From e33e1d2c4490fec3e72698d2481124201926c463 Mon Sep 17 00:00:00 2001 From: Shewer Lu Date: Sat, 1 Jun 2024 21:29:27 +0800 Subject: [PATCH] chore: some adjustments for unicode.lua (#898) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update unicode.lua 1. config:get_string() 可能取得 nil , 增加預設字串 2. seg:has_tag() , input == "" 提前判斷,可以避免 patterns 未設定的問題 * trim and add change log --------- Co-authored-by: mirtlecn --- lua/unicode.lua | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/lua/unicode.lua b/lua/unicode.lua index ff7614c..d318654 100644 --- a/lua/unicode.lua +++ b/lua/unicode.lua @@ -3,26 +3,32 @@ -- 示例:输入 U62fc 得到「拼」 -- 触发前缀默认为 recognizer/patterns/unicode 的第 2 个字符,即 U -- 2024.02.26: 限定编码最大值 +-- 2024.06.01: 部分变量初始化,条件语句调整。 + +local path = 'recognizer/patterns/unicode' local function unicode(input, seg, env) + if not seg:has_tag("unicode") or input == '' then return end -- 获取 recognizer/patterns/unicode 的第 2 个字符作为触发前缀 - env.unicode_keyword = env.unicode_keyword or - env.engine.schema.config:get_string('recognizer/patterns/unicode'):sub(2, 2) - if seg:has_tag("unicode") and env.unicode_keyword ~= '' and input:sub(1, 1) == env.unicode_keyword then - local ucodestr = input:match(env.unicode_keyword .. "(%x+)") - if ucodestr and #ucodestr > 1 then - local code = tonumber(ucodestr, 16) - if code > 0x10FFFF then - yield(Candidate("unicode", seg.start, seg._end, "数值超限!", "")) - return - end - local text = utf8.char(code) - yield(Candidate("unicode", seg.start, seg._end, text, string.format("U%x", code))) - if code < 0x10000 then - for i = 0, 15 do - local text = utf8.char(code * 16 + i) - yield(Candidate("unicode", seg.start, seg._end, text, string.format("U%x~%x", code, i))) - end - end + -- config:get_string(path) 可能取得 nil 造成error + if not env.unicode_keyword then + local pattern = env.engine.schema.config:get_string(path) or "UU" + env.unicode_keyword = pattern:sub(2,2) + end + + local ucodestr = input:match(env.unicode_keyword .. "(%x+)") + if ucodestr and #ucodestr > 1 then + local code = tonumber(ucodestr, 16) + if code > 0x10FFFF then + yield(Candidate("unicode", seg.start, seg._end, "数值超限!", "")) + return + end + local text = utf8.char(code) + yield(Candidate("unicode", seg.start, seg._end, text, string.format("U%x", code))) + if code < 0x10000 then + for i = 0, 15 do + local text = utf8.char(code * 16 + i) + yield(Candidate("unicode", seg.start, seg._end, text, string.format("U%x~%x", code, i))) + end end end end