rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜

在 rime中州韵小狼毫 easyEnglish输入法 一文中, 我们定义了 easy-English 输入方案。输入效果如下:
rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜_第1张图片

我们知道,在英文世界中,单词有首字母大写的习惯,如果我们输入 english 单词后,再回来改首字母为 E,这体验,不说了,是比较酸爽的。

今天我们将要提供的 Upper_Filter 是一个 rime中州韵小狼毫输入法中的一个 Filter,该 Upper_Filter 所提供的功能,是为我们的第一个候选单词,提供一个首字母大写的选项供我们选择使用。效果如下:
rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜_第2张图片

Upper_Filter.lua

Upper_Filter.lua 文档是我们要定义 Upper_Filter 接口方案的 lua 脚本文档。我们在 Upper_Filter.lua 脚本文档中完成以下脚本:

-- Upper_Filter.lua
-- Copyright (C) 2023 yaoyuan.dou 
-- 这个脚本,用于为英文单词提供一个首字母大写的候选项

-- 如果需要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中州韵小狼毫 Upper lua Filter 首字母大写滤镜_第3张图片

rime.lua

同样的,我们在 Upper_Filter.lua 脚本内所定义的 Upper_Filter 方法,需要在 rime.lua 中转成 Upper_Filter 接口。我们在 rime.lua 中增加以下配置:

help_translator = require("help")
inputShow_translator = require("inputShow")
inputShow_Filter = require("inputShow_Filter")
Upper_Filter = require("Upper_Filter")

rime.lua 文档应该放置在 用户文件夹 内,如下:
rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜_第4张图片

easy_en.custom.yaml

Upper_Filter 接口已经准备完成,接下来我们需要在输入方案中配置使用该 Upper_Filter。承接本文开头所述使用场景,我们在 easyEnglish 输入方案中配置使用 Upper_Filter

用户文件夹 内的 easyEnglish 输入方案的方案文档 easy_en.schema.yaml 的补丁文档 easy_en.custom.yaml 内,我们配置增加如下 Filter

patch:
  engine/filters/+:
    # 下面的滤镜会对候选项进行格式化处理
    - lua_filter@Upper_Filter #英文后加空格滤镜
    # 上面的滤镜会增加候选词选项
    - uniquifier

以上的配置中,我们在 patch 节点下的 engine 节点下的 filter 节点增加了 Upper_Filter,为了保持候选项的唯一性,我们同时增加了 uniquifier

效果欣赏

在完成了一上脚本和配置的修改保存后,重新部署 rime中州韵/小狼毫 输入法,则我们即可以在 easyEnglish 输入方案下看到 Upper_Filter 所带来的首字母大写的效果,如下:
rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜_第5张图片

Upper_Filter.lua/rime.lua/easy_en.custom.yaml 文档

上述 Upper_Filter.luarime.luaeasy_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 滤镜,最最终观察到了首字母大写的效果。

你可能感兴趣的:(小狼毫,Rime,保姆教程,lua,linux,ubuntu,windows)