建网站入门,seo关键词快速排名介绍,个人网站备案和企业网站备案吗,百度上海分公司地址在中文环境下#xff0c;多音字是比较常见的现象。对于一些不常见的生僻字#xff0c;或者一些用于地名#xff0c;人名中的常见字的冷门读音#xff0c;如果不能正确的阅读#xff0c;例如把 荥阳 读成了 miāo yng#xff0c;则会怡笑大方。
今天我们在rime中州韵小狼…在中文环境下多音字是比较常见的现象。对于一些不常见的生僻字或者一些用于地名人名中的常见字的冷门读音如果不能正确的阅读例如把 荥阳 读成了 miāo yáng则会怡笑大方。
今天我们在rime中州韵小狼毫输入法中配置一个注音滤镜以便我们在日常的文字输入时可以经常的实时的学习、复习、强化这些文字的读音不做白字先生。
先睹为快
本文所分离的在rime中州韵小狼毫须鼠管输入法中的生字注音效果如下
pinyinAdding.txt
首先我们需要一个文档来记录和管理汉字与注音的信息。pinyinAdding.txt 文档的内容截取部分展示如下
冔 冔(xǔ)
玏 玏(lè)
鹯 鹯(zhān)
亶 亶(dǎn)
荥 荥(yíng)
荥阳 荥(xíng)阳以上pinyinAdding.txt 文档中的内容主要有两列以 tag 制表符分隔。第一列是汉字或者词组第二列是带有注音的词组。顺序无先后。但在后续的lua滤镜中会被处理成优先匹配词组的逻辑。例如词组荥阳会优先匹配荥(xíng)阳而不是匹配成 荥(yíng)阳。
pinyinAddingModule.lua
我们有了字典文档 pinyinAdding.txt但这并没有办法在输入引擎中直接使用。我们还需要一个lua脚本将 pinyinAdding.txt 文档内的词组加载到lua程序中。pinyinAddingModule.lua 脚本文档中的脚本如下
-- pinyinAddingModule.lua
-- Copyright (C) 2023 yaoyuan.dou douyaoyuan126.comlocal M{}
local dict{}
local dbgFlg true--引入系统变更处理模块
local ok, sysInfoRes pcall(require, sysInfo)
local currentDir sysInfoRes.currentDir
local userName sysInfoRes.userName
--引入utf8String用于处理utf8字符串
local of,utf8Str pcall(require, utf8String)
local utf8Sub utf8Str.utf8Sub
local utf8Len utf8Str.utf8Len--设置 dbg 开关
local function setDbg(flg)dbgFlg flgsysInfoRes.setDbg(flg)print(pinyinAddingModule dbgFlg is ..tostring(dbgFlg))
end--将文档处理成行数组
local function files_to_lines(...)if dbgFlg thenprint(---files_to_lines called here)endlocal tabsetmetatable({},{__indextable})local index1for i,filename in next,{...} dolocal fn io.open(filename)if fn thenfor line in fn:lines() doif not line or #line 0 thentab:insert(line)endendfn:close()endendif dbgFlg thenprint(---files_to_lines completed here)endreturn tab
endlocal function dictload(...) -- filename)if dbgFlg thenprint(--dictload called here)endlocal linesfiles_to_lines(...)local thisDict{}for i,line in next ,lines doif not line:match(^%s*#) then -- 第一字 # 为注释行local key,val string.match(line,(.)\t(.))if nil ~ key then--此处如果key 已经存在则使用后来的值顶替旧的值if ~val thenthisDict[key] valendendendendif dbgFlg thenprint(--dictload completed here)endreturn thisDict
end--test
local function test(printPrefix)if nil printPrefix thenprintPrefix endif dbgFlg thenprint(printPrefix,pinyinAddingModule test starting...)sysInfoRes.test(printPrefix.. )for k,v in pairs(dict) doif dbgFlg thenprint(printPrefix..k..\t..v)endendend
end--这是一个递归函数用于在给定的字符串中查找最大能匹配的子串
local function getItmInDicByStr(Str)Str Str or if Str then--返回子串值匹配值匹配长度return ,,0endlocal itmKey,itmLen,itmVal,strLen,flgstrLen utf8Len(Str)flgfalsefor idxstrLen,1,-1 doitmKey utf8Sub(Str,1,idx)if~itmKey thenitmVal dict[itmKey]if nil~itmVal thenitmLen idxflg truebreakendendendif flg thenreturn itmKey,itmVal,itmLenelsereturn ,,0end
endlocal function pinyinAdding(k)k k or if k thenreturn kendlocal valStr,kLenlocal subK,subKVal,subKLenlocal matchPositionvalStr kLen utf8Len(k)matchPosition 1while matchPosition kLen dosubK,subKVal,subKLen getItmInDicByStr(utf8Sub(k,matchPosition,kLen))if subK thenvalStr valStr..utf8Sub(k,matchPosition,1)matchPosition matchPosition 1elsevalStr valStr..subKValmatchPosition matchPosition subKLenendendreturn valStr
endfunction M.init(...)local files{...}--文件名不支持中文其中 # 开始的行为注释行table.insert(files,pinyinAdding.txt)for i,v in next, files dofiles[i] currentDir()../.. venddict dictload(table.unpack(files))--抛出功能函数M.pinyinAdding pinyinAddingM.pinyinAddingT pinyinAddingM.setDbg setDbgM.test test
endM.init()return M以上脚本中我们将指定的 pinyinAdding.txt 文档中的词组加载为一个 dict 的字典对象然后给出了一个检索字典的方法 pinyinAdding。我们通过方法pinyinAdding可以方便的检索出指定关键字的注音版本词组。
pinyinAdding_Filter.lua
在脚本文档 pinyinAddingModule.lua 中我们加载并定义了词组的检索方法。现在我们需要在脚本文档 pinyinAdding_Filter.lua 内将词组检索方法整理成rime引擎的滤镜方法pinyinAdding_Filter.lua文档内的脚本如下
-- phraseReplace_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou douyaoyuan126.com
--[[
这个过滤器的主要作用是对于候选项中命中的选项(OR 内容)用其指定的内容来代替如果没有指定则使用 * 替换
由于这个过滤器会改变候选项的内容主要是会减少候选项数量所以请将这个过滤器放在其它过滤器的最前端使用
]]
local phraseShown local ok, py pcall(require, pinyinAddingModule)--最长的comment长度限制
local maxLenOfComment 250local function pinyinAdding(input, env)--获取选项pinyin开关状态local pySwitchFlg env.engine.context:get_option(pinyin) or false--如果pySwitchFlg是true状态则替换原选项如果是false状态则在comment中注音local pyInCommentFlg trueif pySwitchFlg thenpyInCommentFlg falseendfor cand in input:iter() dolocal txtWithPy py.pinyinAdding(cand.text)if nil txtWithPy then--没有获取到 txtWithPy则不做处理yield(cand)elseif txtWithPy cand.text then--txtWithPy 与 原候选词一致则不做处理yield(cand)else--获取到了 txtWithPy,且不与原候选词一致if pyInCommentFlg or string.find(cand.comment,☯) then--如果需要加到comment里或者这是一个自造词为了不影响自造词功能也需要加到commnet里if cand.comment thencand:get_genuine().comment txtWithPyelseif utf8.len(cand.comment) 5 thencand:get_genuine().comment cand.comment..✔..txtWithPyelsecand:get_genuine().comment cand.comment..\r✔..txtWithPyendendyield(cand)else--如果不加到comment则替换原选项注意替换原选项会影响自动调频功能cand.text txtWithPyif cand.text txtWithPy thenyield(cand)elseyield(Candidate(word, cand.start, cand._end, txtWithPy, cand.comment))endendendend
endreturn pinyinAdding以上脚本中 我们定义了滤镜方法 pinyinAdding 并返回/抛出了该方法。
注意 以上所述文档 pinyinAdding.txtpinyinAddingModule.luapinyinAdding_Filter.lua 三个文档应该位于 用户文件夹 下的 lua 文件夹内。如下
rime.lua
以上我们完成了 pinyinAdding 滤镜方法的定义现在我们需要在文档 rime.lua 中将该 pinyinAdding 滤镜方法映射成 pinyinAdding_Filter 滤镜接口。我们在 rime.lua 中增加以下脚本
help_translator require(help)
inputShow_translator require(inputShow)
inputShow_Filter require(inputShow_Filter)
Upper_Filter require(Upper_Filter)
dic_4w_Filter require(dic_4w_Filter)
phraseReplace_Filter require(phraseReplace_Filter)
pinyinAdding_Filter require(pinyinAdding_Filter)以上脚本中注音最后一行的 pinyinAdding_Filter 的定义。
wubi_pinyin.custom.yaml
以上步骤中我们完成了pinyinAdding_Filter滤镜的定义。现在万事俱备只欠东风了。我们只需要在我们的输入方案中配置引用该 pinyinAdding_Filter 滤镜即可看到文字注音的效果了。
现在我们以 五笔・拼音 输入方案为例来配置生字注音滤镜。我们在 五笔・拼音输入方案的方案文档 wubi_pinyin.schema.yaml 的补丁文档 wubi_pinyin.custom.yaml 加入以下配置
patch:switches/: #增加以下开关- name: pinyin # 这个开关用于标记是否打开拼音滤镜reset: 0states: [Off, pīnyīn]engine/filters: # 设置以下filter- simplifier# 下面的滤镜是comment滤镜不会改变候选项列表- lua_filterpinyinAdding_Filter # pinyin滤镜用于对候选项中的字添加拼音以上的配置中我们增加了两项内容一个是switch开关pinyin 一个是lua_filter 滤镜 pinyinAdding_Filter。这是因为我们在 pinyinAdding_Filter.lua 脚本中会检测开关pinyin的状态以决定是否启用滤镜功能。如下
注意 文档 rime.lua 和 wubi_pinyin.custom.yaml 都应该位于 用户文件夹下这不需要再多说什么了。
pinyinAdding.txt/pinyinAddingModule.lua/pinyinAdding_Filter.lua/rime.lua/wubi_pinyin.custom.yaml 文档
以上所述 pinyinAdding.txt、pinyinAddingModule.lua、pinyinAdding_Filter.lua、rime.lua、wubi_pinyin.custom.yaml 五个文档你也可以在 rime中州韵小狼毫 生字注音滤镜.zip 下载取用。
效果欣赏
做完了以上的配置工作不要忘了 重新部署 你的 rime。然后你就应该能够观察到文字注音效果了。如下
小结
本文分享了一种在rime中州韵小狼毫须鼠管输入法中配置生字注音滤镜的方法并以五笔・拼音 输入方案为例配置并演示了生字注音滤镜的功能效果。本文所配置文档共5个其中 pinyinAdding.txt 文档为词组管理文档通过这个文档可以非常方便的增删管理生字及其注音信息pinyinAddingModule.lua 脚本文档提供了 pinyinAdding.txt 词组的加载和解析功能并提提供了检索方法的接口pinyinAdding_Filter.lua 文档定义了基于rime引擎接口的滤镜方法最后我们在 rime.lua 脚本和 wubi_pinyin.custom.yaml 文档中配置和使用了该滤镜。并在最终的功能效果中观察到了预期的功能效果。