refactor: lua; close #352
This commit is contained in:
parent
ab066356f8
commit
314b3621af
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user