120 lines
3.8 KiB
Lua
120 lines
3.8 KiB
Lua
require("cold_word_drop.string")
|
|
require("cold_word_drop.metatable")
|
|
local processor = {}
|
|
|
|
local function get_record_filername(record_type)
|
|
local path_sep = "/"
|
|
local user_data_dir = rime_api:get_user_data_dir()
|
|
local user_distribute_name = rime_api:get_distribution_code_name()
|
|
if user_distribute_name:lower():match("weasel") then path_sep = [[\]] end
|
|
if user_distribute_name:lower():match("ibus") then
|
|
return string.format("%s/rime/lua/cold_word_records/%s_words.lua",
|
|
os.getenv("HOME") .. "/.config/ibus",
|
|
record_type
|
|
)
|
|
else
|
|
local file_path = string.format("%s/lua/cold_word_records/%s_words.lua", user_data_dir, record_type)
|
|
return file_path:gsub("/", path_sep)
|
|
end
|
|
end
|
|
|
|
local function write_word_to_file(env, record_type)
|
|
local filename = get_record_filername(record_type)
|
|
local record_header = string.format("local %s_words =\n", record_type)
|
|
local record_tailer = string.format("\nreturn %s_words", record_type)
|
|
if not filename then
|
|
return false
|
|
end
|
|
local fd = assert(io.open(filename, "w")) --打开
|
|
-- fd:flush() --刷新
|
|
local x = string.format("%s_list", record_type)
|
|
local record = table.serialize(env.tbls[x]) -- lua 的 table 对象 序列化为字符串
|
|
fd:setvbuf("line")
|
|
fd:write(record_header) --写入文件头部
|
|
fd:write(record) --写入 序列化的字符串
|
|
fd:write(record_tailer) --写入文件尾部, 结束记录
|
|
fd:close() --关闭
|
|
end
|
|
|
|
local function append_word_to_droplist(env, ctx, action_type)
|
|
local word = ctx.word:gsub(" ", "")
|
|
local input_code = ctx.code:gsub(" ", "")
|
|
|
|
if action_type == "drop" then
|
|
table.insert(env.drop_words, word) -- 高亮选中的词条插入到 drop_list
|
|
return true
|
|
end
|
|
|
|
if action_type == "hide" then
|
|
if not env.hide_words[word] then
|
|
env.hide_words[word] = { input_code }
|
|
-- 隐藏的词条如果已经在 hide_list 中, 则将输入串追加到 值表中, 如: ['藏'] = {'chang', 'zhang'}
|
|
elseif not table.find_index(env.hide_words[word], input_code) then
|
|
table.insert(env.hide_words[word], input_code)
|
|
end
|
|
return true
|
|
end
|
|
|
|
if action_type == "reduce_freq" then
|
|
if env.reduce_freq_words[word] then
|
|
table.insert(env.reduce_freq_words[word], input_code)
|
|
else
|
|
env.reduce_freq_words[word] = { input_code }
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
|
|
function processor.init(env)
|
|
local engine = env.engine
|
|
local config = engine.schema.config
|
|
env.drop_cand_key = config:get_string("key_binder/drop_cand") or "Control+d"
|
|
env.hide_cand_key = config:get_string("key_binder/hide_cand") or "Control+x"
|
|
env.reduce_cand_key = config:get_string("key_binder/reduce_freq_cand") or "Control+j"
|
|
env.drop_words = require("cold_word_drop.drop_words") or {}
|
|
env.hide_words = require("cold_word_drop.hide_words") or {}
|
|
env.reduce_freq_words = require("cold_word_drop.reduce_freq_words") or {}
|
|
env.tbls = {
|
|
["drop_list"] = env.drop_words,
|
|
["hide_list"] = env.hide_words,
|
|
["reduce_freq_list"] = env.reduce_freq_words,
|
|
}
|
|
end
|
|
|
|
function processor.func(key, env)
|
|
local engine = env.engine
|
|
local context = engine.context
|
|
local preedit_code = context:get_script_text()
|
|
local action_map = {
|
|
[env.drop_cand_key] = "drop",
|
|
[env.hide_cand_key] = "hide",
|
|
[env.reduce_cand_key] = "reduce_freq",
|
|
}
|
|
|
|
if context:has_menu() and action_map[key:repr()] then
|
|
local cand = context:get_selected_candidate()
|
|
local action_type = action_map[key:repr()]
|
|
local ctx_map = {
|
|
["word"] = cand.text,
|
|
["code"] = preedit_code,
|
|
}
|
|
local res = append_word_to_droplist(env, ctx_map, action_type)
|
|
|
|
context:refresh_non_confirmed_composition() -- 刷新当前输入法候选菜单, 实现看到实时效果
|
|
if not res then
|
|
return 2
|
|
end
|
|
|
|
if res then
|
|
-- 期望被删的词和隐藏的词条写入文件(drop_words.lua, hide_words.lua)
|
|
write_word_to_file(env, action_type)
|
|
end
|
|
|
|
return 1 -- kAccept
|
|
end
|
|
|
|
return 2 -- kNoop, 不做任何操作, 交给下个组件处理
|
|
end
|
|
|
|
return processor
|