nk2028/qieyun-autoderiver

Features to be implemented

graphemecluster opened this issue · 5 comments

  • 指定某自訂選項是否可見
  • 格式化推導結果(粗體斜體等)
  • 適配 Qieyun.js 0.13
  • 用 tshet-uinh-deriver-tools
  • TypeScript 推導方案支援
  • Prettier, ESLint 導入
  • 文章/推導結果分割顯示
  • Dark mode
  • 改善面板靈活性
  • 本地檔案載入/儲存
  • 改為以 Web Worker 執行腳本
  • 將 render 部分搬回 React

範例(暫且放此)

if (!音韻地位) {
    const 地位 = Qieyun.音韻地位.from描述("幫三凡入");
    const 屬性 = new Set(Object.getOwnPropertyNames(地位).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(地位))));
    屬性.delete("constructor");
    屬性.delete("判斷");
    屬性.delete("等於");
    return [
        ["音韻屬性", ["屬於", ...屬性]],
        ["表達式", "冬韻 平聲", 選項.音韻屬性 === "屬於"],
    ]
}
if (選項.音韻屬性 === "屬於") {
    const result = 音韻地位.屬於(選項.表達式);
    return ({ b, fg }) => fg(result ? "green" : "red")`${result ? b`1` : "0"}`;
}
return 音韻地位[選項.音韻屬性];
["表達式", "冬韻 平聲", 選項.音韻屬性 === "屬於"],

從這行可以看出來,用戶調整選項後,是通過「再調用一次推導方案」(傳入用戶當前選項)來生成新的列表。

但既然這樣的話,為什麼不直接構造一個新列表返回呢?(就像 React 的 render 函數那樣)

代碼例:

if (!音韻地位) {
    const 地位 = Qieyun.音韻地位.from描述("幫三凡入");
    const 屬性 = new Set(Object.getOwnPropertyNames(地位).concat(Object.getOwnPropertyNames(Object.getPrototypeOf(地位))));
    屬性.delete("constructor");
    屬性.delete("判斷");
    屬性.delete("等於");
    const 列表 = [
        ["音韻屬性", ["屬於", ...屬性]],
    ];
    if (選項.音韻屬性 === "屬於") 列表.push(["表達式", "冬韻 平聲"]);
    return 列表;
}

而且這樣不僅能 filter 還能 map,比如可以根據用戶的某選項值,改變其他選項的可選值等。

但既然這樣的話,為什麼不直接構造一個新列表返回呢?(就像 React 的 render 函數那樣)

好像這樣還產生了更多可能性😂:因為每次調整選項都重新產生一次選項列表,新產生的列表完全沒有任何約束,因此甚至可以寫出像這種兩選項「交替切換」的效果」:

if (!音韻地位) {
    if (選項.選項A === false) {
        return [["選項B", true]];
    } else {
        return [["選項A", true]];
    }
}
return '';

(嘛不過感覺這個功能還是很好的233

↑給 qieyun-js 開了相關的 issue,並詳細說明了下現狀。

好耶~