From 314b3621af3c0ecceb4383fb24739f5d046f10db Mon Sep 17 00:00:00 2001 From: Dvel Date: Thu, 15 Jun 2023 22:21:06 +0800 Subject: [PATCH] refactor: lua; close #352 --- lua/cn_en_spacer.lua | 11 ++--------- lua/date_translator.lua | 36 ++++++++++++++++++----------------- lua/is_in_user_dict.lua | 20 +++++++++++-------- lua/long_word_filter.lua | 26 +++++++++++++------------ lua/reduce_english_filter.lua | 34 +++++++++++++++++---------------- 5 files changed, 65 insertions(+), 62 deletions(-) diff --git a/lua/cn_en_spacer.lua b/lua/cn_en_spacer.lua index e827e56..ec86270 100644 --- a/lua/cn_en_spacer.lua +++ b/lua/cn_en_spacer.lua @@ -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) diff --git a/lua/date_translator.lua b/lua/date_translator.lua index 2e00c19..c487309 100644 --- a/lua/date_translator.lua +++ b/lua/date_translator.lua @@ -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 diff --git a/lua/is_in_user_dict.lua b/lua/is_in_user_dict.lua index 2086f84..f0751f0 100644 --- a/lua/is_in_user_dict.lua +++ b/lua/is_in_user_dict.lua @@ -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 diff --git a/lua/long_word_filter.lua b/lua/long_word_filter.lua index eb34b50..a8f199f 100644 --- a/lua/long_word_filter.lua +++ b/lua/long_word_filter.lua @@ -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 diff --git a/lua/reduce_english_filter.lua b/lua/reduce_english_filter.lua index 54db469..6c8ef62 100644 --- a/lua/reduce_english_filter.lua +++ b/lua/reduce_english_filter.lua @@ -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