在 rime中州韵小狼毫 easyEnglish输入法 一文中, 我们定义了 easy-English
输入方案。输入效果如下👇:
我们知道,在英文世界中,单词有首字母大写的习惯,如果我们输入 english
单词后,再回来改首字母为 E
,这体验,不说了,是比较酸爽的。
今天我们将要提供的 Upper_Filter
是一个 rime
中州韵小狼毫输入法中的一个 Filter
,该 Upper_Filter
所提供的功能,是为我们的第一个候选单词,提供一个首字母大写的选项供我们选择使用。效果如下👇:
Upper_Filter.lua
Upper_Filter.lua
文档是我们要定义 Upper_Filter
接口方案的 lua
脚本文档。我们在 Upper_Filter.lua
脚本文档中完成以下👇脚本:
lua
-- Upper_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou <douyaoyuan@126.com>
-- 这个脚本,用于为英文单词提供一个首字母大写的候选项
-- 如果需要debug,可以在这里进行函数功能调试
local function _specialFunc(input, env)
for cand in input:iter() do
yield(cand)
end
end
local function _upperFilter(input, env)
local cands = {}
local idx, idxSelf
local selfFlg
local candTxtLen
idx = 0
idxSelf = 0
for cand in input:iter() do
idx = idx + 1 --索引位置
selfFlg = cand.comment:find('☯')
if selfFlg then
--自动造词数量
idxSelf = idxSelf + 1
end
--匹配英文字母
local s,e = string.find(cand.text,"^[a-z]+$")
if nil == s then
--匹配失败,说明不是英文单词
if selfFlg then
--对于自动造词选项,使用如下逻辑
if idxSelf == 1 and idx == idxSelf then
--对于第一条自动造词选项,不加干涉
yield(cand)
else
--对于非第一条自动造词选项,限制其长度
--candTxtLen = utf8.len(cand.text)
yield(cand)
end
else
--对于非自动造的词,则正常输出
yield(cand)
end
else
--匹配成功,说明是英文单词
yield(cand)
if idx == 1 then
--如果这是第一个候选词,提供一个首字母大写的选项
local thisTxt=cand.text:gsub("^%l",string.upper)
yield(Candidate("word", cand.start, cand._end, thisTxt, ''))
--idx额外加1
idx = idx + 1
end
end
end
end
local function upperFilter(input, env)
--获取debug选项开关状态
local debugSwitchSts = env.engine.context:get_option("debug")
if debugSwitchSts then
_specialFunc(input,env)
else
_upperFilter(input, env)
end
end
return _upperFilter
👆以上脚本中,存在部分逻辑用于检测候选项是否是完全的英文单词,这是为了避免对非英文单词进行 Upper 转换。这部分的判断在一些中英混输的输入方案中是有作用的。
Upper_Filter.lua
文档应该位于 用户文件夹 下的 lua 文件夹内,如下👇:
rime.lua
同样的,我们在 Upper_Filter.lua
脚本内所定义的 Upper_Filter
方法,需要在 rime.lua
中转成 Upper_Filter
接口。我们在 rime.lua
中增加以下👇配置:
lua
help_translator = require("help")
inputShow_translator = require("inputShow")
inputShow_Filter = require("inputShow_Filter")
Upper_Filter = require("Upper_Filter")
rime.lua
文档应该放置在 用户文件夹 内,如下👇:
easy_en.custom.yaml
Upper_Filter
接口已经准备完成,接下来我们需要在输入方案中配置使用该 Upper_Filter
。承接本文开头所述使用场景,我们在 easyEnglish
输入方案中配置使用 Upper_Filter
。
在 用户文件夹 内的 easyEnglish
输入方案的方案文档 easy_en.schema.yaml
的补丁文档 easy_en.custom.yaml
内,我们配置增加如下👇 Filter
:
yaml
patch:
engine/filters/+:
# 下面的滤镜会对候选项进行格式化处理
- lua_filter@Upper_Filter #英文后加空格滤镜
# 上面的滤镜会增加候选词选项
- uniquifier
👆以上的配置中,我们在 patch
节点下的 engine
节点下的 filter
节点增加了 Upper_Filter
,为了保持候选项的唯一性,我们同时增加了 uniquifier
。
效果欣赏
在完成了一上脚本和配置的修改保存后,重新部署 rime
中州韵/小狼毫 输入法,则我们即可以在 easyEnglish
输入方案下看到 Upper_Filter
所带来的首字母大写的效果,如下👇:
Upper_Filter.lua
/rime.lua
/easy_en.custom.yaml
文档
👆上述 Upper_Filter.lua
、rime.lua
、easy_en.custom.yaml
三个文档,你可以从 Upper_Filter.zip 下载取用。
小结
本文分享了在 rime
中州韵小狼毫输入法中配置 Upper_Filter
滤镜以实现在英文输入中英文单词首字母大写的功能。在 Upper_Filter.lua
文档中定义并实现了首字母大写的功能方法,在 rime.lua
文档中将 Upper_Filter
方法映射为 Upper_Filter
滤镜接口,最后以 easyEnglish
输入方案为例,在 easy_en.custom.yaml
文档中配置了 Upper_Filter
滤镜,最最终观察到了首字母大写的效果。