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

v3.2.1 RimeData preedit_comment正则错误 #288

Open
WindyValley opened this issue May 26, 2024 · 16 comments
Open

v3.2.1 RimeData preedit_comment正则错误 #288

WindyValley opened this issue May 26, 2024 · 16 comments

Comments

@WindyValley
Copy link

WindyValley commented May 26, 2024

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

@WindyValley
Copy link
Author

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

@WindyValley
Copy link
Author

WindyValley commented May 26, 2024

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
Copy link

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

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

@WindyValley
Copy link
Author

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

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

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

@WindyValley
Copy link
Author

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

@danny0838
Copy link

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

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

@Jackchows
Copy link
Owner

Jackchows commented May 26, 2024

窮舉的話我想可以這樣

  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
Copy link
Owner

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

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

@danny0838
Copy link

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

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

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

@Jackchows
Copy link
Owner

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

@danny0838
Copy link

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

@Jackchows
Copy link
Owner

Jackchows commented May 30, 2024

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

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

IMG_7228
IMG_7229
IMG_7230

@danny0838
Copy link

danny0838 commented May 31, 2024

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

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


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

@Jackchows
Copy link
Owner

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

@danny0838
Copy link

danny0838 commented May 31, 2024

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

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

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

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

@danny0838
Copy link

danny0838 commented May 31, 2024

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants