diff --git a/lua/cold_word_drop/debugtool.lua b/lua/cold_word_drop/debugtool.lua deleted file mode 100644 index cf7398f..0000000 --- a/lua/cold_word_drop/debugtool.lua +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env lua --- --- debugtool.lua --- Copyright (C) 2021 Shewer Lu --- --- Distributed under terms of the MIT license. --- --- puts(tag,...) --- DEBUG --> log.error --- WARN --> log.warning --- INFO --> log.info --- CONSOLE --> print --- --- ex: --- test.lua --- --- local puts = require 'tools/debugtool' --- --set tag D103 C102 --- local D103= DEBUG .. "103" --- local C102= CONSOLE .. "102" --- local C103= nil --- --- --- puts(ERROR,__FILE__(),__LINE__(),__FUNC__(), 1, 2 , 3 ) --- --> log.error( "error" .. tran_msg(...)) --- --- puts(DEBUG,__FILE__(),__LINE__(),__FUNC__(), 1, 2 , 3 ) --- --> log.error( DEBUG .. tran_msg(...)) --- --- puts(D103,__FILE__(),__LINE__(),__FUNC__(), 1 2 3) --- --> log.error("trace103" .. tran_msg(...) --- --- puts(C102,__FILE__(),__LINE__(),__FUNC__(), 1 2 3) --- --> print("console103" .. tran_msg(...) --- --- puts(C103,__FILE__(),__LINE__(),__FUNC__(), 1 2 3) --- --> pass --- --- --- --- puts(DEBUG,__FILE__(),__LINE__(),__FUNC__() , ...) --- puts(INFO,__FILE__(),__LINE__(),__FUNC__() , ...) --- --- global variable -function __FILE__(n) - n = n or 2 - return debug.getinfo(n, 'S').source -end - -function __LINE__(n) - n = n or 2 - return debug.getinfo(n, 'l').currentline -end - -function __FUNC__(n) - n = n or 2 - return debug.getinfo(n, 'n').name -end - -INFO = "log" -WARN = "warn" -ERROR = "error" -DEBUG = "trace" -CONSOLE = "console" - - - - -local function tran_msg(...) - local msg = "\t" - for i, k in next, { ... } do msg = msg .. ": " .. tostring(k) end - return msg -end -local function puts(tag, ...) - if type(tag) ~= "string" then return end - - if INFO and tag:match("^" .. INFO) then - (log and log.info or print)(tag .. tran_msg(...)) - elseif WARN and tag:match("^" .. WARN) then - (log and log.warning or print)(tag .. tran_msg(...)) - elseif ERROR and tag:match("^" .. ERROR) then - (log and log.error or print)(tag .. tran_msg(...)) - elseif DEBUG and tag:match("^" .. DEBUG) then - (log and log.error or print)(tag .. tran_msg(...)) - elseif CONSOLE and tag:match("^" .. CONSOLE) then - (print)(tag .. tran_msg(...)) - else - return - end -end - -return puts diff --git a/lua/cold_word_drop/drop_words.lua b/lua/cold_word_drop/drop_words.lua index 8f9e71d..97908c1 100644 --- a/lua/cold_word_drop/drop_words.lua +++ b/lua/cold_word_drop/drop_words.lua @@ -1,4 +1,3 @@ local drop_words = -{ "示~例~", -} -return drop_words +{ "示~例~", "肏女人", } +return drop_words \ No newline at end of file diff --git a/lua/cold_word_drop/filter.lua b/lua/cold_word_drop/filter.lua index c2fa950..35b3b10 100644 --- a/lua/cold_word_drop/filter.lua +++ b/lua/cold_word_drop/filter.lua @@ -1,54 +1,60 @@ -local drop_list = require("cold_word_drop.drop_words") -local hide_list = require("cold_word_drop.hide_words") -local turndown_freq_list = require("cold_word_drop.turndown_freq_words") +local filter = {} -local function filter(input, env) - local idx = 3 -- 降频的词条放到第三个后面, 即第四位, 可在 yaml 里配置 - local i = 1 - local cands = {} - local context = env.engine.context - local preedit_code = context.input +function filter.init(env) + local engine = env.engine + local config = engine.schema.config + env.word_reduce_idx = config:get_int("cold_word_reduce/idx") or 4 + 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 {} +end - for cand in input:iter() do - local cpreedit_code = string.gsub(cand.preedit, ' ', '') - if (i <= idx) then - local tfl = turndown_freq_list[cand.text] or nil - -- 前三个 候选项排除 要调整词频的词条, 要删的(实际假性删词, 彻底隐藏罢了) 和要隐藏的词条 - if not - ((tfl and table.find_index(tfl, cpreedit_code)) or - table.find_index(drop_list, cand.text) or - (hide_list[cand.text] and table.find_index(hide_list[cand.text], cpreedit_code)) - ) - then - i = i + 1 - ---@diagnostic disable-next-line: undefined-global - yield(cand) - else - table.insert(cands, cand) - end - else - table.insert(cands, cand) - end - if (#cands > 50) then - break - end - end - for _, cand in ipairs(cands) do - local cpreedit_code = string.gsub(cand.preedit, ' ', '') - if not - -- 要删的 和要隐藏的词条不显示 - ( - table.find_index(drop_list, cand.text) or - (hide_list[cand.text] and table.find_index(hide_list[cand.text], cpreedit_code)) - ) - then - ---@diagnostic disable-next-line: undefined-global - yield(cand) - end - end - for cand in input:iter() do - yield(cand) - end +function filter.func(input, env) + local cands = {} + local context = env.engine.context + local preedit_str = context.input:gsub(" ", "") + local drop_words = env.drop_words + local hide_words = env.hide_words + local word_reduce_idx = env.word_reduce_idx + local reduce_freq_words = env.reduce_freq_words + for cand in input:iter() do + local cand_text = cand.text:gsub(" ", "") + local preedit_code = cand.preedit:gsub(" ", "") or preedit_str + + local reduce_freq_list = reduce_freq_words[cand_text] or {} + if word_reduce_idx > 1 then + -- 前三个 候选项排除 要调整词频的词条, 要删的(实际假性删词, 彻底隐藏罢了) 和要隐藏的词条 + if reduce_freq_list and table.find_index(reduce_freq_list, preedit_code) then + table.insert(cands, cand) + elseif + not ( + table.find_index(drop_words, cand_text) + or (hide_words[cand_text] and table.find_index(hide_words[cand_text], preedit_code)) + + ) + then + yield(cand) + word_reduce_idx = word_reduce_idx - 1 + end + else + if + not ( + table.find_index(drop_words, cand_text) + or (hide_words[cand_text] and table.find_index(hide_words[cand_text], preedit_code)) + ) + then + table.insert(cands, cand) + end + end + + if #cands >= 80 then + break + end + end + + for _, cand in ipairs(cands) do + yield(cand) + end end return filter diff --git a/lua/cold_word_drop/hide_words.lua b/lua/cold_word_drop/hide_words.lua index 767a141..df4bf16 100644 --- a/lua/cold_word_drop/hide_words.lua +++ b/lua/cold_word_drop/hide_words.lua @@ -1,4 +1,5 @@ local hide_words = -{ ["示~例~"] = { "shil", "shili", }, +{ ["示~例~"] = { "shil", "shili", }, + ["么特瑞"] = { "meter", }, } -return hide_words +return hide_words \ No newline at end of file diff --git a/lua/cold_word_drop/logger.lua b/lua/cold_word_drop/logger.lua new file mode 100644 index 0000000..2510d86 --- /dev/null +++ b/lua/cold_word_drop/logger.lua @@ -0,0 +1,48 @@ +-- runLog.lua +-- Copyright (C) 2023 yaoyuan.dou + +local M = {} +local dbgFlg = true + +--设置 dbg 开关 +M.setDbg = function(flg) + dbgFlg = flg + + print('runLog dbgFlg is ' .. tostring(dbgFlg)) +end + +local current_path = string.sub(debug.getinfo(1).source, 2, string.len("/runLog.lua") * -1) +M.logDoc = current_path .. 'runLog.txt' + +M.writeLog = function(logStr, newLineFlg) + logStr = logStr or "nothing" + + if not newLineFlg then newLineFlg = true end + + local f = io.open(M.logDoc, 'a') + if f then + local timeStamp = os.date("%Y/%m/%d %H:%M:%S") + f:write(timeStamp .. '[' .. _VERSION .. ']' .. '\t' .. logStr .. '\n') + f:close() + end +end + +--===========================test======================== +M.test = function(printPrefix) + if nil == printPrefix then + printPrefix = ' ' + end + if dbgFlg then + M.writeLog('this is a test string on new line', true) + M.writeLog('this is a test string appending the last line', false) + M.writeLog('runLogDoc is: ' .. M.logDoc, true) + end +end + +function M.init(...) + --如果有需要初始化的动作,可以在这里运行 +end + +M.init() + +return M diff --git a/lua/cold_word_drop/metatable.lua b/lua/cold_word_drop/metatable.lua index 1ba2705..225fa1a 100644 --- a/lua/cold_word_drop/metatable.lua +++ b/lua/cold_word_drop/metatable.lua @@ -2,162 +2,167 @@ orgtype = type function type(obj) - local _type = orgtype(obj) - if "table" == _type and obj._cname then - return obj._cname - end - return _type + local _type = orgtype(obj) + if "table" == _type and obj._cname then + return obj._cname + end + return _type end function metatable(...) - if ... and type(...) == "table" then - return setmetatable(..., { __index = table }) - else - return setmetatable({ ... }, { __index = table }) - end + if ... and type(...) == "table" then + return setmetatable(..., { __index = table }) + else + return setmetatable({ ... }, { __index = table }) + end end -- chech metatble function metatable_chk(tab) - if "table" == type(tab) - then - return (tab.each and tab) or metatable(tab) - else - return tab - end + if "table" == type(tab) then + return (tab.each and tab) or metatable(tab) + else + return tab + end end table.eachi = function(tab, func) - for i = 1, #tab do - func(tab[i], i) - end - return tab + for i = 1, #tab do + func(tab[i], i) + end + return tab end table.eacha = function(tab, func) - for i, v in ipairs(tab) do - func(v, i) - end - return tab + for i, v in ipairs(tab) do + func(v, i) + end + return tab end table.each = function(tab, func) - for k, v in pairs(tab) do - func(v, k) - end - return tab + for k, v in pairs(tab) do + func(v, k) + end + return tab end table.find_index = function(tab, elm, ...) - local _, i = table.find(tab, elm, ...) - return i + local _, i = table.find(tab, elm, ...) + return i end table.find = function(tab, elm, func) - for i, v in ipairs(tab) do - if elm == v then - return v, i - end - end + for i, v in ipairs(tab) do + if elm == v then + return v, i + end + end end table.find_with_func = function(tab, elm, ...) - local i, v = table.find(tab, elm) + local i, v = table.find(tab, elm) end table.delete = function(tab, elm, ...) - local index = table.find_index(tab, elm) - return index and table.remove(tab, index) + local index = table.find_index(tab, elm) + return index and table.remove(tab, index) end table.find_all = function(tab, elm, ...) - local tmptab = setmetatable({}, { __index = table }) - local _func = (type(elm) == "function" and elm) or function(v, k, ...) return v == elm end - for k, v in pairs(tab) do - if _func(v, k, ...) then - tmptab:insert(v) - end - end - return tmptab + local tmptab = setmetatable({}, { __index = table }) + local _func = (type(elm) == "function" and elm) or function(v, k, ...) + return v == elm + end + for k, v in pairs(tab) do + if _func(v, k, ...) then + tmptab:insert(v) + end + end + return tmptab end table.select = table.find_all table.reduce = function(tab, func, arg) - local new, old = arg, arg - for i, v in ipairs(tab) do - new, old = func(v, new) - end - return new, arg + local new, old = arg, arg + for i, v in ipairs(tab) do + new, old = func(v, new) + end + return new, arg end table.map = function(tab, func) - local newtab = setmetatable({}, { __index = table }) - func = func or function(v, i) return v, i end - for i, v in ipairs(tab) do - newtab[i] = func(v, i) - end - return newtab + local newtab = setmetatable({}, { __index = table }) + func = func or function(v, i) + return v, i + end + for i, v in ipairs(tab) do + newtab[i] = func(v, i) + end + return newtab end -table.map_hash = function(tab, func) -- table to list of array { key, v} - local newtab = setmetatable({}, { __index = table }) - func = func or function(k, v) return { k, v } end - for k, v in pairs(tab) do - newtab:insert(func(k, v)) - end - return newtab +table.map_hash = function(tab, func) -- table to list of array { key, v} + local newtab = setmetatable({}, { __index = table }) + func = func or function(k, v) + return { k, v } + end + for k, v in pairs(tab) do + newtab:insert(func(k, v)) + end + return newtab end function table:push(elm) - self:insert(elm) + self:insert(elm) end table.append = table.push function table:pop() - return self:remove(#self) + return self:remove(#self) end function table:shift() - self:remove(1) + self:remove(1) end function table:unshift(elm) - self:insert(1, elm) + self:insert(1, elm) end function table.len(t) - local leng = 0 - for k, v in pairs(t) do - leng = leng + 1 - end - return leng; + local leng = 0 + for k, v in pairs(t) do + leng = leng + 1 + end + return leng end -- table to string 序列化 function table.serialize(obj) - local serialize_str = "" - local t = type(obj) - if t == "number" then - serialize_str = serialize_str .. obj - elseif t == "boolean" then - serialize_str = serialize_str .. tostring(obj) - elseif t == "string" then - serialize_str = serialize_str .. string.format("%q", obj) - elseif t == "table" then - serialize_str = serialize_str .. "{ " - local record_sep = #obj < 4 and ", " or ",\n" - local record_prefix = #obj < 4 and "" or "\t" - for k, v in pairs(obj) do - if type(k) == "number" then - serialize_str = serialize_str .. record_prefix .. '"' .. v .. '"' .. record_sep - else - serialize_str = serialize_str .. "\t[" .. table.serialize(k) .. "] = " .. table.serialize(v) .. ",\n" - end - end - -- local metatable = getmetatable(obj) - -- if metatable ~= nil and type(metatable.__index) == "table" then - -- for k, v in pairs(metatable.__index) do - -- serialize_str = serialize_str .. "[" .. table.serialize(k) .. "]=" .. table.serialize(v) .. ",\n" - -- end - -- end - serialize_str = serialize_str .. "}" - elseif t == "nil" then - return nil - else - error("can not serialize a " .. t .. " type.") - end - return serialize_str + local serialize_str = "" + local t = type(obj) + if t == "number" then + serialize_str = serialize_str .. obj + elseif t == "boolean" then + serialize_str = serialize_str .. tostring(obj) + elseif t == "string" then + serialize_str = serialize_str .. string.format("%q", obj) + elseif t == "table" then + serialize_str = serialize_str .. "{ " + local record_sep = #obj < 4 and ", " or ",\n" + local record_prefix = #obj < 4 and "" or "\t" + for k, v in pairs(obj) do + if type(k) == "number" then + serialize_str = serialize_str .. record_prefix .. '"' .. v .. '"' .. record_sep + else + serialize_str = serialize_str .. "\t[" .. table.serialize(k) .. "] = " .. table.serialize(v) .. ",\n" + end + end + -- local metatable = getmetatable(obj) + -- if metatable ~= nil and type(metatable.__index) == "table" then + -- for k, v in pairs(metatable.__index) do + -- serialize_str = serialize_str .. "[" .. table.serialize(k) .. "]=" .. table.serialize(v) .. ",\n" + -- end + -- end + serialize_str = serialize_str .. "}" + elseif t == "nil" then + return nil + else + error("can not serialize a " .. t .. " type.") + end + return serialize_str end diff --git a/lua/cold_word_drop/processor.lua b/lua/cold_word_drop/processor.lua index 233ed44..435513c 100644 --- a/lua/cold_word_drop/processor.lua +++ b/lua/cold_word_drop/processor.lua @@ -1,151 +1,120 @@ -require('cold_word_drop.string') +require("cold_word_drop.string") require("cold_word_drop.metatable") --- local puts = require("tools/debugtool") -local drop_list = require("cold_word_drop.drop_words") -local hide_list = require("cold_word_drop.hide_words") -local turndown_freq_list = require("cold_word_drop.turndown_freq_words") -local tbls = { - ['drop_list'] = drop_list, - ['hide_list'] = hide_list, - ['turndown_freq_list'] = turndown_freq_list -} --- local cold_word_drop = {} - +local processor = {} local function get_record_filername(record_type) - local user_distribute_name = rime_api:get_distribution_name() - if user_distribute_name == '小狼毫' then - return string.format("%s\\Rime\\lua\\cold_word_drop\\%s_words.lua", os.getenv("APPDATA"), record_type) - end - - local system = io.popen("uname -s"):read("*l") - local filename = nil - -- body - if system == "Darwin" then - filename = string.format("%s/Library/Rime/lua/cold_word_drop/%s_words.lua", os.getenv('HOME'), record_type) - elseif system == "Linux" then - filename = string.format("%s/%s/rime/lua/cold_word_drop/%s_words.lua", - os.getenv('HOME'), - (string.find(os.getenv('GTK_IM_MODULE'), 'fcitx') and '.local/share/fcitx5' or '.config/ibus'), - record_type) - end - return filename + local user_distribute_name = rime_api:get_distribution_code_name() + if user_distribute_name:lower():match("weasel") then + return string.format("%s\\lua\\cold_word_drop\\%s_words.lua", rime_api:get_user_data_dir(), record_type) + elseif user_distribute_name:lower():match("squirrel") then + return string.format("%s/lua/cold_word_drop/%s_words.lua", rime_api:get_user_data_dir(), record_type) + elseif user_distribute_name:lower():match("fcitx") then + return string.format("%s/lua/cold_word_drop/%s_words.lua", rime_api:get_user_data_dir(), record_type) + elseif user_distribute_name:lower():match("ibus") then + return string.format( + "%s/rime/lua/cold_word_drop/%s_words.lua", + os.getenv("HOME") .. "/.config/ibus", + record_type + ) + end end -local function write_word_to_file(record_type) - -- local filename = string.format("%s/Library/Rime/lua/cold_word_drop/%s_words.lua", os.getenv('HOME'), 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) - local fd = assert(io.open(filename, "w")) --打开 - fd:setvbuf("line") - fd:write(record_header) --写入文件头部 - -- df:flush() --刷新 - local x = string.format("%s_list", record_type) - local record = table.serialize(tbls[x]) -- lua 的 table 对象 序列化为字符串 - fd:write(record) --写入 序列化的字符串 - fd:write(record_tailer) --写入文件尾部, 结束记录 - fd:close() --关闭 +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 check_encode_matched(cand_code, word, input_code_tbl, reversedb) - if #cand_code < 1 and utf8.len(word) > 1 then -- 二字词以上的词条反查, 需要逐个字去反查 - local word_cand_code = string.split(word, "") - for i, v in ipairs(word_cand_code) do - -- 如有 `[` 引导的辅助码情况, 去掉引导符及之后的所有形码字符 - local char_code = string.gsub(reversedb:lookup(v), '%[%l%l', '') - local _char_preedit_code = input_code_tbl[i] or " " - -- 如有 `[` 引导的辅助码情况, 同上, 去掉之 - local char_preedit_code = string.gsub(_char_preedit_code, '%[%l+', '') - if not string.match(char_code, char_preedit_code) then - -- 输入编码串和词条反查结果不匹配(考虑到多音字, 开启了模糊音, 纠错音), 返回false, 表示隐藏这个词条 - return false - end - end - end - -- 输入编码串和词条反查结果匹配, 返回true, 表示对这个词条降频 - return true +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 -local function append_word_to_droplist(ctx, action_type, reversedb) - local word = ctx.word - local input_code = ctx.code - if action_type == 'drop' then - table.insert(drop_list, word) -- 高亮选中的词条插入到 drop_list - return true - end - local input_code_tbl = string.split(input_code, " ") - local cand_code = reversedb:lookup(word) or "" -- 反查候选项文字编码 - -- 二字词 的匹配检查, 匹配返回true, 不匹配返回false - local match_result = check_encode_matched(cand_code, word, input_code_tbl, reversedb) - local ccand_code = string.gsub(cand_code, '%[%l%l', '') - -- 如有 `[` 引导的辅助码情况, 去掉引导符及之后的所有形码字符 - local input_str = string.gsub(input_code, '%[%l+', '') - local input_code_str = table.concat(input_code_tbl, '') - -- 单字和二字词 的匹配检查, 如果匹配, 降频 - if string.match(ccand_code, input_str) or match_result then - if turndown_freq_list[word] then - table.insert(turndown_freq_list[word], input_code_str) - else - turndown_freq_list[word] = { input_code_str } - end - return 'turndown_freq' - end - - -- 单字和二字词 如果不匹配 就隐藏 - if not hide_list[word] then - hide_list[word] = { input_code_str } - return true - else - -- 隐藏的词条如果已经在 hide_list 中, 则将输入串追加到 值表中, 如: ['藏'] = {'chang', 'zhang'} - if not table.find_index(hide_list[word], input_code_str) then - table.insert(hide_list[word], input_code_str) - return true - else - return false - 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 -local function processor(key, env) - local engine = env.engine - local config = engine.schema.config - local context = engine.context - -- local top_cand_text = context:get_commit_text() - -- local preedit_code = context.input - local preedit_code = context:get_script_text() - local turndown_cand_key = config:get_string("key_binder/turn_down_cand") or "Control+j" - local drop_cand_key = config:get_string("key_binder/drop_cand") or "Control+d" - local action_map = { - [turndown_cand_key] = 'hide', - [drop_cand_key] = 'drop' - } +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", + } - -- local schema_id = config:get_string("schema/schema_id") - local schema_id = config:get_string("translator/dictionary") -- 多方案共用字典取主方案名称 - ---@diagnostic disable-next-line: undefined-global - local reversedb = ReverseLookup(schema_id) - if key:repr() == turndown_cand_key or key:repr() == drop_cand_key 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(ctx_map, action_type, reversedb) + 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 type(res) == "boolean" then - -- 期望被删的词和隐藏的词条写入文件(drop_words.lua, hide_words.lua) - write_word_to_file(action_type) - else - -- 期望 要调整词频的词条写入 turndown_freq_words.lua 文件 - write_word_to_file(res) - end - return 1 -- kAccept - end + context:refresh_non_confirmed_composition() -- 刷新当前输入法候选菜单, 实现看到实时效果 + if not res then + return 2 + end - return 2 -- kNoop, 不做任何操作, 交给下个组件处理 + 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 diff --git a/lua/cold_word_drop/reduce_freq_words.lua b/lua/cold_word_drop/reduce_freq_words.lua new file mode 100644 index 0000000..282ff00 --- /dev/null +++ b/lua/cold_word_drop/reduce_freq_words.lua @@ -0,0 +1,5 @@ +local reduce_freq_words = +{ ["示~例~"] = { "shili", }, + ["颜射"] = { "yanshe", }, +} +return reduce_freq_words \ No newline at end of file diff --git a/lua/cold_word_drop/string.lua b/lua/cold_word_drop/string.lua index 9d4eb32..4c7735d 100644 --- a/lua/cold_word_drop/string.lua +++ b/lua/cold_word_drop/string.lua @@ -4,35 +4,34 @@ -- string.utf8_offset= utf8.offset -- string.utf8_sub= utf8.sub function string.split(str, sp, sp1) - sp = type(sp) == "string" and sp or " " - if #sp == 0 then - sp = "([%z\1-\127\194-\244][\128-\191]*)" - elseif #sp == 1 then - sp = "[^" .. (sp == "%" and "%%" or sp) .. "]*" - else - sp1 = sp1 or "^" - str = str:gsub(sp, sp1) - sp = "[^" .. sp1 .. "]*" - end + sp = type(sp) == "string" and sp or " " + if #sp == 0 then + sp = "([%z\1-\127\194-\244][\128-\191]*)" + elseif #sp == 1 then + sp = "[^" .. (sp == "%" and "%%" or sp) .. "]*" + else + sp1 = sp1 or "^" + str = str:gsub(sp, sp1) + sp = "[^" .. sp1 .. "]*" + end - local tab = {} - for v in str:gmatch(sp) do - table.insert(tab, v) - end - return tab + local tab = {} + for v in str:gmatch(sp) do + table.insert(tab, v) + end + return tab end function utf8.gsub(str, si, ei) - local function index(ustr, i) - return i >= 0 and (ustr:utf8_offset(i) or ustr:len() + 1) - or (ustr:utf8_offset(i) or 1) - end + local function index(ustr, i) + return i >= 0 and (ustr:utf8_offset(i) or ustr:len() + 1) or (ustr:utf8_offset(i) or 1) + end - local u_si = index(str, si) - ei = ei or str:utf8_len() - ei = ei >= 0 and ei + 1 or ei - local u_ei = index(str, ei) - 1 - return str:sub(u_si, u_ei) + local u_si = index(str, si) + ei = ei or str:utf8_len() + ei = ei >= 0 and ei + 1 or ei + local u_ei = index(str, ei) - 1 + return str:sub(u_si, u_ei) end string.utf8_len = utf8.len diff --git a/lua/cold_word_drop/turndown_freq_words.lua b/lua/cold_word_drop/turndown_freq_words.lua deleted file mode 100644 index ee6430e..0000000 --- a/lua/cold_word_drop/turndown_freq_words.lua +++ /dev/null @@ -1,4 +0,0 @@ -local turndown_freq_words = -{ ["示~例~"] = { "shili", }, -} -return turndown_freq_words