refactor: lua; close #352

This commit is contained in:
Dvel 2023-06-15 22:21:06 +08:00
parent ab066356f8
commit 314b3621af
5 changed files with 65 additions and 62 deletions

View File

@ -11,16 +11,9 @@ local function add_spaces(s)
return s
end
-- 是否同时包含中文和英文数字
local function is_mixed_cn_en_num(s)
-- 检查是否含有中文
if not s:find("([\228-\233][\128-\191]-)") then
return false
end
-- 检查是否含有英文或数字
if not s:find("[%a%d]") then
return false
end
return true
return s:find("([\228-\233][\128-\191]-)") and s:find("[%a%d]")
end
local function cn_en_spacer(input, env)

View File

@ -1,4 +1,5 @@
-- 日期时间
-- 提高权重的原因:因为在方案中设置了大于 1 的 initial_quality导致 rq sj xq dt ts 产出的候选项在所有词语的最后。
local function yield_cand(seg, text)
local cand = Candidate('date', seg.start, seg._end, text, '')
@ -6,19 +7,21 @@ local function yield_cand(seg, text)
yield(cand)
end
local function date_translator(input, seg, env)
if not env.date then
local config = env.engine.schema.config
env.name_space = env.name_space:gsub('^*', '')
env.date = config:get_string(env.name_space .. '/date') or 'rq'
env.time = config:get_string(env.name_space .. '/time') or 'sj'
env.week = config:get_string(env.name_space .. '/week') or 'xq'
env.datetime = config:get_string(env.name_space .. '/datetime') or 'dt'
env.timestamp = config:get_string(env.name_space .. '/timestamp') or 'ts'
end
local M = {}
function M.init(env)
local config = env.engine.schema.config
M.name_space = env.name_space:gsub('^*', '')
M.date = config:get_string(env.name_space .. '/date') or 'rq'
M.time = config:get_string(env.name_space .. '/time') or 'sj'
M.week = config:get_string(env.name_space .. '/week') or 'xq'
M.datetime = config:get_string(env.name_space .. '/datetime') or 'dt'
M.timestamp = config:get_string(env.name_space .. '/timestamp') or 'ts'
end
function M.func(input, seg, env)
-- 日期
if (input == env.date) then
if (input == M.date) then
local current_time = os.time()
yield_cand(seg, os.date('%Y-%m-%d', current_time))
yield_cand(seg, os.date('%Y/%m/%d', current_time))
@ -27,13 +30,13 @@ local function date_translator(input, seg, env)
yield_cand(seg, os.date('%Y 年 %m 月 %d 日', current_time):gsub(' 0', ' '))
-- 时间
elseif (input == env.time) then
elseif (input == M.time) then
local current_time = os.time()
yield_cand(seg, os.date('%H:%M', current_time))
yield_cand(seg, os.date('%H:%M:%S', current_time))
-- 星期
elseif (input == env.week) then
elseif (input == M.week) then
local current_time = os.time()
local week_tab = {'', '', '', '', '', '', ''}
local text = week_tab[tonumber(os.date('%w', current_time) + 1)]
@ -42,13 +45,13 @@ local function date_translator(input, seg, env)
yield_cand(seg, '' .. text)
-- ISO 8601/RFC 3339 的时间格式 (固定东八区)(示例 2022-01-07T20:42:51+08:00
elseif (input == env.datetime) then
elseif (input == M.datetime) then
local current_time = os.time()
yield_cand(seg, os.date('%Y-%m-%dT%H:%M:%S+08:00', current_time))
yield_cand(seg, os.date('%Y%m%d%H%M%S', current_time))
-- 时间戳(十位数,到秒,示例 1650861664
elseif (input == env.timestamp) then
elseif (input == M.timestamp) then
local current_time = os.time()
yield_cand(seg, string.format('%d', current_time))
end
@ -65,5 +68,4 @@ local function date_translator(input, seg, env)
-- end
end
return date_translator
return M

View File

@ -1,14 +1,18 @@
-- 根据是否在用户词典,在结尾加上一个星号 *
-- is_in_user_dict: true 输入过的内容
-- is_in_user_dict: flase 或不写 未输入过的内容
local function is_in_user_dict(input, env)
if not env.is_in_user_dict then
local config = env.engine.schema.config
env.name_space = env.name_space:gsub('^*', '')
env.is_in_user_dict = config:get_bool(env.name_space)
end
local M = {}
function M.init(env)
local config = env.engine.schema.config
env.name_space = env.name_space:gsub('^*', '')
M.is_in_user_dict = config:get_bool(env.name_space)
end
function M.func(input, env)
for cand in input:iter() do
if env.is_in_user_dict then
if M.is_in_user_dict then
if cand.type == "user_phrase" then
cand.comment = cand.comment .. '*'
end
@ -21,4 +25,4 @@ local function is_in_user_dict(input, env)
end
end
return is_in_user_dict
return M

View File

@ -1,15 +1,17 @@
-- 长词优先(提升「西安」「提案」「图案」「饥饿」等词汇的优先级)
-- 感谢&参考于: https://github.com/tumuyan/rime-melt
-- 修改:不提升英文和中英混输的
local function long_word_filter(input, env)
-- 提升 count 个词语,插入到第 idx 个位置,默认 2、4。
if not env.idx then
local config = env.engine.schema.config
env.name_space = env.name_space:gsub("^*", "")
env.idx = config:get_int(env.name_space .. "/idx") or 4
env.count = config:get_int(env.name_space .. "/count") or 2
end
local M = {}
function M.init(env)
-- 提升 count 个词语,插入到第 idx 个位置,默认 2、4。
local config = env.engine.schema.config
env.name_space = env.name_space:gsub("^*", "")
M.idx = config:get_int(env.name_space .. "/idx") or 4
M.count = config:get_int(env.name_space .. "/count") or 2
end
function M.func(input, env)
local l = {}
local firstWordLength = 0 -- 记录第一个候选词的长度,提前的候选词至少要比第一个候选词长
local done = 0 -- 记录筛选了多少个词条(只提升 count 个词的权重)
@ -17,18 +19,18 @@ local function long_word_filter(input, env)
for cand in input:iter() do
-- 找到要提升的词
local leng = utf8.len(cand.text)
if (firstWordLength < 1 or i < env.idx) then
if (firstWordLength < 1 or i < M.idx) then
i = i + 1
firstWordLength = leng
yield(cand)
elseif ((leng > firstWordLength) and (done < env.count)) and (string.find(cand.text, "[%w%p%s]+") == nil) then
elseif ((leng > firstWordLength) and (done < M.count)) and (string.find(cand.text, "[%w%p%s]+") == nil) then
yield(cand)
done = done + 1
else
table.insert(l, cand)
end
-- 找齐了或者 l 太大了,就不找了
if (done == env.count) or (#l > 50) then
if (done == M.count) or (#l > 50) then
break
end
end
@ -40,4 +42,4 @@ local function long_word_filter(input, env)
end
end
return long_word_filter
return M

View File

@ -1,23 +1,25 @@
-- 降低部分英语单词在候选项的位置
-- https://dvel.me/posts/make-rime-en-better/#短单词置顶的问题
-- 感谢大佬 @[Shewer Lu](https://github.com/shewer) 指点
local function reduce_english_filter(input, env)
-- load data
if not env.idx then
local config = env.engine.schema.config
env.name_space = env.name_space:gsub("^*", "")
env.idx = config:get_int(env.name_space .. "/idx") -- 要插入的位置
env.words = {} -- 要过滤的词
local list = config:get_list(env.name_space .. "/words")
for i = 0, list.size - 1 do
local word = list:get_value_at(i).value
env.words[word] = true
end
end
local M = {}
function M.init(env)
local config = env.engine.schema.config
env.name_space = env.name_space:gsub("^*", "")
M.idx = config:get_int(env.name_space .. "/idx") -- 要插入的位置
M.words = {} -- 要过滤的词
local list = config:get_list(env.name_space .. "/words")
for i = 0, list.size - 1 do
local word = list:get_value_at(i).value
M.words[word] = true
end
end
function M.func(input, env)
-- filter start
local code = env.engine.context.input
if env.words[code] then
if M.words[code] then
local pending_cands = {}
local index = 0
for cand in input:iter() do
@ -28,7 +30,7 @@ local function reduce_english_filter(input, env)
else
yield(cand)
end
if index >= env.idx + #pending_cands - 1 then
if index >= M.idx + #pending_cands - 1 then
for _, cand in ipairs(pending_cands) do
yield(cand)
end
@ -43,4 +45,4 @@ local function reduce_english_filter(input, env)
end
end
return reduce_english_filter
return M