From c8652325610acbbf97928883e9cc5077d606c884 Mon Sep 17 00:00:00 2001 From: Dvel Date: Sat, 3 Feb 2024 13:24:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20pin=5Fcand=5Ffilter.lua=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=94=A8=20>=20=E5=88=86=E5=89=B2=E5=90=AB=E6=9C=89?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=E7=9A=84=E8=AF=8D=E6=B1=87=20#586?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/pin_cand_filter.lua | 63 +++++++++++++++++++++++------------------ rime_ice.schema.yaml | 36 +++++++++++++---------- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/lua/pin_cand_filter.lua b/lua/pin_cand_filter.lua index bea9b2f..9482849 100644 --- a/lua/pin_cand_filter.lua +++ b/lua/pin_cand_filter.lua @@ -10,10 +10,6 @@ local function is_in_list(list, str) return false, 0 end -local function starts_with(a, b) - return string.sub(a, 1, string.len(b)) == b -end - local M = {} function M.init(env) @@ -35,9 +31,9 @@ function M.init(env) -- 'l 了 啦' → M.pin_cands["l"] = {"了", "啦"} -- 'ta 他 她 它' → M.pin_cands["ta"] = {"他", "她", "它"} -- - -- 无空格词汇,如 `nihao 你好` → M.pin_cands["nihao"] = {"你好"} + -- 无空格的键,如 `nihao 你好` → M.pin_cands["nihao"] = {"你好"} -- - -- 包含空格的词汇,同时生成简码的拼写(最后一个空格后的首字母),如: + -- 包含空格的的键,同时生成简码的拼写(最后一个空格后的首字母),如: -- 'ni hao 你好 拟好' → M.pin_cands["nihao"] = {"你好", "拟好"} -- → M.pin_cands["nih"] = {"你好", "拟好"} -- @@ -61,12 +57,18 @@ function M.init(env) M.pin_cands = {} for i = 0, list.size - 1 do local preedit, texts = list:get_value_at(i).value:match("([^\t]+)\t(.+)") - -- use #text to match both nil and empty value if #preedit > 0 and #texts > 0 then + -- 按照 " > " 或 " " 分割词汇 + local delimiter = "\0" + if texts:find(" > ") then + texts = texts:gsub(" > ", delimiter) + else + texts = texts:gsub(" ", delimiter) + end + -- 按照键生成完整的拼写 local preedit_no_spaces = preedit:gsub(" ", "") M.pin_cands[preedit_no_spaces] = {} - -- 按照配置生成完整的拼写 - for text in texts:gmatch("%S+") do + for text in texts:gmatch("[^" .. delimiter .. "]+") do table.insert(M.pin_cands[preedit_no_spaces], text) end -- 额外处理包含空格的 preedit,增加最后一个拼音的首字母和 zh, ch, sh 的简码 @@ -78,7 +80,7 @@ function M.init(env) -- 只在没有明确定义此简码时才生成,已有的追加,没有的直接赋值 if not set[p1] then if M.pin_cands[p1] ~= nil then - for text in texts:gmatch("%S+") do + for text in texts:gmatch("[^" .. delimiter .. "]+") do table.insert(M.pin_cands[p1], text) end else @@ -91,7 +93,7 @@ function M.init(env) -- 只在没有明确定义此简码时才生成,已有的追加,没有的直接赋值 if not set[p2] then if M.pin_cands[p2] ~= nil then - for text in texts:gmatch("%S+") do + for text in texts:gmatch("[^" .. delimiter .. "]+") do table.insert(M.pin_cands[p2], text) end else @@ -112,21 +114,33 @@ function M.func(input, env) return end + -- 当前输入框的 preedit,未经过方案 translator/preedit_format 转换 + -- 输入 nihaoshij 则为 nihaoshij,选择了「你好」后变成 你好shij + local full_preedit = env.engine.context:get_preedit().text + -- 非汉字部分的 preedit,如 shij + local letter_only_preedit = string.gsub(full_preedit, "[^a-zA-Z]", "") + -- 是否正在选词(已经选择了至少一个字词,如 `你好shij` 这种状态) + -- local isSelecting = full_preedit ~= letter_only_preedit + local pined = {} -- 提升的候选项 local others = {} -- 其余候选项 local pined_count = 0 for cand in input:iter() do - local preedit_no_spaces = cand.preedit:gsub(" ", "") + local cand_preedit_no_spaces = cand.preedit:gsub(" ", "") - -- 跳过不需要处理的部分,这样期望置顶的字词在句子开头及输入到一半时也会被置顶 - if M.pin_cands[preedit_no_spaces] == nil then + -- 无关的输入直接 break + if string.find(letter_only_preedit, "^" .. cand_preedit_no_spaces) == nil then yield(cand) - goto continue + break end - local texts = M.pin_cands[preedit_no_spaces] - if texts then + local texts = M.pin_cands[cand_preedit_no_spaces] + + -- 跳过不需要处理的部分,对后续的候选项排序 + if texts == nil then + yield(cand) + else -- 给 pined 几个空字符串占位元素,后面直接 pined[idx] = cand 确保 pined 与 texts 顺序一致 if #pined < #texts then for _ = 1, #texts do @@ -134,17 +148,17 @@ function M.func(input, env) end end -- 处理简繁转换后的问题 - local candtext = cand.text + local cand_text = cand.text if cand:get_dynamic_type() == "Shadow" then -- handle cands converted by simplifier local originalCand = cand:get_genuine() - if #originalCand.text == #candtext then - -- 笑|😄 candtext = 😄; 麼|么 candtext = 麼; - candtext = originalCand.text + if #originalCand.text == #cand_text and not is_in_list({ "↑", "←", "→", "↓", "丶", "✅", "✔", "⭕" }, cand.text) then + -- 笑|😄 cand_text = 😄; 麼|么 cand_text = 麼; + cand_text = originalCand.text end end -- 要置顶的放到 pined 中,其余的放到 others - local ok, idx = is_in_list(texts, candtext) + local ok, idx = is_in_list(texts, cand_text) if ok then pined[idx] = cand pined_count = pined_count + 1 @@ -155,12 +169,7 @@ function M.func(input, env) if pined_count == #texts or #others > 50 then break end - else - table.insert(others, cand) - break end - - ::continue:: end -- yield pined others 及后续的候选项 diff --git a/rime_ice.schema.yaml b/rime_ice.schema.yaml index b6edb4b..116f7e8 100644 --- a/rime_ice.schema.yaml +++ b/rime_ice.schema.yaml @@ -146,22 +146,22 @@ pin_cand_filter: # 单编码 - q 去 千 - w 我 万 往 - - e 呃 + - e 呃 🤔 - r 让 人 - t 他 她 它 祂 - y 与 于 # - u 在 custom_phrase 置顶 # - i 在 custom_phrase 置顶 - - o 哦 + - o 哦 😮 - p 片 篇 - - a 啊 + - a 啊 😲 😦 😧 - s 是 时 使 式 - d 的 地 得 - f 发 放 分 - g 个 各 - h 和 或 - j 及 将 即 既 继 - - k 可 + - k 可 🉑 - l 了 啦 喽 嘞 - z 在 再 自 - x 想 像 向 @@ -170,12 +170,12 @@ pin_cand_filter: - b 吧 把 呗 百 - n 那 哪 拿 呐 - m 吗 嘛 呣 - # 单字 + # 常用单字 - qing 请 - qu 去 - wo 我 - wei 为 - - er 而 儿 二 + - er 而 儿 二 2️⃣ - en 嗯 - rang 让 - ta 他 她 它 祂 @@ -186,12 +186,16 @@ pin_cand_filter: - yao 要 - ye 也 - shi 是 时 使 式 + - suo 所 + - shang 上 ⬆️ ↑ + - shuo 说 - de 的 地 得 - dan 但 + - dou 都 - dao 到 倒 - - dian 点 + - dian 点 · 丶 - dang 当 - - dui 对 + - dui 对 ⭕ ✅ ✔ - fa 发 - ge 个 各 - gang 刚 @@ -199,12 +203,12 @@ pin_cand_filter: - huo 或 - hui 会 - hai 还 - - hao 好 + - hao 好 👌 🙆‍♂️ 🙆‍♀️ - ji 及 即 既 - jiu 就 - jiang 将 - - ke 可 - - kan 看 + - ke 可 🉑 + - kan 看 👀 - kai 开 - le 了 - la 啦 拉 @@ -216,11 +220,11 @@ pin_cand_filter: - zhen 真 - zui 最 - zheng 正 - - zuo 做 坐 左 + - zuo 做 坐 左 ⬅️ ← - ze 则 - xiang 想 像 向 - xian 先 - - xia 下 + - xia 下 ⬇️ ↓ - xing 行 - cai 才 - cong 从 @@ -232,18 +236,20 @@ pin_cand_filter: - bie 别 - bi 比 - bing 并 - - na 那 哪 拿 + - na 那 哪 拿 呐 - ni 你 - ma 吗 嘛 妈 - mei 没 + - mai 买 卖 # ta、na - ta men 他们 她们 它们 - tm 他们 她们 它们 - ta de 他的 她的 它的 + - td 他的 她的 它的 - ta men de 他们的 她们的 它们的 - na er 那儿 哪儿 - na ge 那个 哪个 - - ng 那个 哪个 + - ng 那个 哪个 拿个 - na xie 那些 哪些 - na li 那里 哪里 - na bian 那边 哪边