Jackchows / Cangjie5

倉頡五代補完計劃
MIT License
141 stars 17 forks source link

v3.2.1 RimeData preedit_comment正则错误 #288

Open WindyValley opened 5 months ago

WindyValley commented 5 months ago

20240518的Release里,默认preedit_comment中的正则错误,查看buildRelease.py脚本发现已经修正,是否可以重新发布release? 以下是小狼毫日志截图: image

WindyValley commented 5 months ago

看起来现在方案里的正则是为了处理 zsxxx=㇣ 这种后面有多个x的,我再研究一下

WindyValley commented 5 months ago
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正则似乎不支持在反向查找表达式里使用通配符,只能这样枚举了,左右最多也就五个码🤣,大佬们如果有更好地办法麻烦告诉我一下

danny0838 commented 5 months ago

不是不支援萬用字元,是正規表示式引擎不支援非固定長度的 lookbehind assertion,比如 (?<=.) 長度固定是 1 就沒問題,而 (?<=.*) 長度是 0 至無限大就不行。

改成一般的 capture group 應該就可以了,像這樣: xform/^(x*)x/$1#/

WindyValley commented 5 months ago

不是不支援萬用字元,是正規表示式引擎不支援非固定長度的 lookbehind assertion,比如 (?<=.) 長度固定是 1 就沒問題,而 (?<=.*) 長度是 0 至無限大就不行。

改成一般的 capture group 應該就可以了,像這樣: xform/^(x*)x/$1#/

不行唉,这样只能换掉最后一个

WindyValley commented 5 months ago

我的写法也不行,comment里不生效,因为comment里第一个字符是~,这里似乎也拿不到完整的编码,估计得靠Lua插件才行了

danny0838 commented 5 months ago

按照 xform/(?<=(^x*))x/#/ 寫出來的同義正規表示式就是 xform/^(x*)x/$1#/

如果是想把所有 x 都換掉,那寫成更簡單的 xform/^x+/#/ 即可。

Jackchows commented 5 months ago

窮舉的話我想可以這樣

  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那裡不能這樣寫,因為有~

Jackchows commented 5 months ago

先改這樣發一版,至少不報錯。zsxxx~的問題再慢慢研究。🫣

  preedit_format:
    - 'xform/(?<![^x])x/#/'
    - "xlit|abcdefghijklmnopqrstuvwxyz#|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜片重|"
  comment_format:
    - 'xform/(?<![^x])x/#/'
    - "xlit|abcdefghijklmnopqrstuvwxyz#~|日月金木水火土竹戈十大中一弓人心手口尸廿山女田難卜片重~|"
danny0838 commented 5 months ago

就我的理解,只有用於去重的X應該顯示為「重」,其餘都應該顯示為「難」。另外Z的顯示也有不同看法,由於不是六代,且主要用於輸入特殊符號,因此以往的方案都是顯示為「符」。

所以像「,」的「zxab」應顯示為「符難日月」,「㇣」的「zsxxx」應顯示為「符尸難難難」,〇「xxxxx」應顯示為「難難難難難」。「曰」的「xa」應顯示為「重日」。

不過對於 comment,輸入「重」之後的「~日」和輸入「竹」之後的「~難卜金」,系統收到的分別是「~a」和「~xyc」,目前 RIME 的系統似乎無法取得已輸入的碼,恐怕是無法區分二者,大概要發 issue 請 RIME 開發者擴充功能了。

Jackchows commented 5 months ago

「片」不是六代特有的,五代手冊中的「Z」鍵定義就是「片/造」(「片」指「片語」)。補完計劃也將「Z」用在輸入鏡像、旋轉字,所以我覺得顯示成「片」會比較貼切。 「〇」字我覺得用「難」或者「重」都可以接受。

Snipaste_2024-05-28_09-08-12
danny0838 commented 5 months ago

基於尊重原作,「Z」用「片」我沒意見。但是我看不出「〇」用「重重重重重」有什麼合理性。

Jackchows commented 5 months ago

當然不一定要照搬官方,「〇」寫「難」的話似乎比較好理解,那就要單獨處理一下xxxxxzsxxx

(如果按原教旨主義的角度,「〇」的定義是標點符號,不算「難字」也不算「重複字」。另外倉頡系統似乎不區分漢字「丶」(U+4E36)和標點符號「、」(U+3001),例如漢文庫典衹能查到「、」(U+3001),但是頁面上的Unicode又是4E36。)

IMG_7228 IMG_7229 IMG_7230

danny0838 commented 5 months ago

所謂重碼字,自然是先有本字,才有對應的重碼字。「〇」的「XXXXX」如果視作「重重重重重」,那根本沒有本字,何來重碼?如果視作「重重重重難」,也說不通,因為「〇」並沒有一個取碼為「難*」的本字;且就算這麼取碼,也沒有相應的4個重碼字存在。

那麼目前「〇」的「XXXXX」只能當作倉頡系統特設的定義了。至於這些特設定義的碼如何呈現,大概只有詢問朱邦復工作室才能確認吧。另一個五代RIME方案是一律把「X」顯示為「難」,技術上這樣做最簡單吧,也可以避開前述 comment 無法確定「重」或「難」的問題。


另外有個疑問。五代手冊似乎沒有明說「XXXXX」對應什麼符號。目前有其他可靠來源能證明該字元是漢字「〇」而非其他圓圈符號嗎?

Jackchows commented 5 months ago

根據五代手冊可以判斷漢字「〇」對應「XXXXX」,因為圓圈「○」是「YYYBK」: 圖片 圖片 「難字」一節也很明確沒有「〇」: 圖片 那麼在「〇」字的問題上,我覺得按照手冊用「重重重重重」是可以的。

danny0838 commented 5 months ago

原來是深藏在手冊碼表中的X部……不過儘管如此,我還是覺得「重重重重重」於理不合,而且無法排除是筆誤(因為X部幾乎都是「重…」開頭,可能因此漏掉了特別定義的「XXXXX」)。

至於「○」非難字的說法,我認為如果可以接受三代的「ZXAB」等顯示成「片難日月」,那「XXXXX」比照顯示為「難難難難難」無妨。對於這些符號,每個碼本來就都不管拆字規則,一律當作純粹的「字母」,「X」這種「難/重」的特殊情況,應該可以認定為,除非符合後者的條件,一律預設為前者。

維基教科書的五代符號表是把XXXXX和YYYBK一樣對應到「○」(但沒有列出來源),而三代和六代都很神奇地沒有該符號,如果「○」是不同符號,六代沒定義似乎有點說不通。

雖然我個人也認為將「XXXXX」解釋為漢字「○」比較合理,不過目前資訊似乎還無法稱得上足夠明確呢。

danny0838 commented 5 months ago

我找到了另一個可能比較有說服力的資料:

在官網提供的文字版五代手冊,二者分別是「?? 重重重重重 XXXXX」和「○ 卜卜卜月叉 YYYBK」。此手冊似乎是輸出為Big5編碼,Big5不支援的字元都顯示為??。由於漢字「○」是Big5不支援的字元(但倚天Big5有編在C6E2),根據「XXXXX」顯示為「??」應該可以合理推論是它。

如果大家都同意,可以找個時間改一下維基XD