Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

建议开放自定义字符集过滤功能 #492

Closed
sezhai opened this issue Jan 11, 2020 · 14 comments
Closed

建议开放自定义字符集过滤功能 #492

sezhai opened this issue Jan 11, 2020 · 14 comments
Labels

Comments

@sezhai
Copy link

sezhai commented Jan 11, 2020

Rime的生僻字过滤有些问题。用gb2312会打不出一些中文标点,如破折号“——”、间隔号“・”等,用gbk的话各种生僻字又都出来了,对于像五笔之类需要减少重码的输入方式不太方便。
建议修正一下gb2312字符集的问题。或者最好能开放自定义字符集过滤功能。这一点,小小输入法已经做了。如果rime能实现,那就太好了。

@Ace-Who
Copy link

Ace-Who commented Jan 11, 2020

参考 #469

@sezhai
Copy link
Author

sezhai commented Jan 12, 2020

参考 #469

谢谢,符号的问题解决了。请问,有办法让个别字不被拦截吗?

@Ace-Who
Copy link

Ace-Who commented Jan 12, 2020

也许有,但问题描述更具体点比较好判断。

@sezhai
Copy link
Author

sezhai commented Jan 12, 2020

也许有,但问题描述更具体点比较好判断。

比如说,启用gb2312的情况下打不出“濛”字。能让启用gb2312的情况下打出这个字来吗?也就是根据个人情况灵活调整哪些是生僻字,哪些是常用字。

@Ace-Who
Copy link

Ace-Who commented Jan 12, 2020

似乎有个复杂点的办法。改天看看。

@Ace-Who
Copy link

Ace-Who commented Jan 12, 2020

不过滤生僻字导致重码的话,可以不影响打常用字——因为它们排在前面,顺序固定,至少有办法做到——除非你是需要四码无重自动上屏,有这个要求吗?

@Ace-Who
Copy link

Ace-Who commented Jan 12, 2020

根据需求细节的不同,可能有不同的最省力的做法。

@sezhai
Copy link
Author

sezhai commented Jan 13, 2020

看到网上有这个方法。按照他说的在windows7下弄了弄,启用之后就打不出字了,不知道为什么。

包括一个 rime.lua 脚本,与一个 lua 文件夹。rime.lua 是 Rime 读取 lua 脚本的入口,lua 过滤器的函数必须在 rime.lua 文件中声明。
但是如果把全部代码都写入到一个文件中的话,会让 rime.lua 文件变得很臃肿,因此可以把真正的脚本代码放入 lua/charset.lua 中,然后在 rime.lua 中引入它。
--[[
charset_filter: 生僻字过滤器
--]]

-- 从 txt 文件中读取全部字符
-- return: string
local function read_chars(filename)
local chars = ""
for line in io.lines(filename) do
chars = chars..line
end
return chars
end

-- 自定义字符集列表 (字符串列表),候选词只能包括列表中的字符,否则将被过滤掉
local charsets = {
-- 通过 read_chars 读取 txt 文件中的所有字符并添加到字符集列表中
-- 将相应的字符写入 txt 文件中,然后通过 read_chars 在这里引入它就可以
-- 这里为了区分不同的字符集,将它们写入了不同的 txt 文件中,但是你也可以只使用一个 txt 文件
-- 这里似乎只能使用 txt 文件的绝对路径,怎么使用相对文件路径我还没有搞清楚

-- lua 中通过 .. 连接两个字符串,而 os.getenv("HOME") 表示我的 HOME 目录 (Windows 下不能这样)
-- os.getenv("HOME").."/Library/Rime/lua/chars/emoji.txt" 等同于 "/Users/zengxs/Library/Rime/lua/chars/emoji.txt"
read_chars(os.getenv("HOME").."/Library/Rime/lua/chars/emoji.txt"), -- emoji 字符集
read_chars(os.getenv("HOME").."/Library/Rime/lua/chars/symbols.txt"), -- 符号字符集
read_chars(os.getenv("HOME").."/Library/Rime/lua/chars/alphanum.txt"), -- 数字字母字符集
read_chars(os.getenv("HOME").."/Library/Rime/lua/chars/mandarin.txt"), -- 通用规范汉字表
}

-- 验证一个字符编码是否在自定义的字符集中
local function is_valid_char(char_code)
for i=1, #(charsets) do
for p, code in utf8.codes(charsets[i]) do
if (code == char_code) then
return true
end
end
end
return false
end

-- 检查字符串是否符合要求
local function is_valid_string(text)
for p, char_point in utf8.codes(text) do
if (not is_valid_char(char_point)) then
return false
end
end
return true
end

local function filter(input)
for cand in input:iter() do
if (is_valid_string(cand.text)) then
yield(cand)
end
end
end

return filter
然后修改 rime.lua:
-- charset_filter 将会是字符集过滤器的名称
charset_filter = require("charset")
然后在 luna_pinyin.custom.yaml 中启用这个过滤器:
patch:

engine/filters/+ 表示在现有的「过滤器列表」末尾再添加下面的过滤器

engine/filters/+:
- lua_filter@charset_filter
然后重新部署就就可以看到字符集已经生效了。

@Ace-Who
Copy link

Ace-Who commented Jan 13, 2020

用 lua 是有办法,但不是所有发行版都支持 lua,如手机上的同文和 iRime 目前就不支持。这个代码格式也没贴对,就不看了。

@sezhai
Copy link
Author

sezhai commented Jan 13, 2020

好的。有时间的话请您指点一下windows下引用自定义码表过滤生僻字的lua代码的写法

@Ace-Who
Copy link

Ace-Who commented Jan 14, 2020

不如直接修改码表。需要的只是筛出一份 GB2312 的码表,在此基础上添加新字,编码可以从原码表获取。

@sezhai
Copy link
Author

sezhai commented Jan 14, 2020

修改词库码表的话,在需要输入生僻字的话又不方便了。rime自带的GB2312 ,能修改吗?

@Ace-Who
Copy link

Ace-Who commented Jan 14, 2020

生僻字如果只是临时输入,好解决,需要用引导键。

据我所知 rime 官方的五笔86是七万字的码表,不是 GB2312。右上角创建一个 gist,把文件内容复制进去方便讨论。方案文件也需要修改。

@lotem
Copy link
Member

lotem commented Jan 15, 2020

#91

@lotem lotem closed this as completed Jan 15, 2020
@lotem lotem added the wontfix label Jan 15, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants