Open WindyValley opened 5 months ago
看起来现在方案里的正则是为了处理 zsxxx=㇣ 这种后面有多个x的,我再研究一下
patch:
translator/preedit_format: # 已輸入編碼
- 'xform/^([a-z]*)$/$1\t(\U$1\E)/'
- 'xform/(?<=(XXXX)X/#/'
- 'xform/(?<=(XXX)X/#/'
- 'xform/(?<=(XX)X/#/'
- 'xform/(?<=(X)X/#/'
- 'xform/(?<=()X/#/'
- "xlit|ABCDEFGHIJKLMNOPQRSTUVWXYZ#|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜符重|"
translator/comment_format: # 編碼提示
- 'xform/(?<=^xxxx)x/#/'
- 'xform/(?<=^xxx)x/#/'
- 'xform/(?<=^xx)x/#/'
- 'xform/(?<=^x)x/#/'
- 'xform/(?<=^)x/#/'
- "xlit|abcdefghijklmnopqrstuvwxyz#~|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜符重~|"
reverse_lookup:
dictionary: rime_ice
prism: double_pinyin_flypy
prefix: "`"
suffix: "'"
tips: 〔双拼〕
overwrite_comment: true
comment_format:
- 'xform/(?<=^xxxx)x/#/'
- 'xform/(?<=^xxx)x/#/'
- 'xform/(?<=^xx)x/#/'
- 'xform/(?<=^x)x/#/'
- 'xform/(?<=^)x/#/'
- "xform/$/〕/"
- "xform/^/〔/"
- "xlit|abcdefghijklmnopqrstuvwxyz#~ |日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜符重~、|"
librime使用的boost_regex里的perl正则似乎不支持在反向查找表达式里使用通配符,只能这样枚举了,左右最多也就五个码🤣,大佬们如果有更好地办法麻烦告诉我一下
不是不支援萬用字元,是正規表示式引擎不支援非固定長度的 lookbehind assertion,比如 (?<=.)
長度固定是 1 就沒問題,而 (?<=.*)
長度是 0 至無限大就不行。
改成一般的 capture group 應該就可以了,像這樣: xform/^(x*)x/$1#/
。
不是不支援萬用字元,是正規表示式引擎不支援非固定長度的 lookbehind assertion,比如
(?<=.)
長度固定是 1 就沒問題,而(?<=.*)
長度是 0 至無限大就不行。改成一般的 capture group 應該就可以了,像這樣:
xform/^(x*)x/$1#/
。
不行唉,这样只能换掉最后一个
我的写法也不行,comment里不生效,因为comment里第一个字符是~,这里似乎也拿不到完整的编码,估计得靠Lua插件才行了
按照 xform/(?<=(^x*))x/#/
寫出來的同義正規表示式就是 xform/^(x*)x/$1#/
。
如果是想把所有 x 都換掉,那寫成更簡單的 xform/^x+/#/
即可。
窮舉的話我想可以這樣
preedit_format:
- 'xform/^([a-z]*)$/$1\t(\U$1\E)/'
- 'xform/^([^x]{2})xxx/$1###/' # ㇣ zsxxx 片尸重重重
- 'xform/^([^x]{2})xx/$1##/'
- 'xform/^([^x]{2})x/$1#/'
- 'xform/^xxxxx/#####/' # 〇 xxxxx 重重重重重
- 'xform/^xxxx/####/'
- 'xform/^xxx/###/' # 戎 xxxik 重重重戈大
- 'xform/^xx/##/' # 𨈑 xxhx 重重竹難
- 'xform/^x/#/' # 𦥑 xhx 重竹難
- "xlit|abcdefghijklmnopqrstuvwxyz#~|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜片重~|"
但是comment_format那裡不能這樣寫,因為有~
。
先改這樣發一版,至少不報錯。zsxxx
和~
的問題再慢慢研究。🫣
preedit_format:
- 'xform/(?<![^x])x/#/'
- "xlit|abcdefghijklmnopqrstuvwxyz#|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜片重|"
comment_format:
- 'xform/(?<![^x])x/#/'
- "xlit|abcdefghijklmnopqrstuvwxyz#~|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜片重~|"
就我的理解,只有用於去重的X應該顯示為「重」,其餘都應該顯示為「難」。另外Z的顯示也有不同看法,由於不是六代,且主要用於輸入特殊符號,因此以往的方案都是顯示為「符」。
所以像「,」的「zxab」應顯示為「符難日月」,「㇣」的「zsxxx」應顯示為「符尸難難難」,〇「xxxxx」應顯示為「難難難難難」。「曰」的「xa」應顯示為「重日」。
不過對於 comment,輸入「重」之後的「~日」和輸入「竹」之後的「~難卜金」,系統收到的分別是「~a」和「~xyc」,目前 RIME 的系統似乎無法取得已輸入的碼,恐怕是無法區分二者,大概要發 issue 請 RIME 開發者擴充功能了。
「片」不是六代特有的,五代手冊中的「Z」鍵定義就是「片/造」(「片」指「片語」)。補完計劃也將「Z」用在輸入鏡像、旋轉字,所以我覺得顯示成「片」會比較貼切。 「〇」字我覺得用「難」或者「重」都可以接受。
基於尊重原作,「Z」用「片」我沒意見。但是我看不出「〇」用「重重重重重」有什麼合理性。
當然不一定要照搬官方,「〇」寫「難」的話似乎比較好理解,那就要單獨處理一下xxxxx
和zsxxx
。
(如果按原教旨主義的角度,「〇」的定義是標點符號,不算「難字」也不算「重複字」。另外倉頡系統似乎不區分漢字「丶」(U+4E36)和標點符號「、」(U+3001),例如漢文庫典衹能查到「、」(U+3001),但是頁面上的Unicode又是4E36。)
所謂重碼字,自然是先有本字,才有對應的重碼字。「〇」的「XXXXX」如果視作「重重重重重」,那根本沒有本字,何來重碼?如果視作「重重重重難」,也說不通,因為「〇」並沒有一個取碼為「難*」的本字;且就算這麼取碼,也沒有相應的4個重碼字存在。
那麼目前「〇」的「XXXXX」只能當作倉頡系統特設的定義了。至於這些特設定義的碼如何呈現,大概只有詢問朱邦復工作室才能確認吧。另一個五代RIME方案是一律把「X」顯示為「難」,技術上這樣做最簡單吧,也可以避開前述 comment 無法確定「重」或「難」的問題。
另外有個疑問。五代手冊似乎沒有明說「XXXXX」對應什麼符號。目前有其他可靠來源能證明該字元是漢字「〇」而非其他圓圈符號嗎?
根據五代手冊可以判斷漢字「〇」對應「XXXXX」,因為圓圈「○」是「YYYBK」: 「難字」一節也很明確沒有「〇」: 那麼在「〇」字的問題上,我覺得按照手冊用「重重重重重」是可以的。
原來是深藏在手冊碼表中的X部……不過儘管如此,我還是覺得「重重重重重」於理不合,而且無法排除是筆誤(因為X部幾乎都是「重…」開頭,可能因此漏掉了特別定義的「XXXXX」)。
至於「○」非難字的說法,我認為如果可以接受三代的「ZXAB」等顯示成「片難日月」,那「XXXXX」比照顯示為「難難難難難」無妨。對於這些符號,每個碼本來就都不管拆字規則,一律當作純粹的「字母」,「X」這種「難/重」的特殊情況,應該可以認定為,除非符合後者的條件,一律預設為前者。
維基教科書的五代符號表是把XXXXX和YYYBK一樣對應到「○」(但沒有列出來源),而三代和六代都很神奇地沒有該符號,如果「○」是不同符號,六代沒定義似乎有點說不通。
雖然我個人也認為將「XXXXX」解釋為漢字「○」比較合理,不過目前資訊似乎還無法稱得上足夠明確呢。
20240518的Release里,默认preedit_comment中的正则错误,查看buildRelease.py脚本发现已经修正,是否可以重新发布release? 以下是小狼毫日志截图: