diff --git a/.gitignore b/.gitignore index 8c35d0b..32648d0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ dist-ssr # Editor directories and files .vscode/* +!.vscode/*.code-snippets !.vscode/extensions.json .idea .DS_Store diff --git a/.vscode/react.code-snippets b/.vscode/react.code-snippets new file mode 100644 index 0000000..df5c6e2 --- /dev/null +++ b/.vscode/react.code-snippets @@ -0,0 +1,59 @@ +{ + // hanzi-chai.github.io workspace snippets. + // Each snippet is defined under a snippet name and has a scope, prefix, body and description. + "template of react component file": { + "scope": "javascriptreact,typescriptreact", + "prefix": "tmplcomp", + "body": [ + "import React, { useState, useEffect, useRef, useReducer } from 'react'", + "import * as A from 'antd'", + "import * as atoms from '~/atoms'", + "", + "", + "//#region $TM_FILENAME_BASE default component", + "export interface ${TM_FILENAME_BASE}Props {", + " $1", + "}", + "export default function ${TM_FILENAME_BASE}(props: ${TM_FILENAME_BASE}Props) {", + " $0", + " return (<>", + " ", + " )", + "}", + "//#endregion", + ], + "description": "template of react component", + "isFileTemplate": true, + }, + "template of component": { + "scope": "javascriptreact,typescriptreact", + "prefix": "comp", + "body": [ + "//#region ${1:YourComponent} component", + "interface ${1:YourComponent}Props {", + " $2", + "}", + "", + "function ${1:YourComponent}(props: ${1:YourComponent}Props) {", + " $0", + " return (<>", + " ", + " )", + "}", + "//#endregion", + "", + ], + }, + "import antd components": { + "scope": "javascriptreact,typescriptreact", + "prefix": "impantd", + "body": "import * as A from 'antd'", + "description": "import * as A from 'antd'", + }, + "import atoms": { + "scope": "javascriptreact,typescriptreact,javascript,typescript", + "prefix": "impatoms", + "body": "import * as atoms from '~/atoms'", + "description": "import atoms from '~/atoms'", + }, +} diff --git a/examples/bxm.yaml b/examples/bxm.yaml new file mode 100644 index 0000000..2bdf0cf --- /dev/null +++ b/examples/bxm.yaml @@ -0,0 +1,1153 @@ +version: '0.1' +source: bxm +info: + name: 表形码 + author: 陈爱文 + version: '1.0' + description: 汉字表形符号和字素分类编码法 +analysis: + classifier: + 圈: 4 + 捺: 5 + 平捺: 5 + 横捺: 5 + 挑捺: 5 + 弯钩: 6 + 横钩: 6 + 横撇: 6 + 横折: 6 + 横折钩: 6 + 撇钩: 6 + 横折提: 6 + 横斜钩: 6 + 横折折: 7 + 横折弯: 7 + 横折弯钩: 7 + 横折折折钩: 8 + 横撇弯钩: 8 + 横折折撇: 8 + 横折折折: 8 + 竖提: 9 + 竖折: 9 + 竖弯: 9 + 竖弯钩: 9 + 撇点: 9 + 撇折: 9 + 斜钩: 9 + 竖折撇: 10 + 竖折折钩: 10 + 竖折折: 10 + degenerator: + no_cross: true + feature: + 提: 横 + 捺: 点 + selector: + - 结构完整 + - 根少优先 + - 全符笔顺 + - 能连不交 + - 能散不连 + - 非形近根 + - 取大优先 + customize: + 无: + - '1' + - 尢 + 戌: + - 戈 + - '3' + - '1' + 戍: + - 戈 + - '3' + - '4' + 兀: + - '1' + - 儿 + 辛: + - 亠 + - 䒑 + - 十 + 亚: + - '1' + - "\ue408" + - '1' + 产: + - 亠 + - 丷 + - 厂 + 佥: + - "\ue43d" + - '1' + - "\ue42d" + - '1' + 天: + - '1' + - 大 + 勿: + - 勹 + - "\ue41e" + 州: + - "\ue089" + - "\ue446" + - "\ue001" + 豙: + - 亠 + - 丷 + - 豕 + "\ue0a8": + - 冂 + - "\ue001" + 卞: + - '4' + - 下 + 余: + - "\ue43d" + - '1' + - 朩 + 互: + - '1' + - "\ue440" + - '1' + 农: + - "\uf000" + - "\ue438" + 衣: + - 亠 + - "\uf038" + - "\ue438" + "\ue02c": + - 土 + - 丷 + "\ue01a": + - "\ue057" + - '3' + "\ue01e": + - "\ue057" + - '4' + - '3' + "\ue0b7": + - "\uf038" + - "\ue438" + 隺: + - "\uf000" + - '2' + - "\ue428" + 㒸: + - 丷 + - 豕 + strong: + - '1' + - 二 + - "\ue40f" + customizeCorners: {} +form: + alphabet: abcdefghijklmnopqrstuvwxyz + mapping_type: 1 + grouping: + 首字母-ê: 首字母-e + "\ue452": 十 + "\ue401": 力 + "\ue0f1": 肀 + "\ue102": 王 + "\ue443": "\ue068" + "\ue44b": 禾 + 于: 干 + "\ue413": 十 + "\uf037": 帀 + "\ue0d1": 夫 + "\ue822": 北 + mapping: + '1': h + '2': i + '3': j + '4': d + '5': 'n' + '6': z + '7': z + '8': w + '9': l + '10': l + 丁: t + 土: 'y' + 二: g + 工: i + 走: e + 耂: j + 王: i + 三: g + 丰: f + 耒: m + "\ue064": r + 耳: b + 扌: f + 艹: h + 十: x + 廿: h + 甘: b + 木: m + 酉: s + "\ue052": c + 車: f + 覀: s + 石: p + 大: r + 厂: j + 不: t + 豕: q + 龙: w + 匚: c + 七: l + 牙: r + 车: l + 弋: s + 戈: s + 虫: c + "\ue018": l + 卜: l + 止: 'y' + 虍: j + 口: o + 囗: q + 足: e + 日: b + 刂: g + 田: q + 由: 'y' + 甲: t + 申: f + 非: x + 小: g + 目: b + 冂: 'n' + 巾: e + 山: e + 且: b + 见: w + 贝: r + 骨: 'n' + 罒: q + 皿: q + "\ue09e": k + "\ue078": v + 牛: f + 手: f + 气: k + 毛: l + 禾: u + 攵: a + 亻: v + 川: g + 片: k + 身: r + 臼: u + 鬼: w + 八: g + 人: v + 入: v + 彳: v + 乂: x + 食: k + 金: z + 彡: g + 丘: o + 爪: j + 瓜: j + 舟: 'n' + 豸: q + 月: 'n' + 几: w + 犭: q + 九: x + 丸: x + 鱼: u + 儿: w + 夕: d + 勹: h + 鸟: s + 乌: s + 匕: l + 言: i + 疒: j + 冫: d + 广: j + 鹿: j + 丬: k + 门: 'n' + 忄: l + 丷: g + 䒑: k + 羊: 'y' + 火: r + 氵: d + "\ue42d": g + 辶: z + 宀: 'n' + 礻: t + 衤: t + 心: u + 马: s + 尸: p + 尹: p + 彐: e + 又: a + 皮: a + 阝: p + 刀: h + 习: e + 力: x + 也: l + 子: z + 己: l + 已: l + 巳: l + 弓: w + 纟: w + 巛: g + 母: q + 厶: u + 女: a + 巴: l + "\ue0a6": s + "\ue41e": g + 了: w + "\ue024": j + "\ue002": f + 饣: k + "\ue000": i + 龶: 'y' + 夊: a + "\ue034": a + 瓦: a + "\ue070": q + "\ue0d2": 'n' + 㠯: b + "\ue414": b + "\ue415": s + 禹: c + 禺: c + 匸: c + 灬: d + "\ue447": x + "\ue01b": e + 肀: f + "\ue06d": t + 龷: s + 长: k + 镸: f + 中: f + "\ue075": f + 书: f + 韦: f + "\ue440": o + "\ue0a7": u + 及: a + 龴: z + "\ue434": z + 癶: x + 夂: a + "\ue0b8": b + "\ue419": b + 曰: b + 臣: c + "\ue0d5": c + "\ue0b4": e + 巨: c + "\ue08e": c + "\ue057": c + "\ue083": d + "\ue09b": x + "\ue088": g + "\ue00d": g + "\ue432": e + 䶹: e + 屮: e + "\ue0de": e + "\uf000": e + "\ue026": e + 牜: f + "\ue029": f + 㐄: f + "\ue411": f + 事: f + "\ue410": f + "\ue003": f + "\uf003": f + 巿: f + 串: f + "\uf006": f + 聿: f + "\uf007": f + "\ue048": f + "\ue412": f + "\ue0f8": f + "\ue089": g + "\ue446": g + "\ue03e": g + "\ue073": g + "\ue044": g + "\ue001": g + "\ue077": g + "\ue07f": g + 巜: g + "\ue0e2": g + "\ue0e3": g + 匁: e + "\ue050": h + 廾: h + 卅: h + 世: h + 册: h + "\ue0fb": h + "\ue11a": h + 乃: h + "\ue020": h + "\ue0bc": h + "\ue423": h + "\ue427": h + 正: i + 五: i + "\ue0df": i + "\ue085": i + 重: i + 垂: i + 讠: i + 亠: i + "\uf008": i + 主: i + "\ue428": i + "\ue451": 'y' + 爫: j + "\uf009": j + "\ue838": j + "\ue014": k + "\ue07c": k + 丌: k + "\ue448": g + "\ue422": k + "\ue0c8": l + "\ue02a": 'n' + 东: l + 乐: l + "\ue05c": l + "\ue079": l + 乜: l + 㔾: l + "\ue0a3": p + 朩: m + 屯: l + 电: l + "\ue0ec": l + "\ue011": l + "\ue051": l + 本: m + 朿: m + 果: m + 柬: m + 秉: m + 未: m + "\ue421": x + 冖: 'n' + 内: 'n' + 禸: 'n' + 丹: 'n' + 两: 'n' + 冉: 'n' + "\uf00b": 'n' + 凸: o + 凹: o + 囬: q + 卩: p + "\ue0b2": p + 廴: z + "\ue031": p + "\uf00c": p + "\ue06b": p + "\ue420": q + 乑: q + "\ue0a9": q + 豖: q + "\uf00f": q + "\uf011": q + "\ue0be": q + 毋: q + "\uf012": q + 囙: q + 丈: r + 史: r + 吏: r + 夷: r + 夬: r + 夫: r + 央: r + 曳: s + 臾: r + "\ue047": r + 矛: r + 西: s + "\ue03f": s + 戋: s + "\ue0da": s + 我: s + "\ue417": s + "\ue0a5": s + "\ue053": s + "\ue007": z + "\ue009": z + 丂: s + "\ue004": s + 专: s + 井: s + 曲: s + 开: s + "\ue0f4": s + "\ue066": s + 弗: s + 丅: t + 干: t + 帀: t + 下: t + "\ue008": t + "\uf013": t + "\ue05a": t + "\ue0eb": t + 弔: t + 丆: t + "\ue039": t + "\uf014": t + "\ue0ee": t + "\uf015": t + "\ue016": 'y' + "\ue042": 'y' + "\ue093": 'y' + 丩: u + 必: u + "\ue43d": v + "\uf017": v + "\ue0d6": w + 尢: w + "\ue100": w + 旡: w + 冘: w + 北: x + 幺: w + "\ue023": w + "\ue42f": x + 兆: x + 夗: x + "\ue408": x + "\ue863": x + "\ue42c": x + "\ue42b": x + "\ue985": x + "\uf018": x + "\uf019": x + 士: 'y' + 上: 'y' + "\ue0c1": 'y' + "\ue0f9": 'y' + "\ue0dd": 'y' + "\uf01a": 'y' + 钅: z + 孑: z + 孓: z + "\uf01c": z + "\ue0c6": e + "\ue131": c + "\ue8b9": e + "\ue125": e + 丯: f + "\ue15b": f + 帇: f + "\ue0fa": f + "\ue12f": f + "\uf01f": f + "\uf01e": f + 亊: f + "\ue442": g + 卌: h + "\ue112": h + 丗: h + "\ue076": h + 冊: h + 円: 'n' + 䍏: 'n' + "\uf020": h + "\ue124": h + 刄: h + 㐁: i + 飠: k + "\ue162": k + "\ue16f": k + "\ue14e": k + 爿: k + "\ue10c": l + "\uebc0": l + "\ue127": l + 黽: l + "\ue06f": l + 東: m + 束: m + "\ue130": m + "\ue12e": m + "\ue04c": h + 乗: m + 冄: 'n' + 冎: 'n' + "\ue105": 'n' + "\ue060": 'n' + "\ueaef": 'n' + "\ue8b2": o + "\ue09c": o + 亞: o + "\uf025": o + 卪: p + "\ue10e": p + 囧: q + "\ue0e7": r + "\ue068": x + "\ue043": r + "\ue449": r + 夨: r + "\uf026": r + 㬰: r + "\uf027": r + "\uf028": f + "\ue103": s + 㦮: s + 馬: s + 鳥: s + 烏: s + 亐: s + "\ue157": s + "\ue0d7": s + 襾: s + 亜: s + "\uf029": s + "\ue0f0": s + 糹: w + "\ue04e": x + 門: x + 鬥: x + "\uf02d": x + "\uf02e": x + "\uf02f": x + "\uf032": x + 臦: x + "\uf033": x + 戼: x + 丱: x + "\uf034": x + "\uf035": x + 卝: x + 丫: 'y' + "\ue030": 'y' + "\ue0e8": 'y' + 甴: 'y' + "\ue035": 'y' + "\ue114": 'y' + "\ue15a": 'y' + "\ue139": 'y' + "\uf036": z + 首字母-a: a + 首字母-b: b + 首字母-c: c + 首字母-d: d + 首字母-e: e + 首字母-f: f + 首字母-g: g + 首字母-h: h + 首字母-j: j + 首字母-k: k + 首字母-l: l + 首字母-m: m + 首字母-n: 'n' + 首字母-o: o + 首字母-p: p + 首字母-q: q + 首字母-r: r + 首字母-s: s + 首字母-t: t + 首字母-w: w + 首字母-x: x + 首字母-y: 'y' + 首字母-z: z + 凵: u + 末: m + 里: i + "\ue42e": x + 尨: w + "\ue117": f + "\uf038": j + "\ue438": k +encoder: + max_length: 4 + auto_select_length: 4 + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + next: c1 + s3: + object: {type: 字根, rootIndex: 3} + next: c2 + s4: + object: {type: 笔画, rootIndex: 2, strokeIndex: 1} + next: s5 + s5: + object: {type: 字音, subtype: 首字母} + next: null + s6: + object: {type: 字根, rootIndex: -1} + next: null + s7: + object: {type: 字音, subtype: 首字母} + next: null + s8: + object: {type: 笔画, rootIndex: 1, strokeIndex: 1} + next: c3 + s14: + object: {type: 笔画, rootIndex: 1, strokeIndex: 2} + next: s17 + s15: + object: {type: 字根, rootIndex: 1} + next: s16 + s16: + object: {type: 字音, subtype: 首字母} + next: null + s17: + object: {type: 字音, subtype: 首字母} + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: s8 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s3 + negative: s4 + c2: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s6 + negative: s7 + c3: + object: {type: 笔画, rootIndex: 1, strokeIndex: 2} + operator: 存在 + positive: s14 + negative: s15 +data: + repertoire: + "\uf000": + unicode: 61440 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 冘, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 冘二 + "\uf003": + unicode: 61443 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue036", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 姊字边二 + "\uf006": + unicode: 61446 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 疌, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}]}] + ambiguous: false + name: 疌无人 + "\uf007": + unicode: 61447 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 甫, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}]}] + ambiguous: false + name: 甫无丶 + "\uf008": + unicode: 61448 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 永, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 永二 + "\uf009": + unicode: 61449 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 氏, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 氏二 + "\uf00a": + unicode: 61450 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue07e", strokes: [{feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 旅下角后二 + "\uf00b": + unicode: 61451 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue00c", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 冒字头二 + "\uf00c": + unicode: 61452 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 艮, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 艮四 + "\uf00f": + unicode: 61455 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0e9", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 象下四 + "\uf010": + unicode: 61456 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [] + ambiguous: false + name: 象下后四 + "\uf011": + unicode: 61457 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0e9", strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 象下后五 + "\uf012": + unicode: 61458 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue069", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}]}] + ambiguous: false + name: 卑六无丿 + "\uf013": + unicode: 61459 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 疋, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 疋无人 + "\uf014": + unicode: 61460 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 斥, strokes: [{feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 斥下 + "\uf015": + unicode: 61461 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue03a", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 定字底三 + "\uf017": + unicode: 61463 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue03a", strokes: [{feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 定字底人 + "\uf018": + unicode: 61464 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 肃, strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}]}] + ambiguous: false + name: 肃下 + "\uf019": + unicode: 61465 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0d0", strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}]}] + ambiguous: false + name: 雨四点 + "\uf01b": + unicode: 61467 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [] + ambiguous: false + name: 承中 + "\uf01c": + unicode: 61468 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 承, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 承中 + "\uf01e": + unicode: 61470 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue12f", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}]}] + ambiguous: false + name: 挿字边无丿 + "\uf01f": + unicode: 61471 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue132", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 揷字边无丿 + "\uf020": + unicode: 61472 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue158", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 5}]}] + ambiguous: false + name: 飛字底四 + "\uf021": + unicode: 61473 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 一, strokes: [{feature: reference, index: 0}]}] + ambiguous: false + name: 亀无头 + "\uf024": + unicode: 61476 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 一, strokes: [{feature: reference, index: 0}]}] + ambiguous: false + name: 壺无士 + "\uf025": + unicode: 61477 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [冖, "\ue137"]}] + ambiguous: false + name: 壺无士 + "\uf026": + unicode: 61478 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 㑒, strokes: [{feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}]}] + ambiguous: false + name: 㑒无人 + "\uf027": + unicode: 61479 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue104", strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}, {feature: reference, index: 9}, {feature: reference, index: 10}]}] + ambiguous: false + name: 漢字边下 + "\uf028": + unicode: 61480 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue150", strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}, {feature: reference, index: 9}]}] + ambiguous: false + name: 㵮下角下 + "\uf029": + unicode: 61481 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [冖, "\ue136"]}] + ambiguous: false + name: 壷无士 + "\uf02a": + unicode: 61482 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 一, strokes: [{feature: reference, index: 0}]}] + ambiguous: false + name: 州二 + "\uf02c": + unicode: 61484 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [] + ambiguous: false + name: 鳏下角四点 + "\uf02d": + unicode: 61485 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0d9", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 鳏下角无竖 + "\uf02e": + unicode: 61486 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue16d", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}]}] + ambiguous: false + name: 畱字头无横 + "\uf02f": + unicode: 61487 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 淵字边无横 + "\uf032": + unicode: 61490 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿰, operandList: [刀, "\ue107"]}] + ambiguous: false + name: 齊字无丫 + "\uf033": + unicode: 61491 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 丣, strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}]}] + ambiguous: false + name: 丣无横 + "\uf034": + unicode: 61492 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue120", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 虛字底无横 + "\uf035": + unicode: 61493 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue129", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 斲字旁无横 + "\uf036": + unicode: 61494 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 之, strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 之下 + "\uf037": + unicode: 61495 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0d0", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 雨字头无四点 + "\uf038": + unicode: 61496 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0b7", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 衣省二 + glyph_customization: + "\uea02": + type: compound + operator: ⿴ + operandList: ["\ue42b", 幺] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue995": + type: compound + operator: ⿴ + operandList: [北, 口] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue9ab": + type: compound + operator: ⿴ + operandList: ["\ue863", 白] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + character_set: gb2312 diff --git a/examples/easy.yaml b/examples/easy.yaml new file mode 100644 index 0000000..260e336 --- /dev/null +++ b/examples/easy.yaml @@ -0,0 +1,1483 @@ +version: '0.1' +source: easy +info: + name: 易码 + version: '1.0' + author: 小泥巴 + description: 形码单字四二顶 +data: + repertoire: + : + unicode: 61443 + tygf: 0 + gb2312: false + name: 㗊上 + gf0014_id: null + readings: [] + glyphs: + - type: compound + operator: ⿰ + operandList: + - 口 + - 口 + ambiguous: false + : + unicode: 61440 + tygf: 0 + gb2312: false + name: 其字头无横 + gf0014_id: null + readings: [] + glyphs: + - type: derived_component + source:  + strokes: + - feature: reference + index: 0 + - feature: reference + index: 1 + - feature: reference + index: 2 + - feature: reference + index: 3 + - feature: reference + index: 4 + ambiguous: false + : + unicode: 61442 + tygf: 0 + gb2312: false + name: 囱字框省 + gf0014_id: null + readings: [] + glyphs: + - type: derived_component + source:  + strokes: + - feature: reference + index: 0 + - feature: reference + index: 1 + - feature: reference + index: 2 + ambiguous: false + : + unicode: 61441 + tygf: 0 + gb2312: false + name: 乑省 + gf0014_id: null + readings: [] + glyphs: + - type: derived_component + source: 乑 + strokes: + - feature: reference + index: 1 + - feature: reference + index: 2 + - feature: reference + index: 3 + - feature: reference + index: 4 + - feature: reference + index: 5 + ambiguous: false + : + unicode: 61444 + tygf: 0 + gb2312: false + name: 㗊下 + gf0014_id: null + readings: [] + glyphs: + - type: compound + operator: ⿰ + operandList: + - 口 + - 口 + ambiguous: false + 䒤: + unicode: 17572 + tygf: 0 + gb2312: false + name: null + gf0014_id: null + readings: [] + glyphs: + - type: compound + operator: ⿱ + operandList: + - 艹 + - 日 + ambiguous: false + glyph_customization: + 胤: + type: compound + tags: + - 横向包夹 + operator: ⿻ + operandList: + - 儿 + -  + order: + - index: 0 + strokes: 1 + - index: 1 + strokes: 0 + - index: 0 + strokes: 1 + 蕞: + type: compound + operator: ⿱ + operandList: + - 䒤 + - 取 + 亓: + type: compound + tags: [] + operator: ⿱ + operandList: + - 一 + - 丌 + 兽: + type: compound + operator: ⿱ + operandList: + -  + -  + 克: + type: basic_component + strokes: + - feature: 横 + start: + - 8 + - 17 + curveList: + - command: h + parameterList: + - 84 + - feature: 竖 + start: + - 50 + - 4 + curveList: + - command: v + parameterList: + - 30 + - feature: 竖 + start: + - 21 + - 34 + curveList: + - command: v + parameterList: + - 24 + - feature: 横折 + start: + - 21 + - 34 + curveList: + - command: h + parameterList: + - 58 + - command: v + parameterList: + - 24 + - feature: 横 + start: + - 21 + - 58 + curveList: + - command: h + parameterList: + - 58 + - feature: 撇 + start: + - 38 + - 58 + curveList: + - command: c + parameterList: + - 0 + - 6 + - 0 + - 26 + - -30 + - 35 + - feature: 竖弯钩 + start: + - 61 + - 58 + curveList: + - command: v + parameterList: + - 35 + - command: h + parameterList: + - 32 + 囱: + type: compound + operator: ⿳ + operandList: + -  + - 夂 + - 一 + 古: + type: basic_component + strokes: + - feature: 横 + start: + - 10 + - 40 + curveList: + - command: h + parameterList: + - 80 + - feature: 竖 + start: + - 50 + - 15 + curveList: + - command: v + parameterList: + - 45 + - feature: 竖 + start: + - 30 + - 60 + curveList: + - command: v + parameterList: + - 30 + - feature: 横折 + start: + - 30 + - 60 + curveList: + - command: h + parameterList: + - 40 + - command: v + parameterList: + - 30 + - feature: 横 + start: + - 30 + - 90 + curveList: + - command: h + parameterList: + - 40 + 囟: + type: compound + operator: ⿳ + operandList: + -  + - 乂 + - 一 + 隺: + type: compound + tags: + - 笔画搭挂 + operator: ⿻ + operandList: + - 冖 + - 隹 + : + type: compound + operator: ⿰ + operandList: + - 吅 + - 口 + 兕: + type: compound + operator: ⿱ + operandList: + -  + - 兀 + 衮: + type: compound + operator: ⿳ + operandList: + - 六 + - 厶 + -  + : + type: compound + operator: ⿺ + operandList: + -  + -  + 草: + type: compound + operator: ⿱ + operandList: + - 䒤 + - 十 + 熏: + type: compound + tags: + - 中竖截断 + operator: ⿱ + operandList: + - 千 + - 黑 + : + type: compound + operator: ⿲ + operandList: + -  + - 矢 + - 匕 + 昊: + type: compound + operator: ⿱ + operandList: + - 旦 + - 大 + 舍: + type: compound + tags: [] + operator: ⿱ + operandList: + - 亼 + - 古 + : + type: compound + operator: ⿻ + operandList: + -  + - 水 + 丢: + type: compound + tags: [] + operator: ⿱ + operandList: + - 壬 + - 厶 + : + type: compound + tags: + - 横向包夹 + operator: ⿻ + operandList: + -  + - 米 + order: + - index: 0 + strokes: 1 + - index: 1 + strokes: 0 + - index: 0 + strokes: 0 + 丝: + type: compound + operator: ⿰ + operandList: + - 纟 + - 纟 + 哀: + type: compound + operator: ⿱ + operandList: + -  + -  + 司: + type: basic_component + strokes: + - feature: 横折钩 + start: + - 12 + - 11 + curveList: + - command: h + parameterList: + - 71 + - command: v + parameterList: + - 83 + - feature: 横 + start: + - 15 + - 30 + curveList: + - command: h + parameterList: + - 57 + - feature: 竖 + start: + - 18 + - 49 + curveList: + - command: v + parameterList: + - 25 + - feature: 横折 + start: + - 18 + - 49 + curveList: + - command: h + parameterList: + - 38 + - command: v + parameterList: + - 25 + - feature: 横 + start: + - 18 + - 74 + curveList: + - command: h + parameterList: + - 38 + 兵: + type: compound + operator: ⿱ + operandList: + -  + -  + 菖: + type: compound + operator: ⿱ + operandList: + - 䒤 + - 日 + : + type: compound + tags: + - 笔画搭挂 + operator: ⿻ + operandList: + - 鱼 + - 人 + 㝵: + type: compound + operator: ⿱ + operandList: + - 旦 + - 寸 + 蔓: + type: compound + operator: ⿱ + operandList: + - 䒤 + -  + 直: + type: basic_component + strokes: + - feature: 横 + start: + - 9 + - 16 + curveList: + - command: h + parameterList: + - 82 + - feature: 竖 + start: + - 50 + - 4 + curveList: + - command: v + parameterList: + - 26 + - feature: 竖 + start: + - 23 + - 30 + curveList: + - command: v + parameterList: + - 60 + - feature: 横折 + start: + - 23 + - 30 + curveList: + - command: h + parameterList: + - 54 + - command: v + parameterList: + - 60 + - feature: 横 + start: + - 23 + - 45 + curveList: + - command: h + parameterList: + - 54 + - feature: 横 + start: + - 23 + - 60 + curveList: + - command: h + parameterList: + - 54 + - feature: 横 + start: + - 23 + - 74 + curveList: + - command: h + parameterList: + - 54 + - feature: 横 + start: + - 6 + - 90 + curveList: + - command: h + parameterList: + - 88 + 葛: + type: compound + operator: ⿱ + operandList: + - 䒤 + - 匃 + 堇: + type: compound + operator: ⿱ + operandList: + - 革 + - 二 + : + type: compound + operator: ⿳ + operandList: + - 十 + - 从 + - 冖 + : + type: compound + operator: ⿳ + operandList: + -  + - 米 + - 一 + : + type: compound + operator: ⿱ + operandList: + -  + - 冖 + 㐫: + type: compound + operator: ⿶ + operandList: + - 凵 + - 文 + order: + - index: 1 + strokes: 0 + - index: 0 + strokes: 0 + 元: + type: compound + tags: [] + operator: ⿱ + operandList: + - 一 + - 兀 + 㗊: + type: compound + operator: ⿱ + operandList: + -  + -  + : + type: compound + operator: ⿴ + operandList: + - 囗 + -  + 莫: + type: compound + operator: ⿱ + operandList: + - 䒤 + - 大 + 舆: + type: compound + operator: ⿱ + operandList: + -  + -  + 章: + type: compound + operator: ⿱ + operandList: + - 音 + - 十 + : + type: compound + operator: ⿱ + operandList: + - 䒑 + - 八 + 爽: + type: compound + operator: ⿻ + operandList: + - 大 + - 㸚 + tags: + - 兴字底 + - 赢字框 + - 微字框 + - 同字心 + - 戈部截断 +analysis: + classifier: + 横折钩: 7 + 斜钩: 6 + 横斜钩: 6 + 横折弯钩: 6 + 竖弯钩: 6 + 竖折: 6 + 横折: 5 + degenerator: + feature: + 捺: 点 + 提: 横 + selector: + - 根少优先 + - 连续笔顺 + - 能连不交 + - 能散不连 + - 取大优先 + customize: + : + - 䒑 + - 夫 + 末: + - '1' + - 木 + 直: + - 十 + -  + - '1' + 丈: + - '1' + - 乂 + 甩: + -  + - 二 + - '6' + 卅: + - '1' + - 川 + 州: + -  + - 川 + 重: + - '3' + - 車 + - '1' + 孑: + - 了 + - '1' + 尹: + -  + - '3' + 夹: + - '1' + - 丷 + - 大 + 巿: + - '1' + - 巾 + : + - 口 + - '1' + : + - '3' + - 止 + 㒸: + - 丷 + - 豕 + 果: + - 日 + - 木 + : + - 肀 + -  + 垂: + - 千 + - 艹 + - 二 + : + - 大 + - 丷 + 余: + - 亼 + - 朩 + : + - 日 + - 十 + 事: + -  + - 肀 + 主: + - '4' + - 王 + 佥: + - 亼 + -  + - '1' + 隶: + -  + - 氺 + 产: + -  + - 厂 + 朿: + - 木 + - 冂 + 今: + - 亽 + - '5' +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + mapping_type: 1 + mapping: + : i + 弓: a + 宀: t + 火: o + 夕: d + 皿: b + 非: g + 扌: m + 羊: j + : h + '33': e + 冉: d + 衣: r + 刂: b + 力: p + 革: x + 曲: m + 夂: o + 癶: f + 儿: e + 虎: x + : n + 豆: n + 走: k + 豕: m + 攴: l + 亻: j + 古: d + 戊: i + 足: a + 疒: r + 不: i + 丷: i + 幺: y + 阝: k + 彐: g + 也: d + 㐄: e + 石: d + 金: u + 兼: x + '34': w + 麻: l + : z + 耒: y + 面: l + '42': u + 糸: v + 井: u + 冖: l + '12': f + 上: e + 衤: d + '21': h + 彑: c + 疋: j + 马: d + 巾: x + 乡: f + '54': x + 䒤: z + 㔾: o + 囗: e + 辛: u + 隹: e + 廿: l + 田: y + 酉: r + 己: u + 用: p + 日: r + 子: w + 业: e + 弋: k + 贝: n + : a + 人: l + : x + 纟: i + 民: y + 攵: h + : p + 彡: h + 矢: l + 丂: z + '52': v + 亼: g + 耂: h + 戈: d + 文: o + '23': k + 瓜: a + 旦: k + 丁: o + 匕: g + 穴: b + 韦: z + 欠: y + 巴: c + 皮: m + 身: l + 竹: n + 丰: a + 高: d + 禺: x + 二: j + '43': i + 辰: y + 甘: i + 丬: y + 甲: g + 吅: u + : n + 厂: q + 亦: r + 页: j + 又: h + 屮: g + '32': r + 歺: a + 山: c + 亠: x + 音: t + 龙: w + 寸: k + 尸: q + 缶: t + 户: t + 谷: i + '53': c + 耳: s + 广: w + 象: r + 乃: a + 鸟: x + 止: o + 骨: x + 壬: x + 见: w + '51': b + 里: z + 言: w + 彳: x + 因: f + 心: z + 片: u + 亍: h + 鬼: i + 木: p + '25': m + 殳: d + 亥: a + 夫: n + 艹: b + 毛: q + : n + 匚: b + 瓦: u + 之: c + : k + 乂: o + 乍: c + 氵: h + '11': g + 牛: f + '44': o + 未: c + 黾: g + 可: i + '14': s + 牙: m + 豸: k + 无: k + 巳: b + 艮: m + 鼠: e + 㡀: z + '24': l + 辶: a + 生: o + 申: j + 尤: l + 手: k + 舌: y + 句: n + 兀: j + 忄: z + 冫: q + 甫: n + 爪: b + 西: g + 亡: t + 卜: h + 聿: f + 勹: k + 水: j + '13': d + 卩: x + 卯: f + 丑: x + 了: k + 由: v + 龹: g + 示: e + 气: u + 立: z + '31': t + 长: j + 五: a + 予: t + : d + 犬: x + : p + 七: c + 丩: a + 且: q + 禾: n + : o + 雨: y + 云: f + : c + 口: s + 米: l + 入: i + 母: z + 千: e + 至: l + 壴: u + '15': a + 虫: o + 厶: k + 戋: z + 川: w + 冂: x + : s + : k + 卵: k + 六: z + 十: w + 讠: v + 歹: w + : z + 舟: t + 白: d + 王: g + '55': n + 土: c + '2': jj + 髟: z + 斤: o + 车: a + 大: u + 四: a + 刀: n + 而: o + 臼: i + 束: r + '5': vv + 臣: q + 自: n + : v + 三: n + 月: l + 八: t + '1': ff + 鬲: q + 丆: y + 羽: a + : v + 食: f + 鱼: o + 鹿: b + 女: y + '35': q + '45': p + 小: u + 几: u + 方: c + 干: m + : j + 黑: k + '22': j + '3': ee + 工: u + : l + 尚: q + 九: w + 兔: i + '4': ii + 门: v + 齿: p + 目: e + : n + '41': y + grouping: + '6': '5' + : 刀 + '57': '55' + : 匚 + : 虫 + : 彐 + : 手 + 镸: 长 + : 兔 + : 辛 + 䒑: 丷 + '46': '45' + '60': '52' + 爫: 爪 + 虍: 虎 + '36': '35' + : 冂 + : 聿 + '7': '5' + : 臣 + 乌: 鸟 + '75': '55' + 覀: 西 + : 月 + '72': '52' + :  + : 艹 + '66': '55' + : 禾 + : 卩 + '76': '55' + : 疋 + : 甘 + '71': '51' + : 艮 + 旡: 无 + : 日 + : 夂 + : 十 + : 羊 + :  + 习: 羽 + : 冂 + : 屮 + : 力 + : 歺 + : 手 + : 雨 + : 甘 + '62': '52' + '65': '55' + : 羊 + : 亦 + : 竹 + '20': '22' + 巜: 川 + : 戋 + '16': '15' + : 八 + : 卜 + '37': '35' + 丌: 兀 + 已: 己 + : 㐄 + : 缶 + 龸: 尚 + : 聿 + : 衣 + '64': '54' + 朩: 木 + : 米 + '10': '12' + : 卯 + :  + : 羊 + : 冫 + : 小 + 車: 车 + : 戊 + : 小 + '50': '52' + : 匕 + : 月 + 丸: 九 + : 片 + : 尚 + 巛: 川 + : 丂 + 钅: 金 + 灬: 火 + : 立 + : 儿 + : 几 + : 斤 + 戉: 戊 + : 日 + 士: 土 + : 十 + : 片 + : 水 + '77': '55' + : 川 + : 八 + : 七 + :  + : 乃 + 龷: 廿 + : 彐 + : 小 + : 云 + : 厂 + :  + '61': '51' + : 水 + : 手 + : 立 + : 竹 + 犭: 犬 + : 用 + : 火 + : 母 + : 亡 + '67': '55' + : 冂 + : 尸 + : 小 + : 丬 + :  + : 月 + : 高 + : 屮 + : 乃 + : 人 + 曰: 日 + : 手 + : 鸟 + 亽: 亼 + 饣: 食 + : 匕 + : 车 + : 匚 + : 小 + 凵: 冂 + : 又 + 肀: 聿 + :  + : 彡 + 爿: 片 + : 七 + : 尸 + '70': '52' + : 水 + 龶: 丰 + : 足 + 礻: 示 + '17': '15' + 龵: 手 + '74': '54' + '27': '25' + : 冫 + '47': '45' + : 井 + 龰: 疋 + : 衣 + : 匕 + '56': '55' + 罒: 四 + : 衣 + '30': '33' + : 屮 + '63': '53' + 牜: 牛 + : 亻 + : 鼠 + 廾: 艹 + 㠯: 吅 + 廴: 辶 + : 高 + : 亦 + '26': '25' + 毋: 母 + : 丰 + '73': '53' + : 牛 + 尢: 尤 + 戶: 户 + : 皮 + 氺: 水 + : 豕 + '40': '43' + : 高 + :  + :  + : 臼 + :  + :  + 龴: 厶 +encoder: + max_length: 3 + select_keys: + - ';' + - '_' + auto_select_length: 2 + sources: + s0: + object: null + next: s1 + s1: + object: + type: 字根 + rootIndex: 1 + index: 0 + next: c0 + s2: + object: + type: 字根 + rootIndex: 2 + index: 0 + next: c1 + s3: + object: + type: 二笔 + rootIndex: 1 + strokeIndex: 1 + index: 0 + next: s6 + s4: + object: + type: 二笔 + rootIndex: 2 + strokeIndex: 1 + index: 0 + next: null + s5: + object: + type: 字根 + rootIndex: -1 + index: 0 + next: null + s6: + object: + type: 笔画 + rootIndex: 1 + strokeIndex: -1 + index: 1 + next: null + conditions: + c0: + object: + type: 字根 + rootIndex: 2 + operator: 存在 + positive: s2 + negative: s3 + c1: + object: + type: 字根 + rootIndex: 3 + operator: 存在 + positive: s5 + negative: s4 + short_code: + - length_equal: 1 + schemes: + - { prefix: 2 } + rules: + - length_equal: 2 + formula: AaAbBa + - length_equal: 3 + formula: AaBaCa + - length_in_range: + - 4 + - 20 + formula: AaBaZa +optimization: + objective: + characters_short: + tiers: + - top: 3000 + duplication: 4.0 + levels: [] + duplication: 200.0 + key_distribution: 2.0 + new_key_equivalence_modified: 0.01 + new_pair_equivalence: 0.01 + levels: + - length: 2 + frequency: -2.0 + constraints: + elements: + - element: '11' + keys: + - 'g' + - element: '12' + keys: + - 'f' + - element: '13' + keys: + - 'd' + - element: '14' + keys: + - 's' + - element: '15' + keys: + - 'a' + - element: '21' + keys: + - 'h' + - element: '22' + keys: + - 'j' + - element: '23' + keys: + - 'k' + - element: '24' + keys: + - 'l' + - element: '25' + keys: + - 'm' + - element: '31' + keys: + - 't' + - element: '32' + keys: + - 'r' + - element: '33' + keys: + - 'e' + - element: '34' + keys: + - 'w' + - element: '35' + keys: + - 'q' + - element: '41' + keys: + - 'y' + - element: '42' + keys: + - 'u' + - element: '43' + keys: + - 'i' + - element: '44' + keys: + - 'o' + - element: '45' + keys: + - 'p' + - element: '51' + keys: + - 'b' + - element: '52' + keys: + - 'v' + - element: '53' + keys: + - 'c' + - element: '54' + keys: + - 'x' + - element: '55' + keys: + - 'n' + - element: '1' + keys: + - 'f' + - element: '2' + keys: + - 'j' + - element: '3' + keys: + - 'e' + - element: '4' + keys: + - 'i' + - element: '5' + keys: + - 'v' + indices: + - index: 1 + element_indices: + - element: 白 + index: 0 + keys: + - 'd' + - element: 勹 + index: 0 + keys: + - 's' + - 'd' + - 'f' + - 'k' + - 'j' + - 'l' + - 'e' + - 'r' + - 'i' + - 'o' + - 'u' + - element: 不 + index: 0 + keys: + - 'e' + - 'r' + - 'u' + - 'i' + - 'o' + - 's' + - 'd' + - 'f' + - 'j' + - 'k' + - 'l' + - element: 口 + index: 0 + keys: + - 'e' + - 'r' + - 'u' + - 'i' + - 'o' + - 's' + - 'd' + - 'f' + - 'j' + - 'k' + - 'l' + metaheuristic: + algorithm: SimulatedAnnealing + parameters: + t_max: 1.0 + t_min: 0.00001 + steps: 100000000 + report_after: 0.75 + search_method: + random_move: 0.9 + random_swap: 0.09 + random_full_key_swap: 0.01 diff --git a/examples/flypy.yaml b/examples/flypy.yaml deleted file mode 100644 index a26ccb0..0000000 --- a/examples/flypy.yaml +++ /dev/null @@ -1,38 +0,0 @@ -form: - alphabet: qwertyuiopasdfghjklzxcvbnm - mapping_type: 1 - grouping: {} - mapping: - zh: v - ch: i - sh: u - 零: o - iu: q - ei: w - uan: r - van: r - ue: t - ve: t - un: "y" - vn: "y" - uo: o - ie: p - ong: s - iong: s - ai: d - en: f - eng: g - ang: h - an: j - uai: k - ing: k - iang: l - uang: l - ou: z - ia: x - ua: x - ao: c - ui: v - in: b - iao: "n" - ian: m diff --git a/examples/huma.yaml b/examples/huma.yaml new file mode 100644 index 0000000..dbba218 --- /dev/null +++ b/examples/huma.yaml @@ -0,0 +1,746 @@ +version: '0.1' +source: huma +info: + name: 虎码 + author: ID;Peace B + version: '2024.06.17' + description: 26 键、大字集、低重码、拥有舒适手感的高性能中文输入方案 +analysis: + classifier: + 横折弯钩: 6 + degenerator: + feature: + 提: 横 + 捺: 点 + no_cross: false + selector: + - 结构完整 + - 根少优先 + - 能连不交 + - 能散不连 + - 全符笔顺 + - 取大优先 + customize: + 丈: + - '1' + - 乂 + 严: + - '1' + - "\ue408" + - 厂 + "\ue02c": + - 土 + - 丷 + 主: + - '4' + - 王 + 亓: + - 二 + - "\ue0e3" + 产: + - "\ue054" + - 厂 + 壬: + - '3' + - 士 + 我: + - '3' + - 扌 + - 戈 + 龹: + - 丷 + - 夫 + 果: + - 田 + - 木 + 禺: + - 田 + - "\ue005" + "\ue082": + - 大 + - 丷 + "\ue067": + - 丷 + - 囗 + - "\ue03e" + 凹: + - "\ue060" + - '1' + "\ue0eb": + - 田 + - 十 + 勿: + - 勹 + - "\ue41e" + "\ue00f": + - 牛 + - 巾 + 垂: + - 千 + - 艹 + - 士 + "\ue048": + - 肀 + - "\ue08c" + "\ue052": + - 十 + - 田 + - "\ue04d" + 重: + - 千 + - 里 + 戋: + - '1' + - 戈 + "\ue053": + - 耳 + - 戈 + "\ue08a": + - 禾 + - 戈 + 甩: + - 用 + - '5' + customizeCorners: {} +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + grouping: + "\ue003": 丰 + 龶: 丰 + "\ue021": 缶 + 爿: 片 + 丬: 片 + "\ue012": 片 + "\ue0e1": 片 + "\ue0e0": 片 + "\ue0c2": 舌 + 㐅: 乂 + "\ue431": 彐 + "\ue432": 彐 + 彑: 彐 + "\ue0b4": 彐 + "\ue40c": "\ue057" + "\ue8d9": 卯 + 肀: 聿 + "\ue06d": 聿 + "\ue06e": 聿 + "\ue00a": 云 + "\uf000": 聿 + "\ue0c1": 虫 + "\ue42f": 火 + "\ue430": 火 + "\ue408": 火 + "\ue42e": 火 + 灬: 火 + "\ue031": 尸 + "\ue06b": 尸 + 旡: 无 + 朩: 木 + "\ue41e": 彡 + 冎: 骨 + 礻: 示 + 亾: 亡 + 歺: 歹 + "\ue098": 歹 + "\ue0ac": 高 + "\ue006": 高 + "\ue804": 高 + "\ue093": 羊 + "\ue042": 羊 + "\ue016": 羊 + 芈: 羊 + 丷: 八 + "\ue446": 八 + 䒑: 八 + "\ue450": 八 + 癶: 八 + "\ue09b": 八 + "\ue948": 谷 + 夊: 夂 + 攴: 攵 + 忄: 心 + "\ue051": 心 + "\ue055": 册 + "\ue44d": 册 + "\ue01c": 艮 + "\ue054": 立 + 纟: 糸 + 亽: 亼 + 侖: 仑 + 亻: 人 + "\ue420": 豕 + 氵: 水 + "\ue42d": 水 + "\ue8e2": 水 + 氺: 水 + "\ue059": 水 + "\ue0d9": 水 + 龴: 厶 + "\ue04d": 厶 + 毌: 毋 + 廾: 艹 + 丌: 艹 + 艸: 艹 + 龷: 廿 + "\ue050": 卅 + 戶: 户 + 凵: 冂 + "\ue02a": 冂 + "\ue060": 冂 + 犭: 犬 + "\ue007": 匚 + "\ue009": 匚 + "\ue068": 十 + "\ue413": 十 + "\ue0ad": 戊 + 戉: 戊 + "\ue0c9": 辛 + "\ue43d": 人 + "\ue448": 川 + "\ue07f": 川 + 巛: 川 + 巜: 川 + "\ue0d6": 几 + 曰: 日 + "\ue00c": 日 + "\ue070": 日 + 尢: 尤 + 镸: 长 + "\ue001": 刀 + 刂: 刀 + "\ue044": 刀 + "\ue0e3": 刀 + "\ue427": 刀 + "\ue089": 刀 + "\ue0de": 刀 + "\ue424": 儿 + "\ue03f": 戈 + "\ue421": 臼 + "\ue0d8": 米 + "\ue959": 鼠 + "\ue0c6": 足 + "\ue0d5": 臣 + "\uf001": 井 + 耂: 老 + "\ue099": 目 + 牜: 牛 + "\ue029": 牛 + 饣: 食 + "\ue416": 七 + "\ue09e": 竹 + "\ue014": 竹 + "\ue434": 又 + 䶹: 屮 + "\ue04e": 屮 + "\ue092": 屮 + "\ue437": 止 + "\ue073": 止 + 龰: 止 + "\ue401": 力 + "\ue0c3": 尚 + 龸: 尚 + 讠: 言 + "\ue04a": 弗 + "\ue036": 弗 + 衤: 衣 + "\ue0b7": 衣 + "\ue422": 衣 + "\ue07e": 衣 + "\ue400": 斤 + "\ue03a": 疋 + "\ue091": 疋 + "\ue0d0": 雨 + "\ue08c": 用 + 扌: 手 + 龵: 手 + "\uf002": 手 + "\ue002": 手 + "\ue410": 手 + "\ue011": 匕 + "\ue079": 匕 + "\ue44f": 匕 + "\ue411": 㐄 + "\ue05d": 乃 + "\ue005": 禸 + 覀: 西 + "\ue0d2": 月 + "\ue988": 月 + "\ue034": 月 + "\ue083": 月 + "\ue088": 冫 + "\ue00d": 冫 + 亍: 彳 + 冖: 宀 + "\ue010": 兔 + 頁: 页 + "\ue024": 厂 + "\ue0bc": "\ue020" + "\ue423": "\ue020" + "\ue40e": 禾 + "\ue0da": 鸟 + 爫: 爪 + "\ue018": 卜 + "\ue0c8": 车 + 車: 车 + 罒: 四 + "\ue03e": 小 + "\ue06c": 小 + "\ue442": 小 + "\ue096": 甘 + 虍: 虎 + 钅: 金 + "\ue0cf": 金 + "\ue0b2": 卩 + 㔾: 卩 + 㐆: 身 + "\ue44b": 禾 + "\ue80a": 衣 + "\ue43a": 土 + "\ue04c": 木 + "\ue043": 大 + "\ue98e": 页 + "\uf004": 水 + "\ue9f0": 鱼 + "\ue838": 鹿 + "\ue451": 止 + "\ue102": 王 + "\ue439": 冂 + mapping: + '1': fi + '2': gs + '3': tp + '4': id + '5': ae + '6': ai + 疒: ab + 丁: ad + 丰: af + 缶: af + 鬼: ag + 六: al + 耒: al + 门: am + 皿: am + 片: ap + 舌: as + 未: aw + 弓: bg + 乂: bi + 彐: bj + "\ue057": bk + 卵: bl + 卯: bm + 面: bm + 女: bn + 氏: bs + 聿: bv + 云: by + 不: cb + 虫: cc + 飞: cf + 古: cg + 火: ch + 支: ci + 及: cj + 尸: cs + 业: cy + 口: dk + 里: dl + 民: dm + 黾: dm + 无: du + 由: dy + 干: eg + 见: ej + 木: em + 欠: eq + 彡: es + "\ue078": et + 穴: ex + 也: ey + 㡀: fb + 辰: fc + 骨: fg + 且: fq + 示: fs + 亡: fw + 歹: gd + 高: gg + 句: gj + 士: gs + 土: gt + 韦: gw + 羊: gy + 八: hb + 夫: hf + 谷: hg + 子: hi + 夂: hi + 攵: hp + 壴: hu + 心: hx + 册: ic + 艮: ig + 丩: ij + 立: il + 舟: io + 糸: is + 予: iv + 乡: ix + 幺: iy + 斗: jd + 亼: ji + 仑: jl + 人: jr + 豕: js + 入: ju + 寸: kc + 亥: kh + 㠯: ki + 九: kj + 母: km + 水: ks + 厶: ks + 毋: ku + 艹: lc + 齿: lc + 而: le + 方: lf + 廿: ln + 千: lq + 生: ls + 卅: ls + 夕: lx + 卌: lx + 牙: ly + 巴: mb + 大: md + 二: me + 光: mg + 户: mh + 豸: mi + 冂: mk + 两: ml + 犬: mq + 石: ms + 甫: nf + 鬲: ng + 黄: nh + 勹: nk + 匚: nk + 马: nm + 十: ns + 戊: nu + 王: nw + 辛: nx + 贝: ob + 川: oc + 自: oi + 几: oj + 日: or + 矢: os + 尤: oy + 长: pc + 刀: pd + 儿: pe + 戈: pg + 黑: ph + 弋: pi + 臼: pj + 米: pm + 鼠: ps + 足: pu + 行: px + 走: pz + 臣: qc + 耳: qe + 井: qj + 老: ql + 目: qm + 牛: qn + 齐: qq + 食: qs + 田: qt + 非: rf + 之: ri + 巾: rj + 囗: rk + 了: rl + 皮: rp + 七: rq + 殳: rs + 竹: ru + 瓦: rw + 又: ry + 屮: sc + 各: sg + 止: si + 甲: sj + 力: sl + 尚: ss + 言: sy + 阝: te + 弗: tf + 革: tg + 衣: ti + 斤: tj + 龙: tl + 疋: ts + 三: ts + 雨: tv + 用: ty + 白: ub + 辶: uc + 工: ug + 隹: ui + 手: us + 廴: uy + 匕: vb + 已: vi + 己: vj + 㐄: vk + 毛: vm + 乃: vn + 气: vq + 禸: vr + 山: vs + 巳: vs + 文: vw + 西: vx + 月: vy + 乍: wa + 冫: wb + 彳: wc + 宀: wg + 龟: wg + 兔: wt + 五: wu + 鱼: wv + 象: wx + 页: wy + 厂: xc + "\ue020": xd + 广: xg + 禾: xh + 鹿: xl + 鸟: xn + 束: xs + 乌: xu + 音: xy + 爪: ya + 卜: yb + 车: yc + 瓜: yg + 至: yi + 曲: yq + 四: ys + 小: yx + 酉: yy + 豆: zd + 甘: zg + 虎: zh + 金: zj + 卩: zj + 可: zk + 麻: zm + 身: zs + 亠: zt + 羽: zv + 习: zx + mapping_type: 2 +encoder: + max_length: 4 + select_keys: + - _ + - ; + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + index: 0 + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + index: 0 + next: c1 + s3: + object: {type: 字根, rootIndex: 1} + index: 1 + next: null + s4: + object: {type: 字根, rootIndex: 2} + index: 1 + next: null + s5: + object: {type: 字根, rootIndex: 3} + index: 0 + next: c2 + s6: + object: {type: 字根, rootIndex: -1} + index: 0 + next: null + s7: + object: {type: 字根, rootIndex: 3} + index: 1 + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: s3 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s5 + negative: s4 + c2: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s6 + negative: s7 + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2, count: 1}, {prefix: 3, count: 1}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa +data: + character_set: gb2312 + repertoire: + "\uf000": + unicode: 61440 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 事, strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}]}] + ambiguous: false + name: 事字底 + "\uf001": + unicode: 61441 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue415", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 寒字腰无横 + "\uf002": + unicode: 61442 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue075", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 段字旁无横 + "\uf004": + unicode: 61444 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 乑, strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}]}] + ambiguous: false + name: 乑无撇 + glyph_customization: + 丝: + type: compound + operator: ⿰ + operandList: [纟, 纟] + 具: + type: compound + tags: [兴字底] + operator: ⿱ + operandList: ["\ue099", "\ue450"] + 兰: + type: compound + operator: ⿱ + operandList: [丷, 三] + tags: [] + 兴: + type: compound + tags: [兴字底] + operator: ⿱ + operandList: ["\ue42d", "\ue450"] + 兵: + type: compound + operator: ⿱ + operandList: ["\ue400", "\ue450"] + 其: + type: compound + operator: ⿱ + operandList: ["\ue096", "\ue450"] + 典: + type: compound + tags: [兴字底] + operator: ⿱ + operandList: ["\ue44d", "\ue450"] + 卿: + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: [卯, "\ue01c"] + order: [{index: 0, strokes: 3}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue022": + type: compound + operator: ⿱ + operandList: ["\uf001", "\ue450"] + 章: + type: compound + operator: ⿱ + operandList: [音, 十] + 熏: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 黑] + "\ue0a5": + type: compound + tags: [戈部截断] + operator: ⿰ + operandList: ["\ue81f", 戈] + "\ue9d0": + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: ["\ue0e3", 米] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 隺: + type: compound + operator: ⿻ + operandList: [冖, 隹] + tags: [笔画搭挂] + 真: + type: compound + operator: ⿳ + operandList: [十, "\ue099", "\ue450"] + 胤: + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: [儿, "\ue99d"] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 舆: + type: compound + tags: [兴字底] + operator: ⿱ + operandList: ["\ue867", "\ue450"] + 龠: + type: compound + operator: ⿴ + operandList: [侖, "\ue0e4"] + 孑: + type: compound + operator: ⿻ + operandList: [了, 一] + tags: + - 衣框 + - 行框 diff --git a/examples/jdh.yaml b/examples/jdh.yaml new file mode 100644 index 0000000..8c13e41 --- /dev/null +++ b/examples/jdh.yaml @@ -0,0 +1,663 @@ +version: '0.1' +source: jdh +info: + name: 简单鹤 + author: 简单男孩 + version: '5.0' + description: 方案不简单做给谁看呢 +data: + repertoire: + "\uf000": + unicode: 61440 + tygf: 0 + gb2312: false + name: 禺字底 + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 禺, strokes: [{feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + "\uf001": + unicode: 61441 + tygf: 0 + gb2312: false + name: 草头 + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [艹, 日]}] + ambiguous: false + glyph_customization: + 黄: + type: compound + operator: ⿱ + operandList: [龷, 更] + 高: + type: compound + operator: ⿰ + operandList: ["\ue804", 口] + 尚: + type: compound + operator: ⿱ + operandList: [龸, 口] + "\ue9f0": + type: compound + operator: ⿰ + operandList: [鱼, 大] + 兵: + type: compound + operator: ⿰ + operandList: ["\ue400", "\ue450"] + "\ue824": + type: compound + operator: ⿰ + operandList: [彳, "\ue849"] + 命: + type: compound + operator: ⿰ + operandList: [合, 卩] + 夌: + type: compound + operator: ⿱ + operandList: [土, "\ue989"] + 丝: + type: compound + operator: ⿰ + operandList: [纟, 纟] + 隺: + type: compound + tags: [笔画搭挂] + operator: ⿻ + operandList: [冖, 隹] + "\ue068": + type: basic_component + strokes: [{feature: 横, start: [8, 18], curveList: [{command: h, parameterList: [85]}]}, {feature: 撇, start: [45, 4], curveList: [{command: c, parameterList: [-8, 26, -22, 42, -39, 56]}]}] + 莫: + type: compound + operator: ⿱ + operandList: ["\uf001", 大] + 㝵: + type: compound + operator: ⿱ + operandList: [旦, 寸] + 章: + type: compound + operator: ⿱ + operandList: [音, 十] + "\ue9ab": + type: compound + operator: ⿲ + operandList: ["\ue057", 白, "\ue009"] + order: [{index: 0, strokes: 0}, {index: 1, strokes: 0}, {index: 2, strokes: 0}] + "\ue00f": + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [牛, 巾] + 重: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 里] + 熏: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 黑] + tags: + - 赢字框 + - 辩字框 + - 玨框 +analysis: + degenerator: + feature: + 提: 横 + 捺: 点 + no_cross: false + selector: + - 结构完整 + - 连续笔顺 + - 根少优先 + - 能连不交 + - 能散不连 + - 取大优先 + customize: + 击: + - 土 + - 山 + 出: + - 山 + - 山 + 必: + - 心 + - '3' + 疌: + - '1' + - '5' + - '1' + - '1' + - '2' + - '1' + - 人 + 耂: + - 土 + - '3' + "\ue0d3": + - '2' + - '5' + - '2' + - '2' + - 二 + - '1' + 兆: + - 儿 + - '4' + - '1' + - '3' + - '4' + 非: + - '2' + - 三 + - '2' + - 三 + 兰: + - 丷 + - 三 + "\ue03a": + - '1' + - '2' + - '1' + - 人 + 聿: + - '5' + - '1' + - '1' + - '1' + - '1' + - '2' + 丘: + - '3' + - '2' + - '1' + - '2' + - '1' + 垂: + - 千 + - 艹 + - 士 + 疋: + - '5' + - '2' + - '1' + - 人 + "\ue043": + - 大 + 开: + - 二 + - '3' + - '2' + 曲: + - '2' + - '5' + - 艹 + - '1' + "\ue419": + - '2' + - '5' + - '1' + - 三 + "\ue0fb": + - 勿 + - '4' + 头: + - '4' + - '4' + - 大 + 亍: + - 二 + - '2' + "\ue44b": + - 千 + - 八 + 赤: + - 十 + - 丁 + - '3' + - 八 + 生: + - "\ue078" + - 土 + 束: + - '1' + - 口 + - '2' + - 八 + 天: + - 二 + - 人 + "\ue42e": + - '3' + - '2' + - 八 + 上: + - '2' + - '1' + - '1' + "\ue070": + - '2' + - '5' + - '2' + - '1' + 羌: + - 丷 + - 三 + - 儿 + 秉: + - 千 + - '5' + - '1' + - '1' + - 八 + 龰: + - '2' + - '1' + - 人 + "\ue446": + - 八 + "\ue085": + - 千 + - 囗 + - 丷 + - 二 + 禾: + - 千 + - 八 + "\ue103": + - 戈 + - '3' + - '3' +algebra: + 鹤韵: + - type: xform + from: ^[aeo](.)\d$ + to: $1 + - type: xform + from: ^.*?([aeiouv].*|m|ng?)\d$ + to: $1 + 鹤声: + - type: xform + from: ^([mn]g?\d)$ + to: o$1 + - type: xform + from: ^([bpmfdtnlgkhjqxzcsrywaoe]h?|^).+$ + to: $1 +form: + alphabet: abcdefghijklmnopqrstuvwxyz + mapping_type: 1 + mapping: + 鹤声-a: a + 鹤声-b: b + 鹤声-c: c + 鹤声-ch: i + 鹤声-d: d + 鹤声-e: e + 鹤声-f: f + 鹤声-g: g + 鹤声-h: h + 鹤声-j: j + 鹤声-k: k + 鹤声-l: l + 鹤声-m: m + 鹤声-n: 'n' + 鹤声-o: o + 鹤声-p: p + 鹤声-q: q + 鹤声-r: r + 鹤声-s: s + 鹤声-sh: u + 鹤声-t: t + 鹤声-w: w + 鹤声-x: x + 鹤声-y: 'y' + 鹤声-z: z + 鹤声-zh: v + 鹤韵-a: a + 鹤韵-ai: d + 鹤韵-an: j + 鹤韵-ang: h + 鹤韵-ao: c + 鹤韵-e: e + 鹤韵-ei: w + 鹤韵-en: f + 鹤韵-eng: g + 鹤韵-i: i + 鹤韵-ia: x + 鹤韵-ian: m + 鹤韵-iang: l + 鹤韵-iao: 'n' + 鹤韵-ie: p + 鹤韵-in: b + 鹤韵-ing: k + 鹤韵-iong: s + 鹤韵-iu: q + 鹤韵-m: m + 鹤韵-n: 'n' + 鹤韵-ng: g + 鹤韵-o: o + 鹤韵-ong: s + 鹤韵-ou: z + 鹤韵-r: r + 鹤韵-u: u + 鹤韵-ua: x + 鹤韵-uai: k + 鹤韵-uan: r + 鹤韵-uang: l + 鹤韵-ue: t + 鹤韵-ui: v + 鹤韵-un: 'y' + 鹤韵-uo: o + 鹤韵-v: v + 鹤韵-ve: t + '1': d + '2': p + '3': u + '4': h + '5': r + "\ue09e": 'n' + "\ue0bc": g + "\ue42d": h + 八: f + 巴: t + 贝: m + 匕: a + 灬: 'n' + 冫: f + 艹: z + 册: j + 车: t + 彳: h + 虫: f + 辶: q + 寸: k + 大: x + 刀: i + 电: e + 丁: j + 儿: k + 而: b + 二: u + 方: f + 付: w + 干: s + 戈: a + 工: p + 骨: c + 广: r + 鬼: s + 火: t + 几: i + 彐: s + 卩: b + 巾: 'y' + 钅: d + 冂: o + 臼: s + 口: o + 力: u + 厉: e + 立: b + 麻: d + 马: z + 米: l + 宀: i + 皿: a + 木: w + 目: s + 疒: m + 廿: v + 鸟: c + 牛: b + 女: 'y' + 气: s + 丬: l + 犭: b + 人: e + 亻: x + 日: v + 山: p + 尸: q + 十: s + 石: t + 手: o + 扌: j + 水: o + 氵: k + 厶: p + 纟: e + 田: w + 土: g + 王: a + 囗: 'n' + 未: e + 文: j + 五: g + 勿: i + 夕: f + 西: p + 习: d + 小: i + 忄: 'n' + 讠: c + 衤: h + 衣: k + 又: l + 鱼: q + 雨: 'y' + 月: l + 止: r + 舟: t + 子: a + 足: g + 㐅: 'y' + grouping: + "\ue03e": "\ue42d" + 自: 目 + "\ue43f": 匕 + 走: 辶 + "\ue0c8": 车 + 牜: 牛 + 三: 二 + "\ue0d0": 雨 + 巳: 巴 + 音: 讠 + 言: 讠 + 末: 未 + "\ue012": 丬 + 厂: 广 + "\ue029": 牛 + 礻: 衤 + 心: 忄 + 冖: 宀 + 龴: 厶 + 氺: 水 + 犬: 犭 + "\ue437": 止 + 阝: 卩 + 㔾: 巴 + 死: 夕 + "\ue0ed": 鬼 + 朩: 木 + 乂: 㐅 + 门: 冂 + 攵: 文 + 曰: 日 + 歹: 夕 + 爫: "\ue42d" + "\ue432": 彐 + "\ue011": 匕 + 甘: 廿 + 可: 丁 + 夂: 文 + 少: 小 + "\ue078": 人 + "\ue0d6": 几 + "\ue020": "\ue0bc" + "\ue055": 册 + "\ue0c6": 足 + 戋: 戈 + 丷: 八 + "\ue0b2": 卩 + 白: 臼 + "\ue050": 艹 + "\ue0d2": 月 + "\ue43a": 土 + 龵: 手 + 已: 巴 + 己: 巴 + "\ue43d": 人 + 千: 干 + 刂: 刀 + 廴: 辶 + 亠: 宀 + 士: 土 + 弋: 戈 + 竹: "\ue09e" + "\ue00c": 日 + "\ue043": 大 + "\ue05a": 王 + 龶: 王 + 丰: 王 + "\ue079": 匕 + "\ue02a": 冂 + 句: 勿 + "\ue068": 十 + 七: 匕 + "\ue416": 匕 + "\ue03f": 戈 + 朱: 未 + 失: 未 + 夫: 未 + 丝: 纟 + "\ue051": 小 + 釆: "\ue42d" + "\ue414": 廿 + 罒: 皿 + "\ue06c": 小 + 覀: 西 +encoder: + max_length: 4 + select_keys: + - _ + - ; + short_code: + - length_equal: 1 + schemes: + - { prefix: 3 } + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字音, subtype: 鹤声} + next: s2 + s2: + object: {type: 字音, subtype: 鹤韵} + next: s3 + s3: + object: {type: 字根, rootIndex: 1} + next: s4 + s4: + object: {type: 字根, rootIndex: -1} + next: null + conditions: {} + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaDa +optimization: + objective: + characters_full: + tiers: [{top: 5458, duplication: 100}] + duplication: 200 + pair_equivalence: 11.4514 + levels: [] + characters_short: + tiers: [{top: 1500, levels: [{length: 3, frequency: -35.89}]}, {top: 5458, duplication: 1}] + duplication: 200 + pair_equivalence: 11.4514 + levels: [] + constraints: + elements: + - {element: 鹤声-a} + - {element: 鹤韵-a} + - {element: 鹤韵-ai} + - {element: 鹤韵-an} + - {element: 鹤韵-ang} + - {element: 鹤韵-ao} + - {element: 鹤声-b} + - {element: 鹤声-c} + - {element: 鹤声-ch} + - {element: 鹤声-d} + - {element: 鹤声-e} + - {element: 鹤韵-e} + - {element: 鹤韵-ei} + - {element: 鹤韵-en} + - {element: 鹤韵-eng} + - {element: 鹤声-f} + - {element: 鹤声-g} + - {element: 鹤声-h} + - {element: 鹤韵-i} + - {element: 鹤韵-ia} + - {element: 鹤韵-ian} + - {element: 鹤韵-iang} + - {element: 鹤韵-iao} + - {element: 鹤韵-ie} + - {element: 鹤韵-in} + - {element: 鹤韵-ing} + - {element: 鹤韵-iong} + - {element: 鹤韵-iu} + - {element: 鹤声-j} + - {element: 鹤声-k} + - {element: 鹤声-l} + - {element: 鹤声-m} + - {element: 鹤韵-m} + - {element: 鹤声-n} + - {element: 鹤韵-n} + - {element: 鹤韵-ng} + - {element: 鹤声-o} + - {element: 鹤韵-o} + - {element: 鹤韵-ong} + - {element: 鹤韵-ou} + - {element: 鹤声-p} + - {element: 鹤声-q} + - {element: 鹤声-r} + - {element: 鹤韵-r} + - {element: 鹤声-s} + - {element: 鹤声-sh} + - {element: 鹤声-t} + - {element: 鹤韵-u} + - {element: 鹤韵-ua} + - {element: 鹤韵-uai} + - {element: 鹤韵-uan} + - {element: 鹤韵-uang} + - {element: 鹤韵-ue} + - {element: 鹤韵-ui} + - {element: 鹤韵-un} + - {element: 鹤韵-uo} + - {element: 鹤韵-v} + - {element: 鹤韵-ve} + - {element: 鹤声-w} + - {element: 鹤声-x} + - {element: 鹤声-y} + - {element: 鹤声-z} + - {element: 鹤声-zh} + indices: [] + element_indices: [] + metaheuristic: + algorithm: SimulatedAnnealing + parameters: + t_max: 0.003 + t_min: 0.000001 + steps: 99999 + report_after: 0.1 diff --git a/examples/mswb.yaml b/examples/mswb.yaml index 6fc0e57..bbcebbf 100644 --- a/examples/mswb.yaml +++ b/examples/mswb.yaml @@ -1,9 +1,9 @@ -version: "0.1" +version: '0.1' source: mswb info: name: 米十五笔 - version: 2023.05.30 author: 李明 + version: '2023.05.30' description: http://xukt.ysepan.com/ analysis: classifier: diff --git a/examples/snow.yaml b/examples/snow.yaml new file mode 100644 index 0000000..0cd579c --- /dev/null +++ b/examples/snow.yaml @@ -0,0 +1,293 @@ +version: '0.1' +source: snow +info: + name: 冰雪四拼 + author: 谭淞宸 + version: '1.0' + description: 带调拼音词顶功 +analysis: + classifier: {} + selector: + - 全符笔顺 + - 取大优先 +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + grouping: + 补码-补: 声调-5 + 韵头-零: 韵头-e + mapping: + '1': e + '2': i + '3': u + '4': o + '5': a + 声调-1: i + 声调-2: e + 声调-3: u + 声调-4: a + 声调-5: o + 声母四分-零撮: k + 声母四分-零合: s + 声母四分-零开: r + 声母四分-零齐: f + 声母四分-b: b + 声母四分-c: c + 声母四分-ch: 'y' + 声母四分-d: d + 声母四分-f: f + 声母四分-g: g + 声母四分-h: h + 声母四分-j: j + 声母四分-k: k + 声母四分-l: l + 声母四分-m: m + 声母四分-n: 'n' + 声母四分-p: p + 声母四分-q: q + 声母四分-r: r + 声母四分-s: s + 声母四分-sh: v + 声母四分-t: t + 声母四分-x: x + 声母四分-z: z + 声母四分-zh: w + 韵头-a: a + 韵头-e: e + 韵头-er: i + 韵头-i: i + 韵头-ia: u + 韵头-ie: e + 韵头-io: o + 韵头-o: o + 韵头-ü: a + 韵头-u: u + 韵头-üa: o + 韵头-ua: i + 韵头-üe: o + 韵头-ue: u + 韵头-uo: o + 韵尾-i: i + 韵尾-m: a + 韵尾-n: o + 韵尾-ng: e + 韵尾-u: u +encoder: + max_length: 6 + auto_select_pattern: ([aeiou]$|[a-z]{4,}) + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2}, {prefix: 3}] + - length_equal: 2 + schemes: [{prefix: 2}, {prefix: 3}, {prefix: 4}, {prefix: 5}] + - length_equal: 3 + schemes: [{prefix: 3}, {prefix: 4}, {prefix: 5}] + - length_equal: 4 + schemes: [{prefix: 4}, {prefix: 5}] + - length_equal: 5 + schemes: [{prefix: 5}] + - length_in_range: [6, 10] + schemes: [{prefix: 6}] + rules: + - length_equal: 2 + formula: AaBaBbBcAbAc + - length_equal: 3 + formula: AaBaCaCbCcAb + - length_equal: 4 + formula: AaBaCaDaDbDc + - length_equal: 5 + formula: AaBaCaDaEaEb + - length_in_range: [6, 10] + formula: AaBaCaDaEaFa + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字音, subtype: 声母四分} + next: s2 + s2: + object: {type: 字音, subtype: 韵头} + next: s3 + s3: + object: {type: 字音, subtype: 韵尾} + next: s4 + s4: + object: {type: 字音, subtype: 声调} + next: c0 + s5: + object: {type: 字音, subtype: 补码} + next: null + conditions: + c0: + object: {type: 字音, subtype: 韵尾} + operator: 是 + value: 韵尾-零 + positive: s5 + negative: null +algebra: + 声母四分: + - type: xform + from: ^[nm]g\d$ + to: 零开 + - type: xform + from: ^([bpmfdtnlgkhjqxzcsr]h?|yu?|[aoew]).+$ + to: $1 + - type: xform + from: ^w$ + to: 零合 + - type: xform + from: ^y$ + to: 零齐 + - type: xform + from: ^yu$ + to: 零撮 + - type: xform + from: ^[aoe]$ + to: 零开 + 韵头: + - type: xform + from: ((?<=[jqx])u|yu|v) + to: ü + - type: xform + from: yi? + to: i + - type: xform + from: wu? + to: u + - type: xform + from: iu + to: iou + - type: xform + from: u([in]) + to: ue$1 + - type: xform + from: ^.*?([aeiouü].*|m|ng?)\d$ + to: $1 + - type: xform + from: ao + to: au + - type: xform + from: ^(?=[mn]) + to: 零 + - type: xform + from: (.+)[iunm]g?$ + to: $1 + 韵尾: + - type: xform + from: ^([jqxy])u + to: $1v + - type: xform + from: ao + to: au + - type: xform + from: yi? + to: i + - type: xform + from: wu? + to: u + - type: xform + from: iu + to: iou + - type: xform + from: u([in]) + to: ue$1 + - type: xform + from: ^.*?([aeiouv].*|m|ng?)\d$ + to: $1 + - type: xform + from: ^(?=[mn]) + to: 零 + - type: xform + to: $1 + from: ^.+?([iunm]|ng)?$ + - type: xform + from: ^$ + to: 零 + 补码: + - type: xform + from: ^.+$ + to: 补 +optimization: + objective: + characters_short: + duplication: 10 + levels: [{length: 2, frequency: 0}, {length: 3, frequency: 0}] + tiers: + - top: 1000 + levels: [{length: 2, frequency: -1}] + - top: 3000 + levels: [{length: 4, frequency: 1}] + duplication: 10 + - top: 5000 + duplication: 10 + - levels: [{length: 3, frequency: -3}] + words_short: + duplication: 10 + levels: [{length: 3, frequency: 0}, {length: 4, frequency: 0}, {length: 5, frequency: 0}] + tiers: + - top: 1000 + levels: [{length: 4, frequency: 1}] + - levels: [{length: 3, frequency: 0}, {length: 4, frequency: 0}, {length: 5, frequency: 0}] + metaheuristic: + algorithm: SimulatedAnnealing + parameters: + t_max: 1 + t_min: 0.000001 + steps: 100000 + constraints: + elements: + - {element: '1'} + - {element: '2'} + - {element: '3'} + - {element: '4'} + - {element: '5'} + - {element: 声母四分-b} + - {element: 声母四分-p} + - {element: 声母四分-m} + - {element: 声母四分-f} + - {element: 声母四分-d} + - {element: 声母四分-t} + - {element: 声母四分-n} + - {element: 声母四分-l} + - {element: 声母四分-g} + - {element: 声母四分-k} + - {element: 声母四分-h} + - {element: 声母四分-j} + - {element: 声母四分-q} + - {element: 声母四分-x} + - {element: 声母四分-z} + - {element: 声母四分-c} + - {element: 声母四分-s} + - {element: 声母四分-r} + - {element: 声母四分-zh} + - {element: 声母四分-ch} + - {element: 声母四分-sh} + - {element: 韵头-a} + - {element: 韵头-e} + - {element: 韵头-i} + - {element: 韵头-o} + - {element: 韵头-u} + - {element: 韵头-er, keys: [a, e, i, o, u]} + - {element: 韵头-ia, keys: [a, e, i, o, u]} + - {element: 韵头-ie, keys: [a, e, i, o, u]} + - {element: 韵头-io, keys: [a, e, i, o, u]} + - {element: 韵头-ua, keys: [a, e, i, o, u]} + - {element: 韵头-ue} + - {element: 韵头-uo} + - {element: 韵头-ü, keys: [a, e, i, o, u]} + - {element: 韵头-üa, keys: [a, e, i, o, u]} + - {element: 韵头-üe, keys: [a, e, i, o, u]} + - {element: 韵尾-i} + - {element: 韵尾-u} + - {element: 韵尾-n} + - {element: 韵尾-ng} + - {element: 韵尾-m} + - {element: 声调-1, keys: [a, e, i, o, u]} + - {element: 声调-2, keys: [a, e, i, o, u]} + - {element: 声调-3, keys: [a, e, i, o, u]} + - {element: 声调-4, keys: [a, e, i, o, u]} + - {element: 声调-5, keys: [a, e, i, o, u]} + - {element: 声母四分-零合, keys: [b, p, m, t, 'n', g, k, h, q, x, z, s, r]} + - {element: 声母四分-零开, keys: [b, p, m, t, 'n', g, k, h, q, x, z, s, r]} + - {element: 声母四分-零齐} + - {element: 声母四分-零撮, keys: [b, p, m, t, 'n', g, k, h, q, x, z, s, r]} diff --git a/examples/xuma.yaml b/examples/xuma.yaml new file mode 100644 index 0000000..e7d9faf --- /dev/null +++ b/examples/xuma.yaml @@ -0,0 +1,1231 @@ +version: '0.1' +source: xuma +info: + name: 徐码 + author: 徐国银 + version: 2023.01.15 + description: 简繁通打输入法 +analysis: + classifier: + 竖钩: 5 + 横捺: 5 + 竖提: 6 + 竖折: 6 + 竖弯: 6 + 竖弯钩: 6 + 竖折撇: 6 + 竖折折钩: 6 + 竖折折: 6 + 撇点: 6 + 撇折: 6 + 斜钩: 6 + 横折弯钩: 7 + 横斜钩: 7 + degenerator: + feature: + 提: 横 + 捺: 点 + no_cross: false + selector: + - 根少优先 + - 全符笔顺 + - 能连不交 + - 能散不连 + - 少弱字根 + - 取大优先 + customize: + 戋: + - '1' + - 戈 + 我: + - '3' + - 扌 + - 戈 + 凸: + - '2' + - '1' + - '2' + - '5' + - '1' + 束: + - "\ue04c" + - 口 + "\ue072": + - 十 + - 口 + - 冖 + 少: + - "\ue442" + - '3' + 兔: + - "\ue0bc" + - 口 + - "\ue424" + - '4' + "\ue0eb": + - 日 + - 十 + 尨: + - 尤 + - 彡 + 㦮: + - 二 + - 戈 + 㐁: + - '1' + - 囗 + - 人 + 为: + - "\ue00d" + - "\ue401" + 及: + - "\ue441" + - '4' + "\ue0b4": + - 匸 + - '1' + "\ue111": + - 䒑 + - 未 + 业: + - "\ue001" + - 䒑 + "\ue415": + - '1' + - 龷 + "\ue022": + - '1' + - 龷 + - 八 + "\ue064": + - 三 + - 人 + 柬: + - "\ue04c" + - 囗 + - 丷 + 冉: + - 冂 + - 土 + "\ue02b": + - "\ue06b" + - 二 + 卑: + - 白 + - 千 + 隺: + - 冖 + - 隹 + "\ue130": + - 十 + - 儿 + 亚: + - "\uf006" + - 䒑 + "\ue052": + - 車 + - '4' + 主: + - '4' + - 王 + 並: + - 䒑 + - "\ue001" + - 䒑 + 乑: + - 亻 + - "\ue077" + - "\ue088" + "\ue048": + - "\ue431" + - "\ue0d2" + - '2' + 耒: + - '1' + - 未 + 两: + - '1' + - 冂 + - 人 + - 人 + "\ue035": + - 十 + - "\ue431" + 万: + - 丆 + - '5' + 严: + - "\uf006" + - 䒑 + - '3' + 卫: + - "\ue0b2" + - '1' + 来: + - '1' + - 米 + "\ue082": + - 大 + - 丷 + "\ue013": + - 丷 + - "\ue410" + 囙: + - 囗 + - "\ue009" + "\ue01e": + - "\ue057" + - "\ue089" + "\ue0d5": + - 匸 + - '2' + - 口 + - '2' + "\ue0b8": + - 口 + - '1' + 㐆: + - "\ue024" + - 彐 + - '5' + "\ue129": + - '6' + - "\ue009" + - "\ue137" + "\ue10e": + - 彐 + - '3' + "\ue0e2": + - '6' + - "\ue447" + - '6' + - '6' + "\ue108": + - 二 + - 儿 + 亜: + - 二 + - 口 + - "\ue001" + "\ue136": + - 口 + - "\ue001" + - '1' + 丼: + - 廾 + - 亠 + "\ue121": + - '6' + - "\ue00d" + 囬: + - 囗 + - "\ue001" + - 二 + "\ue0cd": + - 刀 + - 二 + 夬: + - '5' + - 大 + "\ue00b": + - 䒑 + - "\ue0d1" + "\ue086": + - 二 + - 夂 + weak: + - "\ue410" + - "\ue039" + customizeCorners: {} +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + grouping: + "\ue042": 羊 + "\ue025": 亦 + "\ue0a3": 巳 + "\ue0ec": 电 + "\ue0e0": 片 + "\ue0e1": 爿 + "\ue441": 乃 + "\ue004": 丂 + "\ue416": 七 + "\ue059": 水 + 氺: 水 + "\ue039": 干 + "\ue0dc": 鹿 + "\ue0da": 鸟 + "\ue079": 匕 + "\ue011": 匕 + "\ue0d6": 几 + "\ue0b2": 卩 + "\ue012": 丬 + "\ue417": 七 + "\ue442": 小 + "\ue43d": 人 + "\ue451": 止 + "\ue0d2": 月 + "\ue102": 王 + "\ue444": 厶 + "\ue0c8": 车 + "\ue404": 亻 + "\ue44b": 禾 + "\ue0bd": 尸 + "\ue14c": 电 + "\ue14e": 爿 + 䶹: 屮 + "\ue069": 鬼 + "\ue41f": 月 + "\ue419": 且 + "\ue0c9": 辛 + "\ue003": 丰 + "\uf006": 丌 + 覀: 西 + "\ue0d7": 鳥 + "\ue11e": 千 + "\uf00a": 片 + "\uf00b": 爿 + "\ue10b": 月 + "\ue157": 馬 + "\uf00c": 米 + "\ue424": 儿 + "\ue80a": 衣 + 龵: 手 + "\ue153": 虍 + "\ue07e": "\ue0b7" + "\ue159": 烏 + "\ue44f": 厶 + "\uf005": 丱 + "\ue06b": 尸 + "\ue007": "\ue009" + 㐄: "\ue411" + 匸: 匚 + "\ue418": 匚 + "\ue019": 飠 + "\ue432": "\ue431" + 彐: "\ue431" + "\ue055": 冊 + "\ue410": "\ue002" + "\ue106": "\ue0b7" + "\ue11c": 臣 + "\ue020": "\ue0bc" + "\ue423": "\ue0bc" + 冖: "\ue0bc" + "\ue427": "\ue0bc" + "\uf008": 夕 + "\ue838": 鹿 + "\ue452": 十 + "\ue0e3": 八 + "\ue0ba": 八 + "\ue446": 八 + "\ue088": 八 + "\ue02d": "\ue028" + "\ue421": "\ue028" + "\ue413": 朩 + "\ue04d": 丄 + "\ue014": "\ue078" + "\ue029": "\ue078" + 糹: 糸 + 丩: 丱 + 凵: 屮 + "\ue02a": 勹 + "\ue831": 勹 + "\uebbd": 勹 + "\ue09b": "\ue083" + "\uf004": "\ue083" + "\ue41e": "\ue077" + "\uebc2": "\ue077" + "\ue16e": "\ue0e8" + "\ue01f": 龴 + "\ue434": 龴 + 廾: 艹 + 卝: 艹 + 卅: 艹 + "\ue050": 艹 + 卌: 艹 + "\ue443": "\ue068" + "\ue0d1": 夫 + "\ue00c": 曰 + "\ue070": 曰 + "\ue07c": "\ue018" + "\ue10c": "\ue018" + "\ue41a": "\ue001" + "\ue448": "\ue42d" + 䒑: 丷 + "\ue440": "\ue405" + "\ue023": 巜 + "\ue439": 冂 + "\ue14f": 爫 + "\uf01b": 乂 + mapping: + '1': gu + '2': ku + '3': pu + '4': wu + '5': bu + '6': cu + '7': bi + 亠: yu + 木: iv + 來: il + 㔾: bu + 卩: ae + 言: yv + 马: am + 尸: dv + 弓: dg + 韋: dw + 皮: dp + 又: do + 癶: du + 女: cv + 冂: mu + 贝: mb + 雨: jy + 彳: sr + 彡: ss + 讠: zy + 白: ub + 爿: ap + 臼: uj + 鬼: ug + 戶: rh + 片: tp + 申: ks + 由: ky + 电: kd + 車: jc + 丰: if + 至: fz + 隹: tw + 亻: tv + 風: qf + 几: qj + 母: cm + 殳: qs + 尤: jo + 手: rs + 扌: fv + 未: iw + 末: im + 气: pq + 乃: an + 廴: bd + 十: eu + 黑: mh + 艮: bg + 户: zh + 匚: ff + 丂: ek + 牙: fy + 犬: jq + 犭: vq + 臣: fe + 土: jv + 耂: ju + 士: ju + 龶: eu + 走: jz + 冫: xs + 宀: wv + 穴: wx + 小: cx + 火: xv + 灬: xh + 丁: ed + 示: fs + 上: ls + 丄: ou + 丅: ju + 王: ev + 日: kv + 曰: ku + 早: kz + 古: jg + 目: nv + 且: nq + 見: nj + 貝: nb + 缶: pf + 矢: pi + 纟: cj + 了: bl + 子: bz + 予: by + 寸: ic + 八: tu + 入: vr + 食: vs + 弋: fi + 戈: fg + 戊: fw + 立: yl + 辛: yx + 三: is + 巛: cc + 巜: cu + 川: tc + 耳: he + 丌: hj + 兀: gw + 口: ov + 鸟: sn + 乌: sw + 豸: vz + 刀: dd + 刂: ld + 禾: rv + 毛: rm + 千: rq + 壬: rr + 夭: ry + 麻: wm + 疒: wb + 广: wg + 鹿: wl + 辰: gn + 干: eg + 甫: ef + 厶: ai + 幺: ay + 匕: vi + 长: pc + 水: as + 氵: zv + 糸: av + 辶: zd + 之: zz + 大: fd + 夫: jf + 巴: db + 已: di + 己: dj + 巳: ds + 也: be + 乜: bu + 钅: pj + 工: ig + 酉: ey + 牛: pn + 齒: lc + 止: lz + 生: ps + 西: ex + 虫: lv + 丷: xu + 米: xm + 丬: xu + 羊: xy + 自: tz + 身: ts + 心: rx + 忄: uv + 人: uu + 僉: uq + 骨: ng + 冎: nu + 九: rj + 瓦: hw + 乂: ti + 力: cl + 用: sy + 面: gm + 而: ge + 革: hg + 世: hs + 艹: hv + 文: yw + 方: yu + 亥: yh + 亦: yi + 门: zm + 豕: gs + 金: vv + 非: lf + 其: hq + 巾: mj + 山: mv + 卜: lb + 鹵: ll + 瓜: rg + 爪: rz + 皿: mm + 罒: mw + 舟: ro + 髟: eb + 長: ez + 镸: ec + 习: ci + 丆: gu + 厂: gc + 石: gv + 不: gb + 甲: kj + 田: kt + 禺: ko + 魚: qv + 屮: au + 勹: su + 囗: nw + 月: sv + 七: fq + 车: fc + 欠: qq + 饣: qi + 鱼: qy + 夕: qx + 衤: wi + 阝: bv + "\ue068": hu + "\ue001": lu + "\ue0cb": ud + 馬: em + 烏: uw + 鳥: un + 鬥: nd + 門: nm + 黽: om + 飛: bf + 丱: au + "\ue083": su + "\ue0c6": oz + "\ue028": uu + "\ue411": fu + "\ue002": fu + "\ue09e": pv + "\ue08d": fu + 龷: hu + 龰: lu + "\ue018": lu + "\ue42d": zu + "\ue07f": vu + 儿: ve + 凡: qa + "\ue0bc": qu + 礻: ws + 衣: wy + 二: ee + 爫: vu + "\ue0b7": ru + 㐅: ti + "\ue137": nu + "\ue00d": zu + 朩: iu + 㗊: oj + "\ue078": pu + "\ue420": ru + 羽: cy + 爾: je + "\ue024": ru + 歹: gd + 頁: gy + 矛: bm + "\ue03e": nu + 夂: vu + 攵: pp + 虍: lh + "\ue073": nu + 音: yn + 鼠: us + "\ue04c": iv + "\uebc0": om + 牜: pn + "\ue077": su + "\ue0e6": su + "\ue08c": sy + "\ue031": du + "\ue0e8": du + 龴: du + "\ue009": du + "\ue0d0": jy + 攴: lp + "\ue447": xh + "\ue089": xu + "\ue406": cu + "\ue401": cl + "\ue14d": cx + "\ue405": cu + 飠: vs + "\ue057": vu + "\ue431": bu + "\ue060": mu + 冊: mu + 行: sx + 比: vb + "\ue043": fd + 鼻: tb + "\ue839": vb + "\uf00f": uv + "\ue449": fd + "\ue40c": vu + 父: tf + mapping_type: 2 +encoder: + max_length: 4 + select_keys: + - _ + - ; + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + index: 0 + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + next: c1 + index: 0 + s3: + object: {type: 字根, rootIndex: 1} + index: 1 + next: null + s4: + object: {type: 字根, rootIndex: -2} + next: s5 + index: 0 + s5: + object: {type: 字根, rootIndex: -1} + next: null + index: 0 + s6: + object: {type: 字根, rootIndex: -1} + next: s7 + index: 0 + s7: + object: {type: 字根, rootIndex: 1} + next: null + index: 1 + s8: + object: {type: 字根, rootIndex: 2} + next: c4 + index: 1 + s9: + object: {type: 字根, rootIndex: 1} + next: null + index: 1 + s10: + object: {type: 字根, rootIndex: 3} + next: c5 + index: 0 + s11: + object: {type: 字根, rootIndex: 3} + next: null + index: 1 + s12: + object: {type: 字根, rootIndex: 1} + next: null + index: 1 + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: s3 + c1: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: c3 + negative: c2 + c2: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s10 + negative: s8 + c3: + object: {type: 字根, rootIndex: 1} + operator: 编码匹配 + positive: s4 + negative: s6 + value: .[uv] + c4: + object: {type: 字根, rootIndex: 1} + operator: 编码匹配 + positive: null + negative: s9 + value: .[uv] + c5: + object: {type: 字根, rootIndex: 1} + operator: 编码匹配 + positive: s11 + negative: s12 + value: .[uv] + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2, count: 1}, {prefix: 3, count: 1}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa +data: + glyph_customization: + 重: + type: compound + operator: ⿳ + operandList: [丿, 車, 一] + 熏: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 黑] + 克: + type: compound + tags: [] + operator: ⿱ + operandList: [古, 儿] + 孑: + type: compound + operator: ⿻ + operandList: [了, 一] + 丢: + type: basic_component + strokes: [{feature: 平撇, start: [86, 7], curveList: [{command: z, parameterList: [-20, 4, -39, 6, -74, 7]}]}, {feature: 横, start: [15, 33], curveList: [{command: h, parameterList: [70]}]}, {feature: 竖, start: [50, 12], curveList: [{command: v, parameterList: [42]}]}, {feature: 横, start: [6, 54], curveList: [{command: h, parameterList: [88]}]}, {feature: 撇折, start: [42, 54], curveList: [{command: c, parameterList: [-7, 14, -16, 26, -26, 34]}, {command: h, parameterList: [69]}]}, {feature: 点, start: [68, 66], curveList: [{command: c, parameterList: [7, 8, 13, 15, 20, 28]}]}] + 丧: + type: derived_component + source: "\ue08d" + strokes: [{feature: 横, start: [10, 20], curveList: [{command: h, parameterList: [78]}]}, {feature: 竖, start: [50, 5], curveList: [{command: v, parameterList: [45]}]}, {feature: 点, start: [25, 35], curveList: [{command: c, parameterList: [3, 4, 7, 10, 10, 15]}]}, {feature: 撇, start: [75, 35], curveList: [{command: c, parameterList: [-2, 4, -6, 11, -10, 15]}]}, {feature: 横, start: [6, 50], curveList: [{command: h, parameterList: [86]}]}, {feature: 竖提, start: [20, 50], curveList: [{command: v, parameterList: [40]}, {command: h, parameterList: [20]}]}, {feature: 平撇, start: [85, 58], curveList: [{command: z, parameterList: [-10, 10, -20, 15, -23, 15]}]}, {feature: 捺, start: [47, 50], curveList: [{command: c, parameterList: [7, 18, 19, 29, 48, 40]}]}] + 堇: + type: basic_component + strokes: [{feature: 横, start: [6, 14], curveList: [{command: h, parameterList: [88]}]}, {feature: 竖, start: [29, 5], curveList: [{command: v, parameterList: [22]}]}, {feature: 竖, start: [71, 5], curveList: [{command: v, parameterList: [22]}]}, {feature: 横, start: [29, 27], curveList: [{command: h, parameterList: [42]}]}, {feature: 竖, start: [19, 38], curveList: [{command: v, parameterList: [14]}]}, {feature: 横折, start: [19, 38], curveList: [{command: h, parameterList: [62]}, {command: v, parameterList: [14]}]}, {feature: 横, start: [19, 52], curveList: [{command: h, parameterList: [62]}]}, {feature: 横, start: [14, 64], curveList: [{command: h, parameterList: [72]}]}, {feature: 横, start: [17, 77], curveList: [{command: h, parameterList: [66]}]}, {feature: 竖, start: [50, 27], curveList: [{command: v, parameterList: [63]}]}, {feature: 横, start: [7, 90], curveList: [{command: h, parameterList: [86]}]}] + 㐫: + type: compound + operator: ⿶ + operandList: [凵, 文] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 兕: + type: compound + operator: ⿱ + operandList: ["\ue060", 兀] + 命: + type: compound + operator: ⿸ + operandList: [合, 卩] + 匹: + type: compound + tags: [] + operator: ⿺ + operandList: [兀, "\ue09d"] + 容: + type: compound + operator: ⿳ + operandList: [穴, "\ue43d", 口] + "\ue9d0": + type: compound + tags: [横向包夹] + operator: ⿻ + operandList: ["\ue0e3", 米] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 胤: + type: compound + tags: [横向包夹] + operator: ⿻ + operandList: [儿, "\ue99d"] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 龠: + type: compound + operator: ⿱ + operandList: ["\uf003", "\ue055"] + 為: + type: compound + operator: ⿻ + operandList: [丶, "\uebbd"] + "\ue8ea": + type: compound + operator: ⿲ + operandList: ["\ue421", "\ue004", 丄] + "\ue156": + type: compound + operator: ⿰ + operandList: [立, 戈] + "\ue134": + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: ["\ue093", 氺] + 抇: + type: compound + operator: ⿰ + operandList: [扌, 日] + 黃: + type: compound + operator: ⿳ + operandList: [艹, 二, "\ue982"] + 龜: + type: compound + operator: ⿱ + operandList: [丿, "\uebc0"] + "\ueb0e": + type: compound + operator: ⿱ + operandList: [二, 业] + "\ue824": + type: compound + operator: ⿵ + operandList: ["\uebc2", 一] + order: [{index: 0, strokes: 6}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue872": + type: compound + operator: ⿹ + operandList: ["\ue873", 一] + order: [{index: 0, strokes: 5}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 痲: + type: compound + operator: ⿰ + operandList: [冫, 麻] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 痳: + type: compound + operator: ⿰ + operandList: [冫, 麻] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 佱: + type: compound + operator: ⿳ + operandList: ["\ue43d", 二, 止] + "\uea95": + type: compound + operator: ⿳ + operandList: [龷, 冂, 山] + "\ue9f9": + type: compound + operator: ⿱ + operandList: ["\ue82b", 一] + 喪: + type: compound + operator: ⿱ + operandList: ["\uebc3", "\ue08d"] + 㱏: + type: compound + operator: ⿱ + operandList: [二, 止] + "\ue9a0": + type: compound + operator: ⿱ + operandList: ["\uf00e", "\ue055"] + 䘮: + type: compound + operator: ⿱ + operandList: ["\uebc6", "\ue08d"] + 㝐: + type: compound + operator: ⿱ + operandList: [穴, 厶] + 㸃: + type: compound + operator: ⿺ + operandList: [黑, 占] + "\ueb1c": + type: derived_component + source: 乍 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: 横, start: [21, 94], curveList: [{command: h, parameterList: [71]}]}] + 㧉: + type: compound + operator: ⿰ + operandList: [扌, 气] + 交: + type: compound + operator: ⿱ + operandList: [亠, 父] + 童: + type: compound + operator: ⿻ + operandList: [音, 土] + "\ue9a5": + type: compound + operator: ⿲ + operandList: [冂, "\ue00d", 冂] + "\ue835": + type: compound + operator: ⿻ + operandList: ["\ue009", 古] + 麗: + type: compound + operator: ⿱ + operandList: [丽, 鹿] + 昌: + type: compound + operator: ⿱ + operandList: [日, 曰] + 丝: + type: compound + operator: ⿰ + operandList: ["\ue023", 纟] + "\ue9ae": + type: compound + operator: ⿴ + operandList: [古, 口] + 旮: + type: compound + operator: ⿱ + operandList: [九, 曰] + 舞: + type: compound + operator: ⿱ + operandList: ["\uf010", "\uf012"] + 器: + type: compound + tags: [纵向包夹] + operator: ⿴ + operandList: [㗊, 犬] + 嚣: + type: compound + operator: ⿴ + operandList: [㗊, 页] + order: [{index: 0, strokes: 6}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 嚚: + type: compound + operator: ⿴ + operandList: [㗊, 臣] + "\ue9be": + type: compound + operator: ⿴ + operandList: [比, 矢] + order: [{index: 0, strokes: 2}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 㐮: + type: compound + operator: ⿴ + operandList: ["\ue80a", "\uf017"] + 肅: + type: compound + operator: ⿳ + operandList: ["\ue431", 十, "\uf016"] + 㕚: + type: compound + operator: ⿻ + operandList: [又, "\ue00d"] + 㣇: + type: compound + tags: [] + operator: ⿱ + operandList: ["\uf018", 巾] + 晉: + type: compound + operator: ⿱ + operandList: ["\uf01a", 日] + 書: + type: compound + operator: ⿱ + operandList: ["\ue114", 曰] + "\ue94f": + type: compound + operator: ⿱ + operandList: [屮, 王] + "\uea8b": + type: compound + operator: ⿱ + operandList: ["\ue427", 又] + "\ue94b": + type: compound + operator: ⿰ + operandList: [口, "\ue427"] + "\uea98": + type: compound + operator: ⿱ + operandList: [一, "\ue9a5"] + "\ue133": + type: compound + operator: ⿱ + operandList: [丿, 凡] + 囂: + type: compound + operator: ⿴ + operandList: [㗊, 頁] + tags: + - 行框 + - 衣框 + - 微字框 + - 纵向包夹 + - 戈部截断 + repertoire: + "\uf003": + unicode: 61443 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [亼, "\ue0e4"]}] + ambiguous: false + name: 龠字头 + "\uf004": + unicode: 61444 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 亙, strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 亙无二 + "\uf005": + unicode: 61445 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue120", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 虛字底无横 + "\uf006": + unicode: 61446 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 亚, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 亚三 + "\uf007": + unicode: 61447 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue112", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 5}]}] + ambiguous: false + name: 帶字头无横 + "\uf008": + unicode: 61448 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue123", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 宐字底无横 + "\uf009": + unicode: 61449 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue115", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 華字心 + "\uf00a": + unicode: 61450 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 0}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 6}]}] + ambiguous: false + name: 淵字边左 + "\uf00b": + unicode: 61451 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 淵字边右 + "\uf00c": + unicode: 61452 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 粛, strokes: [{feature: reference, index: 3}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}, {feature: reference, index: 9}, {feature: reference, index: 10}]}] + ambiguous: false + name: 粛字心 + "\uf00d": + unicode: 61453 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue12e", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 4}]}] + ambiguous: false + name: 枾字边心 + "\uf00e": + unicode: 61454 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [亼, 吅]}] + ambiguous: false + name: 㵸字旁头 + "\uf00f": + unicode: 61455 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 㣺, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 㣺无丶 + "\uf010": + unicode: 61456 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0b1", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 5}, {feature: reference, index: 6}]}] + ambiguous: false + name: 舞字头无横 + "\uf012": + unicode: 61458 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿰, operandList: [歹, 㐄]}] + ambiguous: false + name: 歹㐄 + "\uf016": + unicode: 61462 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 淵字边无一 + "\uf017": + unicode: 61463 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [八, "\ue415"]}] + ambiguous: false + name: 㐮心 + "\uf018": + unicode: 61464 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿳, operandList: ["\ue440", 丆, 丿]}] + ambiguous: false + name: 㣇上 + "\uf01a": + unicode: 61466 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿴, operandList: [二, 厸]}] + ambiguous: false + name: 晉上 + "\uf01b": + unicode: 61467 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 匁, strokes: [{feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 匁字心 + character_set: extended +optimization: + objective: {} + metaheuristic: + algorithm: SimulatedAnnealing + constraints: + elements: [] + indices: [] + element_indices: [] diff --git a/examples/yima.yaml b/examples/yima.yaml deleted file mode 100644 index 952544a..0000000 --- a/examples/yima.yaml +++ /dev/null @@ -1,29 +0,0 @@ -encoder: - max_length: 3 - sources: - s0: { object: null, next: s1 } - s1: { object: { type: 字根, rootIndex: 1 }, index: 0, next: c0 } - s2: { object: { type: 字根, rootIndex: 2 }, index: 0, next: c1 } - s3: { object: { type: 二笔, rootIndex: 1, strokeIndex: 1 }, next: s4 } - s4: { object: { type: 字根, rootIndex: 1 }, index: 1, next: null } - s5: { object: { type: 二笔, rootIndex: 2, strokeIndex: 1 }, next: s7 } - s6: { object: { type: 字根, rootIndex: 3 }, index: 0, next: c2 } - s7: { object: { type: 字根, rootIndex: 2 }, index: 1, next: null } - s8: { object: { type: 字根, rootIndex: -1 }, index: 0, next: null } - s9: { object: { type: 二笔, rootIndex: 3, strokeIndex: 1 }, next: null } - conditions: - c0: - object: { type: 字根, rootIndex: 2 } - operator: 存在 - positive: s2 - negative: s3 - c1: - object: { type: 字根, rootIndex: 3 } - operator: 存在 - positive: s6 - negative: s5 - c2: - object: { type: 字根, rootIndex: 4 } - operator: 存在 - positive: s8 - negative: s9 diff --git a/examples/yustar.yaml b/examples/yustar.yaml new file mode 100644 index 0000000..6f86688 --- /dev/null +++ b/examples/yustar.yaml @@ -0,0 +1,1015 @@ +version: '0.1' +source: yustar +info: + name: 宇浩·星陈 + author: 朱宇浩 + version: '3.5.0' + description: 全汉字字形输入・繁简通打 +analysis: + classifier: + 竖钩: 5 + 横捺: 5 + 竖提: 6 + 竖折: 6 + 竖弯: 6 + 竖弯钩: 6 + 竖折撇: 6 + 竖折折钩: 6 + 竖折折: 6 + 撇点: 6 + 撇折: 6 + 斜钩: 6 + degenerator: + feature: + 提: 横 + 捺: 点 + no_cross: false + selector: + - 根少优先 + - 结构完整 + - 连续笔顺 + - 能连不交 + - 能散不连 + - 少弱字根 + - 取大优先 + customize: + 戋: + - '1' + - 戈 + 我: + - '3' + - 扌 + - 戈 + "\ue08a": + - 禾 + - 戈 + 凸: + - '2' + - '1' + - '2' + - '5' + - '1' + "\ue053": + - 耳 + - 戈 + 隺: + - 冖 + - 隹 + 两: + - '1' + - 冂 + - 人 + - 人 + 尨: + - 尤 + - 彡 + 垂: + - 千 + - 龷 + - '1' + 柬: + - "\ue04c" + - 囗 + - 丷 + 禹: + - '3' + - 口 + - 冂 + - "\ue04d" + "\ue0a6": + - "\ue431" + - "\ue001" + - 八 + 丙: + - '1' + - 冂 + - 人 + 卞: + - '4' + - 下 + 主: + - '4' + - 王 + 再: + - '1' + - 冂 + - "\ue43a" + 乑: + - 亻 + - "\ue077" + - "\ue088" + "\ue066": + - 卄 + - 日 + "\ue034": + - 夕 + - '4' + 堇: + - 革 + - 二 + 亙: + - '1' + - "\uf004" + - '1' + "\ue139": + - 二 + - '5' + - 口 + - 丄 + 曲: + - "\ue439" + - 龷 + 㦮: + - 二 + - 戈 + 亜: + - "\uf006" + - 口 + - '1' + 严: + - '1' + - 业 + - '3' + 夨: + - '6' + - 大 + 甴: + - 囗 + - 丄 + "\ue168": + - 丅 + - "\ue424" + 丼: + - 廾 + - 亠 + "\ue121": + - '6' + - "\ue00d" + "\ue136": + - 口 + - "\ue001" + - '1' + weak: + - "\ue410" + - "\ue039" + - "\ue042" +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + grouping: + "\ue089": 丷 + 䒑: 丷 + "\ue044": 丷 + "\ue042": 羊 + "\ue093": 羊 + "\ue083": 月 + "\ue09b": 月 + "\ue02a": 勹 + "\ue427": 勹 + "\ue04e": 屮 + "\ue440": 彑 + "\ue405": 彑 + "\ue025": 亦 + "\ue834": 亡 + "\ue420": 豕 + 爫: 爪 + "\ue018": 卜 + "\ue07c": 卜 + "\ue41a": "\ue001" + "\ue03e": 小 + "\ue073": 小 + "\ue0c3": 尚 + "\ue0a3": 巳 + "\ue0c6": 足 + 牜: 牛 + "\ue029": 牛 + 朩: 木 + "\ue04c": 木 + "\ue002": 㐄 + "\ue410": 㐄 + "\ue0ac": 高 + "\ue804": 高 + "\ue006": 高 + "\ue415": 艹 + 龷: 艹 + 廾: 艹 + 卝: 艹 + 卄: 艹 + "\ue0ec": 电 + "\ue421": 臼 + "\ue028": 向 + "\ue02d": 向 + "\ue400": 斤 + "\ue024": 斤 + "\ue0e0": 片 + "\ue0e1": 爿 + "\ue07e": "\ue0b7" + "\ue09e": 竹 + "\ue014": 竹 + "\ue078": 竹 + "\ue441": 乃 + "\ue004": 丂 + "\ue04d": 丄 + "\ue0e3": 八 + "\ue413": 寸 + "\ue8d9": 卯 + "\ue08e": 卯 + "\ue01a": 卯 + "\ue057": 卯 + "\ue40c": 卯 + "\ue023": 纟 + "\ue020": 冖 + "\ue0bc": 冖 + "\ue423": 冖 + "\ue416": 七 + "\ue988": 冂 + "\ue060": 冂 + "\ue077": 彡 + "\ue41e": 彡 + "\ue0e6": 彡 + 龴: 又 + "\ue01f": 又 + "\ue434": 又 + "\ue031": 尸 + "\ue06b": 尸 + "\ue0b4": 彐 + "\ue0e8": 韋 + "\ue059": 水 + 氺: 水 + "\ue0d9": 水 + "\ue039": 干 + "\ue0dc": 鹿 + "\ue08d": 辰 + "\ue0da": 鸟 + "\ue00d": 二 + "\ue088": 二 + "\ue079": 匕 + "\ue011": 匕 + "\ue0d6": 几 + "\ue424": 儿 + "\ue0b2": 卩 + "\ue07f": 儿 + "\ue012": 丬 + "\ue417": 七 + "\ue442": 小 + "\ue087": 八 + "\ue43d": 人 + "\ue451": 止 + "\ue401": 力 + "\ue406": 母 + "\ue043": 大 + "\ue449": 大 + "\ue050": 卅 + "\ue431": 彐 + "\ue432": 彐 + "\ue070": 日 + "\ue0d2": 月 + "\ue102": 王 + "\ue43a": 土 + "\ue411": 㐄 + "\ue439": 冂 + "\ue0d0": 雨 + "\ue448": 氵 + "\ue42d": 氵 + "\ue046": 氵 + "\ue444": 厶 + "\ue0c2": 舌 + "\ue0ba": 八 + "\ue052": 車 + "\ue446": 八 + 礻: 示 + "\ue0c8": 车 + "\ue106": "\ue0b7" + "\ue0d5": 臣 + "\ue404": 亻 + "\ue08c": 用 + "\ue44b": 禾 + "\ue0bd": 尸 + "\ue14c": 电 + "\ue14e": 爿 + "\ue14d": 小 + "\ue0d1": 夫 + 攵: 夊 + "\ue418": 匚 + 䶹: 屮 + "\ue069": 鬼 + "\ue41f": 月 + "\ue419": 且 + "\ue452": 十 + "\ue443": "\ue068" + "\ue0c9": 辛 + "\ue0d8": 乂 + "\ue838": 鹿 + "\uf000": 高 + "\uf003": 合 + "\ue003": 丰 + "\uf004": 月 + "\uf005": 丩 + 丱: 丩 + "\ue137": 八 + "\ue129": 八 + "\uf006": 丌 + "\ue130": 木 + 冊: "\ue055" + 襾: 西 + 覀: 西 + 龰: 止 + "\ue0d7": 鳥 + 卌: 卅 + "\uf007": 卅 + "\uf008": 夕 + "\ue16e": 韋 + "\ue131": 臣 + "\ue11c": 臣 + "\ue154": 艹 + "\uebbd": "\ue831" + "\ue11e": 千 + 尙: 尚 + "\uf00a": 片 + "\uf00b": 爿 + "\ue10c": 卜 + "\ue10b": 月 + 飠: 食 + "\ue019": 食 + "\ue157": 馬 + "\uebc0": 黽 + "\uf00c": 米 + "\uebc2": 彳 + "\ue873": 士 + "\uf00d": 㐄 + "\ue125": 彐 + "\uf00e": 合 + "\ue153": 虎 + 虍: 虎 + "\uf00f": 忄 + mapping: + '1': fi + '2': us + '3': gp + '4': kd + '5': yi + '6': ei + 高: ag + 亠: at + 木: am + 來: al + 㔾: aj + 卩: aj + 言: by + 马: bm + 尸: bs + 弓: bg + 韋: bw + 皮: bp + 又: bo + 癶: bo + 彐: bj + 肀: bj + 丑: bc + 隶: bd + 女: cn + 冂: ck + 见: cj + 贝: cb + 雨: cv + 彳: cc + 彡: cp + 讠: dy + 白: db + 爿: dq + 臼: di + 鬼: dg + 甶: dg + 向: dx + 戶: dh + 斤: dj + 片: dp + 申: ds + 由: do + 电: dd + 車: dc + 叀: dc + 丰: df + 至: dz + 隹: eh + 亻: er + 風: ef + 几: ej + 母: em + 彑: em + 殳: es + 尤: fo + 尢: fo + 手: fs + 龵: fs + 扌: fs + 未: fw + 末: fm + 竹: gz + 气: gq + 乃: gn + 廴: gy + 十: gi + 黑: gh + 艮: gg + 户: hh + 戸: hh + 匚: hf + 丂: hk + 牙: ha + 犬: hq + 犭: hq + 臣: hc + 土: ht + 耂: ht + 士: hs + 龶: hs + 走: hz + 壴: hz + 亍: ic + 二: ir + 冫: ir + 宀: im + 穴: ix + 尚: is + 龸: is + 小: iv + 火: ih + 灬: ib + 丁: jd + 示: js + 上: jv + 丄: jv + 下: jx + 丅: jx + 王: jw + 日: jr + 曰: jy + 早: jz + 古: jg + 目: jm + 且: jq + 見: jj + 貝: jb + 缶: jf + 矢: ji + 卯: km + 纟: kj + 了: ke + 子: kz + 予: kv + 寸: kc + 八: ka + 入: kr + 食: ks + 弋: ki + 戈: kg + 戊: kw + 立: kl + 辛: kx + 三: la + 巛: lc + 巜: lc + 川: lc + 耳: le + 丌: lj + 兀: lw + 舌: ls + 口: lv + 鸟: mn + 乌: mw + 豸: mz + 刀: md + 刂: md + 禾: mh + 毛: mm + 千: mq + 壬: mr + 夭: my + 麻: ma + 疒: mb + 广: mg + 鹿: ml + 辰: mc + 干: ng + 甫: nf + 厶: na + 幺: na + 匕: nb + 长: nc + 水: ns + 氵: ns + 糸: os + 糹: os + 辶: oc + 之: oz + 大: od + 夫: of + 巴: ob + 已: oi + 己: oj + 巳: os + 也: oe + 乜: om + 钅: oj + 工: pg + 酉: py + 牛: pn + 齒: pc + 止: pi + 足: pz + 生: ps + 西: px + 虫: qc + 丷: qk + 米: qm + 丬: qq + 羊: qy + 自: qi + 身: qs + 心: ri + 忄: rx + 人: re + 合: rh + 僉: rq + 骨: rg + 咼: rk + 冎: rk + 九: rj + 瓦: rw + 乂: si + 力: sl + 用: sy + 面: sm + 而: sr + 革: sg + 世: si + 艹: so + 卅: ss + 文: te + 方: tf + 亥: th + 亦: ti + 门: tm + 豕: ts + 夊: tu + 亡: tw + 金: tj + 业: ue + 非: uf + 其: uq + 巾: uj + 山: us + 卜: ub + 虎: uh + 鹵: ul + 瓜: ug + 爪: uz + 皿: um + 罒: uw + 舟: uo + 髟: ub + 長: uc + 镸: uc + 习: vx + 丆: vh + 厂: vh + 石: vs + 不: vu + 甲: vj + 里: vl + 田: vt + 禺: vv + 魚: vv + 儿: wr + 屮: wc + 丩: wj + 凵: wk + 勹: wb + 囗: ww + 月: wy + 七: xi + 车: xj + 冖: xm + 欠: xq + 饣: xs + 鱼: xv + 夕: xx + 衤: xy + 阝: yf + "\ue068": ez + "\ue001": us + 㐄: ak + "\ue0b7": gy + "\ue0e2": ls + "\ue007": bo + "\ue009": bo + "\ue064": od + "\ue055": ce + "\ue0cb": dd + 馬: wm + 烏: dw + 鳥: dn + 鬥: du + 門: dm + 黽: dm + 飛: yf + "\ue831": gw + "\ue14f": uz + mapping_type: 2 +encoder: + max_length: 4 + select_keys: + - _ + - ; + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + index: 0 + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + index: 0 + next: c1 + s3: + object: {type: 字根, rootIndex: 1} + index: 1 + next: s6 + s4: + object: {type: 字根, rootIndex: 2} + index: 1 + next: s9 + s5: + object: {type: 字根, rootIndex: 3} + index: 0 + next: c2 + s6: + object: {type: 字根, rootIndex: 1} + index: 1 + next: null + s7: + object: {type: 字根, rootIndex: -1} + index: 0 + next: null + s8: + object: {type: 字根, rootIndex: 3} + index: 1 + next: null + s9: + object: {type: 字根, rootIndex: 1} + index: 1 + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: s3 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s5 + negative: s4 + c2: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s7 + negative: s8 + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2, count: 1}, {prefix: 3, count: 1}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa +data: + glyph_customization: + 重: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 里] + 熏: + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: [千, 黑] + 卵: + type: compound + operator: ⿲ + operandList: [卯, 丶, 丶] + 克: + type: compound + tags: [] + operator: ⿱ + operandList: [古, 儿] + 孑: + type: compound + operator: ⿻ + operandList: [了, 一] + 丢: + type: basic_component + strokes: [{feature: 平撇, start: [86, 7], curveList: [{command: z, parameterList: [-20, 4, -39, 6, -74, 7]}]}, {feature: 横, start: [15, 33], curveList: [{command: h, parameterList: [70]}]}, {feature: 竖, start: [50, 12], curveList: [{command: v, parameterList: [42]}]}, {feature: 横, start: [6, 54], curveList: [{command: h, parameterList: [88]}]}, {feature: 撇折, start: [42, 54], curveList: [{command: c, parameterList: [-7, 14, -16, 26, -26, 34]}, {command: h, parameterList: [69]}]}, {feature: 点, start: [68, 66], curveList: [{command: c, parameterList: [7, 8, 13, 15, 20, 28]}]}] + 丧: + type: derived_component + source: "\ue08d" + strokes: [{feature: 横, start: [10, 20], curveList: [{command: h, parameterList: [78]}]}, {feature: 竖, start: [50, 5], curveList: [{command: v, parameterList: [45]}]}, {feature: 点, start: [25, 35], curveList: [{command: c, parameterList: [3, 4, 7, 10, 10, 15]}]}, {feature: 撇, start: [75, 35], curveList: [{command: c, parameterList: [-2, 4, -6, 11, -10, 15]}]}, {feature: 横, start: [6, 50], curveList: [{command: h, parameterList: [86]}]}, {feature: 竖提, start: [20, 50], curveList: [{command: v, parameterList: [40]}, {command: h, parameterList: [20]}]}, {feature: 平撇, start: [85, 58], curveList: [{command: z, parameterList: [-10, 10, -20, 15, -23, 15]}]}, {feature: 捺, start: [47, 50], curveList: [{command: c, parameterList: [7, 18, 19, 29, 48, 40]}]}] + 堇: + type: basic_component + strokes: [{feature: 横, start: [6, 14], curveList: [{command: h, parameterList: [88]}]}, {feature: 竖, start: [29, 5], curveList: [{command: v, parameterList: [22]}]}, {feature: 竖, start: [71, 5], curveList: [{command: v, parameterList: [22]}]}, {feature: 横, start: [29, 27], curveList: [{command: h, parameterList: [42]}]}, {feature: 竖, start: [19, 38], curveList: [{command: v, parameterList: [14]}]}, {feature: 横折, start: [19, 38], curveList: [{command: h, parameterList: [62]}, {command: v, parameterList: [14]}]}, {feature: 横, start: [19, 52], curveList: [{command: h, parameterList: [62]}]}, {feature: 横, start: [14, 64], curveList: [{command: h, parameterList: [72]}]}, {feature: 横, start: [17, 77], curveList: [{command: h, parameterList: [66]}]}, {feature: 竖, start: [50, 27], curveList: [{command: v, parameterList: [63]}]}, {feature: 横, start: [7, 90], curveList: [{command: h, parameterList: [86]}]}] + 㐫: + type: compound + operator: ⿶ + operandList: [凵, 文] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 衰: + type: compound + operator: ⿳ + operandList: ["\ue006", 一, "\ue0b7"] + 亓: + type: derived_component + source: 丌 + strokes: [{feature: 横, start: [18, 5], curveList: [{command: h, parameterList: [64]}]}, {feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}] + 元: + type: derived_component + source: 兀 + strokes: [{feature: 横, start: [20, 10], curveList: [{command: h, parameterList: [60]}]}, {feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}] + 兕: + type: compound + operator: ⿱ + operandList: ["\ue060", 兀] + 命: + type: compound + operator: ⿸ + operandList: [合, 卩] + 哀: + type: compound + operator: ⿱ + operandList: ["\ue006", "\ue0b7"] + 匹: + type: compound + tags: [] + operator: ⿺ + operandList: [兀, "\ue09d"] + 容: + type: compound + operator: ⿳ + operandList: [穴, "\ue43d", 口] + 襄: + type: compound + operator: ⿱ + operandList: ["\uf000", "\ue0b9"] + "\ue9d0": + type: compound + tags: [横向包夹] + operator: ⿻ + operandList: ["\ue0e3", 米] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 胤: + type: compound + tags: [横向包夹] + operator: ⿻ + operandList: [儿, "\ue99d"] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 龠: + type: compound + operator: ⿱ + operandList: ["\uf003", "\ue055"] + 衷: + type: compound + operator: ⿳ + operandList: ["\ue006", 丨, "\ue0b7"] + 為: + type: compound + operator: ⿻ + operandList: [丶, "\uebbd"] + "\ue8ea": + type: compound + operator: ⿲ + operandList: ["\ue421", "\ue004", 丄] + "\ue156": + type: compound + operator: ⿰ + operandList: [立, 戈] + "\ue134": + type: compound + tags: [中竖截断] + operator: ⿱ + operandList: ["\ue093", 氺] + 抇: + type: compound + operator: ⿰ + operandList: [扌, 日] + 黃: + type: compound + operator: ⿳ + operandList: [艹, 二, "\ue982"] + 龜: + type: compound + operator: ⿱ + operandList: [丿, "\uebc0"] + "\ueb0e": + type: compound + operator: ⿱ + operandList: [二, 业] + "\ue824": + type: compound + operator: ⿵ + operandList: ["\uebc2", 一] + order: [{index: 0, strokes: 6}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue872": + type: compound + operator: ⿹ + operandList: ["\ue873", 一] + order: [{index: 0, strokes: 5}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 痲: + type: compound + operator: ⿰ + operandList: [冫, 麻] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 痳: + type: compound + operator: ⿰ + operandList: [冫, 麻] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 佱: + type: compound + operator: ⿳ + operandList: ["\ue43d", 二, 止] + "\uea95": + type: compound + operator: ⿳ + operandList: [龷, 冂, 山] + "\ue9f9": + type: compound + operator: ⿱ + operandList: ["\ue82b", 一] + 喪: + type: compound + operator: ⿱ + operandList: ["\uebc3", "\ue08d"] + 㱏: + type: compound + operator: ⿱ + operandList: [二, 止] + "\ue9a0": + type: compound + operator: ⿱ + operandList: ["\uf00e", "\ue055"] + 䘮: + type: compound + operator: ⿱ + operandList: ["\uebc6", "\ue08d"] + 㝐: + type: compound + operator: ⿱ + operandList: [穴, 厶] + 㸃: + type: compound + operator: ⿺ + operandList: [黑, 占] + "\ueb1c": + type: derived_component + source: 乍 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: 横, start: [21, 94], curveList: [{command: h, parameterList: [71]}]}] + 㧉: + type: compound + operator: ⿰ + operandList: [扌, 气] + tags: + - 赢字框 + - 彀字框 + - 微字框 + repertoire: + "\uf000": + unicode: 61440 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [亠, 吅]}] + ambiguous: false + name: 襄字头 + "\uf003": + unicode: 61443 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [亼, "\ue0e4"]}] + ambiguous: false + name: 龠字头 + "\uf004": + unicode: 61444 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 亙, strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 亙无二 + "\uf005": + unicode: 61445 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue120", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 虛字底无横 + "\uf006": + unicode: 61446 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 亚, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 亚三 + "\uf007": + unicode: 61447 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue112", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 5}]}] + ambiguous: false + name: 帶字头无横 + "\uf008": + unicode: 61448 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue123", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 宐字底无横 + "\uf009": + unicode: 61449 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue115", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 華字心 + "\uf00a": + unicode: 61450 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 0}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 6}]}] + ambiguous: false + name: 淵字边左 + "\uf00b": + unicode: 61451 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue10a", strokes: [{feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 7}, {feature: reference, index: 8}]}] + ambiguous: false + name: 淵字边右 + "\uf00c": + unicode: 61452 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 粛, strokes: [{feature: reference, index: 3}, {feature: reference, index: 6}, {feature: reference, index: 7}, {feature: reference, index: 8}, {feature: reference, index: 9}, {feature: reference, index: 10}]}] + ambiguous: false + name: 粛字心 + "\uf00d": + unicode: 61453 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue12e", strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 4}]}] + ambiguous: false + name: 枾字边心 + "\uf00e": + unicode: 61454 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [亼, 吅]}] + ambiguous: false + name: 㵸字旁头 + "\uf00f": + unicode: 61455 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 㣺, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 㣺无丶 + character_set: extended diff --git a/examples/zhangma.yaml b/examples/zhangma.yaml new file mode 100644 index 0000000..6f0629f --- /dev/null +++ b/examples/zhangma.yaml @@ -0,0 +1,815 @@ +version: '0.1' +source: zhangma +info: + name: 张码 + author: 张建平 + version: '7.0' + description: 形义码元编码输入法 +analysis: + classifier: + 竖钩: 6 + 圈: 7 + degenerator: + no_cross: false + feature: + 捺: 点 + selector: + - 根少优先 + - 结构完整 + - 连续笔顺 + - 能连不交 + - 能散不连 + - 取大优先 + customize: + 丈: + - '1' + - 乂 + 下: + - '1' + - 卜 + 丌: + - '1' + - "\ue0e3" + 丐: + - '1' + - "\ue018" + - '5' + 兀: + - '1' + - 儿 + 再: + - '1' + - 冂 + - "\ue43a" + 末: + - '1' + - 木 + 束: + - "\ue04c" + - 口 + "\ue0cf": + - 王 + - 丷 + 金: + - "\ue43d" + - 王 + - 丷 + 卡: + - "\ue018" + - '1' + - 卜 + 里: + - 日 + - "\ue43a" + 天: + - '1' + - 大 + 禹: + - '3' + - 口 + - 冂 + - "\ue04d" + "\ue02c": + - 土 + - 丷 + "\ue0a4": + - 䒑 + - '2' + "\ue035": + - '1' + - "\ue431" + - '2' + "\ue067": + - 丷 + - "\ue070" + - 丷 + 凸: + - '2' + - '1' + - '2' + - '5' + - '1' + 凹: + - '2' + - '5' + - '2' + - '5' + - '1' + "\ue066": + - '1' + - "\ue439" + - 龷 + "\ue064": + - 三 + - 人 + "\ue052": + - '1' + - 日 + - "\ue04d" + 牜: + - "\ue05b" + - '2' + 㡀: + - 丷 + - 冂 + - "\ue442" + 州: + - '4' + - '3' + - '4' + - '2' + "\ue053": + - 耳 + - 戈 + 瓦: + - '1' + - '5' + - '5' + - '4' + "\ue08a": + - 禾 + - 戈 + 曲: + - "\ue439" + - 龷 + "\ue083": + - "\ue423" + - "\ue00d" + 囬: + - 囗 + - "\ue001" + - 二 + 万: + - '1' + - "\ue427" + serializer: zhangma +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + grouping: + '7': 二 + 勹: 勺 + "\ue020": 勺 + "\ue423": 勺 + "\ue427": 勺 + "\ue042": 羊 + "\ue02e": 疒 + "\ue055": 皿 + "\ue069": "\ue02d" + 爫: 爪 + "\ue42d": 爪 + "\ue046": 爪 + 覀: 西 + 氏: 虍 + "\ue077": 彳 + "\ue41e": 彳 + "\ue0e3": 儿 + "\ue0ba": 儿 + "\ue0d6": 门 + 卩: 阝 + "\ue0b2": 阝 + "\ue40f": "\ue029" + "\ue404": 亻 + "\ue024": 亻 + 丷: 䒑 + 㔾: 巳 + 氺: 水 + "\ue42b": 水 + "\ue442": 小 + "\ue03e": 小 + "\ue0d9": 小 + "\ue431": 彐 + "\ue07d": 彐 + "\ue42f": 灬 + "\ue430": 灬 + "\ue42e": 灬 + "\ue0e2": 雨 + "\ue006": 酉 + "\ue437": 止 + 龰: 止 + "\ue03a": 止 + "\ue451": 止 + 辶: 之 + 龴: 廴 + 夂: 廴 + "\ue004": 五 + 丂: 五 + 弋: 戈 + 寸: 戈 + "\ue03f": 戈 + "\ue435": 马 + 罒: 四 + "\ue436": 四 + 穴: 大 + 龸: 大 + 长: 镸 + "\ue800": 田 + "\ue070": 三 + 韦: 王 + 龶: 王 + 衤: 示 + "\ue0ae": 瓜 + 干: 土 + "\ue039": 土 + "\ue418": "\ue07c" + 卜: "\ue018" + "\ue0da": 鸟 + 支: 十 + "\ue068": 十 + "\ue09e": 竹 + "\ue421": 臼 + "\ue079": 七 + 匕: 七 + "\ue011": 七 + "\ue001": 刂 + 癶: 八 + "\ue09b": 八 + 礻: 饣 + "\ue44f": 厶 + "\ue04d": 厶 + "\ue43d": 人 + 亽: 人 + "\uf000": 人 + 车: 車 + "\ue0c8": 車 + "\ue405": 母 + "\ue406": 母 + "\ue419": 母 + "\ue023": 纟 + 彑: 纟 + 㠯: 目 + 囗: 目 + "\ue44b": 禾 + "\ue40e": 禾 + 东: 禾 + "\ue05c": 禾 + 心: 匚 + "\ue051": 匚 + 吂: 可 + 艮: 曰 + "\ue01c": 曰 + 忄: 巛 + 也: 勿 + "\ue439": 冂 + "\ue02a": 冂 + 丆: 厂 + "\ue0c1": 虫 + "\ue422": "\ue088" + "\ue441": 乃 + "\ue0f6": "\ue0fc" + 了: "\ue0fc" + 丬: "\ue012" + 乂: 叉 + "\ue434": 叉 + "\ue00d": 冫 + 廾: 冫 + 龷: 冫 + 又: 刀 + "\ue177": "\ue012" + "\ue178": 七 + "\ue0d0": 雨 + "\ue838": 鹿 + "\ue445": 小 + "\ue42c": 水 + "\uf001": 鸟 + "\ue43a": 土 + "\ue043": 大 + "\ue449": 大 + "\ue43f": 七 + "\ue401": 力 + "\ue04c": 木 + 朩: 木 + "\ue17b": "\ue012" + "\ue17c": "\ue012" + "\ue0d2": 月 + "\ue402": "\ue012" + "\ue102": 王 + "\ue17d": 三 + "\ue443": 十 + "\ue452": 十 + "\ue179": "\ue0fc" + "\uf002": "\ue088" + "\ue446": 八 + "\ue05b": "\ue029" + "\ue14f": 爪 + "\uf003": 厂 + "\ue438": "\ue088" + "\uf004": 三 + "\uf005": 戈 + "\uf006": 丩 + "\ue868": 巾 + mapping: + '1': g + '2': j + '3': e + '4': o + '5': z + '6': 'n' + '11': g + '12': f + '13': d + '14': s + '15': a + '21': h + '22': j + '23': k + '24': l + '25': m + '31': t + '32': r + '33': e + '34': w + '35': q + '41': 'y' + '42': u + '43': i + '44': o + '45': p + '51': b + '52': v + '53': c + '54': x + '55': z + '61': 'n' + 米: q + "\ue0ce": q + "\ue057": q + 勺: q + 我: q + 月: q + 羊: q + 力: w + 疒: w + 夭: w + 贝: w + 皿: w + 几: w + 鱼: w + "\ue02d": w + 子: e + 广: e + 犭: e + 彡: e + "\ue07f": e + 爪: e + 巾: e + 年: e + 西: r + 虍: r + 彳: r + 儿: r + 门: r + 阝: r + "\ue029": r + 乐: t + 亻: t + 乑: t + 丅: t + "\ue078": t + 古: 'y' + 钅: 'y' + 亠: 'y' + "\ue081": 'y' + 己: 'y' + 习: 'y' + 白: u + 木: u + 䒑: u + 吅: u + "\ue009": u + 巳: u + 水: i + 氵: i + 小: i + "\ue0e4": i + 彐: i + 巴: i + 方: o + 火: o + 灬: o + 雨: o + 酉: o + 甲: o + 民: p + 止: p + 之: p + 廴: p + 鬼: p + 石: a + 五: a + 弓: a + 耂: a + 戈: a + 麻: a + 马: s + 四: s + 大: s + "\ue08f": s + 镸: s + 田: s + 舟: d + 三: d + 王: d + "\ue080": d + 示: d + 瓜: d + 士: f + 二: f + 土: f + "\ue07c": f + 夕: f + 言: g + 讠: g + "\ue018": g + 歹: g + 鸟: h + 十: h + 竹: h + 丄: h + 臼: h + 由: j + 七: j + 艹: j + 廿: j + 凵: j + 刂: j + 旲: j + 光: k + 八: k + "\ue050": k + 甘: k + 山: k + 饣: k + 厶: k + 女: l + 九: l + 人: l + "\ue428": l + 早: l + 車: l + 立: z + 母: z + 纟: z + 身: x + 目: x + 禾: x + 匚: x + 可: x + 日: c + 曰: c + "\ue031": c + 巛: c + 勿: c + 口: v + 尸: v + 犬: v + 巜: v + 耳: b + 冂: b + 厂: b + 虫: b + "\ue088": b + 乃: b + 且: 'n' + 扌: 'n' + 冖: 'n' + "\ue0d8": 'n' + "\ue0fc": 'n' + "\ue012": 'n' + 叉: 'n' + 工: m + "\ue0c6": m + 宀: m + 业: m + 冫: m + 刀: m + "\ue175": l + "\ue174": i + 鹿: t + "\ue17a": 'y' + 六: h + "\ue176": v + 丩: 'n' +encoder: + max_length: 4 + auto_select_length: 4 + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2}, {prefix: 3}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + next: c1 + s3: + object: {type: 字根, rootIndex: 3} + next: c5 + s4: + object: {type: 字根, rootIndex: -1} + next: null + s5: + object: {type: 固定, key: t} + next: s7 + s6: + object: {type: 特殊, subtype: 张码补码} + next: c6 + s7: + object: {type: 固定, key: 'y'} + next: null + s8: + object: {type: 特殊, subtype: 张码补码} + next: s10 + s9: + object: {type: 特殊, subtype: 张码补码} + next: s11 + s10: + object: {type: 固定, key: t} + next: null + s11: + object: {type: 固定, key: 'n'} + next: c4 + s12: + object: {type: 固定, key: p} + next: null + s13: + object: {type: 特殊, subtype: 张码补码} + next: null + s14: + object: {type: 固定, key: 'n'} + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: c2 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s3 + negative: s6 + c2: + object: {type: 汉字} + operator: 匹配 + value: '[一二三四五六七八九]' + positive: s5 + negative: c3 + c3: + object: {type: 汉字} + operator: 匹配 + positive: s8 + negative: s9 + value: '[言士舟马石鸟由光女乐西子力米古白水方民耳口日身立且工]' + c4: + object: {type: 汉字} + operator: 匹配 + positive: s12 + negative: null + value: '[丌丨丬丶丿亠亻冂冖冫凵刂勹匚卩厶囗夂宀屮巛廴廾彐彡忄扌攴攵氵灬犭疋疒礻糸纟艹衤讠辶钅阝饣虍彳]' + c5: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s4 + negative: s13 + c6: + object: {type: 特殊, subtype: 张码准码元} + operator: 是 + positive: s14 + negative: null + value: '1' +data: + character_set: gb2312 + repertoire: + "\uf000": + unicode: 61440 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: compound, operator: ⿱, operandList: [宀, "\ue415"]}] + ambiguous: false + name: 寒字头无八 + "\uf001": + unicode: 61441 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 乌, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}]}] + ambiguous: false + name: 乌省 + "\uf002": + unicode: 61442 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue0b7", strokes: [{feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 衣省无丿 + "\uf003": + unicode: 61443 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 豕, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 豕二 + "\uf004": + unicode: 61444 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: "\ue075", strokes: [{feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 4}]}] + ambiguous: false + name: 段字旁无段二 + "\uf005": + unicode: 61445 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 戋, strokes: [{feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 2}, {feature: reference, index: 3}]}] + ambiguous: false + name: 戋无一 + "\uf006": + unicode: 61446 + tygf: 0 + gb2312: false + gf0014_id: null + readings: [] + glyphs: [{type: derived_component, source: 爿, strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}]}] + ambiguous: false + name: 爿二 + glyph_customization: + "\ue03c": + type: compound + operator: ⿱ + operandList: ["\uf000", 八] + 兆: + type: compound + operator: ⿴ + operandList: ["\ue42b", 儿] + 儿: + type: compound + operator: ⿰ + operandList: [丿, 乚] + 川: + type: compound + operator: ⿰ + operandList: ["\ue0e3", 丨] + 气: + type: compound + tags: [] + operator: ⿱ + operandList: ["\ue40f", "\ue122"] + "\uea02": + type: compound + operator: ⿴ + operandList: ["\ue42b", 幺] + 乃: + type: derived_component + source: "\ue441" + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}] + 衰: + type: compound + operator: ⿳ + operandList: ["\ue006", 一, "\ue0b7"] + 后: + type: compound + tags: [同字心] + operator: ⿸ + operandList: ["\ue024", "\ue800"] + 容: + type: compound + operator: ⿳ + operandList: [穴, "\ue43d", 口] + 合: + type: compound + operator: ⿱ + operandList: ["\ue43d", "\ue800"] + 哀: + type: compound + operator: ⿱ + operandList: ["\ue006", "\ue0b7"] + 以: + type: compound + operator: ⿰ + operandList: ["\ue44f", 人] + 非: + type: compound + operator: ⿰ + operandList: ["\ue07d", "\ue080"] + "\ue01e": + type: compound + operator: ⿴ + operandList: ["\ue01a", 丶] + 衮: + type: compound + operator: ⿳ + operandList: [六, 厶, "\ue0b7"] + "\ue84f": + type: compound + operator: ⿱ + operandList: [二, 古] + "\ue886": + type: compound + operator: ⿱ + operandList: ["\ue40f", 巾] + 衷: + type: compound + operator: ⿳ + operandList: ["\ue006", 丨, "\ue0b7"] + 乙: + type: derived_component + source: "\ue065" + strokes: [{feature: reference, index: 0}] + 鼍: + type: compound + operator: ⿱ + operandList: [嘼, 电] + "\ue819": + type: compound + operator: ⿱ + operandList: ["\uebc6", 冖] + 麥: + type: compound + operator: ⿱ + operandList: [龶, 夂] + "\ue90f": + type: compound + operator: ⿱ + operandList: ["\ue867", 一] + 万: + type: derived_component + source: 万 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 2}, {feature: reference, index: 1}] + "\ue427": + type: derived_component + source: "\ue427" + strokes: [{feature: reference, index: 1}, {feature: reference, index: 0}] + 方: + type: derived_component + source: 方 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 3}, {feature: reference, index: 2}] + 弋: + type: derived_component + source: 弋 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 2}, {feature: reference, index: 1}] + 戈: + type: derived_component + source: 戈 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 3}, {feature: reference, index: 1}, {feature: reference, index: 2}] + 戊: + type: derived_component + source: 戊 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 2}, {feature: reference, index: 3}] + 戌: + type: derived_component + source: 戌 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 5}, {feature: reference, index: 3}, {feature: reference, index: 4}] + 戍: + type: derived_component + source: 戍 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 5}, {feature: reference, index: 3}, {feature: reference, index: 4}] + 成: + type: derived_component + source: 成 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 5}, {feature: reference, index: 3}, {feature: reference, index: 4}] + 戋: + type: derived_component + source: 戋 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 2}, {feature: reference, index: 3}] + 我: + type: derived_component + source: 我 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 6}, {feature: reference, index: 4}, {feature: reference, index: 5}] + "\ue05f": + type: derived_component + source: "\ue05f" + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 3}, {feature: reference, index: 5}, {feature: reference, index: 4}] + 戉: + type: derived_component + source: 戉 + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 4}, {feature: reference, index: 2}, {feature: reference, index: 3}] + "\ue950": + type: derived_component + source: "\ue950" + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 2}, {feature: reference, index: 5}, {feature: reference, index: 3}, {feature: reference, index: 4}] + "\ue074": + type: derived_component + source: "\ue074" + strokes: [{feature: reference, index: 0}, {feature: reference, index: 1}, {feature: reference, index: 3}, {feature: reference, index: 2}] diff --git a/examples/zhengma.yaml b/examples/zhengma.yaml index 01b69e2..025d70c 100644 --- a/examples/zhengma.yaml +++ b/examples/zhengma.yaml @@ -1,10 +1,10 @@ -version: "0.1" +version: '0.1' source: zhengma info: name: 郑码 author: 郑易里 - version: 0.1.0 - description: 从模板创建 + version: '1.0' + description: 形码四码定长 analysis: classifier: 斜钩: 6 @@ -28,8 +28,10 @@ analysis: 竖折折钩: 8 竖折折: 8 degenerator: - feature: {提: 横, 捺: 点} - nocross: false + feature: + 提: 横 + 捺: 点 + no_cross: false selector: - 结构完整 - 根少优先 @@ -38,15 +40,34 @@ analysis: - 非形近根 - 取大优先 customize: - 我: [手, 戈] - 曲: [日, "\ue001"] - 五: [工, '5'] - 里: [日, 土] - 兆: ["\ue997", 儿] - 井: [二, "\ue0e3"] - 夫: [二, 人] - 孑: [了, '1'] - 及: ['6', '3', '4'] + 我: + - 手 + - 戈 + 曲: + - 日 + - "\ue001" + 五: + - 工 + - '5' + 里: + - 日 + - 土 + 兆: + - "\ue997" + - 儿 + 井: + - 二 + - "\ue0e3" + 夫: + - 二 + - 人 + 孑: + - 了 + - '1' + 及: + - '6' + - '3' + - '4' strong: - '1' - 二 @@ -168,7 +189,6 @@ form: "\ue042": 羊 "\ue00b": 羊 灬: 火 - "\ue997": 氵 之: 辶 定: 宀 "\ue007": 马 @@ -194,7 +214,6 @@ form: "\ue0e2": 巛 丩: 凵 屮: 凵 - "\ue065": 凵 爿: 凵 "\ue0e1": 凵 "\ue0be": 母 @@ -238,6 +257,8 @@ form: "\ue02a": 冂 "\ue442": 小 "\ue411": 牛 + 䶹: 凵 + "\ue42b": 氵 mapping: '1': a '2': i diff --git a/examples/zhenma.yaml b/examples/zhenma.yaml new file mode 100644 index 0000000..079d649 --- /dev/null +++ b/examples/zhenma.yaml @@ -0,0 +1,772 @@ +version: '0.1' +source: zhenma +info: + name: 真码 + author: 命 + version: 2023.04.15 + description: 以最小记忆量获得最大确定性的 25 键全码单字输入法 +analysis: + classifier: + 斜钩: 8 + 横折提: 6 + 横折折: 6 + 横折弯: 6 + 横折折折钩: 6 + 横折钩: 6 + 横撇弯钩: 6 + 横折折撇: 6 + 横折折折: 6 + 横折弯钩: 7 + 横斜钩: 7 + 竖提: 8 + 竖折: 8 + 竖弯: 8 + 竖弯钩: 8 + 撇点: 8 + 撇折: 8 + 竖折撇: 8 + 竖折折钩: 8 + 竖折折: 8 + degenerator: + feature: + 提: 横 + 捺: 点 + no_cross: false + selector: + - 结构完整 + - 根少优先 + - 连续笔顺 + - 能连不交 + - 能散不连 + - 取大优先 + customize: + 丈: + - '1' + - 㐅 + 丌: + - '1' + - "\ue0e3" + 主: + - '4' + - 王 + 事: + - '1' + - 口 + - "\ue431" + - '2' + 亍: + - 二 + - '2' + 互: + - '1' + - "\ue440" + - '1' + 产: + - "\ue054" + - 厂 + 元: + - 二 + - 儿 + 兆: + - "\ue42b" + - 儿 + 凸: + - '2' + - '1' + - '2' + - '5' + - '1' + 凹: + - '2' + - '6' + - '2' + - '1' + 卅: + - '1' + - 川 + 发: + - '8' + - '3' + - 又 + - '4' + 垂: + - '3' + - 十 + - 龷 + - '1' + 夷: + - '1' + - 弓 + - 人 + 夹: + - '1' + - 丷 + - 大 + 屯: + - '1' + - 凵 + - '8' + 我: + - 手 + - 戈 + 曲: + - 冂 + - 龷 + 末: + - '1' + - 木 + 甩: + - "\ue02a" + - 二 + - '8' + 禹: + - '3' + - 口 + - 冂 + - '2' + - '1' + - '4' + 禺: + - 日 + - 冂 + - '2' + - '1' + - '4' + 芈: + - '1' + - "\ue001" + - '1' + - "\ue002" + 里: + - 日 + - "\ue43a" + 重: + - '3' + - '1' + - 日 + - "\ue43a" + "\ue082": + - 大 + - 丷 + "\ue035": + - '1' + - "\ue431" + - '2' + "\ue00e": + - '5' + - 氺 + "\ue01e": + - "\ue057" + - 丷 + 两: + - '1' + - 冂 + - 人 + - 人 + "\ue066": + - '1' + - 冂 + - 龷 + "\ue072": + - '1' + - 囗 + - '2' + - 冖 + "\ue053": + - 耳 + - 戈 + 秉: + - '3' + - '1' + - "\ue431" + - "\ue445" + 夫: + - 二 + - 人 + "\ue085": + - '3' + - '1' + - "\ue436" + - "\ue43a" + 㡀: + - 丷 + - 冂 + - "\ue442" + 囬: + - 囗 + - "\ue001" + - 二 + 井: + - 二 + - "\ue0e3" + "\ue0b3": + - 二 + - "\ue420" + serializer: zhenma +form: + alphabet: qwertyuiopasdfghjklxcvbnm + grouping: + '2': 虫 + '4': 言 + '5': 马 + '6': 了 + "\ue0bc": "\ue020" + 㐅: 乂 + "\ue400": 斤 + "\ue416": 七 + "\ue43d": 人 + "\ue441": 乃 + "\ue445": 小 + "\ue417": 七 + "\ue0a3": 巳 + "\ue420": 豕 + "\ue43a": 土 + "\ue424": 儿 + "\ue0d2": 月 + "\ue079": 匕 + "\ue0d6": 几 + "\ue0d0": 雨 + "\ue013": 半 + "\ue446": 八 + "\ue0c8": 车 + "\ue42f": "\ue42e" + "\ue0c2": 舌 + "\ue102": 王 + "\ue0da": 鸟 + "\ue912": 余 + 饣: 食 + 飠: 食 + 釆: 采 + 彳: 行 + "\ue02d": 鬼 + "\ue069": 鬼 + "\ue421": 臼 + "\ue026": 臼 + "\ue028": 自 + "\ue078": 午 + 夂: 攵 + "\ue021": 缶 + 龵: 手 + "\ue054": 立 + "\ue0b6": 䒑 + "\ue0a4": 䒑 + "\ue030": 䒑 + "\ue016": 半 + "\ue442": 小 + "\ue051": 小 + "\ue06c": 小 + 灬: 火 + 肩: 户 + 戋: 戈 + 㦮: 戈 + "\ue03f": 戈 + 豖: 豕 + 覀: 西 + 丗: 廿 + 龷: 廿 + "\ue415": 甘 + 龶: 丰 + "\ue003": 丰 + 長: 长 + 镸: 长 + 髟: 长 + "\ue018": 卜 + "\ue07c": 卜 + 巜: 巛 + "\ue0a7": 乡 + 毌: 母 + "\ue405": 母 + 刂: "\ue001" + "\ue044": "\ue001" + 冉: 用 + "\ue419": 且 + 罒: 四 + "\ue03e": 小 + "\ue09e": 竹 + "\ue002": 工 + "\ue410": 工 + "\ue402": 小 + "\ue44b": 禾 + "\ue08c": 用 + 牜: 牛 + "\ue0c9": 辛 + "\ue012": 丬 + "\ue838": 鹿 + 䶹: 凵 + 屮: 凵 + "\ue822": 北 + "\ue052": 甫 + 朩: 木 + "\ue0af": 臼 + "\ue423": "\ue020" + "\ue422": "\ue0b7" + "\ue08e": "\ue057" + "\ue40c": "\ue057" + "\ue07e": "\ue0b7" + 勺: 夕 + "\ue09b": 夕 + "\ue083": 夕 + 钅: 金 + "\ue41e": 犭 + 彡: 犭 + "\ue024": 犭 + 亻: 川 + "\ue0e3": 川 + "\ue07f": 川 + "\ue404": 川 + "\ue029": 告 + "\ue40f": 告 + 㐄: 告 + "\ue411": 告 + 讠: 言 + 亠: 言 + "\ue0dc": 鹿 + "\ue093": 羊 + "\ue042": 羊 + "\ue00b": 羊 + 冫: 疒 + 丷: 疒 + "\ue089": 疒 + 龹: 半 + "\ue00d": 疒 + "\ue088": 疒 + "\ue42d": 氵 + "\ue448": 氵 + "\ue059": 水 + 乑: 水 + 氺: 水 + "\ue0d9": 水 + "\ue0c3": 龸 + 党: 龸 + "\ue42b": 忄 + "\ue447": 忄 + 辶: 之 + 宀: 定 + "\ue0d5": 臣 + 匚: 臣 + "\ue418": 臣 + 戊: 戈 + 車: 车 + 厂: 石 + 丆: 石 + "\ue068": 石 + "\ue443": 石 + 尢: 尤 + 兀: 尤 + 廾: 艹 + "\ue050": 艹 + "\ue0aa": 廿 + "\ue413": 扌 + 士: 土 + 龰: 止 + "\ue451": 止 + 齒: 齿 + 糹: 纟 + 糸: 纟 + 丩: 凵 + 丱: 凵 + "\ue0e2": 巛 + "\ue427": 力 + 阝: 了 + 卩: 了 + "\ue0b2": 了 + 㔾: 了 + 廴: 了 + 馬: 马 + "\ue009": 马 + "\ue007": 马 + "\ue0e8": 马 + "\ue06b": 马 + 彐: 录 + "\ue431": 录 + "\ue01c": 艮 + "\ue031": 尸 + 龴: 又 + 癶: 又 + 囗: 因 + 員: 员 + 曰: 日 + "\ue070": 日 + 皿: 四 + "\ue0a9": 四 + "\ue436": 四 + 冂: 目 + "\ue439": 目 + 冈: 目 + "\ue02a": 目 + mapping: + '1': k + '3': t + '7': cg + '8': x + 丁: kl + 七: ag + 乂: wy + 三: hg + 卜: lg + 不: sl + 与: kx + 丑: vf + 刀: co + 专: jv + 且: mh + 廿: fk + 斤: ek + 人: wg + 业: nu + 小: iw + 水: io + 王: h + 厶: xy + 北: ux + 山: mx + 土: j + 䒑: uk + 十: fg + 丬: ul + 口: b + 丰: hl + 九: qt + 二: jg + 八: w + 乃: cp + 之: p + 乌: qo + 大: sy + 巾: ml + 禾: td + 也: cl + 习: cu + 乡: xt + 田: nb + 力: ct + 石: s + 舌: tm + 欠: qw + 爫: w + 子: ck + 扌: g + 辛: yf + 甫: du + 氵: i + 母: xu + 日: 'n' + 方: yc + 者: jn + 干: fl + 又: vy + 米: ud + 夕: qy + 冖: pp + 了: c + 予: vc + 止: ll + 匕: x + 亡: ya + 几: mg + 立: yu + 亼: wk + 寸: gy + 工: jl + 弋: ay + 令: wp + 门: up + 月: q + 午: tk + 牛: tl + 壬: tj + 弓: vx + 凵: xl + 勹: q + 殳: mv + 心: pu + 犬: su + 戈: at + 木: d + 尤: sx + 火: ow + 韦: jc + 车: af + 牙: al + 儿: qg + 长: ha + 文: yg + 尸: vt + 女: xk + 白: rn + 古: fb + 半: uj + 四: mn + 由: 'no' + 司: cb + 㠯: v + 甘: fj + 皮: vv + 示: ji + 余: wt + 句: qb + 尔: qi + 用: mj + 包: qv + 各: tb + 耂: jt + 合: wb + 羊: uh + 耳: hd + 艮: vq + 广: ys + 至: aj + 歹: kq + 聿: vl + 而: sm + 舟: eu + 贝: mw + 矢: ts + 辰: sj + 兑: uq + 手: tg + 犭: e + 告: tj + 巴: vn + 良: yv + 巛: xg + 目: m + 言: 'y' + 非: nf + 虍: la + 門: up + 出: mm + 其: fh + 隹: rl + 攵: tw + 穴: pw + 青: hq + 臼: rj + 采: wd + 页: sw + 艹: f + 户: pv + 虫: l + 音: yn + 酉: dk + 疋: vl + 貝: mw + 鬼: rb + 羽: cc + 兼: uw + 缶: tm + 豕: se + 骨: mp + 頁: sw + 巳: vp + 番: wn + 黽: px + 雨: do + 臣: a + 鹿: yx + 龍: st + 黑: mo + 毛: ta + 马: v + 金: w + 己: vk + 气: tc + 衤: pu + 录: vh + 生: th + 自: rm + 员: bm + 革: ff + 身: rh + 甲: np + 川: r + 南: fu + 龙: st + 瓜: ex + 因: bg + 西: dg + 行: eg + 纟: x + 角: qm + 走: jw + 齿: lw + 定: pg + 食: wv + 烏: qo + 爪: ei + 忄: o + 豸: we + 疒: u + 鳥: qx + 已: vo + 片: rv + 礻: py + 耒: hi + 鸟: qx + 鬥: up + "\ue950": fa + "\ue05f": hc + "\ue064": hw + "\ue001": ng + "\ue057": q + "\ue0b7": q + "\ue425": q + "\ue020": qv + "\ue0a2": vj + "\ue984": wi + "\ue42e": wr + "\ue011": x + "\ue06a": yv + "\ue440": xv + "\ue046": ik + 竹: t + 龸: ip + mapping_type: 2 +encoder: + max_length: 4 + select_keys: + - _ + - ; + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + next: c1 + index: 0 + s3: + object: {type: 字根, rootIndex: -1} + next: null + index: 0 + s4: + object: {type: 字根, rootIndex: 2} + next: null + index: 1 + s5: + object: {type: 字根, rootIndex: 3} + next: c3 + index: 0 + s6: + object: {type: 字根, rootIndex: -1} + next: null + index: 0 + s7: + object: {type: 字根, rootIndex: 3} + next: null + index: 1 + s8: + object: {type: 固定, key: i} + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: c4 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: c2 + negative: s4 + c2: + object: {type: 字根, rootIndex: 1} + operator: 编码匹配 + positive: s3 + negative: s5 + value: ^[a-z]{2}$ + c3: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s6 + negative: s7 + c4: + object: {type: 字根, rootIndex: 1} + operator: 编码匹配 + positive: c5 + negative: null + value: ^[a-z]$ + c5: + object: {type: 字根, rootIndex: 1} + operator: 匹配 + positive: null + negative: s8 + value: '[月土八了1]' + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2, count: 1}, {prefix: 3, count: 1}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa +data: + character_set: gb2312 + glyph_customization: + 兰: + type: compound + operator: ⿱ + operandList: [丷, 三] + tags: [] + 章: + type: compound + operator: ⿱ + operandList: [音, 十] + "\ue9d0": + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: ["\ue0e3", 米] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\uea02": + type: compound + operator: ⿴ + operandList: ["\ue42b", 幺] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue0a5": + type: compound + tags: [戈部截断] + operator: ⿰ + operandList: ["\ue81f", 戈] + 刅: + type: compound + operator: ⿴ + operandList: ["\ue446", 刀] + 办: + type: compound + operator: ⿴ + operandList: ["\ue446", 力] + 容: + type: compound + operator: ⿳ + operandList: [穴, "\ue43d", 口] + 隺: + type: compound + operator: ⿻ + operandList: [冖, 隹] + tags: [笔画搭挂] + 胤: + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: [儿, "\ue99d"] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue9f0": + type: compound + operator: ⿱ + operandList: ["\ue425", 大] + "\ue819": + type: compound + operator: ⿱ + operandList: ["\uebc6", 冖] + "\ue90f": + type: compound + operator: ⿴ + operandList: ["\ue0af", 车] + tags: + - 行框 diff --git a/examples/ziyuan.yaml b/examples/ziyuan.yaml new file mode 100644 index 0000000..9aa8dac --- /dev/null +++ b/examples/ziyuan.yaml @@ -0,0 +1,900 @@ +version: '0.1' +source: ziyuan +info: + name: 字源 + author: 彭秀峰 + version: '1.29' + description: 字源追求的是在易学、易用、优美的前提下综合数据跻身形码第一梯队。 +analysis: + classifier: {} + degenerator: + no_cross: false + feature: + 提: 横 + 捺: 点 + selector: + - 根少优先 + - 能连不交 + - 能散不连 + - 结构完整 + - 连续笔顺 + - 取大优先 + customize: + 与: + - 二 + - '5' + 丌: + - '1' + - "\ue0e3" + 才: + - '1' + - '2' + - '3' + 丐: + - 下 + - '5' + 卞: + - '4' + - 下 + 毋: + - '5' + - '5' + - "\ue443" + "\ue034": + - 夕 + - '4' + "\ue0bf": + - 匚 + - '1' + "\ue0cd": + - '5' + - "\ue002" + "\ue123": + - 夕 + - '1' + "\ue125": + - "\ue44a" + - '1' + 丱: + - '5' + - '3' + - "\ue018" + - '2' + 主: + - '4' + - 王 + 丼: + - 二 + - "\ue0e3" + - '4' + 乍: + - "\ue078" + - '2' + - 二 + 冊: + - 冂 + - 艹 + 凸: + - '2' + - '1' + - '2' + - '5' + - '1' + 凹: + - '2' + - '5' + - '2' + - '5' + - '1' + "\ue15f": + - '2' + - '5' + - 二 + "\ue160": + - '2' + - '5' + - 二 + 戉: + - '5' + - 戈 + "\ue013": + - 丷 + - "\ue002" + "\ue02b": + - "\ue009" + - '2' + - 二 + "\ue0c1": + - 口 + - '2' + - '1' + "\ue0fa": + - "\ue44a" + - 二 + "\ue12a": + - '3' + - 䒑 + - '3' + "\ue12e": + - "\ue002" + - "\ue0e3" + "\ue13d": + - 三 + - 人 + 㦮: + - 二 + - 戈 + 曲: + - 囗 + - 艹 + 襾: + - '1' + - "\ue439" + - 凵 + "\ue0d8": + - 乂 + - '4' + - '4' + - '4' + - '4' + "\ue11c": + - "\ue009" + - '2' + - 匚 + - '2' + "\ue120": + - '5' + - "\ue001" + - '2' + - '1' + - '1' + "\ue136": + - 口 + - "\ue001" + - '1' + "\ue149": + - '5' + - 末 + "\ue159": + - 亻 + - "\ue009" + - '1' + - '5' + "\ue15e": + - 彐 + - '2' + - 二 + "\ue16a": + - "\ue439" + - '1' + - '1' + - '2' + - '5' + "\ue414": + - 艹 + - 三 + 丣: + - '1' + - "\ue0e3" + - 匚 + - "\ue009" + 亜: + - "\ue800" + - "\ue001" + - '1' + 我: + - '3' + - 扌 + - '5' + - '3' + - '4' + 釆: + - 禾 + - 丷 + "\ue066": + - 艹 + - 日 + "\ue0d7": + - 亻 + - 彐 + - '1' + - '5' + "\ue0dc": + - 广 + - "\ue009" + - "\ue001" + "\ue0dd": + - 革 + - 二 + "\ue10c": + - '1' + - '5' + - '1' + - '5' + - 三 + "\ue115": + - '1' + - 艹 + - "\ue002" + "\ue137": + - '2' + - '1' + - '5' + - '5' + - '1' + - '2' + - '1' + "\ue13b": + - "\ue800" + - '2' + - 人 + 㑒: + - 亼 + - 口 + - 人 + 卑: + - 白 + - 千 + 垂: + - 千 + - 艹 + - 二 + "\ue0ad": + - "\ue14e" + - 戈 + "\ue0b1": + - "\ue078" + - 艹 + - "\ue001" + - '1' + "\ue139": + - "\ue002" + - '5' + - 囗 + - '1' + 㒸: + - 丷 + - 豕 + 重: + - 千 + - 日 + - 二 + "\ue053": + - 耳 + - '5' + - '3' + - '4' + "\ue10a": + - "\ue0e3" + - '2' + - '1' + - '5' + - '1' + - '5' + - '1' + - '2' + 畢: + - 甲 + - 龷 + - '1' + 隺: + - 冖 + - 隹 + 粛: + - "\ue431" + - 米 + - "\ue0e3" + "\ue064": + - 三 + - 人 + 果: + - 日 + - 木 + "\ue086": + - 二 + - 夂 + 亙: + - '1' + - "\ue083" + - '1' + "\ue085": + - 千 + - 囗 + - 丷 + - 二 + "\ue129": + - 匚 + - "\ue009" + - "\ue137" +form: + alphabet: qwertyuiopasdfghjklzxcvbnm + mapping_type: 1 + grouping: + "\ue401": 力 + "\ue432": 彐 + "\ue431": 彐 + 曰: 日 + "\ue00c": 日 + "\ue416": 七 + "\ue011": 匕 + "\ue443": "\ue068" + "\ue439": 冂 + "\ue441": 乃 + "\ue437": 止 + "\ue0c6": 足 + "\ue403": 勹 + 氺: 水 + "\ue42b": 水 + "\ue42c": 水 + 龵: 手 + "\ue0d2": 月 + "\ue08c": 用 + "\ue44b": 禾 + "\ue420": 豕 + "\ue0d0": 雨 + "\ue0c8": 车 + "\ue0d6": 几 + 朩: 木 + "\ue012": 丬 + 龰: 止 + "\ue451": 止 + 覀: 西 + "\ue406": 口 + "\ue449": 大 + "\ue043": 大 + "\ue452": 十 + "\ue020": "\ue0bc" + "\ue43d": 人 + "\ue838": 鹿 + "\ue042": 羊 + "\ue093": 羊 + "\ue029": 牛 + "\ue005": 禸 + "\ue0da": 鸟 + 爫: 爪 + 䶹: 屮 + "\ue09e": 竹 + "\ue14e": 爿 + "\ue106": 衣 + "\ue0b7": 衣 + 衤: 衣 + "\ue422": 衣 + 幺: 丝 + 纟: 丝 + 糸: 丝 + "\ue0c3": 尚 + "\ue03e": 尚 + 饣: 食 + "\ue423": "\ue0bc" + 亻: 人 + 扌: 手 + "\ue002": 手 + "\ue079": 匕 + "\ue839": 比 + "\ue40c": "\ue057" + "\ue424": 儿 + 忄: 心 + "\ue051": 心 + 㣺: 心 + "\ue0b2": 卩 + "\ue0d5": 臣 + 囗: 口 + 讠: 言 + "\ue427": 勹 + 钅: 金 + 刂: 刀 + 戋: 戈 + 戌: 戊 + "\ue04c": 木 + 氵: 水 + 灬: 火 + "\ue430": "\ue42e" + "\ue42f": "\ue42e" + 礻: 示 + 牜: 牛 + 犭: 犬 + "\ue054": 六 + "\ue102": 王 + 車: 车 + "\ue80a": 衣 + 叀: "\ue052" + 魚: 鱼 + "\ue442": 小 + 馬: 马 + "\ue157": 马 + 鳥: 鸟 + "\ue0d7": 鸟 + 糹: 丝 + 飠: 食 + "\ue019": 食 + 門: 门 + 貝: 贝 + 齒: 齿 + "\ue43a": 土 + "\ue444": 厶 + "\ue120": 业 + "\ue0dc": 鹿 + "\ue153": 虍 + "\ue131": 臣 + "\ue421": 臼 + "\ue137": 业 + "\ue17e": 儿 + mapping: + '1': q + '2': l + '3': m + '4': v + '5': d + 气: 'n' + 刀: z + 力: o + 方: l + 马: w + 五: t + 亠: l + 山: i + "\ue018": v + 巾: 'y' + 彐: f + 八: i + 土: b + 士: b + 干: 'y' + 雨: 'n' + 田: b + 言: l + "\ue434": c + 龴: j + 厶: j + 鱼: q + 也: l + 月: m + 用: o + 文: l + 夕: 'n' + "\ue0bc": a + 日: 'n' + 宀: p + 冖: u + 㠯: i + 口: k + 尸: h + 毛: u + 小: i + 大: s + 彳: g + 车: g + 金: z + 人: s + 石: f + 丆: f + 米: o + 二: w + 工: d + "\ue0e3": i + "\ue001": j + 冫: 'n' + 丷: i + "\ue00d": 'n' + 王: f + 三: e + 龶: r + 四: r + 目: j + 罒: o + 广: h + 疒: h + 厂: h + 古: m + 弓: x + 贝: a + 且: t + "\ue419": t + 火: v + "\ue024": h + "\ue057": h + 禾: o + 丁: o + 九: o + 子: h + 了: h + 斤: x + 十: p + 廿: r + 艹: r + 廾: r + 龷: r + 丬: t + 䒑: g + 又: f + 立: g + 七: u + 匕: h + "\ue417": u + 弋: u + 戈: z + 之: g + 辶: g + 廴: g + 舟: g + 豸: w + 豕: w + 西: e + 彡: u + "\ue068": f + 心: j + 乂: r + 川: c + 门: p + 镸: u + 匚: i + 凵: i + "\ue009": i + "\ue007": i + 冂: u + "\ue02a": u + "\ue418": i + 虫: e + 寸: f + 水: c + "\ue42d": i + "\ue448": i + 皿: o + 手: d + 耳: j + 卩: j + 阝: i + 巳: j + 巴: w + 㔾: j + 勹: a + 女: a + 白: c + 臼: b + 乃: l + 止: g + 足: g + 几: x + 儿: h + "\ue07f": c + 木: x + "\ue42e": v + 卜: v + 首字母-o: o + "\ue446": i + 攵: f + 夂: f + 韵母-a: a + 韵母-i: i + 韵母-u: u + 韵母-e: e + 韵母-n: 'n' + 韵母-ê1: e + 韵母-ê2: e + 韵母-ê3: e + 韵母-ê4: e + 韵母-m: m + 韵母-v: v + 韵母-o: o + "\ue078": t + "\ue044": i + 乑: s + "\ue44a": i + 声母-b: b + 声母-c: c + 声母-d: d + 声母-f: f + 声母-g: g + 声母-h: h + 声母-j: j + 声母-k: k + 声母-l: l + 声母-m: m + 声母-n: 'n' + 声母-p: p + 声母-r: r + 声母-s: s + 声母-t: t + 声母-z: z + 尤: w + 虍: w + 鼠: w + 鹿: w + 牛: w + 羊: w + 彑: w + 禸: w + 鸟: e + 隹: e + 飞: e + 非: e + 爪: e + "\ue415": r + 屮: r + 竹: t + 个: t + "\ue014": t + 矢: t + 片: t + 爿: t + "\ue075": r + 屯: r + 业: r + 六: 'y' + 衣: 'y' + 㡀: 'y' + 勿: 'y' + 甲: 'y' + 丝: u + 乡: u + "\ue052": u + 专: u + 羽: u + 皮: u + 革: u + 尚: i + 丘: i + 食: o + 瓜: o + 豆: o + 壴: o + 耒: o + "\ue0eb": o + 瓦: o + 缶: o + 丸: o + 户: p + "\ue006": p + 穴: p + 母: a + 亼: s + 欠: s + 佥: s + 尹: f + 予: f + 正: g + "\ue073": g + 走: g + 亍: g + 屰: g + "\ue411": g + 癶: g + 比: h + 生: h + 兀: h + 自: j + 身: j + 己: j + 已: j + 臣: j + 牙: j + 齿: j + 骨: j + 头: j + 歹: j + 回: k + "\ue800": k + 丂: k + 亡: l + 亥: l + 吂: l + 而: l + 千: l + 万: l + 戊: z + 凡: x + 本: x + 末: x + 未: x + 林: x + 巛: c + 黑: v + 上: v + 下: v + 㐄: g + 示: v + 由: b + 甫: b + 早: 'n' + 旦: 'n' + 辰: 'n' + 云: 'n' + 天: 'n' + "\ue09b": m + "\ue083": m + 今: m + 首字母-a: a + 首字母-b: b + 首字母-c: c + 首字母-d: d + 首字母-e: e + 首字母-f: f + 首字母-g: g + 首字母-h: h + 首字母-j: j + 首字母-k: k + 首字母-l: l + 首字母-m: m + 首字母-n: 'n' + 首字母-p: p + 首字母-q: q + 首字母-r: r + 首字母-s: s + 首字母-t: t + 首字母-w: w + 首字母-x: x + 首字母-y: 'y' + 首字母-z: z + 首字母-ê: e + 二字母-a: a + 二字母-e: e + 二字母-g: g + 二字母-h: h + 二字母-i: i + 二字母-m: m + 二字母-n: 'n' + 二字母-o: o + 二字母-r: r + 二字母-u: u + 二字母-v: v + 三字母-a: a + 三字母-e: e + 三字母-g: g + 三字母-i: i + 三字母-n: 'n' + 三字母-o: o + 三字母-u: u + "\ue089": i + 少: i + 不: i + 耂: h + 犬: w + 其: t +encoder: + max_length: 4 + auto_select_length: 4 + short_code: + - length_equal: 1 + schemes: [{prefix: 1}, {prefix: 2}, {prefix: 3}] + rules: + - length_equal: 2 + formula: AaAbBaBb + - length_equal: 3 + formula: AaBaCaCb + - length_in_range: [4, 10] + formula: AaBaCaZa + sources: + s0: + object: null + next: s1 + s1: + object: {type: 字根, rootIndex: 1} + next: c0 + s2: + object: {type: 字根, rootIndex: 2} + next: c1 + s3: + object: {type: 字根, rootIndex: 3} + next: c5 + s4: + object: {type: 字根, rootIndex: -1} + next: null + s5: + object: {type: 字音, subtype: 首字母} + next: s7 + s6: + object: {type: 字音, subtype: 首字母} + next: null + s7: + object: {type: 字音, subtype: 二字母} + next: s8 + s8: + object: {type: 字音, subtype: 三字母} + next: null + s15: + object: {type: 字音, subtype: 首字母} + next: null + conditions: + c0: + object: {type: 字根, rootIndex: 2} + operator: 存在 + positive: s2 + negative: s5 + c1: + object: {type: 字根, rootIndex: 3} + operator: 存在 + positive: s3 + negative: s6 + c5: + object: {type: 字根, rootIndex: 4} + operator: 存在 + positive: s4 + negative: s15 +data: + character_set: extended + glyph_customization: + 面: + type: compound + operator: ⿵ + operandList: [而, 三] + 丢: + type: compound + tags: [] + operator: ⿱ + operandList: [壬, 厶] + 令: + type: compound + operator: ⿱ + operandList: [今, 丶] + 畺: + type: compound + tags: [纵向包夹] + operator: ⿻ + operandList: [三, 畕] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 5}, {index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 堇: + type: compound + operator: ⿻ + operandList: [革, 二] + 是: + type: compound + operator: ⿱ + operandList: [旦, 龰] + 舍: + type: compound + tags: [] + operator: ⿱ + operandList: [亼, 古] + 囱: + type: compound + operator: ⿴ + operandList: ["\ue02d", 夕] + order: [{index: 0, strokes: 3}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 㐫: + type: compound + operator: ⿶ + operandList: [凵, 文] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 威: + type: compound + operator: ⿵ + operandList: [戌, 女] + order: [{index: 0, strokes: 3}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + 容: + type: compound + operator: ⿳ + operandList: [穴, 人, 口] + 㝵: + type: compound + operator: ⿱ + operandList: [旦, 寸] + "\uea02": + type: compound + operator: ⿴ + operandList: ["\ue42b", 幺] + order: [{index: 1, strokes: 0}, {index: 0, strokes: 0}] + 胤: + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: [儿, "\ue99d"] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + "\ue9d0": + type: compound + tags: [横向包夹] + operator: ⿴ + operandList: ["\ue0e3", 米] + order: [{index: 0, strokes: 1}, {index: 1, strokes: 0}, {index: 0, strokes: 0}] + tags: + - 衣框 + - 同字心 + repertoire: {} +algebra: + 二字母: + - type: xform + from: ^.(.?).*\d$ + to: $1 + 三字母: + - type: xform + from: ^..?(.?).*\d$ + to: $1 diff --git a/index.html b/index.html index 0881ae6..f6b5171 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,13 @@ + + + + + + + 汉字自动拆分系统 diff --git a/package-lock.json b/package-lock.json index 0beea02..893bb5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,77 +1,88 @@ { "name": "chai", - "version": "0.1.9", + "version": "0.1.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "chai", - "version": "0.1.9", + "version": "0.1.14", "dependencies": { + "@ant-design/charts": "^2.1.1", "@ant-design/colors": "^7.0.2", - "@ant-design/pro-components": "^2.7.1", - "@dagrejs/dagre": "^1.1.2", + "@ant-design/icons": "^5.3.7", + "@ant-design/pro-components": "^2.7.10", + "@antv/s2": "^2.0.0-next.24", + "@antv/s2-react": "^2.0.0-next.23", + "@dagrejs/dagre": "^1.1.3", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "ahooks": "^3.7.11", - "antd": "5.11.4", + "@types/mdx": "^2.0.13", + "ahooks": "^3.8.0", + "antd": "^5.18.3", "d3-array": "^3.2.4", + "deep-object-diff": "^1.1.9", "immer": "^10.1.1", - "jotai": "^2.8.0", + "jotai": "^2.8.4", + "jotai-effect": "^1.0.0", + "jotai-location": "^0.5.5", "jotai-minidb": "^0.0.8", - "jotai-optics": "^0.3.2", + "jotai-optics": "^0.4.0", "js-md5": "^0.8.3", "js-yaml": "4.1.0", - "libchai": "^0.1.9", + "libchai": "^0.1.14-alpha.1", "lodash-es": "^4.17.21", - "lz-string": "^1.5.0", - "mathjs": "12.1.0", + "mathjs": "^13.0.1", "nanoid": "^5.0.7", "optics-ts": "^2.4.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^6.23.0", - "reactflow": "^11.11.3", + "react-router-dom": "^6.24.0", + "reactflow": "^11.11.4", "styled-components": "^6.1.9", - "use-immer": "^0.9.0" + "use-immer": "^0.10.0" }, "devDependencies": { "@emotion/react": "^11.11.4", "@jsdevtools/version-bump-prompt": "^6.1.0", + "@mdx-js/react": "^3.0.1", + "@mdx-js/rollup": "^3.0.1", "@modyfi/vite-plugin-yaml": "^1.1.0", - "@swc-jotai/react-refresh": "^0.1.0", + "@swc-jotai/react-refresh": "^0.1.1", + "@tailwindcss/typography": "^0.5.13", "@types/d3-array": "^3.2.1", "@types/js-md5": "^0.7.2", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.12.11", - "@types/react": "^18.3.1", + "@types/node": "^20.14.9", "@types/react-dom": "^18.3.0", "@types/styled-components": "^5.1.34", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "@vitejs/plugin-react-swc": "^3.6.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-react-swc": "^3.7.0", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", - "axios": "^1.6.8", + "autoprefixer": "^10.4.19", + "axios": "^1.7.2", "eslint": "^8.57.0", "eslint-config-alloy": "^5.1.2", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", - "eslint-plugin-tsdoc": "^0.2.17", + "eslint-plugin-tsdoc": "^0.3.0", "fs-extra": "^11.2.0", - "jotai-devtools": "^0.9.1", + "jotai-devtools": "^0.10.0", + "postcss": "^8.4.39", "pre-commit": "^1.2.2", - "prettier": "^3.2.5", + "prettier": "^3.3.2", "rollup-plugin-visualizer": "^5.12.0", - "ts-json-schema-generator": "^2.1.1", - "typescript": "^5.4.5", - "vite": "^5.2.11", - "vite-plugin-cdn-import": "^1.0.1", + "tailwindcss": "^3.4.4", + "tsx": "^4.16.2", + "typescript": "^5.5.2", + "vite": "^5.3.2", "vite-plugin-chunk-split": "^0.5.0", - "vite-plugin-pages": "^0.32.1", + "vite-plugin-pages": "^0.32.3", "vite-plugin-wasm": "^3.3.0", "vite-plugin-wasm-pack": "^0.1.12", "vitest": "^1.6.0" @@ -80,6 +91,18 @@ "decimal.js": "^10.4.3" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -93,6 +116,28 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/charts": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ant-design/charts/-/charts-2.1.1.tgz", + "integrity": "sha512-db/Dcc8HdftcmiN6QXePzTw3MeGZD/6XeBrefY+Isjm55jUrvSE+zFf5GEFFrSi4C06LP4ioEEcqUXxblGKwHA==", + "dependencies": { + "@ant-design/plots": "^2.1.3" + }, + "peerDependencies": { + "lodash-es": "^4.17.21", + "react": ">=16.8.4", + "react-dom": ">=16.8.4" + } + }, + "node_modules/@ant-design/charts-util": { + "version": "0.0.1-alpha.5", + "resolved": "https://registry.npmjs.org/@ant-design/charts-util/-/charts-util-0.0.1-alpha.5.tgz", + "integrity": "sha512-EwTUjRPhU2CUyI2e11pAi9aOQg9oEWdFEWxv1f4j+Ta4doYXd1yTl94Zy9JvigiEj4qv8dPGl0PUd3r+qMVrAg==", + "peerDependencies": { + "react": ">=16.8.4", + "react-dom": ">=16.8.4" + } + }, "node_modules/@ant-design/colors": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", @@ -102,9 +147,9 @@ } }, "node_modules/@ant-design/cssinjs": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.20.0.tgz", - "integrity": "sha512-uG3iWzJxgNkADdZmc6W0Ci3iQAUOvLMcM8SnnmWq3r6JeocACft4ChnY/YWvI2Y+rG/68QBla/O+udke1yH3vg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz", + "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==", "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", @@ -143,14 +188,31 @@ "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" }, + "node_modules/@ant-design/plots": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@ant-design/plots/-/plots-2.2.4.tgz", + "integrity": "sha512-e9JE51x4QVIA8E/liU+0Tj2bWglE/Ck6iZeWk1eCz8FJQN8KS8x2Pej8oqKdvYmy/YGzwiAulrBnI7NuoZwO3A==", + "dependencies": { + "@ant-design/charts-util": "0.0.1-alpha.5", + "@antv/event-emitter": "^0.1.3", + "@antv/g": "^6.0.0", + "@antv/g2": "^5.1.18", + "@antv/g2-extension-plot": "^0.2.0" + }, + "peerDependencies": { + "lodash-es": "^4.17.21", + "react": ">=16.8.4", + "react-dom": ">=16.8.4" + } + }, "node_modules/@ant-design/pro-card": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-card/-/pro-card-2.6.1.tgz", - "integrity": "sha512-LiZwTUFHNU8t7bJsp51DnSmuct2uY2WHxl+dMcWCpsW2V6KRPws4raGo96SDMPfGjwbF0YrMZhR9yO7qmI5nag==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@ant-design/pro-card/-/pro-card-2.8.4.tgz", + "integrity": "sha512-V+8D10YDsO1FnQK2OKOkB8KkpbjgN7OSLzsJhpkv0l4c4FYV0HzWwEmqIhscgse1j587QcuK3jKwnCWEsxSP1Q==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "omit.js": "^2.0.2", @@ -163,20 +225,20 @@ } }, "node_modules/@ant-design/pro-components": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-components/-/pro-components-2.7.1.tgz", - "integrity": "sha512-9e1BCrDNZ4NZXt7sY9eotVOFa506Pnwhsg9alRWfAzn36IpLt0o9/VllBSAR3WeGaUn452vEEOWJTsCVW4Jq4w==", - "dependencies": { - "@ant-design/pro-card": "2.6.1", - "@ant-design/pro-descriptions": "2.5.37", - "@ant-design/pro-field": "2.14.10", - "@ant-design/pro-form": "2.26.0", - "@ant-design/pro-layout": "7.19.1", - "@ant-design/pro-list": "2.5.52", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-skeleton": "2.1.11", - "@ant-design/pro-table": "3.15.3", - "@ant-design/pro-utils": "2.15.7", + "version": "2.7.10", + "resolved": "https://registry.npmjs.org/@ant-design/pro-components/-/pro-components-2.7.10.tgz", + "integrity": "sha512-UZV1gKGjKxZ9OridFzJLgd9K8WFbTr3t36MQa2Fz5EwWj2mfpAFSvg/0yP9UHgTnfdCe5yrpeck9tGpgHIfcdg==", + "dependencies": { + "@ant-design/pro-card": "2.8.4", + "@ant-design/pro-descriptions": "2.5.45", + "@ant-design/pro-field": "2.15.0", + "@ant-design/pro-form": "2.28.0", + "@ant-design/pro-layout": "7.19.8", + "@ant-design/pro-list": "2.5.61", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-skeleton": "2.1.13", + "@ant-design/pro-table": "3.16.1", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.16.3" }, "peerDependencies": { @@ -186,14 +248,15 @@ } }, "node_modules/@ant-design/pro-descriptions": { - "version": "2.5.37", - "resolved": "https://registry.npmjs.org/@ant-design/pro-descriptions/-/pro-descriptions-2.5.37.tgz", - "integrity": "sha512-YaMs0IGQ39n8jMDUQjhpWW6uZMDktgxAAYwUE9s1tF2XK/ySQSdfylsGvMHZFKqWPRnOqNFIYQ1kAcDLIO9KXQ==", - "dependencies": { - "@ant-design/pro-field": "2.14.10", - "@ant-design/pro-form": "2.26.0", - "@ant-design/pro-skeleton": "2.1.11", - "@ant-design/pro-utils": "2.15.7", + "version": "2.5.45", + "resolved": "https://registry.npmjs.org/@ant-design/pro-descriptions/-/pro-descriptions-2.5.45.tgz", + "integrity": "sha512-XwaHEWhBEa2KiLUZoh67TIfW9bIckzNFUu/gzy/6Tzi9W+qYhZQCzacNNAUDR/a/MULc3J859oqRP+JjCdFUGg==", + "dependencies": { + "@ant-design/pro-field": "2.15.0", + "@ant-design/pro-form": "2.28.0", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-skeleton": "2.1.13", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "rc-resize-observer": "^0.2.3", "rc-util": "^5.0.6" @@ -219,13 +282,13 @@ } }, "node_modules/@ant-design/pro-field": { - "version": "2.14.10", - "resolved": "https://registry.npmjs.org/@ant-design/pro-field/-/pro-field-2.14.10.tgz", - "integrity": "sha512-Q5JIfZJheQKbxgpX29xNwQgsP+fA9WYD4ov5QBLBn1ePUqOreXOQK4cLMBPxxD5MOMULihzHoKi3JOBmuyBCUw==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@ant-design/pro-field/-/pro-field-2.15.0.tgz", + "integrity": "sha512-pf0ldCWZGEWLpZWyifHqyaQ0/uG5yVPvYXhnSM6sXBtxtfHqZvZvjuhmIK1wR05wDocS/JHQnq+sA3FTut8FXQ==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "@chenshuai2144/sketch-color": "^1.0.8", "classnames": "^2.3.2", @@ -241,14 +304,14 @@ } }, "node_modules/@ant-design/pro-form": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@ant-design/pro-form/-/pro-form-2.26.0.tgz", - "integrity": "sha512-K542iiEM0mS/U2iaBHhJjsNinsquy4ZSSfoz6dRdFg6OQEU6+qxx7SpvXpVAGk+CtTxDTmd6u0EKlyVl6shK5Q==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@ant-design/pro-form/-/pro-form-2.28.0.tgz", + "integrity": "sha512-3sOtwSakzrQVYvhWzvvg1iBmGWwr166HKqob5UnjQPP55+40y0agQpyxeoagJF83Xb31zkbp+U0iFcAAQQs76A==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-field": "2.14.10", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-field": "2.15.0", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "@chenshuai2144/sketch-color": "^1.0.7", "@umijs/use-params": "^1.0.9", @@ -273,13 +336,13 @@ } }, "node_modules/@ant-design/pro-layout": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.19.1.tgz", - "integrity": "sha512-JquPxUMFuEZ0kAgs75ECsRFEgygmXawk/oAvEvKNuNTavrUyU/8EJHN+oAETjKdhtsst0Wp5MJKQqPZAcQdYnA==", + "version": "7.19.8", + "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.19.8.tgz", + "integrity": "sha512-f/vC83jmCjEDP7rrLBxRBqCK8298keSRrXqpd2RqigYlJpGqeKVGcevmk5ngBjDxz+UqjoNfOokG7cU3t3eIvQ==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "@umijs/route-utils": "^4.0.0", "@umijs/use-params": "^1.0.9", @@ -299,15 +362,15 @@ } }, "node_modules/@ant-design/pro-list": { - "version": "2.5.52", - "resolved": "https://registry.npmjs.org/@ant-design/pro-list/-/pro-list-2.5.52.tgz", - "integrity": "sha512-Ndro8YKubSQxFDJ3ZTMU9esZJAjye9TqKMLd768ST86nWvSeDrm8A0oUIKtyMgvnbzsh7YXj4JgexGUNJJPaGg==", + "version": "2.5.61", + "resolved": "https://registry.npmjs.org/@ant-design/pro-list/-/pro-list-2.5.61.tgz", + "integrity": "sha512-MwqTfWcos3XBPJlYNw/T1iVlU7HAT/PlAUDTVhdqwpjs6gKafFsg8fHdsj5MxVsk1Pjp5h8hCWIE0P13aMwfYg==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.6.1", - "@ant-design/pro-field": "2.14.10", - "@ant-design/pro-table": "3.15.3", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-card": "2.8.4", + "@ant-design/pro-field": "2.15.0", + "@ant-design/pro-table": "3.16.1", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "dayjs": "^1.11.10", @@ -333,9 +396,9 @@ } }, "node_modules/@ant-design/pro-provider": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.14.1.tgz", - "integrity": "sha512-N8hTUNJc7dtIjj79ZFviielizo15nOUyjrmz9Ll0Mn68Btne2FLpf8cKHsUMdA+yLDW9oM0ExcqIWJOKyx0nUg==", + "version": "2.14.7", + "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.14.7.tgz", + "integrity": "sha512-yEAOph/fTzIhOWMtYAbcsjffyYq8tL6IgMQqRlYZmIisVMRDZZ32F+Ab18a4S18foZiDChEr0e6NZuuY7du5rA==", "dependencies": { "@ant-design/cssinjs": "^1.11.1", "@babel/runtime": "^7.18.0", @@ -350,9 +413,9 @@ } }, "node_modules/@ant-design/pro-skeleton": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ant-design/pro-skeleton/-/pro-skeleton-2.1.11.tgz", - "integrity": "sha512-a1drmZSDXHFexFniN1YD7PgYiWvhdBAM9OwzSOO3eXPAltAg2cGcaVBlFmweShN+dupO220RN+6aaLUv3G9B2Q==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@ant-design/pro-skeleton/-/pro-skeleton-2.1.13.tgz", + "integrity": "sha512-Z2+DpJaFzO6gbmDW8lTceHy2vOpwKQUVRteAh5Ac3NSPeZFUDoyxZGOmA2jN/BxlSQnhrR88vhwXi+KouEqxcg==", "dependencies": { "@babel/runtime": "^7.18.0" }, @@ -363,16 +426,16 @@ } }, "node_modules/@ant-design/pro-table": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/@ant-design/pro-table/-/pro-table-3.15.3.tgz", - "integrity": "sha512-85LMPOsE8vqnKO0/C/r1fLBMhG5jfBUzSlzO7dtDKNzgR3FIeIdOBm49rtoKJ3sHdf3HV3sFazHkOUv9aXQ6Bg==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/@ant-design/pro-table/-/pro-table-3.16.1.tgz", + "integrity": "sha512-c67xsUMIzlGnHYSVjOCkhPlBlt21zoZxa7+p4A087cyjfkQwFR5Qc+xj8L9t0GCqdRz+7J2A9s3s8SSJAwqCEA==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.6.1", - "@ant-design/pro-field": "2.14.10", - "@ant-design/pro-form": "2.26.0", - "@ant-design/pro-provider": "2.14.1", - "@ant-design/pro-utils": "2.15.7", + "@ant-design/pro-card": "2.8.4", + "@ant-design/pro-field": "2.15.0", + "@ant-design/pro-form": "2.28.0", + "@ant-design/pro-provider": "2.14.7", + "@ant-design/pro-utils": "2.15.14", "@babel/runtime": "^7.18.0", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", @@ -406,12 +469,12 @@ } }, "node_modules/@ant-design/pro-utils": { - "version": "2.15.7", - "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.7.tgz", - "integrity": "sha512-VMK1mkb9St4OoEoekW0qUqkKK632XOGjBZusKjlfP9WPwv+MP8bPAB2jOH89JoY8SIQ87Zod6lMgWLMJX3qbOw==", + "version": "2.15.14", + "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.15.14.tgz", + "integrity": "sha512-h/GdYDN19dTnyWvbfoEF5DyeTwkB+iRUXlhQ1O1NMkD2eOUpKTjVKF8J+Kekb7Bp7Fkf1dBVktVrcY8sioTkrw==", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.14.1", + "@ant-design/pro-provider": "2.14.7", "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "dayjs": "^1.11.10", @@ -427,9 +490,9 @@ } }, "node_modules/@ant-design/react-slick": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", - "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", "dependencies": { "@babel/runtime": "^7.10.4", "classnames": "^2.2.5", @@ -441,6 +504,324 @@ "react": ">=16.9.0" } }, + "node_modules/@antv/component": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@antv/component/-/component-2.0.1.tgz", + "integrity": "sha512-VldsSv2O/JNjZYenFIzmtLeC+KD2RcpNARsCLKpi04Iz26joQ3uMtnwxM5W4bd/SCJYKp+eeQeMHMAbwaNR1pw==", + "dependencies": { + "@antv/g": "^6.0.5", + "@antv/scale": "^0.4.3", + "@antv/util": "^3.3.5", + "svg-path-parser": "^1.1.0" + } + }, + "node_modules/@antv/coord": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@antv/coord/-/coord-0.4.7.tgz", + "integrity": "sha512-UTbrMLhwJUkKzqJx5KFnSRpU3BqrdLORJbwUbHK2zHSCT3q3bjcFA//ZYLVfIlwqFDXp/hzfMyRtp0c77A9ZVA==", + "dependencies": { + "@antv/scale": "^0.4.12", + "@antv/util": "^2.0.13", + "gl-matrix": "^3.4.3" + } + }, + "node_modules/@antv/coord/node_modules/@antv/util": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz", + "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==", + "dependencies": { + "csstype": "^3.0.8", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/event-emitter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz", + "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==" + }, + "node_modules/@antv/g": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@antv/g/-/g-6.0.7.tgz", + "integrity": "sha512-plglNjV0N7cn7hPONVl+9FIWjInAo5s7FrOsEFpAB8KXyJ0p1hKb2zEO0TzCw0it/lf3Xbiuixk9NbyslDs3nw==", + "dependencies": { + "@antv/g-camera-api": "2.0.6", + "@antv/g-dom-mutation-observer-api": "2.0.5", + "@antv/g-lite": "2.0.5", + "@antv/g-web-animations-api": "2.0.6" + } + }, + "node_modules/@antv/g-camera-api": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/g-camera-api/-/g-camera-api-2.0.6.tgz", + "integrity": "sha512-fhwwsmhs03N+t1XycAEA8a4ApKKBYJGpRMgFpQ5YS+NNBXoufXuJDESJVPUEwowbFt+664GQwW/g/ULkwNEoVw==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-canvas": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-2.0.7.tgz", + "integrity": "sha512-tHa3Jq2B9EHDg8Icchxa+9z6TaTh4F0iVBqemj714XqPZfSf2cb+mr/AtqNsB25yCqosX31m8NsA+Ci18N2A1A==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/g-plugin-canvas-path-generator": "2.0.5", + "@antv/g-plugin-canvas-picker": "2.0.6", + "@antv/g-plugin-canvas-renderer": "2.0.6", + "@antv/g-plugin-dom-interaction": "2.0.5", + "@antv/g-plugin-html-renderer": "2.0.6", + "@antv/g-plugin-image-loader": "2.0.5", + "@antv/util": "^3.3.5", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-dom-mutation-observer-api": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-dom-mutation-observer-api/-/g-dom-mutation-observer-api-2.0.5.tgz", + "integrity": "sha512-0e86+x/2hcmt5SITzeZjSA8X2/j2Fms+FQX+Iuf7zSou/77kk3ZqUASlwDsf03MT2oGXAW7EcO2Xy8MqpUiseA==", + "dependencies": { + "@antv/g-lite": "2.0.5" + } + }, + "node_modules/@antv/g-lite": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-lite/-/g-lite-2.0.5.tgz", + "integrity": "sha512-IeD7L10MOofNg302Zrru09zjNczCyOAC6mFLjHQlkYCQRtcU04zn32pTxCDy7xRkLHlhAK1mlymBqzeRMkmrRg==", + "dependencies": { + "@antv/g-math": "3.0.0", + "@antv/util": "^3.3.5", + "d3-color": "^3.1.0", + "eventemitter3": "^5.0.1", + "gl-matrix": "^3.4.3", + "rbush": "^3.0.1", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-3.0.0.tgz", + "integrity": "sha512-AkmiNIEL1vgqTPeGY2wtsMdBBqKFwF7SKSgs+D1iOS/rqYMsXdhp/HvtuQ5tx/HdawE/ZzTiicIYopc520ADZw==", + "dependencies": { + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-canvas-path-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-path-generator/-/g-plugin-canvas-path-generator-2.0.5.tgz", + "integrity": "sha512-O1TCCmrzJDWrA9BG2MfPb79zY23a2fOugygeAaj9CElc/rO5ZqZ4lO4NJe4UCHRInTTXJjGwPnIcmX24Gi6O/A==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/g-math": "3.0.0", + "@antv/util": "^3.3.5", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-canvas-picker": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-picker/-/g-plugin-canvas-picker-2.0.6.tgz", + "integrity": "sha512-QD9Z6YA29iJC36mQxd+qSX5tNlQZ41M4nGWY/iepKnOwAf9Rm+X4AgyIxKOrjg/rkRgUv2WR0Dp2eMfKUqm/Ng==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/g-math": "3.0.0", + "@antv/g-plugin-canvas-path-generator": "2.0.5", + "@antv/g-plugin-canvas-renderer": "2.0.6", + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-canvas-renderer": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-renderer/-/g-plugin-canvas-renderer-2.0.6.tgz", + "integrity": "sha512-65uoJ2XJcUeGDYxnMxsGkdvaNNmEy79QEstr//as8hH+ssyUZJhBLgsDnhLqBQWYQGb7fXMPG0rUEesfjGOYkg==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/g-math": "3.0.0", + "@antv/g-plugin-canvas-path-generator": "2.0.5", + "@antv/g-plugin-image-loader": "2.0.5", + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-dom-interaction": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-dom-interaction/-/g-plugin-dom-interaction-2.0.5.tgz", + "integrity": "sha512-m4LeXM63d+MqQguCgmZU8TvvfuLlZ9zrtKWtRr6gYhi0+98o/3+pPrluIZhZHdgplH209+nN2JQ/ceoWp4OrZA==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-dragndrop": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-dragndrop/-/g-plugin-dragndrop-2.0.5.tgz", + "integrity": "sha512-Ow9BfL4w6er8OhJxilmU4FOQvFyEWSD6ScRWHBmXqY45/8zcMuhTWd2KcMAmxxPMNmtGch4WeJdPurb0beH8DQ==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/util": "^3.3.5", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-html-renderer": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-html-renderer/-/g-plugin-html-renderer-2.0.6.tgz", + "integrity": "sha512-dk0GHksBeuZlHFK/ARr6WRXQLuBQtsl7lboYQWXUVTlk+lIFq1n459hpukKokah89bRvnSAuqMVlBqEsyjn+nw==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-plugin-image-loader": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@antv/g-plugin-image-loader/-/g-plugin-image-loader-2.0.5.tgz", + "integrity": "sha512-TMpwOW4KibMtKOZZVMZHny+LOrWGjl1GP+i3N8sQx97oDaxIoNIB789XriuovKU/S71Y77ZTrqQdldknwWY24A==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/util": "^3.3.5", + "gl-matrix": "^3.4.3", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g-web-animations-api": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@antv/g-web-animations-api/-/g-web-animations-api-2.0.6.tgz", + "integrity": "sha512-sDNkG0umxAgks14sCgumg9PoLkHXszS+T4RGMgFtlRYuXgM4OBZB3EYTa99www5Z4TaUM+Y/rvECn3FKv8Zo4Q==", + "dependencies": { + "@antv/g-lite": "2.0.5", + "@antv/util": "^3.3.5", + "tslib": "^2.5.3" + } + }, + "node_modules/@antv/g2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-5.2.0.tgz", + "integrity": "sha512-wruxga0RdaCtUi2LcJ5qgrBTP37tUwCYbBJYc3R8dW7oywB5ZqUmPWI7qh6lUh2hIS+hGsNsWvVa7vQOQSIeSw==", + "dependencies": { + "@antv/component": "^2.0.0", + "@antv/coord": "^0.4.6", + "@antv/event-emitter": "^0.1.3", + "@antv/g": "^6.0.0", + "@antv/g-canvas": "^2.0.0", + "@antv/g-plugin-dragndrop": "^2.0.0", + "@antv/path-util": "^3.0.1", + "@antv/scale": "^0.4.12", + "@antv/util": "^3.3.5", + "d3-array": "^3.2.4", + "d3-dsv": "^3.0.1", + "d3-force": "^3.0.0", + "d3-format": "^3.1.0", + "d3-geo": "^3.1.0", + "d3-hierarchy": "^3.1.2", + "d3-path": "^3.1.0", + "d3-scale-chromatic": "^3.0.0", + "d3-shape": "^3.2.0", + "d3-voronoi": "^1.1.4", + "flru": "^1.0.2", + "fmin": "^0.0.2", + "pdfast": "^0.2.0" + } + }, + "node_modules/@antv/g2-extension-plot": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@antv/g2-extension-plot/-/g2-extension-plot-0.2.1.tgz", + "integrity": "sha512-WNv/LIUNJLwlfG8XXmKUbje9PbImtJqh36UDvuOk/uu+kmP/uMyHAXsBuu0yCOWdQgBVTVwoxszxJOCnY4mVfg==", + "dependencies": { + "@antv/g2": "^5.1.8", + "@antv/util": "^3.3.5", + "d3-array": "^3.2.4", + "d3-hierarchy": "^3.1.2" + } + }, + "node_modules/@antv/path-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@antv/path-util/-/path-util-3.0.1.tgz", + "integrity": "sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q==", + "dependencies": { + "gl-matrix": "^3.1.0", + "lodash-es": "^4.17.21", + "tslib": "^2.0.3" + } + }, + "node_modules/@antv/s2": { + "version": "2.0.0-next.24", + "resolved": "https://registry.npmjs.org/@antv/s2/-/s2-2.0.0-next.24.tgz", + "integrity": "sha512-qUEbz+GPZOs4FPp792X1spAo2NQlr0hJpvpK1YpsLjI5Whg5eV/TfzbPJXBz1LyH68NSCY8Sqk6xUj9WtB0xAw==", + "dependencies": { + "@antv/event-emitter": "^0.1.3", + "@antv/g": "^6.0.6", + "@antv/g-canvas": "^2.0.7", + "@antv/g-lite": "^2.0.5", + "d3-ease": "^3.0.1", + "d3-interpolate": "^1.3.2", + "d3-timer": "^1.0.9", + "decimal.js": "^10.4.3", + "lodash": "^4.17.21", + "tinycolor2": "^1.6.0" + } + }, + "node_modules/@antv/s2-react": { + "version": "2.0.0-next.23", + "resolved": "https://registry.npmjs.org/@antv/s2-react/-/s2-react-2.0.0-next.23.tgz", + "integrity": "sha512-/h/pSyaQLv62DHwnieqr4jFQXaI82f6Y3V3WKeTzW9ckJbg19+HC+RZ9kuyMcQNS8RjRz3PcNMf52R5ggJCaCQ==", + "dependencies": { + "ahooks": "^3.8.0", + "classnames": "^2.5.1", + "lodash": "^4.17.21", + "react-beautiful-dnd": "^13.1.1" + }, + "peerDependencies": { + "@ant-design/icons": ">=4.7.0", + "@antv/s2": "^2.0.0-next.1", + "antd": "^5.0.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@antv/s2/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/@antv/s2/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/@antv/s2/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/@antv/scale": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.16.tgz", + "integrity": "sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==", + "dependencies": { + "@antv/util": "^3.3.7", + "color-string": "^1.5.5", + "fecha": "^4.2.1" + } + }, + "node_modules/@antv/util": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.7.tgz", + "integrity": "sha512-qqPg7rIPCsJyl7N56jAC25v/99mJ3ApVkgBsGijhiWrEeKvzXBPk1r5P77Pm9nCljpnn+hH8Z3t5AivbEoTJMg==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "gl-matrix": "^3.3.0", + "tslib": "^2.3.1" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -583,9 +964,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -634,9 +1015,9 @@ } }, "node_modules/@dagrejs/dagre": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.2.tgz", - "integrity": "sha512-F09dphqvHsbe/6C2t2unbmpr5q41BNPEfJCdn8Z7aEBpVSy/zFQ/b4SWsweQjWNsYMDvE2ffNUN8X0CeFsEGNw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.3.tgz", + "integrity": "sha512-umT7fBPECI4zgxxXW07H3vJN7W1WZcnBjk613eOEAKcwoFrYNyMZO+1SHmoC8zPZWR18DquK2wRUp9VHUE+94g==", "dependencies": { "@dagrejs/graphlib": "2.2.2" } @@ -861,9 +1242,9 @@ "dev": true }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -877,9 +1258,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -893,9 +1274,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -909,9 +1290,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -925,9 +1306,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -941,9 +1322,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -957,9 +1338,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -973,9 +1354,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -989,9 +1370,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -1005,9 +1386,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -1021,9 +1402,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -1037,9 +1418,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -1053,9 +1434,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -1069,9 +1450,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -1085,9 +1466,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -1101,9 +1482,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -1117,9 +1498,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1133,9 +1514,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1149,9 +1530,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1165,9 +1546,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1181,9 +1562,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1197,9 +1578,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1213,9 +1594,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1307,32 +1688,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", - "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.3.tgz", + "integrity": "sha512-1ZpCvYf788/ZXOhRQGFxnYQOVgeU+pi0i+d0Ow34La7qjIXETi6RNswGVKkA6KcDO8/+Ysu2E/CeUmmeEBDvTg==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.3" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.6.tgz", + "integrity": "sha512-qiTYajAnh3P+38kECeffMSQgbvXty2VB6rS+42iWR4FPIlZjLK84E9qtLnMTLIpPz2znD/TaFqaiavMUrS+Hcw==", "dev": true, "dependencies": { "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/utils": "^0.2.3" } }, "node_modules/@floating-ui/react": { - "version": "0.26.14", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.14.tgz", - "integrity": "sha512-I2EhfezC+H0WfkMEkCcF9+++PU1Wq08bDKhHHGIoBZVCciiftEQHgrSI4dTUTsa7446SiIVW0gWATliIlVNgfg==", + "version": "0.26.18", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.18.tgz", + "integrity": "sha512-enDDX09Jpi3kmhcXXpvs+fvRXOfBj1jUV2KF6uDMf5HjS+SOZJzNTFUW71lKbFcxz0BkmQqwbvqdmHIxMq/fyQ==", "dev": true, "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@floating-ui/utils": "^0.2.0", + "@floating-ui/react-dom": "^2.1.0", + "@floating-ui/utils": "^0.2.3", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -1341,9 +1722,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz", - "integrity": "sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", "dev": true, "dependencies": { "@floating-ui/dom": "^1.0.0" @@ -1354,9 +1735,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.3.tgz", + "integrity": "sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww==", "dev": true }, "node_modules/@humanwhocodes/config-array": { @@ -1416,7 +1797,7 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "dependencies": { @@ -1433,7 +1814,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { @@ -1445,7 +1826,7 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { @@ -1457,13 +1838,13 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { @@ -1480,7 +1861,7 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { @@ -1495,7 +1876,7 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { @@ -1616,63 +1997,67 @@ "node": ">=10" } }, + "node_modules/@ljharb/resumer": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz", + "integrity": "sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==", + "dependencies": { + "@ljharb/through": "^2.3.9" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@mantine/code-highlight": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@mantine/code-highlight/-/code-highlight-7.9.1.tgz", - "integrity": "sha512-4FEEcfz4mMx/DzIMfnJGp+CXCyITVFwrGL0Hh35OeL/E/OIRejvHDM8TUgmoWMqGspK+jtYf2XiOAVQKBGBgDg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@mantine/code-highlight/-/code-highlight-7.11.0.tgz", + "integrity": "sha512-IPx0FYcvWBeRElw5HUO0FwtR4JgTGuBd8gHKzHQyfplnnaNHYmLEncnhBtljzVriQFVpqzvWetfV/TWczAqc/g==", "dev": true, "dependencies": { - "clsx": "2.1.0", + "clsx": "^2.1.1", "highlight.js": "^11.9.0" }, "peerDependencies": { - "@mantine/core": "7.9.1", - "@mantine/hooks": "7.9.1", + "@mantine/core": "7.11.0", + "@mantine/hooks": "7.11.0", "react": "^18.2.0", "react-dom": "^18.2.0" } }, - "node_modules/@mantine/code-highlight/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@mantine/core": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.9.1.tgz", - "integrity": "sha512-UXK11t1fAQ2ROQ9HTIZfyU52XdwS8sFJ2SRUh5uHMWSahJo3wTdKzaCvYN7wg+ONM9p6ENT0hC0dfv5qXoKU4w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.11.0.tgz", + "integrity": "sha512-yw2Llww9mw8rDWZtucdEuvkqqjHdreUibos7JCUpejL721FW1Tn9L91nsxO/YQFSS7jn4Q0CP+1YbQ/PMULmwA==", "dev": true, "dependencies": { "@floating-ui/react": "^0.26.9", - "clsx": "2.1.0", + "clsx": "^2.1.1", "react-number-format": "^5.3.1", "react-remove-scroll": "^2.5.7", "react-textarea-autosize": "8.5.3", "type-fest": "^4.12.0" }, "peerDependencies": { - "@mantine/hooks": "7.9.1", + "@mantine/hooks": "7.11.0", "react": "^18.2.0", "react-dom": "^18.2.0" } }, - "node_modules/@mantine/core/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@mantine/core/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "version": "4.20.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", "dev": true, "engines": { "node": ">=16" @@ -1682,45 +2067,152 @@ } }, "node_modules/@mantine/hooks": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.1.tgz", - "integrity": "sha512-nb2Ar+2HfGxLjGZgObapeUeqcQsUWJ+rvj4X2KNTUy3+YpvLIMD3CqREowWHF7/5OTGh4BCyBqQNZ9JFpnMeHQ==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.11.0.tgz", + "integrity": "sha512-T3472GhUXFhuhXUHlxjHv0wfb73lFyNuaw631c7Ddtgvewq0WKtNqYd7j/Zz/k02DuS3r0QXA7e12/XgqHBZjg==", "dev": true, "peerDependencies": { "react": "^18.2.0" } }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "dev": true, + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mdx-js/rollup": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@mdx-js/rollup/-/rollup-3.0.1.tgz", + "integrity": "sha512-j0II91OCm4ld+l5QVgXXMQGxVVcAWIQJakYWi1dv5pefDHASJyCYER2TsdH7Alf958GoFSM7ugukWyvDq/UY4A==", + "dev": true, + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@rollup/pluginutils": "^5.0.0", + "source-map": "^0.7.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "rollup": ">=2" + } + }, + "node_modules/@mdx-js/rollup/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", + "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", + "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", + "@microsoft/tsdoc": "0.15.0", + "ajv": "~8.12.0", "jju": "~1.4.0", - "resolve": "~1.19.0" + "resolve": "~1.22.2" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@modyfi/vite-plugin-yaml": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@modyfi/vite-plugin-yaml/-/vite-plugin-yaml-1.1.0.tgz", @@ -1772,7 +2264,7 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "optional": true, @@ -1786,15 +2278,26 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, - "node_modules/@rc-component/color-picker": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz", - "integrity": "sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==", + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", "dependencies": { - "@babel/runtime": "^7.10.1", - "@ctrl/tinycolor": "^3.6.0", + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", + "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "@ctrl/tinycolor": "^3.6.1", "classnames": "^2.2.6", - "rc-util": "^5.30.0" + "rc-util": "^5.38.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -1860,13 +2363,13 @@ } }, "node_modules/@rc-component/tour": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.10.0.tgz", - "integrity": "sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.0.tgz", + "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/portal": "^1.0.0-9", - "@rc-component/trigger": "^1.3.6", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.3.2", "rc-util": "^5.24.4" }, @@ -1879,9 +2382,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.3.tgz", - "integrity": "sha512-Ksr25pXreYe1gX6ayZ1jLrOrl9OAUHUqnuhEx6MeHnNa1zVM5Y2Aj3Q35UrER0ns8D2cJYtmJtVli+i+4eKrvA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.0.tgz", + "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==", "dependencies": { "@babel/runtime": "^7.23.2", "@rc-component/portal": "^1.1.0", @@ -1899,11 +2402,11 @@ } }, "node_modules/@reactflow/background": { - "version": "11.3.13", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.13.tgz", - "integrity": "sha512-hkvpVEhgvfTDyCvdlitw4ioKCYLaaiRXnuEG+1QM3Np+7N1DiWF1XOv5I8AFyNoJL07yXEkbECUTsHvkBvcG5A==", + "version": "11.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz", + "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==", "dependencies": { - "@reactflow/core": "11.11.3", + "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -1913,11 +2416,11 @@ } }, "node_modules/@reactflow/controls": { - "version": "11.2.13", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.13.tgz", - "integrity": "sha512-3xgEg6ALIVkAQCS4NiBjb7ad8Cb3D8CtA7Vvl4Hf5Ar2PIVs6FOaeft9s2iDZGtsWP35ECDYId1rIFVhQL8r+A==", + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz", + "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==", "dependencies": { - "@reactflow/core": "11.11.3", + "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -1927,9 +2430,9 @@ } }, "node_modules/@reactflow/core": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.3.tgz", - "integrity": "sha512-+adHdUa7fJSEM93fWfjQwyWXeI92a1eLKwWbIstoCakHpL8UjzwhEh6sn+mN2h/59MlVI7Ehr1iGTt3MsfcIFA==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz", + "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==", "dependencies": { "@types/d3": "^7.4.0", "@types/d3-drag": "^3.0.1", @@ -1947,11 +2450,11 @@ } }, "node_modules/@reactflow/minimap": { - "version": "11.7.13", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.13.tgz", - "integrity": "sha512-m2MvdiGSyOu44LEcERDEl1Aj6x//UQRWo3HEAejNU4HQTlJnYrSN8tgrYF8TxC1+c/9UdyzQY5VYgrTwW4QWdg==", + "version": "11.7.14", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz", + "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==", "dependencies": { - "@reactflow/core": "11.11.3", + "@reactflow/core": "11.11.4", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", @@ -1965,11 +2468,11 @@ } }, "node_modules/@reactflow/node-resizer": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.13.tgz", - "integrity": "sha512-X7ceQ2s3jFLgbkg03n2RYr4hm3jTVrzkW2W/8ANv/SZfuVmF8XJxlERuD8Eka5voKqLda0ywIZGAbw9GoHLfUQ==", + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz", + "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==", "dependencies": { - "@reactflow/core": "11.11.3", + "@reactflow/core": "11.11.4", "classcat": "^5.0.4", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", @@ -1981,11 +2484,11 @@ } }, "node_modules/@reactflow/node-toolbar": { - "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.13.tgz", - "integrity": "sha512-aknvNICO10uWdthFSpgD6ctY/CTBeJUMV9co8T9Ilugr08Nb89IQ4uD0dPmr031ewMQxixtYIkw+sSDDzd2aaQ==", + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz", + "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==", "dependencies": { - "@reactflow/core": "11.11.3", + "@reactflow/core": "11.11.4", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2008,9 +2511,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz", + "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==", "engines": { "node": ">=14.0.0" } @@ -2260,20 +2763,20 @@ "dev": true }, "node_modules/@swc-jotai/react-refresh": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@swc-jotai/react-refresh/-/react-refresh-0.1.0.tgz", - "integrity": "sha512-CWV4W06GdfQo3cW3CoUM2fp7avH4Z/suR7SvECNJnQbr6Sa9U3p7o10nXjNv2zT6z09bbNUPM55HBw5Nwd24Iw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@swc-jotai/react-refresh/-/react-refresh-0.1.1.tgz", + "integrity": "sha512-Zke+Wd8tJIpGkzXhoWA9yLVcfV57hSef2EE5K/Cp1n3A1yl9E+Umpz/b1OyIuwXAALeiHah+MQM4JtXEN0tMsg==", "dev": true }, "node_modules/@swc/core": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.6.tgz", - "integrity": "sha512-0UC0NkgWoqd9fkHPn1NTkTsQucW8iaA1fujK2OLGp40Zg5Vr7nrwBlqruX9expVMggS4rv/3vZSAGzRm80VQ/g==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.6.tgz", + "integrity": "sha512-sHfmIUPUXNrQTwFMVCY5V5Ena2GTOeaWjS2GFUpjLhAgVfP90OP67DWow7+cYrfFtqBdILHuWnjkTcd0+uPKlg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "^0.1.5" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" }, "engines": { "node": ">=10" @@ -2283,19 +2786,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.6", - "@swc/core-darwin-x64": "1.5.6", - "@swc/core-linux-arm-gnueabihf": "1.5.6", - "@swc/core-linux-arm64-gnu": "1.5.6", - "@swc/core-linux-arm64-musl": "1.5.6", - "@swc/core-linux-x64-gnu": "1.5.6", - "@swc/core-linux-x64-musl": "1.5.6", - "@swc/core-win32-arm64-msvc": "1.5.6", - "@swc/core-win32-ia32-msvc": "1.5.6", - "@swc/core-win32-x64-msvc": "1.5.6" + "@swc/core-darwin-arm64": "1.6.6", + "@swc/core-darwin-x64": "1.6.6", + "@swc/core-linux-arm-gnueabihf": "1.6.6", + "@swc/core-linux-arm64-gnu": "1.6.6", + "@swc/core-linux-arm64-musl": "1.6.6", + "@swc/core-linux-x64-gnu": "1.6.6", + "@swc/core-linux-x64-musl": "1.6.6", + "@swc/core-win32-arm64-msvc": "1.6.6", + "@swc/core-win32-ia32-msvc": "1.6.6", + "@swc/core-win32-x64-msvc": "1.6.6" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -2304,9 +2807,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.6.tgz", - "integrity": "sha512-U4szqU03cvZOTXug5o+HQbbg16ZGwANtr7LELjw4hmWBqSTcbBVXgocyBMm1L4ngFIsqJc33D+urnnaae/NfMg==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.6.tgz", + "integrity": "sha512-5DA8NUGECcbcK1YLKJwNDKqdtTYDVnkfDU1WvQSXq/rU+bjYCLtn5gCe8/yzL7ISXA6rwqPU1RDejhbNt4ARLQ==", "cpu": [ "arm64" ], @@ -2320,9 +2823,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.6.tgz", - "integrity": "sha512-k4jymBHYkbfGw8DT4bLtVsAckpp2dblyImQHRPScpvDyS4jUo4174mgy/dEnFmZVLTbuZAY876zBQyH+eJ3p4A==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.6.tgz", + "integrity": "sha512-2nbh/RHpweNRsJiYDFk1KcX7UtaKgzzTNUjwtvK5cp0wWrpbXmPvdlWOx3yzwoiSASDFx78242JHHXCIOlEdsw==", "cpu": [ "x64" ], @@ -2336,9 +2839,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.6.tgz", - "integrity": "sha512-ijwGEdP18vS8YmvHUIfKYDFQ5mQ1GtCxhJp+IcJlrBJE+/eSJVvEVF5WwXFQ+Hzj6tr/OOub8UcRNUaQokjh3A==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.6.tgz", + "integrity": "sha512-YgytuyUfR7b0z0SRHKV+ylr83HmgnROgeT7xryEkth6JGpAEHooCspQ4RrWTU8+WKJ7aXiZlGXPgybQ4TiS+TA==", "cpu": [ "arm" ], @@ -2352,9 +2855,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.6.tgz", - "integrity": "sha512-6YD942jsDm64wgGNew4Q1Yh8CRI4QKWTqjzCkvlZCGV6aOw5B663WDSnUEKIoN4egeLcvSiqYYGlKMfbkkfNMw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.6.tgz", + "integrity": "sha512-yGwx9fddzEE0iURqRVwKBQ4IwRHE6hNhl15WliHpi/PcYhzmYkUIpcbRXjr0dssubXAVPVnx6+jZVDSbutvnfg==", "cpu": [ "arm64" ], @@ -2368,9 +2871,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.6.tgz", - "integrity": "sha512-Jntdd/HQAgRSQFUpmXjiU00BG08Yl5G1pgYDBXG2mPfkndGGgapRT8JPsnzfQujh9nOdWMIQDnCGU+mB4NY2Dg==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.6.tgz", + "integrity": "sha512-a6fMbqzSAsS5KCxFJyg1mD5kwN3ZFO8qQLyJ75R/htZP/eCt05jrhmOI7h2n+1HjiG332jLnZ9S8lkVE5O8Nqw==", "cpu": [ "arm64" ], @@ -2384,9 +2887,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.6.tgz", - "integrity": "sha512-cdaAyAZJvYCx0u9uadUVe4VVJOEC6GeVO5uTGo/vybCsKFn2Z8WVjGVTeHbxdp7pH2II9MRTySIv1eCCq70SOQ==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.6.tgz", + "integrity": "sha512-hRGsUKNzzZle28YF0dYIpN0bt9PceR9LaVBq7x8+l9TAaDLFbgksSxcnU/ubTtsy+WsYSYGn+A83w3xWC0O8CQ==", "cpu": [ "x64" ], @@ -2400,9 +2903,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.6.tgz", - "integrity": "sha512-mGIs4d6/Hv/5EbP2d+2YNmIj9U5U/6CiPZsTyahQcEl+vJjNsmwDJoLex36LhxoGIUmVbbgk6cHj5DoHWNl0bQ==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.6.tgz", + "integrity": "sha512-NokIUtFxJDVv3LzGeEtYMTV3j2dnGKLac59luTeq36DQLZdJQawQIdTbzzWl2jE7lxxTZme+dhsVOH9LxE3ceg==", "cpu": [ "x64" ], @@ -2416,9 +2919,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.6.tgz", - "integrity": "sha512-ViiS2pUXy/J9RZWJXQJMuDKid0lqH9fu2piFi3IHnMWyyWPla5qHYijkeODwrdBsjc30NAHjV6jfka5SZduqiw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.6.tgz", + "integrity": "sha512-lzYdI4qb4k1dFG26yv+9Jaq/bUMAhgs/2JsrLncGjLof86+uj74wKYCQnbzKAsq2hDtS5DqnHnl+//J+miZfGA==", "cpu": [ "arm64" ], @@ -2432,9 +2935,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.6.tgz", - "integrity": "sha512-Ju5z65Nda8oYjt2Z4CGbuBLxM+98TcewLogutI69rBo5S70xunadp4ANIHcr9fZlTu/IX9mxZmUpOaHtb+/TfA==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.6.tgz", + "integrity": "sha512-bvl7FMaXIJQ76WZU0ER4+RyfKIMGb6S2MgRkBhJOOp0i7VFx4WLOnrmMzaeoPJaJSkityVKAftfNh7NBzTIydQ==", "cpu": [ "ia32" ], @@ -2448,9 +2951,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.6.tgz", - "integrity": "sha512-pkqJsdrgxyFYJA+g9a3zbl+AoxYoBtv+Rji1Fw4+Sq7CsSMWboayWNN5fKRiyi3u3nG8kxqyGi51PsKy2G4Vpg==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.6.tgz", + "integrity": "sha512-WAP0JoCTfgeYKgOeYJoJV4ZS0sQUmU3OwvXa2dYYtMLF7zsNqOiW4niU7QlThBHgUv/qNZm2p6ITEgh3w1cltw==", "cpu": [ "x64" ], @@ -2470,14 +2973,51 @@ "dev": true }, "node_modules/@swc/types": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", - "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", "dev": true, "dependencies": { "@swc/counter": "^0.1.3" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.13", + "resolved": "https://registry.npmmirror.com/@tailwindcss/typography/-/typography-0.5.13.tgz", + "integrity": "sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/base16": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/base16/-/base16-1.0.5.tgz", @@ -2598,9 +3138,9 @@ } }, "node_modules/@types/d3-force": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", - "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==" }, "node_modules/@types/d3-format": { "version": "3.0.4", @@ -2721,16 +3261,33 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.14", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -2748,12 +3305,6 @@ "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@types/lodash": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", @@ -2769,6 +3320,20 @@ "@types/lodash": "*" } }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==" + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -2776,9 +3341,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2793,14 +3358,12 @@ "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", - "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", - "devOptional": true, + "version": "18.3.3", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -2815,6 +3378,25 @@ "@types/react": "*" } }, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/@types/styled-components": { "version": "5.1.34", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz", @@ -2831,17 +3413,23 @@ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", - "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/type-utils": "7.9.0", - "@typescript-eslint/utils": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2865,15 +3453,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", - "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4" }, "engines": { @@ -2893,13 +3481,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2910,13 +3498,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", - "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2937,9 +3525,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2950,13 +3538,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2978,15 +3566,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", - "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0" + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3000,12 +3588,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3036,12 +3624,12 @@ "dev": true }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", - "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", + "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", "dev": true, "dependencies": { - "@swc/core": "^1.3.107" + "@swc/core": "^1.5.7" }, "peerDependencies": { "vite": "^4 || ^5" @@ -3239,9 +3827,9 @@ } }, "node_modules/ahooks": { - "version": "3.7.11", - "resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.7.11.tgz", - "integrity": "sha512-BfSq7HJ9wk/7a2vX7WbLdwzHyQHmbNe21ipX1PfIzssXIzQfAl79WVJ9GjZaqNl4PFPsJusj/Xjg2OF+gIgGaQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ahooks/-/ahooks-3.8.0.tgz", + "integrity": "sha512-M01m+mxLRNNeJ/PCT3Fom26UyreTj6oMqJBetUrJnK4VNI5j6eMA543Xxo53OBXn6XibA2FXKcCCgrT6YCTtKQ==", "dependencies": { "@babel/runtime": "^7.21.0", "dayjs": "^1.9.1", @@ -3276,6 +3864,27 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3328,56 +3937,56 @@ } }, "node_modules/antd": { - "version": "5.11.4", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.11.4.tgz", - "integrity": "sha512-FuaV/viyZiMlCL1JzdQpSlzPcWcBlGYDAbtj3FM4BgwAso+ge3d4tXkZZG4yZkktUoLvWrcaJObs3Nk32Oiwuw==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.18.3.tgz", + "integrity": "sha512-Dm3P8HBxoo/DiR/QZLj5Mk+rQZsSXxCCArSZACHGiklkkjW6klzlebAElOUr9NyDeFX7UnQ6LVk7vznXlnjTqQ==", "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/cssinjs": "^1.17.5", - "@ant-design/icons": "^5.2.6", - "@ant-design/react-slick": "~1.0.2", - "@babel/runtime": "^7.18.3", + "@ant-design/colors": "^7.0.2", + "@ant-design/cssinjs": "^1.21.0", + "@ant-design/icons": "^5.3.7", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.24.7", "@ctrl/tinycolor": "^3.6.1", - "@rc-component/color-picker": "~1.4.1", + "@rc-component/color-picker": "~1.5.3", "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/tour": "~1.10.0", - "@rc-component/trigger": "^1.18.2", - "classnames": "^2.3.2", + "@rc-component/tour": "~1.15.0", + "@rc-component/trigger": "^2.2.0", + "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", - "dayjs": "^1.11.1", + "dayjs": "^1.11.11", "qrcode.react": "^3.1.0", - "rc-cascader": "~3.20.0", - "rc-checkbox": "~3.1.0", - "rc-collapse": "~3.7.1", - "rc-dialog": "~9.3.4", - "rc-drawer": "~6.5.2", - "rc-dropdown": "~4.1.0", - "rc-field-form": "~1.40.0", - "rc-image": "~7.5.1", - "rc-input": "~1.3.6", - "rc-input-number": "~8.4.0", - "rc-mentions": "~2.9.1", - "rc-menu": "~9.12.2", - "rc-motion": "^2.9.0", - "rc-notification": "~5.3.0", - "rc-pagination": "~3.7.0", - "rc-picker": "~3.14.6", - "rc-progress": "~3.5.1", - "rc-rate": "~2.12.0", + "rc-cascader": "~3.26.0", + "rc-checkbox": "~3.3.0", + "rc-collapse": "~3.7.3", + "rc-dialog": "~9.5.2", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~2.2.1", + "rc-image": "~7.9.0", + "rc-input": "~1.5.1", + "rc-input-number": "~9.1.0", + "rc-mentions": "~2.14.0", + "rc-menu": "~9.14.0", + "rc-motion": "^2.9.2", + "rc-notification": "~5.6.0", + "rc-pagination": "~4.0.4", + "rc-picker": "~4.5.0", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.0", "rc-resize-observer": "^1.4.0", - "rc-segmented": "~2.2.2", - "rc-select": "~14.10.0", - "rc-slider": "~10.4.0", + "rc-segmented": "~2.3.0", + "rc-select": "~14.14.0", + "rc-slider": "~10.6.2", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.36.0", - "rc-tabs": "~12.13.1", - "rc-textarea": "~1.5.3", - "rc-tooltip": "~6.1.2", - "rc-tree": "~5.8.2", - "rc-tree-select": "~5.15.0", - "rc-upload": "~4.3.5", - "rc-util": "^5.38.1", + "rc-table": "~7.45.7", + "rc-tabs": "~15.1.1", + "rc-textarea": "~1.7.0", + "rc-tooltip": "~6.2.0", + "rc-tree": "~5.8.8", + "rc-tree-select": "~5.21.0", + "rc-upload": "~4.5.2", + "rc-util": "^5.43.0", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.0" }, @@ -3391,12 +4000,12 @@ } }, "node_modules/antd/node_modules/rc-field-form": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.40.0.tgz", - "integrity": "sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.2.1.tgz", + "integrity": "sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==", "dependencies": { "@babel/runtime": "^7.18.0", - "async-validator": "^4.1.0", + "@rc-component/async-validator": "^5.0.3", "rc-util": "^5.32.2" }, "engines": { @@ -3407,6 +4016,31 @@ "react-dom": ">=16.9.0" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3425,7 +4059,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -3540,23 +4173,25 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -3583,10 +4218,20 @@ "node": "*" } }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmmirror.com/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "dev": true, + "bin": { + "astring": "bin/astring" + } + }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "peer": true }, "node_modules/asynckit": { "version": "0.4.0", @@ -3594,11 +4239,47 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3610,9 +4291,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dev": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -3635,11 +4316,20 @@ "npm": ">=6" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base16": { "version": "1.0.0", @@ -3647,6 +4337,18 @@ "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==", "dev": true }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -3657,17 +4359,49 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3687,7 +4421,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3717,6 +4450,23 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -3725,6 +4475,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001640", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -3759,6 +4551,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3777,7 +4609,43 @@ "node": "*" } }, - "node_modules/classcat": { + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classcat": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" @@ -3836,6 +4704,16 @@ "node": ">=6" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -3861,14 +4739,12 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -3901,6 +4777,16 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/command-line-args": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", @@ -3917,12 +4803,11 @@ } }, "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">=18" + "node": ">= 10" } }, "node_modules/complex.js": { @@ -3945,8 +4830,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -3969,6 +4853,11 @@ "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true }, + "node_modules/contour_plot": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/contour_plot/-/contour_plot-0.0.1.tgz", + "integrity": "sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw==" + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -4019,6 +4908,14 @@ "node": ">= 8" } }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -4037,6 +4934,18 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -4081,6 +4990,41 @@ "node": ">=12" } }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -4089,6 +5033,46 @@ "node": ">=12" } }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -4100,6 +5084,34 @@ "node": ">=12" } }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", @@ -4108,6 +5120,17 @@ "node": ">=12" } }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-timer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", @@ -4134,6 +5157,11 @@ "d3-selection": "2 - 3" } }, + "node_modules/d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, "node_modules/d3-zoom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", @@ -4153,7 +5181,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -4170,7 +5197,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4187,7 +5213,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -4206,9 +5231,9 @@ "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -4222,11 +5247,32 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -4240,29 +5286,16 @@ } }, "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" + "regexp.prototype.flags": "^1.5.1" }, "engines": { "node": ">= 0.4" @@ -4277,11 +5310,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deep-object-diff": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", + "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==" + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4307,7 +5344,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -4320,6 +5356,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4329,6 +5373,15 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -4353,6 +5406,25 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "dev": true }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff-match-patch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", @@ -4380,6 +5452,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4392,12 +5470,49 @@ "node": ">=6.0.0" } }, + "node_modules/dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dependencies": { + "minimatch": "^3.0.4" + }, + "bin": { + "ignored": "bin/ignored" + } + }, + "node_modules/dotignore/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dotignore/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/electron-to-chromium": { + "version": "1.4.818", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4417,7 +5532,6 @@ "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -4477,7 +5591,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -4489,31 +5602,10 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", @@ -4549,7 +5641,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -4561,7 +5652,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -4584,7 +5674,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4598,9 +5687,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -4610,29 +5699,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -4760,29 +5849,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -4873,13 +5962,13 @@ } }, "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.3.0.tgz", + "integrity": "sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "0.16.2" + "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc-config": "0.17.0" } }, "node_modules/eslint-scope": { @@ -5007,25 +6096,116 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/estree-util-build-jsx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -5084,6 +6264,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -5114,8 +6300,7 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -5166,6 +6351,11 @@ "reusify": "^1.0.4" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -5209,9 +6399,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -5274,6 +6464,97 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/flru": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flru/-/flru-1.0.2.tgz", + "integrity": "sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fmin": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fmin/-/fmin-0.0.2.tgz", + "integrity": "sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==", + "dependencies": { + "contour_plot": "^0.0.1", + "json2module": "^0.0.3", + "rollup": "^0.25.8", + "tape": "^4.5.1", + "uglify-js": "^2.6.2" + } + }, + "node_modules/fmin/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fmin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fmin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fmin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fmin/node_modules/rollup": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.25.8.tgz", + "integrity": "sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==", + "dependencies": { + "chalk": "^1.1.1", + "minimist": "^1.2.0", + "source-map-support": "^0.3.2" + }, + "bin": { + "rollup": "bin/rollup" + } + }, + "node_modules/fmin/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fmin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -5298,15 +6579,14 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -5321,7 +6601,7 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "engines": { @@ -5346,9 +6626,9 @@ } }, "node_modules/fraction.js": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", - "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "engines": { "node": "*" }, @@ -5374,8 +6654,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -5395,7 +6674,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5404,7 +6682,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -5422,7 +6699,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5449,7 +6725,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -5489,7 +6764,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -5502,11 +6776,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5538,7 +6829,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5548,7 +6838,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5575,7 +6864,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -5611,7 +6899,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -5631,11 +6918,37 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5653,7 +6966,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -5665,7 +6977,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5677,7 +6988,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5689,7 +6999,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -5704,7 +7013,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -5712,6 +7020,89 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==", + "dev": true + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dev": true, + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/highlight.js": { "version": "11.9.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", @@ -5725,7 +7116,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "dependencies": { "react-is": "^16.7.0" } @@ -5825,7 +7215,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5834,7 +7223,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", "dev": true }, "node_modules/inquirer": { @@ -5865,7 +7259,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -5897,11 +7290,34 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5917,7 +7333,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -5954,7 +7369,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -5962,11 +7376,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5978,11 +7403,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5994,7 +7423,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -6006,7 +7434,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, "dependencies": { "is-typed-array": "^1.1.13" }, @@ -6021,7 +7448,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6032,6 +7458,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -6104,6 +7540,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6120,7 +7566,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -6141,7 +7586,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6161,9 +7605,21 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-reference": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", "dev": true, "dependencies": { @@ -6174,7 +7630,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6202,7 +7657,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, "dependencies": { "call-bind": "^1.0.7" }, @@ -6229,7 +7683,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6244,7 +7697,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -6259,7 +7711,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -6298,7 +7749,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -6337,8 +7787,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -6410,15 +7859,15 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.1.tgz", + "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6438,6 +7887,15 @@ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -6445,9 +7903,9 @@ "dev": true }, "node_modules/jotai": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.0.tgz", - "integrity": "sha512-yZNMC36FdLOksOr8qga0yLf14miCJlEThlp5DeFJNnqzm2+ZG7wLcJzoOyij5K6U6Xlc5ljQqPDlJRgqW0Y18g==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.4.tgz", + "integrity": "sha512-f6jwjhBJcDtpeauT2xH01gnqadKEySwwt1qNBLvAXcnojkmb76EdqRt05Ym8IamfHGAQz2qMKAwftnyjeSoHAA==", "engines": { "node": ">=12.20.0" }, @@ -6465,14 +7923,14 @@ } }, "node_modules/jotai-devtools": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/jotai-devtools/-/jotai-devtools-0.9.1.tgz", - "integrity": "sha512-mOBziL4WFBzEvZMhvo2V6oUW86BNopcHIdK4//caNdd1+UjwuvHBR8pB1Or1gj1LNd4pwp/jewnVk/LXRwgZyw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/jotai-devtools/-/jotai-devtools-0.10.0.tgz", + "integrity": "sha512-ltGzJMam7sXbC827U1A2H6rMg+iiK5VzaBmanVfVpWS4fK9/8Mq5NLaG3n2OFtsQgI0nUDaNl/3NObI38sBx+A==", "dev": true, "dependencies": { - "@mantine/code-highlight": "^7.8.1", - "@mantine/core": "^7.8.1", - "@mantine/hooks": "^7.8.1", + "@mantine/code-highlight": "^7.10.1", + "@mantine/core": "^7.10.1", + "@mantine/hooks": "^7.10.1", "@redux-devtools/extension": "^3.3.0", "clsx": "^2.1.1", "javascript-stringify": "^2.1.0", @@ -6489,6 +7947,22 @@ "react": ">=17.0.0" } }, + "node_modules/jotai-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jotai-effect/-/jotai-effect-1.0.0.tgz", + "integrity": "sha512-eCgKKG4BACDzuJGYTu0xZRk1C1MEOvbAhC3L8w7YufQ2lSLORwNX/WFnCuZxLFX0sDLkTUeoUzOYaw8wnXY+UQ==", + "peerDependencies": { + "jotai": ">=2.5.0" + } + }, + "node_modules/jotai-location": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/jotai-location/-/jotai-location-0.5.5.tgz", + "integrity": "sha512-6QW/7W9IJHjhbn7gRgAw4sC30k0/G6JiC4uPlKi8ZPZGYk7R7r9PyMD2eVhL4XSxxag89JxS1iSyr6BIXsB4Sw==", + "peerDependencies": { + "jotai": ">=1.11.0" + } + }, "node_modules/jotai-minidb": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/jotai-minidb/-/jotai-minidb-0.0.8.tgz", @@ -6502,12 +7976,12 @@ } }, "node_modules/jotai-optics": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/jotai-optics/-/jotai-optics-0.3.2.tgz", - "integrity": "sha512-RH6SvqU5hmkVqnHmaqf9zBXvIAs4jLxkDHS4fr5ljuBKHs8+HQ02v+9hX7ahTppxx6dUb0GGUE80jQKJ0kFTLw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/jotai-optics/-/jotai-optics-0.4.0.tgz", + "integrity": "sha512-osbEt9AgS55hC4YTZDew2urXKZkaiLmLqkTS/wfW5/l0ib8bmmQ7kBXSFaosV6jDDWSp00IipITcJARFHdp42g==", "peerDependencies": { - "jotai": ">=1.11.0", - "optics-ts": "*" + "jotai": ">=2.0.0", + "optics-ts": ">=2.0.0" } }, "node_modules/js-cookie": { @@ -6560,6 +8034,17 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2module": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json2module/-/json2module-0.0.3.tgz", + "integrity": "sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==", + "dependencies": { + "rw": "^1.3.2" + }, + "bin": { + "json2module": "bin/json2module" + } + }, "node_modules/json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", @@ -6645,6 +8130,25 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6659,9 +8163,18 @@ } }, "node_modules/libchai": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/libchai/-/libchai-0.1.9.tgz", - "integrity": "sha512-nbmmYDxtztC6kTgukaPZDagUYleqtf68cBHeLjmGz4XOTYqTjQo/YJzK+32EvgXALUf0A2oV1zV5hByGHqRS3g==" + "version": "0.1.14-alpha.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/libchai/-/libchai-0.1.14-alpha.1.tgz", + "integrity": "sha512-XVt9d97BpWh92qdXXpfwzstiL6aVhS7aMjSnnK58CmlzFEl4E4Hg/OaQPITs+JaFoUlw9SO1priMlZElCyhyeg==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -6716,12 +8229,24 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==", "dev": true }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6748,6 +8273,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6778,14 +8321,6 @@ "yallist": "^2.1.2" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -6821,20 +8356,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mathjs": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.1.0.tgz", - "integrity": "sha512-x5wUkWo3CfXMl4mf/jHsbVNuMcUwN2m4qbj+tR/jYr9fdiIrlsexQbKYav8Uwfe+E5he30CyVaABNLmAlTFO3w==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-13.0.1.tgz", + "integrity": "sha512-38IzJ/MY0erNp7apXJp6DZwUYHOuvlqRqk2KtMo9GPqrTmCaLb1vTzw/Fib3PessXEMs52wnJaga0pd9xkIjjA==", "dependencies": { - "@babel/runtime": "^7.23.2", + "@babel/runtime": "^7.24.7", "complex.js": "^2.1.1", "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", - "fraction.js": "4.3.4", + "fraction.js": "^4.3.7", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", - "typed-function": "^4.1.1" + "typed-function": "^4.2.1" }, "bin": { "mathjs": "bin/cli.js" @@ -6843,20 +8390,791 @@ "node": ">= 18" } }, - "node_modules/merge-stream": { + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dev": true, + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "dev": true, - "engines": { - "node": ">= 8" - } + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, "node_modules/micromatch": { "version": "4.0.5", @@ -6902,9 +9220,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6916,10 +9234,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -6937,6 +9263,25 @@ "ufo": "^1.5.3" } }, + "node_modules/mock-property": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", + "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "functions-have-names": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "hasown": "^2.0.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -6958,6 +9303,17 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", @@ -6987,15 +9343,30 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -7031,11 +9402,19 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7044,7 +9423,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -7060,7 +9438,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -7069,7 +9446,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -7158,7 +9534,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -7265,6 +9640,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7286,6 +9667,32 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -7317,7 +9724,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7334,12 +9740,11 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { @@ -7354,12 +9759,12 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.0.tgz", + "integrity": "sha512-bfJaPTuEiTYBu+ulDaeQ0F+uLmlfFkMgXj4cbwfuMSjgObGMzb55FMMbDvbRU0fAHZ4sLGkz2mKwcMg8Dvm8Ww==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": ">=18" } }, "node_modules/path-to-regexp": { @@ -7391,6 +9796,31 @@ "node": "*" } }, + "node_modules/pdfast": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pdfast/-/pdfast-0.2.0.tgz", + "integrity": "sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==" + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/periscopic/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -7408,6 +9838,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", @@ -7423,15 +9871,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -7448,13 +9896,140 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -7464,6 +10039,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -7543,9 +10119,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -7605,6 +10181,16 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -7654,15 +10240,33 @@ } ] }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" + } + }, "node_modules/rc-cascader": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.20.0.tgz", - "integrity": "sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.26.0.tgz", + "integrity": "sha512-L1dml383TPSJD1I11YwxuVbmqaJY64psZqFp1ETlgl3LEOwDu76Cyl11fw5dmjJhMlUWwM5dECQfqJgfebhUjg==", "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", "classnames": "^2.3.1", - "rc-select": "~14.10.0", + "rc-select": "~14.14.0", "rc-tree": "~5.8.1", "rc-util": "^5.37.0" }, @@ -7672,9 +10276,9 @@ } }, "node_modules/rc-checkbox": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", - "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", + "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -7701,9 +10305,9 @@ } }, "node_modules/rc-dialog": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", - "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz", + "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -7717,15 +10321,15 @@ } }, "node_modules/rc-drawer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.5.2.tgz", - "integrity": "sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", "dependencies": { - "@babel/runtime": "^7.10.1", + "@babel/runtime": "^7.23.9", "@rc-component/portal": "^1.1.1", "classnames": "^2.2.6", "rc-motion": "^2.6.1", - "rc-util": "^5.36.0" + "rc-util": "^5.38.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -7733,12 +10337,12 @@ } }, "node_modules/rc-dropdown": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", - "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", "dependencies": { "@babel/runtime": "^7.18.3", - "@rc-component/trigger": "^1.7.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", "rc-util": "^5.17.0" }, @@ -7766,14 +10370,14 @@ } }, "node_modules/rc-image": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.1.tgz", - "integrity": "sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz", + "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==", "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", "classnames": "^2.2.6", - "rc-dialog": "~9.3.4", + "rc-dialog": "~9.5.2", "rc-motion": "^2.6.2", "rc-util": "^5.34.1" }, @@ -7783,9 +10387,9 @@ } }, "node_modules/rc-input": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.3.11.tgz", - "integrity": "sha512-jhH7QP5rILanSHCGSUkdoFE5DEtpv8FIseYhuYkOZzUBeiVAiwM3q26YqZ6xBB0QFEZ/yUAgms4xW4iuub3xFQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.5.1.tgz", + "integrity": "sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -7797,15 +10401,15 @@ } }, "node_modules/rc-input-number": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.4.0.tgz", - "integrity": "sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.1.0.tgz", + "integrity": "sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/mini-decimal": "^1.0.1", "classnames": "^2.2.5", - "rc-input": "~1.3.5", - "rc-util": "^5.28.0" + "rc-input": "~1.5.0", + "rc-util": "^5.40.1" }, "peerDependencies": { "react": ">=16.9.0", @@ -7813,16 +10417,16 @@ } }, "node_modules/rc-mentions": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.9.1.tgz", - "integrity": "sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.14.0.tgz", + "integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==", "dependencies": { "@babel/runtime": "^7.22.5", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.6", - "rc-input": "~1.3.5", - "rc-menu": "~9.12.0", - "rc-textarea": "~1.5.0", + "rc-input": "~1.5.0", + "rc-menu": "~9.14.0", + "rc-textarea": "~1.7.0", "rc-util": "^5.34.1" }, "peerDependencies": { @@ -7831,12 +10435,12 @@ } }, "node_modules/rc-menu": { - "version": "9.12.4", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.4.tgz", - "integrity": "sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==", + "version": "9.14.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.14.1.tgz", + "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.17.0", + "@rc-component/trigger": "^2.0.0", "classnames": "2.x", "rc-motion": "^2.4.3", "rc-overflow": "^1.3.1", @@ -7848,13 +10452,13 @@ } }, "node_modules/rc-motion": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", - "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.2.tgz", + "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", - "rc-util": "^5.21.0" + "rc-util": "^5.43.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -7862,9 +10466,9 @@ } }, "node_modules/rc-notification": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz", - "integrity": "sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.0.tgz", + "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -7895,13 +10499,13 @@ } }, "node_modules/rc-pagination": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.7.0.tgz", - "integrity": "sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.0.4.tgz", + "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==", "dependencies": { "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.32.2" + "classnames": "^2.3.2", + "rc-util": "^5.38.0" }, "peerDependencies": { "react": ">=16.9.0", @@ -7909,14 +10513,16 @@ } }, "node_modules/rc-picker": { - "version": "3.14.7", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.7.tgz", - "integrity": "sha512-+craFcClAOwu4R7lSlaiTAZRY4cWPgtE0+yji9stQkQR28C7WGTrZcyiq5AD7xfhXNV+82QmoJ8Aqg3duDYF6A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.5.0.tgz", + "integrity": "sha512-suqz9bzuhBQlf7u+bZd1bJLPzhXpk12w6AjQ9BTPTiFwexVZgUKViG1KNLyfFvW6tCUZZK0HmCCX7JAyM+JnCg==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.2.1", - "rc-util": "^5.30.0" + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.38.1" }, "engines": { "node": ">=8.x" @@ -7945,9 +10551,9 @@ } }, "node_modules/rc-progress": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", - "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -7959,9 +10565,9 @@ } }, "node_modules/rc-rate": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", - "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -7991,9 +10597,9 @@ } }, "node_modules/rc-segmented": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", - "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -8006,12 +10612,12 @@ } }, "node_modules/rc-select": { - "version": "14.10.0", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.10.0.tgz", - "integrity": "sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag==", + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.14.0.tgz", + "integrity": "sha512-Uo2wulrjoPPRLCPd7zlK4ZFVJxlTN//yp1xWP/U+TUOQCyXrT+Duvq/Si5OzVcmQyWAUSbsplc2OwNNhvbOeKQ==", "dependencies": { "@babel/runtime": "^7.10.1", - "@rc-component/trigger": "^1.5.0", + "@rc-component/trigger": "^2.1.1", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-overflow": "^1.3.1", @@ -8027,13 +10633,13 @@ } }, "node_modules/rc-slider": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.4.1.tgz", - "integrity": "sha512-wiHRWgzEEHcgF7MWDd0ODsMpqBwszT558R2qH52fplJwctw/L9J8ipEt89ZqVASlh0QFG9kJPgBuL2+cbdLRUw==", + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.6.2.tgz", + "integrity": "sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", - "rc-util": "^5.27.0" + "rc-util": "^5.36.0" }, "engines": { "node": ">=8.x" @@ -8075,16 +10681,16 @@ } }, "node_modules/rc-table": { - "version": "7.36.1", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.36.1.tgz", - "integrity": "sha512-9qMxEm/3Y8ukdW8I8ZvmhX0QImfNKzH0JEUlSbyaUlsYTB+/tQEbfaB8YkG4sHVZ1io4pxqK/BXoZYqebi/TIQ==", + "version": "7.45.7", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.45.7.tgz", + "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==", "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/context": "^1.4.0", "classnames": "^2.2.5", "rc-resize-observer": "^1.1.0", "rc-util": "^5.37.0", - "rc-virtual-list": "^3.11.1" + "rc-virtual-list": "^3.14.2" }, "engines": { "node": ">=8.x" @@ -8095,14 +10701,14 @@ } }, "node_modules/rc-tabs": { - "version": "12.13.1", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.13.1.tgz", - "integrity": "sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.1.1.tgz", + "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", - "rc-dropdown": "~4.1.0", - "rc-menu": "~9.12.0", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.14.0", "rc-motion": "^2.6.2", "rc-resize-observer": "^1.0.0", "rc-util": "^5.34.1" @@ -8116,13 +10722,13 @@ } }, "node_modules/rc-textarea": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.5.3.tgz", - "integrity": "sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.7.0.tgz", + "integrity": "sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", - "rc-input": "~1.3.5", + "rc-input": "~1.5.0", "rc-resize-observer": "^1.0.0", "rc-util": "^5.27.0" }, @@ -8132,12 +10738,12 @@ } }, "node_modules/rc-tooltip": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.3.tgz", - "integrity": "sha512-HMSbSs5oieZ7XddtINUddBLSVgsnlaSb3bZrzzGWjXa7/B7nNedmsuz72s7EWFEro9mNa7RyF3gOXKYqvJiTcQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", + "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", "dependencies": { "@babel/runtime": "^7.11.2", - "@rc-component/trigger": "^1.18.0", + "@rc-component/trigger": "^2.0.0", "classnames": "^2.3.1" }, "peerDependencies": { @@ -8146,9 +10752,9 @@ } }, "node_modules/rc-tree": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.7.tgz", - "integrity": "sha512-cpsIQZ4nNYwpj6cqPRt52e/69URuNdgQF9wZ10InmEf8W3+i0A41OVmZWwHuX9gegQSqj+DPmaDkZFKQZ+ZV1w==", + "version": "5.8.8", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.8.tgz", + "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -8165,13 +10771,13 @@ } }, "node_modules/rc-tree-select": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.15.0.tgz", - "integrity": "sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.21.0.tgz", + "integrity": "sha512-w+9qEu6zh0G3wt9N/hzWNSnqYH1i9mH1Nqxo0caxLRRFXF5yZWYmpCDoDTMdQM1Y4z3Q5yj08qyrPH/d4AtumA==", "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-select": "~14.10.0", + "rc-select": "~14.14.0", "rc-tree": "~5.8.1", "rc-util": "^5.16.1" }, @@ -8181,9 +10787,9 @@ } }, "node_modules/rc-upload": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.6.tgz", - "integrity": "sha512-Bt7ESeG5tT3IY82fZcP+s0tQU2xmo1W6P3S8NboUUliquJLQYLkUcsaExi3IlBVr43GQMCjo30RA2o0i70+NjA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", + "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -8195,9 +10801,9 @@ } }, "node_modules/rc-util": { - "version": "5.39.3", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.3.tgz", - "integrity": "sha512-j9wOELkLQ8gC/NkUg3qg9mHZcJf+5mYYv40JrDHqnaf8VSycji4pCf7kJ5fdTXQPDIF0vr5zpb/T2HdrMs9rWA==", + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.43.0.tgz", + "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -8213,9 +10819,9 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/rc-virtual-list": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.12.0.tgz", - "integrity": "sha512-43+/lr7bImpvEwTFw1FTYwSg42VHzRgO5PiCEEUROj8D2+M2SCvANqGIa9QyhoFLVQtc+2QXvgTB7VPGG7oOoQ==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.14.5.tgz", + "integrity": "sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==", "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -8256,6 +10862,32 @@ "lodash.curry": "^4.1.1" } }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-beautiful-dnd/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -8311,18 +10943,47 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-number-format": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz", - "integrity": "sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.0.tgz", + "integrity": "sha512-NWdICrqLhI7rAS8yUeLVd6Wr4cN7UjJ9IBTS0f/a9i7UB4x4Ti70kGnksBtZ7o4Z7YRbvCMMR/jQmkoOBa/4fg==", "dev": true, "dependencies": { "prop-types": "^15.7.2" }, "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/react-remove-scroll": { "version": "2.5.10", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", @@ -8381,11 +11042,11 @@ } }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz", + "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.17.0" }, "engines": { "node": ">=14.0.0" @@ -8395,12 +11056,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz", + "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.17.0", + "react-router": "6.24.0" }, "engines": { "node": ">=14.0.0" @@ -8459,22 +11120,31 @@ } }, "node_modules/reactflow": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.3.tgz", - "integrity": "sha512-wusd1Xpn1wgsSEv7UIa4NNraCwH9syBtubBy4xVNXg3b+CDKM+sFaF3hnMx0tr0et4km9urIDdNvwm34QiZong==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz", + "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==", "dependencies": { - "@reactflow/background": "11.3.13", - "@reactflow/controls": "11.2.13", - "@reactflow/core": "11.11.3", - "@reactflow/minimap": "11.7.13", - "@reactflow/node-resizer": "2.2.13", - "@reactflow/node-toolbar": "1.3.13" + "@reactflow/background": "11.3.14", + "@reactflow/controls": "11.2.14", + "@reactflow/core": "11.11.4", + "@reactflow/minimap": "11.7.14", + "@reactflow/node-resizer": "2.2.14", + "@reactflow/node-toolbar": "1.3.14" }, "peerDependencies": { "react": ">=17", "react-dom": ">=17" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -8496,6 +11166,18 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -8533,7 +11215,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -8547,6 +11228,61 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8556,6 +11292,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -8565,7 +11310,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -8587,6 +11331,16 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8610,6 +11364,17 @@ "node": ">=0.10.0" } }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -8660,30 +11425,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-external-globals": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.10.0.tgz", - "integrity": "sha512-RXlupZrmn97AaaS5dWnktkjM+Iy+od0E+8L0mUkMIs3iuoUXNJebueQocQKV7Ircd54fSGGmkBaXwNzY05J1yQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.2", - "magic-string": "^0.30.5" - }, - "peerDependencies": { - "rollup": "^2.25.0 || ^3.3.0 || ^4.1.4" - } - }, - "node_modules/rollup-plugin-external-globals/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/rollup-plugin-visualizer": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", @@ -8751,6 +11492,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -8773,7 +11519,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -8797,7 +11542,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -8821,8 +11565,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/scheduler": { "version": "0.23.2", @@ -8872,7 +11615,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -8889,7 +11631,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -8930,7 +11671,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -8960,7 +11700,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, "dependencies": { "is-arrayish": "^0.3.1" } @@ -8968,8 +11707,7 @@ "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sirv": { "version": "2.0.4", @@ -8998,7 +11736,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9011,12 +11748,34 @@ "node": ">=0.10.0" } }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true + "node_modules/source-map-support": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz", + "integrity": "sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==", + "dependencies": { + "source-map": "0.1.32" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/spawn-sync": { "version": "1.0.15", @@ -9041,18 +11800,6 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9093,7 +11840,7 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { @@ -9135,7 +11882,6 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -9153,7 +11899,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -9167,7 +11912,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -9180,6 +11924,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9195,7 +11953,7 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { @@ -9247,6 +12005,15 @@ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/styled-components": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz", @@ -9279,11 +12046,109 @@ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, + "node_modules/styled-components/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.3.tgz", + "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9300,7 +12165,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9308,6 +12172,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-path-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/svg-path-parser/-/svg-path-parser-1.1.0.tgz", + "integrity": "sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==" + }, "node_modules/swr": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", @@ -9326,6 +12195,80 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "dev": true }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tape": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.17.0.tgz", + "integrity": "sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==", + "dependencies": { + "@ljharb/resumer": "~0.0.1", + "@ljharb/through": "~2.3.9", + "call-bind": "~1.0.2", + "deep-equal": "~1.1.1", + "defined": "~1.0.1", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "glob": "~7.2.3", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.1.4", + "minimist": "~1.2.8", + "mock-property": "~1.0.0", + "object-inspect": "~1.12.3", + "resolve": "~1.22.6", + "string.prototype.trim": "~1.2.8" + }, + "bin": { + "tape": "bin/tape" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tape/node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9356,22 +12299,43 @@ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": "*" + "node": ">=0.8" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", "engines": { "node": ">=12.22" } @@ -9387,6 +12351,11 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", @@ -9472,6 +12441,26 @@ "node": ">=6" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -9484,54 +12473,37 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-json-schema-generator": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.1.1.tgz", - "integrity": "sha512-ha5/w3A2APOOn9ET2CfunEXdVOnKmjISTGcxhCkDszmrsRWFfG5F+re5U5onLXo665sZ4BuE2g5jZAjC+CUcgA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15", - "commander": "^12.0.0", - "glob": "^10.3.12", - "json5": "^2.2.3", - "normalize-path": "^3.0.0", - "safe-stable-stringify": "^2.4.3", - "typescript": "^5.4.5" - }, - "bin": { - "ts-json-schema-generator": "bin/ts-json-schema-generator.js" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/ts-json-schema-generator/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "node_modules/tsx": { + "version": "4.16.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/tsx/-/tsx-4.16.2.tgz", + "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "esbuild": "~0.21.5", + "get-tsconfig": "^4.7.5" }, "bin": { - "glob": "dist/esm/bin.mjs" + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9569,7 +12541,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -9583,7 +12554,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -9602,7 +12572,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -9622,7 +12591,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -9639,11 +12607,11 @@ } }, "node_modules/typed-function": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.1.tgz", - "integrity": "sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", + "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/typedarray": { @@ -9653,9 +12621,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -9680,11 +12648,55 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -9701,6 +12713,120 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -9710,6 +12836,36 @@ "node": ">= 10.0.0" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -9750,11 +12906,11 @@ } }, "node_modules/use-immer": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.9.0.tgz", - "integrity": "sha512-/L+enLi0nvuZ6j4WlyK0US9/ECUtV5v9RUbtxnn5+WbtaXYUaOBoKHDNL9I5AETdurQ4rIFIj/s+Z5X80ATyKw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.10.0.tgz", + "integrity": "sha512-/eVwNR4TG9Tm/dd+aHYLLaI0FLfYKlkTqKMkn78Ah/EYVzWd/zJIgpkdoFEKbhQJOGo8XN7/mWrTx0exp1c+Ug==", "peerDependencies": { - "immer": ">=2.0.0", + "immer": ">=8.0.0", "react": "^16.8.0 || ^17.0.1 || ^18.0.0" } }, @@ -9789,6 +12945,14 @@ } } }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/use-sidecar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", @@ -9825,13 +12989,42 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -9902,16 +13095,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-plugin-cdn-import": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vite-plugin-cdn-import/-/vite-plugin-cdn-import-1.0.1.tgz", - "integrity": "sha512-lgjLxgwFSKvJLbqjVBirUZ0rQo00GpUGJzRpgQu8RyBw9LA7jaqG6fUMQzBC9qWmTGabPC3iOzwCcoi7PseRAQ==", - "dev": true, - "dependencies": { - "rollup-plugin-external-globals": "^0.10.0", - "vite-plugin-externals": "^0.6.2" - } - }, "node_modules/vite-plugin-chunk-split": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/vite-plugin-chunk-split/-/vite-plugin-chunk-split-0.5.0.tgz", @@ -9926,83 +13109,45 @@ "vite": "^4 || ^5" } }, - "node_modules/vite-plugin-externals": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/vite-plugin-externals/-/vite-plugin-externals-0.6.2.tgz", - "integrity": "sha512-R5oVY8xDJjLXLTs2XDYzvYbc/RTZuIwOx2xcFbYf+/VXB6eJuatDgt8jzQ7kZ+IrgwQhe6tU8U2fTyy72C25CQ==", - "dev": true, - "dependencies": { - "acorn": "^8.4.0", - "es-module-lexer": "^0.4.1", - "fs-extra": "^10.0.0", - "magic-string": "^0.25.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": ">=2.0.0" - } - }, - "node_modules/vite-plugin-externals/node_modules/es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", - "dev": true - }, - "node_modules/vite-plugin-externals/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-plugin-externals/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, "node_modules/vite-plugin-pages": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/vite-plugin-pages/-/vite-plugin-pages-0.32.1.tgz", - "integrity": "sha512-4oPlIbb+J+zpJGfT2xI/27xqY+qTkRc3MBgWKfbW6IWM3CTcSyybuL9kRMCFRdBHfmgkF28qDs7fqVf/HjH1Xw==", + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/vite-plugin-pages/-/vite-plugin-pages-0.32.3.tgz", + "integrity": "sha512-1vmKwc9e+lRBLkpTAMUNSVV3BglyE+DRa0iivpe6q3pbOCGkAHHSUp8f6yceXC8+lu/kFgH60vm5vK6IHyvdVw==", "dev": true, "dependencies": { "@types/debug": "^4.1.12", - "debug": "^4.3.4", - "deep-equal": "^2.2.3", + "debug": "^4.3.5", + "dequal": "^2.0.3", "extract-comments": "^1.1.0", "fast-glob": "^3.3.2", "json5": "^2.2.3", "local-pkg": "^0.5.0", - "picocolors": "^1.0.0", - "yaml": "^2.4.1" + "picocolors": "^1.0.1", + "yaml": "^2.4.5" }, "peerDependencies": { "@vue/compiler-sfc": "^2.7.0 || ^3.0.0", "vite": "^2.0.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { + "@solidjs/router": { + "optional": true + }, "@vue/compiler-sfc": { "optional": true + }, + "react-router": { + "optional": true + }, + "vue-router": { + "optional": true } } }, "node_modules/vite-plugin-pages/node_modules/yaml": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -10137,7 +13282,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -10197,7 +13341,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -10228,6 +13371,14 @@ "node": ">=8" } }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -10237,6 +13388,14 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10257,7 +13416,7 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { @@ -10275,8 +13434,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/y18n": { "version": "5.0.8", @@ -10342,9 +13500,9 @@ } }, "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", "dependencies": { "use-sync-external-store": "1.2.0" }, @@ -10375,6 +13533,16 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 0c27f8f..1659a4d 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "chai", "private": true, - "version": "0.1.9", + "version": "0.1.14", "type": "module", "scripts": { "start": "vite --mode CF", - "fetch": "node scripts/fetchAssets.mjs", + "fetch": "tsx scripts/fetch.ts", "publish": "bump --tag --commit --push", - "build:BEX": "vite build --mode BEX && node scripts/makeBex.cjs", + "build:BEX": "vite build --mode BEX", "build:PAGES": "vite build --mode PAGES", "build:CF": "vite build --mode CF", "build2": "npm run fetch && npm run build:PAGES", @@ -22,70 +22,81 @@ "coverage": "vitest run --coverage" }, "dependencies": { + "@ant-design/charts": "^2.1.1", "@ant-design/colors": "^7.0.2", - "@ant-design/pro-components": "^2.7.1", - "@dagrejs/dagre": "^1.1.2", + "@ant-design/icons": "^5.3.7", + "@ant-design/pro-components": "^2.7.10", + "@antv/s2": "^2.0.0-next.24", + "@antv/s2-react": "^2.0.0-next.23", + "@dagrejs/dagre": "^1.1.3", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "ahooks": "^3.7.11", - "antd": "5.11.4", + "@types/mdx": "^2.0.13", + "ahooks": "^3.8.0", + "antd": "^5.18.3", "d3-array": "^3.2.4", + "deep-object-diff": "^1.1.9", "immer": "^10.1.1", - "jotai": "^2.8.0", + "jotai": "^2.8.4", + "jotai-effect": "^1.0.0", + "jotai-location": "^0.5.5", "jotai-minidb": "^0.0.8", - "jotai-optics": "^0.3.2", + "jotai-optics": "^0.4.0", "js-md5": "^0.8.3", "js-yaml": "4.1.0", - "libchai": "^0.1.9", + "libchai": "^0.1.14-alpha.1", "lodash-es": "^4.17.21", - "lz-string": "^1.5.0", - "mathjs": "12.1.0", + "mathjs": "^13.0.1", "nanoid": "^5.0.7", "optics-ts": "^2.4.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^6.23.0", - "reactflow": "^11.11.3", + "react-router-dom": "^6.24.0", + "reactflow": "^11.11.4", "styled-components": "^6.1.9", - "use-immer": "^0.9.0" + "use-immer": "^0.10.0" }, "devDependencies": { "@emotion/react": "^11.11.4", "@jsdevtools/version-bump-prompt": "^6.1.0", + "@mdx-js/react": "^3.0.1", + "@mdx-js/rollup": "^3.0.1", "@modyfi/vite-plugin-yaml": "^1.1.0", - "@swc-jotai/react-refresh": "^0.1.0", + "@swc-jotai/react-refresh": "^0.1.1", + "@tailwindcss/typography": "^0.5.13", "@types/d3-array": "^3.2.1", "@types/js-md5": "^0.7.2", "@types/js-yaml": "^4.0.9", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.12.11", - "@types/react": "^18.3.1", + "@types/node": "^20.14.9", "@types/react-dom": "^18.3.0", "@types/styled-components": "^5.1.34", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "@vitejs/plugin-react-swc": "^3.6.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-react-swc": "^3.7.0", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", - "axios": "^1.6.8", + "autoprefixer": "^10.4.19", + "axios": "^1.7.2", "eslint": "^8.57.0", "eslint-config-alloy": "^5.1.2", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-react-refresh": "^0.4.7", - "eslint-plugin-tsdoc": "^0.2.17", + "eslint-plugin-tsdoc": "^0.3.0", "fs-extra": "^11.2.0", - "jotai-devtools": "^0.9.1", + "jotai-devtools": "^0.10.0", + "postcss": "^8.4.39", "pre-commit": "^1.2.2", - "prettier": "^3.2.5", + "prettier": "^3.3.2", "rollup-plugin-visualizer": "^5.12.0", - "ts-json-schema-generator": "^2.1.1", - "typescript": "^5.4.5", - "vite": "^5.2.11", - "vite-plugin-cdn-import": "^1.0.1", + "tailwindcss": "^3.4.4", + "tsx": "^4.16.2", + "typescript": "^5.5.2", + "vite": "^5.3.2", "vite-plugin-chunk-split": "^0.5.0", - "vite-plugin-pages": "^0.32.1", + "vite-plugin-pages": "^0.32.3", "vite-plugin-wasm": "^3.3.0", "vite-plugin-wasm-pack": "^0.1.12", "vitest": "^1.6.0" @@ -129,7 +140,7 @@ ], "tsdoc/syntax": "warn", "no-undef": "error", - "no-undefined": "error" + "no-undefined": "off" } }, "hintConfig": { diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/scripts/analyze.ts b/scripts/analyze.ts new file mode 100644 index 0000000..902cda2 --- /dev/null +++ b/scripts/analyze.ts @@ -0,0 +1,150 @@ +import { readFileSync } from "fs"; +import { load } from "js-yaml"; + +const estimate = (n: number, k: number) => (n * n) / (2 * k); + +const makeMap = (filename: string) => { + const content = readFileSync(filename, "utf-8").split("\n"); + return new Map( + content.map((x) => { + const [char, analysis_str] = x.split("\t") as [string, string]; + const analysis = analysis_str.split(" "); + while (analysis.length < 3) analysis.push(""); + return [char, analysis] as [string, [string, string, string]]; + }), + ); +}; + +const calculate = ( + descendants: Map, + analysisMap: Map, +) => { + let total = 0; + for (const [char, derivatives] of descendants) { + const analysis = analysisMap.get(char); + const derivAnalysis = [...derivatives] + .map((x) => analysisMap.get(x)) + .filter((x) => x) + .map((x) => x!.join(" ")); + if (!analysis) continue; + const subseqs = [[0], [1], [2], [0, 1], [0, 2], [1, 2]]; + let best = 0; + // find all subsequences + for (const subseq of subseqs) { + const hash = subseq.map((i) => analysis[i]).join(" "); + const score = + derivAnalysis.filter((x) => x.includes(hash)).length * subseq.length; + if (score > best) { + best = score; + } + } + total += best; + } + console.log(total); +}; + +const analyze = ( + analysisMap: Map, + map: Record, + alphabet: number, +) => { + const simpMap: Record = {}; + for (const [key, value] of Object.entries(map)) { + for (const [index, char] of [...value].entries()) { + simpMap[index ? `${key}.${index}` : key] = char; + } + } + const map0 = new Map(); + const map1 = new Map(); + const map2 = new Map(); + const codemap = new Map(); + let dup1 = 0; + let dup2 = 0; + let dup3 = 0; + for (const [char, [a0, a1, a2]] of analysisMap) { + const hash = `${a0} ${a1} ${a2}`; + const hash01 = `${a0} ${a1} *`; + const hash02 = `${a0} * ${a2}`; + const hash12 = `* ${a1} ${a2}`; + const hash0 = `${a0} * *`; + const hash1 = `* ${a1} *`; + const hash2 = `* * ${a2}`; + const code = [a0, a1, a2].map((x) => simpMap[x] ?? "$").join(""); + const prev = codemap.get(code) ?? []; + if (prev.length) { + const toCompare = prev[0]!; + const sameCount = [a0, a1, a2].filter( + (x, i) => x === toCompare[i], + ).length; + if (sameCount >= 2) { + dup1 += 1; + } + if (sameCount >= 1) { + dup2 += 1; + } + dup3 += 1; + } + codemap.set(code, prev.concat([[a0, a1, a2]])); + map0.set(hash, (map0.get(hash) ?? []).concat(char)); + for (const partial of [hash01, hash02, hash12]) { + map1.set(partial, (map1.get(partial) ?? []).concat(char)); + } + for (const partial of [hash0, hash1, hash2]) { + map2.set(partial, (map2.get(partial) ?? []).concat(char)); + } + } + const dup0 = [...map0.values()] + .filter((x) => x.length > 1) + .reduce((a, b) => a + b.length - 1, 0); + const estdup1 = [...map1.values()] + .filter((x) => x.length > 1) + .reduce((a, b) => a + estimate(b.length, alphabet), 0); + const estdup2 = [...map2.values()] + .filter((x) => x.length > 1) + .reduce((a, b) => a + estimate(b.length, alphabet * alphabet), 0); + const estdup3 = estimate(analysisMap.size, alphabet * alphabet * alphabet); + console.log({ dup0, dup1, estdup1, dup2, estdup2, dup3, estdup3 }); +}; + +const yima_map = (load(readFileSync("examples/easy.yaml", "utf-8")) as any).form + .mapping; +const yima_content = makeMap("public/cache/yima.txt"); +const grand_map = ( + load(readFileSync("public/cache/grand.yaml", "utf-8")) as any +).form.mapping; +const grand_content = makeMap("public/cache/grand.txt"); +// const c42_map = Object.fromEntries( +// readFileSync("public/cache/keymap.dat", "utf-8") +// .trim() +// .split("\n") +// .map((x) => x.split("\t").slice(0, 2) as [string, string]), +// ); +const c42_content = makeMap("public/cache/c42.txt"); +// for (const char of "abcdefghijklmnopqrstuvwxyz") { +// c42_map[char] = char; +// } +for (const char of yima_content.keys()) { + if (!c42_content.has(char)) { + yima_content.delete(char); + grand_content.delete(char); + } +} +for (const char of c42_content.keys()) { + if (!yima_content.has(char)) { + c42_content.delete(char); + } +} +console.log(yima_content.size, c42_content.size); +analyze(yima_content, yima_map as Record, 26); +analyze(grand_content, grand_map as Record, 26); +// analyze(c42_content, c42_map, 27); + +const descendants = new Map( + readFileSync("public/cache/通用规范汉字一级分解.txt", "utf-8") + .split("\n") + .map((x) => x.split("\t") as [string, string]), +); + +calculate(descendants, yima_content); +calculate(descendants, grand_content); +calculate(descendants, c42_content); diff --git a/scripts/convert.ts b/scripts/convert.ts new file mode 100644 index 0000000..3a9589b --- /dev/null +++ b/scripts/convert.ts @@ -0,0 +1,19 @@ +import { readFileSync, writeFileSync } from "fs"; + +const zhenma = readFileSync( + "/Users/tansongchen/Downloads/zhenma-raw.txt", + "utf-8", +).split("\n"); +const entries: [string, string][] = []; + +for (const line of zhenma) { + const [key, ...rest] = line.split(" "); + rest.forEach((value) => { + entries.push([key!, value]); + }); +} + +writeFileSync( + "/Users/tansongchen/Downloads/zhenma.txt", + entries.map(([key, value]) => `${value}\t${key}`).join("\n"), +); diff --git a/scripts/diff.ts b/scripts/diff.ts new file mode 100644 index 0000000..dc0aac4 --- /dev/null +++ b/scripts/diff.ts @@ -0,0 +1,16 @@ +import { readFileSync, writeFileSync } from "fs"; +import type { Compound, PrimitiveCharacter } from "~/lib"; + +const repertoire = JSON.parse( + readFileSync("public/cache/repertoire.json", "utf-8"), +) as PrimitiveCharacter[]; + +const diff = []; + +for (const { unicode, gb2312, tygf } of repertoire) { + if (gb2312 && tygf === 0) { + diff.push(String.fromCodePoint(unicode)); + } +} + +writeFileSync("public/cache/diff.txt", diff.join("")); diff --git a/scripts/fetchAssets.mjs b/scripts/fetch.ts similarity index 99% rename from scripts/fetchAssets.mjs rename to scripts/fetch.ts index 53e5262..4afbd2b 100644 --- a/scripts/fetchAssets.mjs +++ b/scripts/fetch.ts @@ -23,6 +23,7 @@ for (const filename of [ "key_distribution", "pair_equivalence", "tygf", + "cjk", ]) { const url = `${assetsEndpoint}${filename}.txt`; const path = `${outputFolder}${filename}.txt`; diff --git a/scripts/makeBex.cjs b/scripts/makeBex.cjs deleted file mode 100644 index 26b8fe6..0000000 --- a/scripts/makeBex.cjs +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -/** - * 处理浏览器扩展的脚本,必须在 `npm run build:BEX` 之后执行此脚本。 - * 过程如下: - * 1. 修改 src/bex/manifest.json 文件中的版本号。 - * 2. 把 src/bex 目录完全复制到 dist/bex 下。 - * - * 本脚本执行结束后,请手动打开 Chromium 浏览器,生成 *.crx 文件。 - */ - -const { readFileSync, writeFileSync, copy } = require("fs-extra"); -const { resolve } = require("node:path"); - -// const getAbsPath = (relativePath) => fileURLToPath(new URL(relativePath, import.meta.url)) -const getAbsPath = (relativePath) => resolve(__dirname, relativePath); -const readJsonFile = (path) => - JSON.parse(readFileSync(path, { encoding: "utf-8" })); - -const manifestPath = "../src/bex/manifest.json"; -const packagePath = "../package.json"; -const manifestContent = readJsonFile(getAbsPath(manifestPath)); -const packageContent = readJsonFile(getAbsPath(packagePath)); -manifestContent.version = packageContent.version.replace(/[-a-zA-Z]+/, ""); - -copy(getAbsPath("../src/bex"), getAbsPath("../dist/bex")); - -writeFileSync( - getAbsPath("../dist/bex/manifest.json"), - JSON.stringify(manifestContent, undefined, 2), - { encoding: "utf-8" }, -); diff --git a/spec/affine.spec.ts b/spec/affine.spec.ts index 3ea098c..586f841 100644 --- a/spec/affine.spec.ts +++ b/spec/affine.spec.ts @@ -1,4 +1,5 @@ -import { affineMerge, Compound, SVGGlyph } from "~/lib"; +import type { Compound, SVGGlyph } from "~/lib"; +import { affineMerge } from "~/lib"; import { describe, expect, it } from "vitest"; describe("affine transformations", () => { diff --git a/spec/analysis.spec.ts b/spec/analysis.spec.ts index 6d16934..8bda9fb 100644 --- a/spec/analysis.spec.ts +++ b/spec/analysis.spec.ts @@ -1,20 +1,25 @@ import { describe, expect, it } from "vitest"; +import type { SVGGlyph } from "~/lib"; import { - SVGGlyph, analysis, assemble, classifier, examples, isValidCJKChar, + recursiveRenderComponent, recursiveRenderCompound, } from "~/lib"; -import { repertoire } from "./mock"; +import { focusAnalysis, primitiveRepertoire, repertoire } from "./mock"; import { readFileSync } from "fs"; describe("e2e test", () => { it("checks database integrity", () => { const config = examples["mswb"]; - const analysisResult = analysis(repertoire, config); + const analysisResult = analysis( + repertoire, + focusAnalysis(config, repertoire), + Object.keys(repertoire).filter(isValidCJKChar), + ); const { componentError, compoundError } = analysisResult; expect(componentError).toHaveLength(0); expect(compoundError).toHaveLength(0); @@ -22,42 +27,64 @@ describe("e2e test", () => { const assemblyResult = assemble( repertoire, - config, + { + algebra: config.algebra, + encoder: config.encoder, + keyboard: config.form, + priority: [], + }, characters, [], analysisResult, + {}, ); expect(assemblyResult.length).toBeGreaterThan(6600); }); it("checks stroke orders are correct", () => { - const tygf = readFileSync("public/cache/tygf.txt", "utf-8") - .trim() - .split("\n") - .map((x) => x.trim().split("\t")); - const reference = new Map(tygf.map((x) => [x[1]!, x[3]!])); - const result = new Map(); + const tygf = new Map( + readFileSync("public/cache/tygf.txt", "utf-8") + .trim() + .split("\n") + .map((x) => x.trim().split("\t") as [string, string]), + ); + const cjk = new Map( + readFileSync("public/cache/cjk.txt", "utf-8") + .trim() + .split("\n") + .map((x) => x.trim().split("\t") as [string, string]), + ); + const result = new Map(); const summarize = (glyph: SVGGlyph) => glyph.map((x) => classifier[x.feature]).join(""); - for (const [char, { glyph }] of Object.entries(repertoire)) { - if (glyph === undefined) continue; - if (glyph.type === "basic_component") { - result.set(char, summarize(glyph.strokes)); - } else { - const svgglyph = recursiveRenderCompound(glyph, repertoire); - if (svgglyph instanceof Error) throw svgglyph; - result.set(char, summarize(svgglyph)); + for (const [char, { glyphs }] of Object.entries(primitiveRepertoire)) { + for (const glyph of glyphs) { + if (glyph.tags?.includes("中竖截断")) continue; + if (glyph.tags?.includes("戈部截断")) continue; + let svg: SVGGlyph; + if (glyph.type === "basic_component") { + svg = glyph.strokes; + } else if (glyph.type === "derived_component") { + const svgglyph = recursiveRenderComponent(glyph, primitiveRepertoire); + svg = svgglyph instanceof Error ? [] : svgglyph; + } else { + const svgglyph = recursiveRenderCompound(glyph, repertoire); + svg = svgglyph instanceof Error ? [] : svgglyph; + } + result.set(char, (result.get(char) ?? []).concat(summarize(svg))); } } let differences = 0; - for (const [char, order] of result) { - const referenceOrder = reference.get(char); + for (const [char, orders] of result) { + const referenceOrder = tygf.get(char) ?? cjk.get(char); if (referenceOrder === undefined) continue; - if (order !== referenceOrder) { - differences += 1; - console.log(char, order, referenceOrder); + for (const order of orders) { + if (order !== referenceOrder) { + differences += 1; + console.log(char, order, referenceOrder); + } } } - expect(differences).toBe(0); + expect(differences).toBeLessThan(30); }); }); diff --git a/spec/component.spec.ts b/spec/component.spec.ts index b7473e8..2261080 100644 --- a/spec/component.spec.ts +++ b/spec/component.spec.ts @@ -2,14 +2,36 @@ import { describe, expect, it } from "vitest"; import { classifier, createConfig, - defaultConfig, + generateSchemes, getComponentScheme, - listToObject, + makeIntervalSum, recursiveRenderComponent, renderRootList, } from "~/lib"; -import type { DerivedComponent, PrimitiveRepertoire } from "~/lib"; -import { primitiveRepertoire, repertoire, computedComponents } from "./mock"; +import type { DerivedComponent } from "~/lib"; +import { + primitiveRepertoire, + repertoire, + computedComponents, + focusAnalysis, +} from "./mock"; + +describe("pruning", () => { + const strokes = 4; + const roots = [8, 4, 2, 1, 12, 6, 3, 14, 9].sort((a, b) => a - b); + const rootsSet = new Set(roots); + + it("generate the correct set for 中", () => { + const set = makeIntervalSum(strokes, rootsSet); + const array = [...set].sort((a, b) => a - b); + expect(array).toEqual([3, 6, 12, 14]); + }); + + it("generate the correct schemes for 中", () => { + const schemes = generateSchemes(strokes, roots); + expect(schemes).toHaveLength(3); + }); +}); describe("recursive render component", () => { it("has nong", () => { @@ -25,13 +47,21 @@ describe("get component scheme", () => { name: "", data: "国标五分类", keyboard: "米十五笔", - encoder: "形音码", + encoder: "形音码(米十五笔)", }); - - const rootList = renderRootList(repertoire, config); + const analysisConfig = focusAnalysis(config, repertoire); + const rootList = renderRootList(repertoire, [ + ...analysisConfig.primaryRoots, + ...analysisConfig.secondaryRoots, + ]); it("can get component scheme", () => { const 天 = computedComponents.天!; - const scheme = getComponentScheme(天, rootList, config, classifier); + const scheme = getComponentScheme( + 天, + [...rootList.values()], + analysisConfig, + classifier, + ); expect(scheme).toHaveProperty("sequence"); }); }); diff --git a/spec/degenerator.spec.ts b/spec/degenerator.spec.ts index cedde0f..c1708d7 100644 --- a/spec/degenerator.spec.ts +++ b/spec/degenerator.spec.ts @@ -4,12 +4,11 @@ import { binaryToIndices, defaultDegenerator, generateSliceBinaries, - defaultConfig, } from "~/lib"; import { describe, it, expect } from "vitest"; import { create, all } from "mathjs"; import { computedGlyphs2 as renderedGlyphs, computedComponents } from "./mock"; -import { RenderedGlyph } from "~/lib"; +import type { RenderedGlyph } from "~/lib"; const { randomInt } = create(all!, { randomSeed: "a", @@ -46,39 +45,43 @@ describe("bi-directional conversion", () => { describe("generate slice binaries", () => { it("should find multiple occurence of a root", () => { const { 丰, 十 } = computedComponents; - expect(generateSliceBinaries(defaultConfig, 丰!, 十!)).toEqual([9, 5, 3]); + expect(generateSliceBinaries(defaultDegenerator, 丰!, 十!)).toEqual([ + 9, 5, 3, + ]); }); it("should be able to distinguish 土 and 士", () => { const { 土, 士, 王, 壬 } = computedComponents; - expect(generateSliceBinaries(defaultConfig, 王!, 土!)).toEqual([7]); - expect(generateSliceBinaries(defaultConfig, 王!, 士!)).toEqual([]); - expect(generateSliceBinaries(defaultConfig, 壬!, 土!)).toEqual([]); - expect(generateSliceBinaries(defaultConfig, 壬!, 士!)).toEqual([7]); + expect(generateSliceBinaries(defaultDegenerator, 王!, 土!)).toEqual([7]); + expect(generateSliceBinaries(defaultDegenerator, 王!, 士!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 壬!, 土!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 壬!, 士!)).toEqual([7]); }); it("should be able to distinguish 未 and 末", () => { const { 未, 末, 朱, 耒 } = computedComponents; - expect(generateSliceBinaries(defaultConfig, 朱!, 未!)).toEqual([31]); - expect(generateSliceBinaries(defaultConfig, 耒!, 未!)).toEqual([47, 31]); - expect(generateSliceBinaries(defaultConfig, 朱!, 末!)).toEqual([]); - expect(generateSliceBinaries(defaultConfig, 耒!, 末!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 朱!, 未!)).toEqual([31]); + expect(generateSliceBinaries(defaultDegenerator, 耒!, 未!)).toEqual([ + 47, 31, + ]); + expect(generateSliceBinaries(defaultDegenerator, 朱!, 末!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 耒!, 末!)).toEqual([]); }); it("should be able to distinguish 口 and 囗", () => { const { 口, 囗, 中, 日 } = computedComponents; - expect(generateSliceBinaries(defaultConfig, 中!, 口!)).toEqual([14]); - expect(generateSliceBinaries(defaultConfig, 中!, 囗!)).toEqual([]); - expect(generateSliceBinaries(defaultConfig, 日!, 口!)).toEqual([]); - expect(generateSliceBinaries(defaultConfig, 日!, 囗!)).toEqual([13]); + expect(generateSliceBinaries(defaultDegenerator, 中!, 口!)).toEqual([14]); + expect(generateSliceBinaries(defaultDegenerator, 中!, 囗!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 日!, 口!)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 日!, 囗!)).toEqual([13]); }); it("should be able to distinguish 木无十 and 全字头", () => { const 木无十 = computedComponents["\ue087"]!; const 全字头 = computedComponents["\ue43d"]!; const { 朱 } = computedComponents; - expect(generateSliceBinaries(defaultConfig, 朱!, 木无十)).toEqual([3]); - expect(generateSliceBinaries(defaultConfig, 朱!, 全字头)).toEqual([]); + expect(generateSliceBinaries(defaultDegenerator, 朱!, 木无十)).toEqual([3]); + expect(generateSliceBinaries(defaultDegenerator, 朱!, 全字头)).toEqual([]); }); }); @@ -90,8 +93,11 @@ const hasroot = (a: RenderedGlyph, indices: number[], root: RenderedGlyph) => { }; describe("degenerate cross tests", () => { - const { 大, 天, 九, 丸, 山, 出, 冖, 农, 赤, 以, 人, 氺, 丆, 疌, 龰 } = + const { 大, 天, 九, 丸, 山, 出, 冖, 农, 以, 人, 氺, 丆, 疌, 龰, 夫, 龵, 象 } = renderedGlyphs as any; + const mianwu = renderedGlyphs["\ue010"]; + const han = renderedGlyphs["\ue104"]!; + const mao3 = renderedGlyphs["\ue17d"]!; it("says 天 has 大", () => { expect(degenerate(大)).toEqual(degenerate(slice(天, [1, 2, 3]))); }); @@ -118,6 +124,15 @@ describe("degenerate cross tests", () => { it("says 疌 has 龰", () => { hasroot(疌, [4, 5, 6, 7], 龰); }); + it("says E104 has 夫", () => { + hasroot(han, [7, 8, 9, 10], 夫); + }); + it("says 龵 has 龵", () => { + hasroot(龵, [0, 1, 2], mao3); + }); + it("says 象 has 免五", () => { + hasroot(象, [0, 1, 2, 3, 4], mianwu); + }); }); describe("degenerate cross tests 2", () => { diff --git a/spec/element.spec.ts b/spec/element.spec.ts index 0b7a565..b757c8a 100644 --- a/spec/element.spec.ts +++ b/spec/element.spec.ts @@ -5,8 +5,6 @@ import { renderName, renderList, parseList, - findElement, - CodableObject, } from "../src/lib/element"; describe("element", () => { diff --git a/spec/form.spec.ts b/spec/form.spec.ts index 52e3761..71d7918 100644 --- a/spec/form.spec.ts +++ b/spec/form.spec.ts @@ -4,8 +4,6 @@ import { generateSchemes } from "~/lib"; describe("generate schemes", () => { it("works for a simple case", () => { expect(generateSchemes(4, [1, 2, 4, 6, 7, 8, 12])).toEqual([ - [8, 4, 2, 1], - [8, 6, 1], [8, 7], [12, 2, 1], ]); diff --git a/spec/mock.ts b/spec/mock.ts index f67f257..967c3f1 100644 --- a/spec/mock.ts +++ b/spec/mock.ts @@ -1,12 +1,23 @@ import rawrepertoire from "../public/cache/repertoire.json"; -import type { BasicComponent } from "~/lib"; -import { listToObject, determine, computeComponent } from "~/lib"; +import type { + AnalysisConfig, + BasicComponent, + Config, + PrimitiveCharacter, + Repertoire, +} from "~/lib"; +import { determine, computeComponent } from "~/lib"; -export const primitiveRepertoire = listToObject(rawrepertoire); +export const primitiveRepertoire = Object.fromEntries( + (rawrepertoire as PrimitiveCharacter[]).map((x) => [ + String.fromCodePoint(x.unicode), + x, + ]), +); export const repertoire = determine(primitiveRepertoire); export const computedComponents = Object.fromEntries( Object.entries(repertoire) - .filter(([k, v]) => v.glyph?.type === "basic_component") + .filter(([_, v]) => v.glyph?.type === "basic_component") .map(([k, v]) => { const glyph = (v.glyph as BasicComponent).strokes; return [k, computeComponent(k, glyph)]; @@ -17,3 +28,16 @@ export const computedGlyphs2 = Object.fromEntries( return [k, v.glyph]; }), ); + +export const focusAnalysis = (config: Config, repertoire: Repertoire) => { + const result: AnalysisConfig = { + analysis: config.analysis ?? {}, + primaryRoots: new Set( + Object.keys(config.form.mapping).filter((x) => repertoire[x]), + ), + secondaryRoots: new Set( + Object.keys(config.form.grouping ?? []).filter((x) => repertoire[x]), + ), + }; + return result; +}; diff --git a/spec/selector.spec.ts b/spec/selector.spec.ts index 5db9441..64cd92c 100644 --- a/spec/selector.spec.ts +++ b/spec/selector.spec.ts @@ -1,43 +1,49 @@ import { describe, expect, it } from "vitest"; -import { length, bias, order, crossing, attaching, Scheme } from "~/lib"; +import type { Environment, Scheme } from "~/lib"; +import { length, bias, order, crossing, attaching } from "~/lib"; import { select } from "~/lib"; -import { computedComponents, repertoire } from "./mock"; +import { computedComponents, focusAnalysis, repertoire } from "./mock"; import { defaultConfig } from "~/lib"; -import { Config } from "~/lib"; +const analysisConfig = focusAnalysis(defaultConfig, repertoire); const { 天 } = computedComponents as any; +const env: Environment = { + component: 天, + rootMap: new Map(), + ...analysisConfig, +}; const rootMap = new Map(); describe("length", () => { it("should measure the length of scheme", () => { - expect(length.key([8, 7], 天, defaultConfig, rootMap)).toBe(2); + expect(length.key([8, 7], env)).toBe(2); }); }); describe("bias", () => { it("should measure the bias of scheme", () => { - expect(bias.key([8, 7], 天, defaultConfig, rootMap)).toEqual([-1, -3]); + expect(bias.key([8, 7], env)).toEqual([-1, -3]); }); }); describe("order", () => { it("should measure the order of scheme", () => { - expect(order.key([8, 7], 天, defaultConfig, rootMap)).toEqual(0); + expect(order.key([8, 7], env)).toEqual(0); }); }); describe("crossing", () => { it("should measure the crossing of scheme", () => { - expect(crossing.key([8, 7], 天, defaultConfig, rootMap)).toBe(0); - expect(crossing.key([12, 3], 天, defaultConfig, rootMap)).toBe(1); + expect(crossing.key([8, 7], env)).toBe(0); + expect(crossing.key([12, 3], env)).toBe(1); }); }); describe("attaching", () => { it("should measure the attaching of scheme", () => { - expect(attaching.key([8, 7], 天, defaultConfig, rootMap)).toBe(1); - expect(attaching.key([12, 3], 天, defaultConfig, rootMap)).toBe(0); + expect(attaching.key([8, 7], env)).toBe(1); + expect(attaching.key([12, 3], env)).toBe(0); }); }); @@ -46,7 +52,7 @@ describe("select", () => { expect( ( select( - defaultConfig, + analysisConfig, 天, [ [12, 3], @@ -55,8 +61,8 @@ describe("select", () => { [8, 4, 2, 1], ], rootMap, - ) as [Scheme, unknown] - )[0], + ) as [{ scheme: Scheme }, unknown] + )[0].scheme, ).toEqual([8, 7]); }); }); diff --git a/spec/topology.spec.ts b/spec/topology.spec.ts index cc3fb7e..b114a4f 100644 --- a/spec/topology.spec.ts +++ b/spec/topology.spec.ts @@ -1,7 +1,7 @@ import { expect, describe, it } from "vitest"; -import type { StrokeRelation } from "~/lib"; -import { findTopology, curveRelation, renderSVGGlyph } from "~/lib"; -import { CubicCurve, LinearCurve, area, render } from "~/lib"; +import type { StrokeRelation, CubicCurve, LinearCurve } from "~/lib"; +import { findTopology, curveRelation } from "~/lib"; +import { area } from "~/lib"; import type { Draw, Point } from "~/lib"; import { computedGlyphs2 as computedGlyphs } from "./mock"; import { getIntervalPosition, makeCurve } from "~/lib"; @@ -97,7 +97,7 @@ describe("curve relation", () => { first: "中", second: "前", }); - expect(curveRelation(c1, c4)).toEqual({ type: "散", x: -0.5, y: -1 }); + expect(curveRelation(c1, c4)).toEqual({ type: "散", x: 0, y: -1 }); expect(curveRelation(c2, c3)).toEqual({ type: "交" }); expect(curveRelation(c2, c4)).toEqual({ type: "连", diff --git a/spec/utils.spec.ts b/spec/utils.spec.ts index bb8a327..2ab7def 100644 --- a/spec/utils.spec.ts +++ b/spec/utils.spec.ts @@ -1,18 +1,13 @@ import { describe, it, expect } from "vitest"; import { - printableAscii, - unicodeBlock, isValidCJKChar, isPUA, chars, getDummyBasicComponent, getDummyDerivedComponent, - getDummyReferenceStroke, - getDummySVGStroke, getDummyCompound, isComponent, getSupplemental, - listToObject, getRecordFromTSV, } from "~/lib/utils"; import { repertoire } from "./mock"; @@ -51,7 +46,7 @@ describe("misc", () => { .filter(([, value]) => value.gb2312) .map(([x]) => x); const result = getSupplemental(repertoire, characters); - expect(result.length).toBeGreaterThan(200); + expect(result.length).toBeGreaterThan(100); }); it("parseTSV should parse a TSV string and return a record with the values", () => { diff --git a/src/api.ts b/src/api.ts index ce2560c..92bb836 100644 --- a/src/api.ts +++ b/src/api.ts @@ -30,6 +30,9 @@ const template = export const list = async () => await template("GET")("repertoire/all"); +export const get = async (unicode: number) => + template("GET")(`repertoire/${unicode}`); + export const post = template("POST"); interface PUA { diff --git a/src/atoms/analysis.ts b/src/atoms/analysis.ts index 513d225..67781dd 100644 --- a/src/atoms/analysis.ts +++ b/src/atoms/analysis.ts @@ -1,7 +1,7 @@ -import type { Analysis, Degenerator, Selector, SieveName } from "~/lib"; +import type { Analysis, Degenerator, Selector, Feature } from "~/lib"; import { focusAtom } from "jotai-optics"; import { analysisAtom } from "./config"; -import { Feature, mergeClassifier } from "~/lib"; +import { mergeClassifier } from "~/lib"; import { atom } from "jotai"; export const degeneratorAtom = focusAtom(analysisAtom, (o) => @@ -32,6 +32,12 @@ export const customizeAtom = focusAtom(analysisAtom, (o) => o.prop("customize").valueOr({} as NonNullable), ); +export const customizeCornersAtom = focusAtom(analysisAtom, (o) => + o + .prop("customizeCorners") + .valueOr({} as NonNullable), +); + export const classifierCustomizationAtom = focusAtom(analysisAtom, (o) => o.prop("classifier").valueOr({} as Record), ); @@ -40,3 +46,7 @@ export const customClassifierAtom = atom((get) => { const customization = get(classifierCustomizationAtom); return mergeClassifier(customization); }); + +export const serializerAtom = focusAtom(analysisAtom, (o) => + o.prop("serializer").valueOr("sequential" as "sequential" | "c3"), +); diff --git a/src/atoms/assets.ts b/src/atoms/assets.ts index 40a27e7..6c70558 100644 --- a/src/atoms/assets.ts +++ b/src/atoms/assets.ts @@ -1,6 +1,113 @@ import { atomWithStorage } from "jotai/utils"; -import { Dictionary, Distribution, Equivalence, Frequency } from "."; +import type { + CustomElementMap, + Dictionary, + Distribution, + Equivalence, + Frequency, +} from "~/lib"; import { MiniDb } from "jotai-minidb"; +import { atom } from "jotai"; +import { + adapt, + getDictFromTSV, + getDistributionFromTSV, + getRecordFromTSV, + type PrimitiveRepertoire, +} from "~/lib"; +import { produce } from "immer"; +import { charactersAtom } from "./data"; + +const _cache: Record = {}; +export async function fetchAsset( + filename: string, + type: "json" | "txt" = "json", +) { + if (filename in _cache) { + return _cache[filename]; + } + const response = await fetch(`/cache/${filename}.${type}`); + const content = await (type === "json" ? response.json() : response.text()); + _cache[filename] = content; + return content; +} + +export const primitiveRepertoireAtom = atom({}); +primitiveRepertoireAtom.debugLabel = "repertoire"; + +export const mutateRepertoireAtom = atom( + null, + (get, set, twoUnicode: [number, number]) => { + const before = String.fromCodePoint(twoUnicode[0]); + const after = String.fromCodePoint(twoUnicode[1]); + const replaceIf = (s: string) => (s === before ? after : s); + + set(primitiveRepertoireAtom, (previous) => + produce(previous, (state) => { + // update itself + const value = state[before]!; + delete state[before]; + state[after] = { ...value, unicode: after.codePointAt(0)! }; + // update references + for (const [_, value] of Object.entries(state)) { + value.glyphs.forEach((x) => { + if (x.type === "derived_component") { + x.source = x.source && replaceIf(x.source); + } else if (x.type === "compound") { + x.operandList = x.operandList.map(replaceIf); + } + }); + } + }), + ); + }, +); + +export const defaultDictionaryAtom = atom>(async () => + getDictFromTSV(await fetchAsset("dictionary", "txt")), +); +export const frequencyAtom = atom>(async () => + getRecordFromTSV(await fetchAsset("frequency", "txt")), +); +export const keyDistributionAtom = atom>(async () => + getDistributionFromTSV(await fetchAsset("key_distribution", "txt")), +); +export const pairEquivalenceAtom = atom>(async () => + getRecordFromTSV(await fetchAsset("pair_equivalence", "txt")), +); + +export interface Assets { + frequency: Frequency; + key_distribution: Distribution; + pair_equivalence: Equivalence; +} + +export const assetsAtom = atom(async (get) => { + const frequency = get(userFrequencyAtom) ?? (await get(frequencyAtom)); + const key_distribution = + get(userKeyDistributionAtom) ?? (await get(keyDistributionAtom)); + const pair_equivalence = + get(userPairEquivalenceAtom) ?? (await get(pairEquivalenceAtom)); + const assets: Assets = { + frequency, + key_distribution, + pair_equivalence, + }; + return assets; +}); + +export const adaptedFrequencyAtom = atom(async (get) => { + const frequency = get(userFrequencyAtom) ?? (await get(frequencyAtom)); + const characters = get(charactersAtom); + const dictionary = await get(dictionaryAtom); + const words = new Set(characters); + dictionary.forEach(([word]) => words.add(word)); + return adapt(frequency, words); +}); + +export const dictionaryAtom = atom(async (get) => { + return get(userDictionaryAtom) ?? (await get(defaultDictionaryAtom)); +}); const db = new MiniDb(); @@ -19,3 +126,18 @@ export const userPairEquivalenceAtom = atomWithStorage( "user_pair_equivalence", undefined, ); + +export const customElementsAtom = atomWithStorage< + Record +>("custom_elements", {}); + +export const processedCustomElementsAtom = atom((get) => { + const customElements = get(customElementsAtom); + const content = new Map( + Object.entries(customElements).map(([name, map]) => { + const set = new Set(Object.values(map).flat()); + return [name, [...set].sort().map((x) => `${name}-${x}`)]; + }), + ); + return content; +}); diff --git a/src/atoms/cache.ts b/src/atoms/cache.ts index 4c8832a..1b42c44 100644 --- a/src/atoms/cache.ts +++ b/src/atoms/cache.ts @@ -1,10 +1,119 @@ import { atom } from "jotai"; -import { EncodeResult } from "~/components/Utils"; -import { AssemblyResult } from "~/lib"; -import { AnalysisResult } from "~/lib"; +import type { + AnalysisConfig, + AnalysisResult, + Assembly, + AssemblyResult, + DictEntry, + EncodeResult, + Metric, + PronunciationElementTypes, +} from "~/lib"; +import { applyRules, defaultAlgebra } from "~/lib"; +import { + algebraAtom, + analysisAtom, + charactersAtom, + configAtom, + dictionaryAtom, + encoderAtom, + groupingAtom, + keyboardAtom, + mappingAtom, + meaningfulObjectiveAtom, + priorityShortCodesAtom, + repertoireAtom, +} from "."; +import { assetsAtom, customElementsAtom } from "./assets"; +import { thread } from "./utils"; -export const analysisResultAtom = atom(null); +const mergedAlgebraAtom = atom((get) => { + const algebra = get(algebraAtom); + return { ...algebra, ...defaultAlgebra }; +}); -export const assemblyResultAtom = atom(null); +export const phonemeEnumerationAtom = atom((get) => { + const repertoire = get(repertoireAtom); + const syllables = [ + ...new Set( + Object.values(repertoire) + .map((x) => x.readings.map((y) => y.pinyin)) + .flat(), + ), + ]; + const mergedAlgebras = Object.entries(get(mergedAlgebraAtom)); + const content: Map = new Map( + mergedAlgebras.map(([name, rules]) => { + const list = [ + ...new Set(syllables.map((s) => applyRules(name, rules, s))), + ].sort(); + return [name as PronunciationElementTypes, list]; + }), + ); + return content; +}); -export const encodeResultAtom = atom(null); +export const analysisResultAtom = atom(async (get) => { + const repertoire = get(repertoireAtom); + const analysisConfig: AnalysisConfig = { + analysis: get(analysisAtom), + primaryRoots: new Set( + Object.keys(get(mappingAtom)).filter((x) => repertoire[x]), + ), + secondaryRoots: new Set( + Object.keys(get(groupingAtom)).filter((x) => repertoire[x]), + ), + }; + const characters = get(charactersAtom); + return await thread.spawn("analysis", [ + repertoire, + analysisConfig, + characters, + ]); +}); + +export const assemblyResultAtom = atom(async (get) => { + const repertoire = get(repertoireAtom); + const algebra = get(algebraAtom); + const encoder = get(encoderAtom); + const keyboard = get(keyboardAtom); + const characters = get(charactersAtom); + const dictionary = await get(dictionaryAtom); + const analysisResult = await get(analysisResultAtom); + const customElements = get(customElementsAtom); + const priority = get(priorityShortCodesAtom); + const config = { algebra, encoder, keyboard, priority }; + return await thread.spawn("assembly", [ + repertoire, + config, + characters, + dictionary, + analysisResult, + customElements, + ]); +}); + +export const encodeResultAtom = atom(async (get) => { + const objective = get(meaningfulObjectiveAtom); + const config = get(configAtom); + const assemblyResult = await get(assemblyResultAtom); + const assets = await get(assetsAtom); + return await thread.spawn<[EncodeResult, Metric]>("encode", [ + objective, + config.info.name, + assemblyResult[0], + assets.pair_equivalence, + ]); +}); + +export interface Combined extends Assembly, DictEntry {} + +export const combinedResultAtom = atom(async (get) => { + const assemblyResult = await get(assemblyResultAtom); + const [encodeResult] = await get(encodeResultAtom); + const combined: Combined[] = assemblyResult.map((x, i) => ({ + ...x, + ...encodeResult[i]!, + })); + return combined; +}); diff --git a/src/atoms/config.ts b/src/atoms/config.ts index d793ffe..f7fd8ad 100644 --- a/src/atoms/config.ts +++ b/src/atoms/config.ts @@ -1,28 +1,34 @@ import { atom } from "jotai"; -import { atomWithStorage } from "jotai/utils"; +import { atomFamily, atomWithStorage } from "jotai/utils"; +import type { Analysis, Data, EncoderConfig, Example } from "~/lib"; import { defaultOptimization, type Algebra, type Config, type Info, - Analysis, - Data, - EncoderConfig, + defaultConfig, + examples, } from "~/lib"; import { focusAtom } from "jotai-optics"; +import { atomWithLocation } from "jotai-location"; -/** 需要在根组件里提前修改它 */ -export const configIdAtom = atom(""); -configIdAtom.debugLabel = "id"; +const locationAtom = atomWithLocation(); -const configStorageAtomAtom = atom((get) => { - const id = get(configIdAtom); - return atomWithStorage(id, {} as Config); +export const idAtom = atom((get) => { + if (import.meta.env.MODE === "CF") { + return get(locationAtom).pathname?.split("/")[1] ?? ""; + } else { + return get(locationAtom).hash?.split("/")[1] ?? ""; + } }); +const configStorage = atomFamily((id: string) => + atomWithStorage(id, examples[id as Example] ?? defaultConfig), +); + export const configAtom = atom( - (get) => get(get(configStorageAtomAtom)), - (get, set, value: Config) => set(get(configStorageAtomAtom), value), + (get) => get(configStorage(get(idAtom))), + (get, set, value: Config) => set(configStorage(get(idAtom)), value), ); configAtom.debugLabel = "config"; diff --git a/src/atoms/constants.ts b/src/atoms/constants.ts deleted file mode 100644 index 2caefde..0000000 --- a/src/atoms/constants.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { atom } from "jotai"; -import type { PrimitiveRepertoire } from "~/lib"; -import { produce } from "immer"; -import { - userFrequencyAtom, - userKeyDistributionAtom, - userPairEquivalenceAtom, - userDictionaryAtom, -} from "./assets"; - -const _cache: Record = {}; -export async function fetchAsset( - filename: string, - type: "json" | "txt" = "json", -) { - if (filename in _cache) { - return _cache[filename]; - } - const response = await fetch(`/cache/${filename}.${type}`); - const content = await (type === "json" ? response.json() : response.text()); - _cache[filename] = content; - return content; -} - -export const primitiveRepertoireAtom = atom({}); -primitiveRepertoireAtom.debugLabel = "repertoire"; - -export const mutateRepertoireAtom = atom( - null, - (get, set, twoUnicode: [number, number]) => { - const before = String.fromCodePoint(twoUnicode[0]); - const after = String.fromCodePoint(twoUnicode[1]); - const replaceIf = (s: string) => (s === before ? after : s); - - set(primitiveRepertoireAtom, (previous) => - produce(previous, (state) => { - // update itself - const value = state[before]!; - delete state[before]; - state[after] = { ...value, unicode: after.codePointAt(0)! }; - // update references - for (const [_, value] of Object.entries(state)) { - value.glyphs.forEach((x) => { - if (x.type === "derived_component") { - x.source = x.source && replaceIf(x.source); - } else if (x.type === "compound") { - x.operandList = x.operandList.map(replaceIf); - } - }); - } - }), - ); - }, -); - -interface Loss { - ideal: number; - lt_penalty: number; - gt_penalty: number; -} - -export type Dictionary = [string, string][]; -export type Frequency = Record; -export type Distribution = Record; -export type Equivalence = Record; - -export const defaultDictionaryAtom = atom([]); -export const frequencyAtom = atom({}); -export const keyDistributionAtom = atom({}); -export const pairEquivalenceAtom = atom({}); - -export interface Assets { - frequency: Frequency; - key_distribution: Distribution; - pair_equivalence: Equivalence; -} - -export const assetsAtom = atom((get) => { - const frequency = get(userFrequencyAtom) ?? get(frequencyAtom); - const key_distribution = - get(userKeyDistributionAtom) ?? get(keyDistributionAtom); - const pair_equivalence = - get(userPairEquivalenceAtom) ?? get(pairEquivalenceAtom); - const assets: Assets = { - frequency, - key_distribution, - pair_equivalence, - }; - return assets; -}); - -export const dictionaryAtom = atom((get) => { - return get(userDictionaryAtom) ?? get(defaultDictionaryAtom); -}); diff --git a/src/atoms/data.ts b/src/atoms/data.ts index f45221a..316ed43 100644 --- a/src/atoms/data.ts +++ b/src/atoms/data.ts @@ -1,14 +1,22 @@ -import { atom, useAtomValue } from "jotai"; -import { primitiveRepertoireAtom } from "./constants"; -import { isPUA } from "~/lib"; +import { atom } from "jotai"; +import { primitiveRepertoireAtom } from "./assets"; +import type { + CharacterSetSpecifier, + CustomReadings, + PrimitiveCharacter, +} from "~/lib"; +import { isPUA, isValidCJKBasicChar, isValidCJKChar } from "~/lib"; import { recursiveRenderCompound } from "~/lib"; import { dataAtom } from "."; import { focusAtom } from "jotai-optics"; -import { PrimitiveRepertoire, SVGGlyph } from "~/lib"; -import { CustomGlyph } from "~/lib"; +import type { PrimitiveRepertoire, SVGGlyph } from "~/lib"; +import type { CustomGlyph } from "~/lib"; import { determine } from "~/lib"; import { classifier } from "~/lib"; +export const characterSetAtom = focusAtom(dataAtom, (o) => + o.prop("character_set").valueOr("general" as CharacterSetSpecifier), +); export const userRepertoireAtom = focusAtom(dataAtom, (o) => o.prop("repertoire").valueOr({} as PrimitiveRepertoire), ); @@ -18,13 +26,34 @@ export const customGlyphAtom = focusAtom(dataAtom, (o) => ); customGlyphAtom.debugLabel = "config.data.customGlyph"; export const customReadingsAtom = focusAtom(dataAtom, (o) => - o.prop("reading_customization").valueOr({} as CustomGlyph), + o.prop("reading_customization").valueOr({} as CustomReadings), ); customReadingsAtom.debugLabel = "config.data.customReadings"; export const userTagsAtom = focusAtom(dataAtom, (o) => o.prop("tags").valueOr([] as string[]), ); +export const charactersAtom = atom((get) => { + const primitiveRepertoire = get(primitiveRepertoireAtom); + const characterSet = get(characterSetAtom); + const filters: Record< + CharacterSetSpecifier, + (k: string, v: PrimitiveCharacter) => boolean + > = { + minimal: (_, v) => v.gb2312 && v.tygf > 0, + gb2312: (_, v) => v.gb2312, + general: (_, v) => v.tygf > 0, + basic: (k, v) => v.tygf > 0 || isValidCJKBasicChar(k), + extended: (k, v) => v.tygf > 0 || isValidCJKChar(k), + }; + + const filter = filters[characterSet]; + const characters = Object.entries(primitiveRepertoire) + .filter(([k, v]) => filter(k, v)) + .map(([k]) => k); + return characters; +}); + export const allRepertoireAtom = atom((get) => { const repertoire = get(primitiveRepertoireAtom); const userRepertoire = get(userRepertoireAtom); @@ -42,9 +71,10 @@ export const displayAtom = atom((get) => { export const repertoireAtom = atom((get) => { const repertoire = get(allRepertoireAtom); - const customization = get(customGlyphAtom); + const customGlyph = get(customGlyphAtom); + const customReadings = get(customReadingsAtom); const tags = get(userTagsAtom); - return determine(repertoire, customization, tags); + return determine(repertoire, customGlyph, customReadings, tags); }); export const glyphAtom = atom((get) => { @@ -52,10 +82,11 @@ export const glyphAtom = atom((get) => { const result = new Map(); for (const [char, { glyph }] of Object.entries(repertoire)) { if (glyph === undefined) continue; + if (result.has(char)) continue; if (glyph.type === "basic_component") { result.set(char, glyph.strokes); } else { - const svgglyph = recursiveRenderCompound(glyph, repertoire); + const svgglyph = recursiveRenderCompound(glyph, repertoire, result); if (svgglyph instanceof Error) continue; result.set(char, svgglyph); } diff --git a/src/atoms/encoder.ts b/src/atoms/encoder.ts index 5ea4323..b7cf89b 100644 --- a/src/atoms/encoder.ts +++ b/src/atoms/encoder.ts @@ -1,6 +1,13 @@ import { focusAtom } from "jotai-optics"; -import { encoderAtom } from "."; -import { ShortCodeRule, ShortCodeScheme, WordRule } from "~/lib"; +import { atom, encoderAtom } from "."; +import type { + LevelWeights, + Objective, + PartialWeights, + ShortCodeRule, + WordRule, +} from "~/lib"; +import { range } from "lodash-es"; export const maxLengthAtom = focusAtom(encoderAtom, (o) => o.prop("max_length"), @@ -35,3 +42,72 @@ export const sourcesAtom = focusAtom(encoderAtom, (o) => o.prop("sources")); export const conditionsAtom = focusAtom(encoderAtom, (o) => o.prop("conditions"), ); + +const isMulti = (s: ShortCodeRule) => { + if ("length_equal" in s) { + return s.length_equal > 1; + } else { + return s.length_in_range[1] > 1; + } +}; + +const makeTier = (top: number, levelWeights: LevelWeights[]) => ({ + top: top === 0 ? undefined : top, + duplication: 1, + levels: levelWeights, + fingering: [1, 1, 1, 1, 1, 1, null, null], +}); + +export const meaningfulObjectiveAtom = atom((get) => { + const wordRules = get(wordRulesAtom); + const shortCodeConfig = get(shortCodeConfigAtom); + const maxLength = get(maxLengthAtom); + const levelWeights: LevelWeights[] = range(1, maxLength + 1).map((i) => ({ + length: i, + frequency: 1, + })); + const partialObjective: PartialWeights = { + duplication: 1, + key_distribution: 1, + pair_equivalence: 1, + fingering: [1, 1, 1, 1, 1, 1, null, null], + levels: levelWeights, + }; + const p1 = { + ...partialObjective, + tiers: [300, 500, 1500, 3000, 4500, 6000, 0].map((x) => + makeTier(x, levelWeights), + ), + }; + const p2 = { + ...partialObjective, + tiers: [2000, 5000, 10000, 20000, 40000, 60000, 0].map((x) => + makeTier(x, levelWeights), + ), + }; + const objective: Objective = { + characters_full: p1, + }; + if (wordRules.length > 0) { + objective.words_full = p2; + } + if (shortCodeConfig.length > 0) { + objective.characters_short = p1; + if (wordRules.length > 0 && shortCodeConfig.some(isMulti)) { + objective.words_short = p2; + } + } + return objective; +}); + +export const meaningfulTypesAtom = atom((get) => { + const objective = get(meaningfulObjectiveAtom); + return Object.keys(objective) as (keyof Objective)[]; +}); + +export const typeLabels: Record = { + characters_full: "一字全码", + characters_short: "一字简码", + words_full: "多字全码", + words_short: "多字简码", +}; diff --git a/src/atoms/hooks.ts b/src/atoms/hooks.ts deleted file mode 100644 index 01b4840..0000000 --- a/src/atoms/hooks.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Config, Key, isValidCJKChar } from "~/lib"; -import useTitle from "ahooks/es/useTitle"; -import init, { validate } from "libchai"; -import { LibchaiOutputEvent } from "~/worker"; -import { notification } from "antd"; -import { Err } from "~/api"; - -export async function validateConfig(config: Config) { - await init(); - try { - validate(config); - notification.success({ - message: "配置校验成功", - description: "该配置可以被正常使用。", - }); - return true; - } catch (e) { - notification.error({ - message: "配置校验失败,原因是:", - description: (e as Error).message, - }); - return false; - } -} - -export interface DictEntry { - name: string; - full: string; - full_rank: number; - short: string; - short_rank: number; -} - -export const errorFeedback = function ( - res: T | Err, -): res is Err { - if (typeof res === "object") { - notification.error({ - message: "无法完成该操作", - description: JSON.stringify(res), - }); - return true; - } else { - notification.success({ - message: "操作成功", - }); - return false; - } -}; - -export const verifyNewName = (newName: string) => { - if (!Array.from(newName).every(isValidCJKChar)) { - notification.error({ - message: "名称含有非法字符", - description: "只有 CJK 基本集或扩展集 A 中的才是合法字符", - }); - return false; - } - return true; -}; - -export type EncodeResult = DictEntry[]; - -export const makeEncodeCallback = (setCode: (e: EncodeResult) => void) => { - return (event: MessageEvent) => { - const { data } = event; - switch (data.type) { - case "code": - setCode(data.code); - notification.success({ - message: "生成成功!", - }); - break; - case "error": - notification.error({ - message: "生成过程中 libchai 出现错误", - description: data.error.message, - }); - break; - } - }; -}; - -export function useChaifenTitle(title: string) { - useTitle(`${title} · 汉字自动拆分系统 ${APP_VERSION}`, { - restoreOnUnmount: true, - }); -} diff --git a/src/atoms/index.ts b/src/atoms/index.ts index 91930c8..af90ea6 100644 --- a/src/atoms/index.ts +++ b/src/atoms/index.ts @@ -1,16 +1,18 @@ -import { WritableAtom, useAtom, useAtomValue, useSetAtom } from "jotai"; +import type { WritableAtom } from "jotai"; +import { useAtomValue, useSetAtom } from "jotai"; export * from "jotai"; -export * from "./constants"; +export * from "./analysis"; +export * from "./assets"; +export * from "./cache"; export * from "./config"; export * from "./data"; -export * from "./hooks"; -export * from "./keyboard"; export * from "./encoder"; -export * from "./analysis"; +export * from "./keyboard"; export * from "./optimization"; +export * from "./utils"; import * as O from "optics-ts/standalone"; -import { SetStateAction } from "react"; +import type { SetStateAction } from "react"; export function useAddAtom( atom: WritableAtom, [SetStateAction>], void>, diff --git a/src/atoms/keyboard.ts b/src/atoms/keyboard.ts index 5b6091a..8cf4cc9 100644 --- a/src/atoms/keyboard.ts +++ b/src/atoms/keyboard.ts @@ -1,6 +1,6 @@ import { focusAtom } from "jotai-optics"; import { keyboardAtom } from "./config"; -import { Grouping } from "~/lib"; +import type { Grouping } from "~/lib"; export const alphabetAtom = focusAtom(keyboardAtom, (o) => o.prop("alphabet")); diff --git a/src/atoms/optimization.ts b/src/atoms/optimization.ts index 3e505df..0cefac5 100644 --- a/src/atoms/optimization.ts +++ b/src/atoms/optimization.ts @@ -1,5 +1,5 @@ import { focusAtom } from "jotai-optics"; -import { atom, optimAtom } from "."; +import { optimAtom } from "."; export const objectiveAtom = focusAtom(optimAtom, (o) => o.prop("objective")); objectiveAtom.debugLabel = "optimization.objective"; diff --git a/src/atoms/utils.ts b/src/atoms/utils.ts new file mode 100644 index 0000000..0317446 --- /dev/null +++ b/src/atoms/utils.ts @@ -0,0 +1,143 @@ +import type { Config } from "~/lib"; +import { isValidCJKChar, stringifySequence } from "~/lib"; +import useTitle from "ahooks/es/useTitle"; +import init, { validate } from "libchai"; +import { notification } from "antd"; +import type { Err } from "~/api"; +import { createContext } from "react"; +import { isEqual } from "lodash-es"; +import { diff } from "deep-object-diff"; +import { load } from "js-yaml"; +import type { WorkerOutput } from "~/worker"; +import { atomEffect } from "jotai-effect"; +import { configAtom } from "./config"; +import { assetsAtom } from "./assets"; +import { assemblyResultAtom } from "./cache"; + +export const syncConfig = atomEffect((get) => { + const value = get(configAtom); + thread.spawn("sync", ["config", value]); +}); + +export const syncAssets = atomEffect((get) => { + get(assetsAtom).then(async (value) => { + await thread.spawn("sync", ["assets", value]); + }); +}); + +export const syncInfo = atomEffect((get) => { + get(assemblyResultAtom).then(async (value) => { + await thread.spawn("sync", ["info", stringifySequence(value)]); + }); +}); + +export const RemoteContext = createContext(true); + +export async function validateConfig(config: Config) { + await init(); + try { + validate(config); + notification.success({ + message: "配置校验成功", + description: "该配置可以被正常使用。", + }); + return true; + } catch (e) { + notification.error({ + message: "配置校验失败,原因是:", + description: (e as Error).message, + }); + return false; + } +} + +export async function roundTestConfig(config: Config) { + await init(); + try { + const rustConfig = load(validate(config)) as object; + if (isEqual(config, rustConfig)) { + notification.success({ + message: "配置环行成功", + description: "该配置在 libchai 中具有同样语义。", + }); + return true; + } else { + notification.warning({ + message: "配置环行失败", + description: + "该配置在 libchai 中具有不同语义。以下是两者的差异:\n" + + JSON.stringify(diff(config, rustConfig)), + }); + return false; + } + } catch (e) { + notification.error({ + message: "配置校验失败,原因是:", + description: (e as Error).message, + }); + return false; + } +} + +export const errorFeedback = function ( + res: T | Err, +): res is Err { + if (typeof res === "object") { + notification.error({ + message: "无法完成该操作", + description: JSON.stringify(res), + }); + return true; + } else { + notification.success({ + message: "操作成功", + }); + return false; + } +}; + +export const verifyNewName = (newName: string) => { + if (!Array.from(newName).every(isValidCJKChar)) { + notification.error({ + message: "名称含有非法字符", + description: "只有 CJK 基本集或扩展集 A 中的才是合法字符", + }); + return false; + } + return true; +}; + +export function useChaifenTitle(title: string) { + // eslint-disable-next-line + useTitle(`${title} · 汉字自动拆分系统 ${APP_VERSION}`, { + restoreOnUnmount: true, + }); +} + +export class Thread { + public worker: Worker; + public constructor() { + this.worker = new Worker(new URL("../worker.ts", import.meta.url), { + type: "module", + }); + } + + public async spawn(type: string, data: any[]): Promise { + return await new Promise((resolve, reject) => { + const channel = new MessageChannel(); + channel.port1.onmessage = ({ data }: { data: WorkerOutput }) => { + channel.port1.close(); + if (data.type === "success") { + resolve(data.result); + } else if (data.type === "error") { + reject(data.error); + } else { + throw new Error(`Unexpected message: ${data}`); + } + }; + this.worker.postMessage({ type, data }, [channel.port2]); + }); + } +} + +export const thread = new Thread(); diff --git a/src/bex/img/logo128.png b/src/bex/img/logo128.png deleted file mode 100644 index 1000091..0000000 Binary files a/src/bex/img/logo128.png and /dev/null differ diff --git a/src/bex/img/logo16.png b/src/bex/img/logo16.png deleted file mode 100644 index 6d737fa..0000000 Binary files a/src/bex/img/logo16.png and /dev/null differ diff --git a/src/bex/img/logo256.png b/src/bex/img/logo256.png deleted file mode 100644 index 3baa457..0000000 Binary files a/src/bex/img/logo256.png and /dev/null differ diff --git a/src/bex/img/logo48.png b/src/bex/img/logo48.png deleted file mode 100644 index c69cacb..0000000 Binary files a/src/bex/img/logo48.png and /dev/null differ diff --git a/src/bex/manifest.json b/src/bex/manifest.json deleted file mode 100644 index 502089a..0000000 --- a/src/bex/manifest.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "汉字自动拆分系统", - "version": "0.0.0", - "manifest_version": 3, - "author": "汉字自动拆分开发团队", - "description": "为用户提供了一个方便的图形界面,使方案设计更加便捷。", - "icons": { - "16": "img/logo16.png", - "48": "img/logo48.png", - "128": "img/logo128.png", - "256": "img/logo256.png" - }, - "homepage_url": "https://github.com/hanzi-chai/hanzi-chai.github.io", - "action": { - "default_popup": "popup.html", - "default_icon": { - "16": "img/logo16.png", - "48": "img/logo48.png", - "128": "img/logo128.png", - "256": "img/logo256.png" - } - }, - "permissions": ["https://api.chaifen.app/*"] -} diff --git a/src/bex/popup.html b/src/bex/popup.html deleted file mode 100644 index 8d46171..0000000 --- a/src/bex/popup.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - popup - - - -
即将运行汉字自动拆分系统……
- - - diff --git a/src/bex/popup.js b/src/bex/popup.js deleted file mode 100644 index a76833f..0000000 --- a/src/bex/popup.js +++ /dev/null @@ -1 +0,0 @@ -chrome.tabs.create({ url: "index.html" }); diff --git a/src/components/Action.tsx b/src/components/Action.tsx index a4ec628..c36f4dc 100644 --- a/src/components/Action.tsx +++ b/src/components/Action.tsx @@ -6,15 +6,9 @@ import { Input, Popconfirm, Popover, - Space, } from "antd"; -import { - ForwardedRef, - createContext, - forwardRef, - useContext, - useState, -} from "react"; +import type { ForwardedRef } from "react"; +import { forwardRef, useContext, useState } from "react"; import { remoteCreate, remoteCreateWithoutUnicode, @@ -23,18 +17,18 @@ import { remoteMutate, } from "~/api"; import { DeleteButton, Select } from "~/components/Utils"; +import type { Reading } from "~/lib"; import { chars, isValidCJKChar, - getDummyBasicComponent, getDummyCompound, getDummyDerivedComponent, + getDummyBasicComponent, } from "~/lib"; import { useAtomValue, useSetAtom, mutateRepertoireAtom, - useAtom, repertoireAtom, nextUnicodeAtom, useAddAtom, @@ -44,20 +38,21 @@ import { customGlyphAtom, errorFeedback, verifyNewName, + RemoteContext, + customReadingsAtom, } from "~/atoms"; -import { PrimitiveCharacter, Compound, Component } from "~/lib"; +import type { PrimitiveCharacter, Compound, Component } from "~/lib"; import ComponentForm from "./ComponentForm"; import CompoundForm from "./CompoundForm"; -import { MenuProps } from "antd/lib"; +import type { MenuProps } from "antd/lib"; import * as O from "optics-ts/standalone"; +import ReadingForm from "./ReadingForm"; interface CreateProps { charOrName: string; type: "component" | "compound"; } -export const RemoteContext = createContext(true); - export const Create = forwardRef( ( { onCreate }: { onCreate: (s: string) => void }, @@ -176,6 +171,9 @@ export const Mutate = ({ unicode }: { unicode: number }) => { const [newName, setNewName] = useState(""); const remote = useContext(RemoteContext); const mutate = useSetAtom(mutateRepertoireAtom); + const repertoire = useAtomValue(primitiveRepertoireAtom); + const update = useAddAtom(primitiveRepertoireAtom); + const name = String.fromCodePoint(unicode); return ( { } onConfirm={async () => { const valid = verifyNewName(newName); - if (!valid || newName.length > 1) return; - const newUnicode = newName.codePointAt(0)!; - const payload = { old: unicode, new: newUnicode }; - const res = await remoteMutate(payload); - if (!errorFeedback(res)) { - mutate([unicode, newUnicode]); + if (!valid) return; + if (Array.from(newName).length === 1) { + // 改变 Unicode,需要联动更新 + const newUnicode = newName.codePointAt(0)!; + const payload = { old: unicode, new: newUnicode }; + const res = await remoteMutate(payload); + if (!errorFeedback(res)) { + mutate([unicode, newUnicode]); + } + } else { + // 改变别名,不需要联动更新 + const character = repertoire[name]; + if (!character) return; + const newCharacter: PrimitiveCharacter = { + ...character, + name: newName, + }; + const res = await remoteUpdate(newCharacter); + if (!errorFeedback(res)) { + update(name, newCharacter); + } } }} > @@ -209,18 +222,12 @@ export const Mutate = ({ unicode }: { unicode: number }) => { export const Delete = ({ unicode }: { unicode: number }) => { const remote = useContext(RemoteContext); const userRepertoire = useAtomValue(userRepertoireAtom); - const customization = useAtomValue(customGlyphAtom); const remove = useRemoveAtom(primitiveRepertoireAtom); const removeUser = useRemoveAtom(userRepertoireAtom); - const removeCustom = useRemoveAtom(customGlyphAtom); const char = String.fromCodePoint(unicode); return ( { if (remote) { const res = await remoteRemove(unicode); @@ -229,21 +236,20 @@ export const Delete = ({ unicode }: { unicode: number }) => { } } else { removeUser(char); - removeCustom(char); } }} /> ); }; -export const Add = ({ character }: { character: PrimitiveCharacter }) => { +export const EditGlyph = ({ character }: { character: PrimitiveCharacter }) => { const remote = useContext(RemoteContext); const repertoire = useAtomValue(primitiveRepertoireAtom); const add = useAddAtom(primitiveRepertoireAtom); - const userRepertoire = useAtomValue(userRepertoireAtom); const addUser = useAddAtom(userRepertoireAtom); const customGlyph = useAtomValue(customGlyphAtom); const addCustomization = useAddAtom(customGlyphAtom); + const removeCustomization = useRemoveAtom(customGlyphAtom); const name = String.fromCodePoint(character.unicode); const isCustomization = !remote && repertoire[name] !== undefined; const onFinish = async (component: Component | Compound) => { @@ -268,7 +274,7 @@ export const Add = ({ character }: { character: PrimitiveCharacter }) => { return true; } }; - let items: MenuProps["items"] = [ + const items: MenuProps["items"] = [ { key: -1, label: ( @@ -282,7 +288,7 @@ export const Add = ({ character }: { character: PrimitiveCharacter }) => { ), }, { - key: -2, + key: -3, label: ( { ), }, ]; + if (remote) { + items.unshift({ + key: -2, + label: ( + + ), + }); + } if (isCustomization) { items.unshift( ...character.glyphs.map((x, index) => ({ key: index, label: `选择第 ${index + 1} 个系统字形`, - onClick: () => { - addCustomization(name, x); - }, + onClick: () => addCustomization(name, x), })), ); + if (customGlyph[name] !== undefined) { + items.push({ + key: -3, + label: 取消自定义字形, + onClick: () => removeCustomization(name), + }); + } } return ( - - + + + + ); +}; + +export const EditReading = ({ + character, +}: { + character: PrimitiveCharacter; +}) => { + const remote = useContext(RemoteContext); + const add = useAddAtom(primitiveRepertoireAtom); + const addUser = useAddAtom(userRepertoireAtom); + const repertoire = useAtomValue(primitiveRepertoireAtom); + const customReadings = useAtomValue(customReadingsAtom); + const addCustomReading = useAddAtom(customReadingsAtom); + const removeCustomReading = useRemoveAtom(customReadingsAtom); + const name = String.fromCodePoint(character.unicode); + const readings = customReadings[name] ?? character.readings; + const isCustomization = !remote && repertoire[name] !== undefined; + const onFinish = async ({ readings }: { readings: Reading[] }) => { + if (isCustomization) { + addCustomReading(name, readings); + return true; + } + const newCharacter = { ...character, readings }; + if (remote) { + const res = await remoteUpdate(newCharacter); + if (!errorFeedback(res)) { + add(name, newCharacter); + return true; + } + return false; + } else { + addUser(name, newCharacter); + return true; + } + }; + const items: MenuProps["items"] = [ + { + key: -1, + label: ( + + ), + }, + ]; + if (isCustomization && customReadings[name] !== undefined) { + items.push({ + key: -2, + label: 取消自定义字音, + onClick: () => removeCustomReading(name), + }); + } + return ( + + ); }; diff --git a/src/components/Algebra.tsx b/src/components/Algebra.tsx index 8e0afad..28cf29c 100644 --- a/src/components/Algebra.tsx +++ b/src/components/Algebra.tsx @@ -1,25 +1,22 @@ -import { PlusOutlined } from "@ant-design/icons"; import { ModalForm, - ProForm, ProFormGroup, ProFormList, ProFormSelect, ProFormText, } from "@ant-design/pro-components"; import { Button, Form, Space, notification } from "antd"; -import { CloseCircleOutlined, CopyOutlined } from "@ant-design/icons"; -import { Rule } from "~/lib"; -import { useAtom } from "jotai"; +import type { Rule } from "~/lib"; import { algebraAtom, useAddAtom } from "~/atoms"; import { defaultAlgebra } from "~/lib"; +import { ArrowDownOutlined, ArrowUpOutlined } from "@ant-design/icons"; interface AlgebraForm { name: string; rules: Rule[]; } -export default function ({ +export default function Algebra({ title, initialValues, disabled, @@ -29,7 +26,6 @@ export default function ({ disabled?: boolean; }) { const [form] = Form.useForm(); - const [algebra, setAlgebra] = useAtom(algebraAtom); const addAlgebra = useAddAtom(algebraAtom); return ( @@ -73,10 +69,32 @@ export default function ({ { + return [ + ...defaultActionDom, + { + if (field.name === 0) { + action.move(field.name, count - 1); + } else { + action.move(field.name, field.name - 1); + } + }} + />, + { + if (field.name === count - 1) { + action.move(field.name, 0); + } else { + action.move(field.name, field.name + 1); + } + }} + />, + ]; }} > diff --git a/src/components/AnalysisCustomizer.tsx b/src/components/AnalysisCustomizer.tsx deleted file mode 100644 index 065eb6d..0000000 --- a/src/components/AnalysisCustomizer.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { useState, memo, useCallback } from "react"; -import { - useSetAtom, - useAtomValue, - analysisAtom, - displayAtom, - useAddAtom, - customizeAtom, - useRemoveAtom, -} from "~/atoms"; -import { Button, Flex, Popover } from "antd"; -import { DeleteButton, MinusButton, PlusButton } from "./Utils"; -import Char from "./Character"; -import Root from "./Element"; -import ElementSelect, { ElementSelectProps } from "./ElementSelect"; -import { GlyphSelect } from "./CharacterSelect"; - -function RootSelectPopover(props: ElementSelectProps) { - const display = useAtomValue(displayAtom); - const [open, setOpen] = useState(false); - return ( - setOpen(v)} - trigger="hover" - content={ - { - props.onChange(v); - setOpen(false); - }} - /> - } - > - {display(props.char!)} - - ); -} - -const EachSequence = ({ - component, - sequencejoin, - display, -}: { - component: string; - sequencejoin: string; - display: Function; -}) => { - const sequence = sequencejoin.split(" "); - const addCustomization = useAddAtom(customizeAtom); - const removeCustomization = useRemoveAtom(customizeAtom); - - return ( - - {display(component)} - - {sequence.map((x, i) => ( - - addCustomization( - component, - sequence.map((y, j) => (i === j ? s : y)), - ) - } - /> - ))} - addCustomization(component, sequence.concat("1"))} - /> - - addCustomization(component, sequence.slice(0, sequence.length - 1)) - } - /> - removeCustomization(component)} /> - - - ); -}; - -const MemoEachSequence = memo(EachSequence); - -const AnalysisCustomizer = () => { - const customize = useAtomValue(analysisAtom)?.customize ?? {}; - const display = useAtomValue(displayAtom); - const [newCustomization, setNew] = useState(undefined); - const addCustomization = useAddAtom(customizeAtom); - return ( - - {Object.entries(customize).map(([component, sequence]) => ( - - ))} - - { - return glyph.glyph?.type === "basic_component"; - }} - /> - - - - ); -}; - -export default AnalysisCustomizer; diff --git a/src/components/CharacterQuery.tsx b/src/components/CharacterQuery.tsx index 6d0f143..97745dd 100644 --- a/src/components/CharacterQuery.tsx +++ b/src/components/CharacterQuery.tsx @@ -1,5 +1,6 @@ -import { Form, Input } from "antd"; -import { Operator, PrimitiveRepertoire, Repertoire, operators } from "~/lib"; +import { Form } from "antd"; +import type { CharacterFilter } from "~/lib"; +import { operators } from "~/lib"; import { ProFormDigit, ProFormSelect, @@ -14,71 +15,14 @@ interface StrokeSearchProps { setFilter: (s: CharacterFilter) => void; } -export const makeCharacterFilter = - ( - input: CharacterFilter, - repertoire: Repertoire | PrimitiveRepertoire, - sequence: Map, - ) => - (char: string) => { - const character = repertoire[char]; - if (character === undefined) return false; - const name = character.name ?? ""; - const seq = sequence.get(char) ?? ""; - const isNameMatched = (name + char).includes(input.name ?? ""); - const isSequenceMatched = seq.startsWith(input.sequence ?? ""); - const isUnicodeMatched = - input.unicode === undefined || input.unicode === char.codePointAt(0); - const isTagMatched = - input.tag === undefined || - ("glyphs" in character && - character.glyphs.some((x) => x.tags?.includes(input.tag!))) || - ("glyph" in character && character.glyph?.tags?.includes(input.tag)); - const isOperatorMatched = - input.operator === undefined || - ("glyphs" in character && - character.glyphs.some( - (x) => "operator" in x && x.operator.includes(input.operator!), - )) || - ("glyph" in character && - character.glyph?.type === "compound" && - character.glyph.operator.includes(input.operator)); - const isPartMatched = - input.part === undefined || - ("glyphs" in character && - character.glyphs.some( - (x) => "operandList" in x && x.operandList.includes(input.part!), - )) || - ("glyph" in character && - character.glyph?.type === "compound" && - character.glyph.operandList.includes(input.part)); - return ( - isNameMatched && - isSequenceMatched && - isUnicodeMatched && - isTagMatched && - isOperatorMatched && - isPartMatched - ); - }; - -export interface CharacterFilter { - name?: string; - sequence?: string; - unicode?: number; - tag?: string; - part?: string; - operator?: Operator; -} - -export default function ({ setFilter }: StrokeSearchProps) { +export default function CharacterQuery({ setFilter }: StrokeSearchProps) { const tags = useAtomValue(tagsAtom); return ( onValuesChange={async (_, values) => setFilter(values)} - labelWidth="auto" submitter={false} style={{ maxWidth: 1080 }} + autoFocusFirstInput={false} > diff --git a/src/components/CharacterSearch.tsx b/src/components/CharacterSearch.tsx index 993bc7c..36fe413 100644 --- a/src/components/CharacterSearch.tsx +++ b/src/components/CharacterSearch.tsx @@ -1,23 +1,15 @@ import { Input } from "antd"; import SearchOutlined from "@ant-design/icons/SearchOutlined"; -import { Repertoire } from "~/lib"; interface StrokeSearchProps { setSequence: (s: string) => void; disabled?: boolean; } -export const makeFilter = - (input: string, form: Repertoire, sequence: Map) => - (char: string) => { - let name = form[char]?.name ?? ""; - let seq = sequence.get(char) ?? ""; - return ( - name.includes(input) || char.includes(input) || seq.startsWith(input) - ); - }; - -export default function ({ setSequence, disabled }: StrokeSearchProps) { +export default function CharacterSearch({ + setSequence, + disabled, +}: StrokeSearchProps) { return ( boolean; @@ -20,14 +20,14 @@ export const GlyphSelect = (props: ItemSelectProps & ProFormSelectProps) => { useEffect(() => { const initial = char ? [{ value: char, label: display(char) }] : []; setData(initial); - }, [props.value]); + }, [props.value, char, display]); const onSearch = (input: string) => { if (input.length === 0) { setData([]); return; } const allResults = sortedRepertoire - .filter(props.customFilter ?? ((_) => true)) + .filter(customFilter ?? (() => true)) .map(([x]) => ({ value: x, label: display(x), diff --git a/src/components/CharacterTable.tsx b/src/components/CharacterTable.tsx index 62940bc..cc01fd5 100644 --- a/src/components/CharacterTable.tsx +++ b/src/components/CharacterTable.tsx @@ -1,5 +1,5 @@ -import React, { useContext, useRef, useState } from "react"; -import { isPUA, unicodeBlock } from "~/lib"; +import { useContext, useRef, useState } from "react"; +import { isPUA, makeCharacterFilter, unicodeBlock } from "~/lib"; import { Checkbox, Flex, @@ -8,11 +8,11 @@ import { Space, Tooltip, Tour, - Typography, } from "antd"; import type { ColumnType, ColumnsType } from "antd/es/table"; import Table from "antd/es/table"; import { + RemoteContext, allRepertoireAtom, customGlyphAtom, customReadingsAtom, @@ -25,33 +25,46 @@ import { userRepertoireAtom, userTagsAtom, } from "~/atoms"; -import type { PrimitiveCharacter } from "~/lib"; +import type { CharacterFilter, PrimitiveCharacter, Reading } from "~/lib"; import { - Add, + EditGlyph, Create, Delete, Mutate, QuickPatchAmbiguous, - RemoteContext, + EditReading, } from "~/components/Action"; import ComponentForm from "./ComponentForm"; import CompoundForm from "./CompoundForm"; import { remoteUpdate } from "~/api"; -import { DeleteButton, PlusButton } from "./Utils"; -import Root from "./Element"; +import { DeleteButton } from "./Utils"; +import Element from "./Element"; import * as O from "optics-ts/standalone"; -import CharacterQuery, { - CharacterFilter, - makeCharacterFilter, -} from "./CharacterQuery"; +import CharacterQuery from "./CharacterQuery"; import TagPicker from "./TagPicker"; import { findGlyphIndex } from "~/lib"; -import { TourProps } from "antd/lib"; +import type { TourProps } from "antd/lib"; import { QuestionCircleOutlined } from "@ant-design/icons"; type Column = ColumnType; -const CharacterTable = () => { +function ReadingList({ readings }: { readings: Reading[] }) { + return ( + + {readings.map((reading, index) => { + const core = {reading.pinyin}; + if (readings.length === 1) return core; + return ( + + {core} + + ); + })} + + ); +} + +export default function CharacterTable() { const allRepertoire = useAtomValue(allRepertoireAtom); const userRepertoire = useAtomValue(userRepertoireAtom); const addUser = useAddAtom(userRepertoireAtom); @@ -130,17 +143,7 @@ const CharacterTable = () => { const readings: Column = { title: "系统字音", dataIndex: "readings", - render: (_, record) => { - return ( - - {record.readings.map((reading, index) => { - const core = {reading.pinyin}; - if (record.readings.length === 1) return core; - return {core}; - })} - - ); - }, + render: (_, record) => , width: 128, }; @@ -198,7 +201,7 @@ const CharacterTable = () => { ) : ( { @@ -230,8 +233,17 @@ const CharacterTable = () => { return as.localeCompare(bs); }, sortDirections: ["ascend", "descend"], - filters: [{ text: "无字形", value: 1 }], - onFilter: (_, record) => record.glyphs.length === 0, + }; + + const customReadingsColumn: Column = { + title: "自定义字音", + render: (_, character) => { + const maybeReadings = + customReadings[String.fromCodePoint(character.unicode)]; + if (maybeReadings === undefined) return null; + return ; + }, + width: 128, }; const customGlyphColumn: Column = { @@ -258,7 +270,7 @@ const CharacterTable = () => { /> ) : ( { @@ -271,12 +283,7 @@ const CharacterTable = () => { ); }, - width: 192, - sorter: (a, b) => { - const [as, bs] = [JSON.stringify(a.glyphs), JSON.stringify(b.glyphs)]; - return as.localeCompare(bs); - }, - sortDirections: ["ascend", "descend"], + width: 128, }; const ambiguous: Column = { @@ -298,7 +305,8 @@ const CharacterTable = () => { key: "option", render: (_, record) => ( - + + @@ -358,6 +366,7 @@ const CharacterTable = () => { unicodeColumn, readings, glyphs, + customReadingsColumn, customGlyphColumn, operations, ]; @@ -374,7 +383,7 @@ const CharacterTable = () => { - {}} ref={ref3} /> + {}} ref={ref3} />
@@ -404,6 +413,4 @@ const CharacterTable = () => {
); -}; - -export default CharacterTable; +} diff --git a/src/components/Classifier.tsx b/src/components/Classifier.tsx index d2d6e46..0a18c10 100644 --- a/src/components/Classifier.tsx +++ b/src/components/Classifier.tsx @@ -4,15 +4,14 @@ import { customClassifierAtom, useAddAtom, useAtomValue, - useSetAtom, } from "~/atoms"; import { Button, Flex, Space, notification } from "antd"; -import Root from "~/components/Element"; +import Element from "~/components/Element"; import { DndContext, useDraggable, useDroppable } from "@dnd-kit/core"; import type { PropsWithChildren } from "react"; import { useState } from "react"; import { blue } from "@ant-design/colors"; -import { Feature } from "~/lib"; +import type { Feature } from "~/lib"; function Draggable({ name }: { name: string }) { const { attributes, listeners, setNodeRef, transform } = useDraggable({ @@ -25,9 +24,9 @@ function Draggable({ name }: { name: string }) { : undefined; return ( - + {name} - + ); } @@ -54,7 +53,7 @@ const Droppable = ({ id, children }: PropsWithChildren<{ id: number }>) => { ); }; -const Classifier = () => { +export default function Classifier() { const classifier = useAtomValue(customClassifierAtom); const add = useAddAtom(classifierCustomizationAtom); const [categories, setCategories] = useState( @@ -82,7 +81,7 @@ const Classifier = () => { {items.map(([x, v]) => ( - {x} + {x} {v.map((s) => ( @@ -112,6 +111,4 @@ const Classifier = () => { ); -}; - -export default Classifier; +} diff --git a/src/components/ComponentForm.tsx b/src/components/ComponentForm.tsx index df401cf..0b3f66e 100644 --- a/src/components/ComponentForm.tsx +++ b/src/components/ComponentForm.tsx @@ -1,38 +1,36 @@ -import { - Button, - Flex, - Form, - Dropdown, - notification, - FormListFieldData, -} from "antd"; -import { EditorColumn, EditorRow, NumberInput } from "./Utils"; -import { MutableRefObject, ReactNode, useRef } from "react"; -import type { PrimitiveCharacter, Component, Character } from "~/lib"; +import type { FormListFieldData, MenuProps } from "antd"; +import { Button, Dropdown, Flex, Form } from "antd"; +import { EditorColumn, EditorRow } from "./Utils"; +import type { MutableRefObject, ReactNode } from "react"; +import { useRef } from "react"; +import type { Character, Component, SVGStroke } from "~/lib"; import type { Feature } from "~/lib"; import { getDummySVGStroke, schema } from "~/lib"; import { getDummyReferenceStroke, isComponent } from "~/lib"; import { allRepertoireAtom, useAtomValue } from "~/atoms"; import { GlyphSelect } from "./CharacterSelect"; +import type { + ProFormInstance, + ProFormListProps, +} from "@ant-design/pro-components"; import { - ModalForm, + ModalForm as _ModalForm, ProFormDependency, ProFormDigit, ProFormGroup, - ProFormInstance, ProFormList, - ProFormListProps, ProFormSelect, } from "@ant-design/pro-components"; import styled from "styled-components"; import { CommonForm } from "./CompoundForm"; -import Root from "./Element"; +import Element from "./Element"; import { recursiveRenderComponent } from "~/lib"; import { Box, StrokesView } from "./GlyphView"; -import { BaseOptionType } from "antd/es/select"; +import type { BaseOptionType } from "antd/es/select"; +import { ArrowDownOutlined, ArrowUpOutlined } from "@ant-design/icons"; const Digit = ({ name }: { name: (string | number)[] }) => ( - + ); const InlineFlex = styled.div` @@ -40,6 +38,25 @@ const InlineFlex = styled.div` margin-right: 8px; `; +const ModalForm = styled(_ModalForm)` + & .ant-pro-form-list-action { + margin: 0; + } + + & .ant-pro-form-list-item { + justify-content: space-between !important; + align-items: center !important; + } + + & .ant-form-item { + margin-bottom: 8px; + } + + & .ant-pro-form-list > .ant-form-item { + margin-bottom: 0; + } +`; + export const InlineRender = ({ listDom, action, @@ -72,10 +89,11 @@ const strokeOptions = Object.keys(schema).map((x) => ({ label: x, })); const classifiedStrokeOptions: BaseOptionType[] = [ - { key: 0, label: "基本", children: strokeOptions.slice(0, 10) }, - { key: 1, label: "折类 I", children: strokeOptions.slice(10, 23) }, - { key: 2, label: "折类 II", children: strokeOptions.slice(23, 30) }, - { key: 4, label: "折类 III", children: strokeOptions.slice(30) }, + { key: 0, label: "横竖", children: strokeOptions.slice(0, 4) }, + { key: 1, label: "撇点", children: strokeOptions.slice(4, 11) }, + { key: 2, label: "折类 I", children: strokeOptions.slice(11, 24) }, + { key: 3, label: "折类 II", children: strokeOptions.slice(24, 31) }, + { key: 4, label: "折类 III", children: strokeOptions.slice(31) }, ]; const referenceOption: BaseOptionType = { label: "引用笔画", @@ -93,10 +111,9 @@ const StrokeForm = ({ }) => { return ( <> - + name="feature" - style={{ width: "96px" }} options={[referenceOption].concat(classifiedStrokeOptions)} disabled allowClear={false} @@ -129,13 +146,21 @@ const StrokeForm = ({ ) } - +
{({ feature }) => feature !== "reference" ? ( - - + + {({ command }) => command === "c" || command === "z" ? ( @@ -163,7 +188,7 @@ const StrokeForm = ({ ); }; -const ComponentForm = ({ +export default function ComponentForm({ title, initialValues, current, @@ -179,14 +204,14 @@ const ComponentForm = ({ noButton?: boolean; primary?: boolean; readonly?: boolean; -}) => { +}) { const repertoire = useAtomValue(allRepertoireAtom); const trigger = noButton ? ( {title} ) : ( - {title} + {title} ); - const isValidSource = ([name, _]: [string, Character]) => { + const isValidSource = ([name]: [string, Character]) => { let component: Component | undefined = repertoire[name]?.glyphs.find(isComponent); if (component === undefined) return false; @@ -214,8 +239,8 @@ const ComponentForm = ({ formRef={formRef} > - - + + {(props) => { const component = props as Component; @@ -226,13 +251,21 @@ const ComponentForm = ({ return ( { + const projection = component.strokes.map((x, index) => + x.feature === "reference" ? x : g[index]!, + ); + formRef.current?.setFieldsValue({ + strokes: projection, + }); + }} /> ); }} - + {({ type }) => @@ -256,25 +289,80 @@ const ComponentForm = ({ .length ?? 0 : 0; return ( - - {(meta, index) => { - return ( + <> + { + return [ + ...defaultActionDom, + { + if (field.name === 0) { + action.move(field.name, count - 1); + } else { + action.move(field.name, field.name - 1); + } + }} + />, + { + if (field.name === count - 1) { + action.move(field.name, 0); + } else { + action.move(field.name, field.name + 1); + } + }} + />, + ]; + }} + > + {(meta) => ( - ); - }} - + )} + + + { + const newStroke = getDummySVGStroke( + item.key as Feature, + ); + formRef.current?.setFieldValue( + "strokes", + formRef.current + ?.getFieldValue("strokes") + ?.concat(newStroke), + ); + }, + }} + > + + + + + ); }} @@ -282,6 +370,4 @@ const ComponentForm = ({ ); -}; - -export default ComponentForm; +} diff --git a/src/components/CompoundForm.tsx b/src/components/CompoundForm.tsx index 067653e..eb14635 100644 --- a/src/components/CompoundForm.tsx +++ b/src/components/CompoundForm.tsx @@ -1,4 +1,4 @@ -import { AutoComplete, Button, Flex, Form, Typography } from "antd"; +import { Button, Flex, Form } from "antd"; import type { Compound } from "~/lib"; import { operators } from "~/lib"; import { useWatch } from "antd/es/form/Form"; @@ -13,7 +13,7 @@ import { import { InlineRender, StaticList } from "./ComponentForm"; import { useAtomValue } from "jotai"; import { repertoireAtom, tagsAtom } from "~/atoms"; -import Root from "./Element"; +import Element from "./Element"; import { EditorColumn, EditorRow } from "./Utils"; import { Box, StrokesView } from "./GlyphView"; import { recursiveRenderCompound } from "~/lib"; @@ -32,33 +32,17 @@ export const CommonForm = () => { ]} disabled /> - "标签"} - > - {(meta) => ( - - ({ label: x, value: x }))} - /> - - )} - + mode="tags" + options={tags.map((x) => ({ label: x, value: x }))} + /> ); }; -const CompoundForm = ({ +export default function CompoundForm({ title, initialValues, onFinish, @@ -72,14 +56,14 @@ const CompoundForm = ({ noButton?: boolean; primary?: boolean; readonly?: boolean; -}) => { +}) { const repertoire = useAtomValue(repertoireAtom); const [form] = Form.useForm(); const list: string[] = useWatch("operandList", form); const trigger = noButton ? ( {title} ) : ( - {title} + {title} ); return ( @@ -119,7 +103,7 @@ const CompoundForm = ({ { const newLength = value === "⿲" || value === "⿳" ? 3 : 2; const newList = list.concat("一").slice(0, newLength); @@ -128,9 +112,9 @@ const CompoundForm = ({ options={operators.map((x) => ({ value: x, label: x }))} style={{ width: "96px" }} allowClear={false} - > - - {(meta, i) => ( + /> + + {(meta) => ( @@ -139,7 +123,7 @@ const CompoundForm = ({ ({ + options={[...Array(12).keys()].map((x) => ({ value: x, label: x === 0 ? "取剩余全部" : `取 ${x} 笔`, }))} @@ -163,10 +147,17 @@ const CompoundForm = ({ />
+ + + ); -}; - -export default CompoundForm; +} diff --git a/src/components/ConfigManager.tsx b/src/components/ConfigManager.tsx index 4737af1..f6ab8e1 100644 --- a/src/components/ConfigManager.tsx +++ b/src/components/ConfigManager.tsx @@ -1,5 +1,5 @@ -import { Button, Flex, notification } from "antd"; -import { configAtom, useAtom, validateConfig } from "~/atoms"; +import { Button, Flex } from "antd"; +import { configAtom, roundTestConfig, useAtom, validateConfig } from "~/atoms"; import { examples, exportYAML } from "~/lib"; export default function ConfigManager() { @@ -8,6 +8,7 @@ export default function ConfigManager() { return ( + diff --git a/src/components/Debugger.tsx b/src/components/Debugger.tsx index 81ba034..c17fdee 100644 --- a/src/components/Debugger.tsx +++ b/src/components/Debugger.tsx @@ -1,18 +1,25 @@ -import { - Button, - Flex, - Form, - Radio, - Space, - Statistic, - Switch, - Table, - Typography, - notification, -} from "antd"; +import { Flex, Form, Statistic, Switch, Table } from "antd"; +import type { ColumnsType } from "antd/es/table"; +import { useAtom, useAtomValue } from "jotai"; +import { atomWithStorage } from "jotai/utils"; +import { useMemo, useState } from "react"; +import { charactersAtom, configAtom, repertoireAtom } from "~/atoms"; +import { encodeResultAtom } from "~/atoms"; import { Select, Uploader } from "~/components/Utils"; +import type { DictEntry } from "~/lib"; +import { getSupplemental } from "~/lib"; -export default function () { +interface DictEntryWithReference extends DictEntry { + reference: string[]; + status: "correct" | "incorrect" | "unknown"; + hash: string; +} + +export default function Debugger() { + const config = useAtomValue(configAtom); + const repertoire = useAtomValue(repertoireAtom); + const characters = useAtomValue(charactersAtom); + const [code] = useAtomValue(encodeResultAtom); const referenceAtom = useMemo( () => atomWithStorage>( @@ -23,11 +30,11 @@ export default function () { ); const [reference, setReference] = useAtom(referenceAtom); - const [debug, setDebug] = useState(false); + const [incorrectOnly, setIncorrectOnly] = useState(false); const filterOptions = ["成字部件", "非成字部件", "所有汉字"] as const; const [filterOption, setFilterOption] = useState("所有汉字"); type FilterOption = (typeof filterOptions)[number]; - const supplemental = getSupplemental(repertoire, list); + const supplemental = getSupplemental(repertoire, characters); const filterMap: Record boolean> = { 成字部件: (char) => repertoire[char]?.glyph?.type === "basic_component", 非成字部件: (char) => supplemental.includes(char), @@ -38,28 +45,51 @@ export default function () { let correct = 0; let incorrect = 0; let unknown = 0; - if (debug && dataSource && mode === "character") { - dataSource = dataSource.filter(({ item, full }) => { - if (!filterFn(item)) return false; - const codes = reference[item]; - if (codes === undefined) { + let dataSource: DictEntryWithReference[] = code + .filter((x) => [...x.name].length === 1 && filterFn(x.name)) + .map((x) => { + const codes = reference[x.name] ?? []; + const hash = `${x.name}-${x.full}`; + let status: "correct" | "incorrect" | "unknown" = "unknown"; + if (codes.length === 0) { unknown += 1; - return false; - } else if (!codes.includes(full)) { + } else if (!codes.includes(x.full)) { incorrect += 1; - return true; + status = "incorrect"; } else { correct += 1; - return false; + status = "correct"; } + return { ...x, reference: codes, status, hash }; }); + + if (incorrectOnly) { + dataSource = dataSource.filter((x) => x.status === "incorrect"); } + const columns: ColumnsType = [ + { + title: "字符", + dataIndex: "name", + key: "name", + }, + { + title: "全码", + dataIndex: "full", + key: "full", + }, + { + title: "参考全码", + dataIndex: "reference", + key: "reference", + render: (codes) => codes.join(", "), + }, + ]; + return ( <> 校对模式 - x.split("\t")); + .map((x) => x.trim().split("\t")); for (const line of tsv) { const [key, value] = line; if (key !== undefined && value !== undefined) { - ref[key] = [value]; + ref[key] = (ref[key] ?? []).concat(value); } } setReference(ref); @@ -81,35 +111,42 @@ export default function () { {reference !== undefined && `已加载码表,条数:${Object.keys(reference).length}`} - {debug && ( - - - ({ label: x, value: x }))} + onChange={setFilterOption} + /> + + + + + + + + + - )} + + ); } diff --git a/src/components/Degenerator.tsx b/src/components/Degenerator.tsx index 27000ed..1cfbbc0 100644 --- a/src/components/Degenerator.tsx +++ b/src/components/Degenerator.tsx @@ -1,60 +1,60 @@ -import { Button, Checkbox, Flex, Typography } from "antd"; +import { Button } from "antd"; +import { degeneratorAtom, useAtom } from "~/atoms"; +import type { Feature } from "~/lib"; +import { classifier } from "~/lib"; import { - useAtomValue, - useSetAtom, - useAddAtom, - degeneratorAtom, - useRemoveAtom, - degeneratorFeatureAtom, - degeneratorNoCrossAtom, -} from "~/atoms"; -import { DeleteButton, Select } from "./Utils"; -import { classifier, Feature } from "~/lib"; -import { useState } from "react"; + ModalForm, + ProFormGroup, + ProFormList, + ProFormSelect, + ProFormSwitch, +} from "@ant-design/pro-components"; -const Degenerator = () => { - const degenerator = useAtomValue(degeneratorAtom); - const addFeature = useAddAtom(degeneratorFeatureAtom); - const removeFeature = useRemoveAtom(degeneratorFeatureAtom); - const switchNoCross = useSetAtom(degeneratorNoCrossAtom); - const [feature, setFeature] = useState("横"); +export default function Degenerator() { + const [degenerator, setDegenerator] = useAtom(degeneratorAtom); + const initialValue = { + no_cross: degenerator.no_cross, + feature: Object.entries(degenerator.feature ?? {}).map(([from, to]) => ({ + from, + to, + })), + }; const options = Object.keys(classifier).map((feature) => ({ label: feature, value: feature, })); return ( - <> - 字根认同 - - {Object.entries(degenerator.feature ?? {}).map(([from, to]) => ( - - 认为 - {from as Feature} - 与 - - value={to} - options={options} - onChange={(value) => addFeature(from as Feature, value)} - /> - 相同 - removeFeature(from as Feature)} /> - - ))} - - ({ @@ -76,6 +77,4 @@ const ElementAdder = ({ element }: { element?: string }) => { ); -}; - -export default ElementAdder; +} diff --git a/src/components/ElementPicker.tsx b/src/components/ElementPicker.tsx index f7f6841..b4054ad 100644 --- a/src/components/ElementPicker.tsx +++ b/src/components/ElementPicker.tsx @@ -1,30 +1,20 @@ -import { Button, Flex, Tabs } from "antd"; +import { Button, Cascader, Flex, Popover, Typography } from "antd"; import { useState } from "react"; import ElementAdder from "./ElementAdder"; import ElementPool from "./ElementPool"; -import styled from "styled-components"; import { algebraAtom, customClassifierAtom, - repertoireAtom, + processedCustomElementsAtom, sortedRepertoireAtom, useAtomValue, useRemoveAtom, } from "~/atoms"; import Algebra from "./Algebra"; -import { PronunciationElementTypes, applyRules, defaultAlgebra } from "~/lib"; +import type { PronunciationElementTypes } from "~/lib"; import { operators } from "~/lib"; - -interface ElementPickerProps { - content: Map; - editable?: boolean; -} - -const Wrapper = styled(Tabs)` - & .ant-tabs-nav-wrap { - transform: none !important; - } -`; +import { phonemeEnumerationAtom } from "~/atoms"; +import QuestionCircleOutlined from "@ant-design/icons/QuestionCircleOutlined"; const AlgebraEditor = function ({ type, @@ -61,8 +51,34 @@ const AlgebraEditor = function ({ const shapeElementTypes = ["字根", "笔画", "二笔", "结构"] as const; export type ShapeElementTypes = (typeof shapeElementTypes)[number]; -export const ShapeElementPicker = function () { +interface Option { + value: string | number; + label: string; + children?: Option[]; + disabled?: boolean; +} + +const pronunciationElementsDescription = ( +
    +
  • + 「声母」和「韵母」是按照《汉语拼音方案》中所规定的声母和韵母来切分一个音节,例如 + yan 分析为零声母 + ian; +
  • +
  • + 「双拼声母」和「双拼韵母」是按照自然码等双拼方案中的习惯来切分一个音节,例如 + yan 分析为 y + an; +
  • +
  • 「首字母」和「末字母」是二笔和形音码等方案中采取的元素类型;
  • +
  • 您可利用拼写运算创造新的字音元素类型。
  • +
+); + +type PrimaryTypes = "shape" | "pronunciation" | "custom"; + +const useAllElements = () => { const customizedClassifier = useAtomValue(customClassifierAtom); + const pronunciationElements = useAtomValue(phonemeEnumerationAtom); + const customElements = useAtomValue(processedCustomElementsAtom); const sortedForm = useAtomValue(sortedRepertoireAtom); const allStrokes = Array.from(new Set(Object.values(customizedClassifier))) .sort() @@ -71,89 +87,82 @@ export const ShapeElementPicker = function () { .map((x) => ["0"].concat(allStrokes).map((y) => x + y)) .flat(); const allGlyph = sortedForm.map(([x]) => x); - const content: Map = new Map([ + const shapeElements: Map = new Map([ ["字根", allGlyph], ["笔画", allStrokes], ["二笔", allErbi], ["结构", [...operators]], ]); - const [element, setElement] = useState(undefined); - const [type, setType] = useState("字根"); - return ( - - { - return { - label: name, - key: name, - children: ( - - ), - }; - })} - onChange={(e) => { - setType(e as ShapeElementTypes); - }} - /> - - - ); + const elements: Record> = { + shape: shapeElements, + pronunciation: pronunciationElements, + custom: customElements, + }; + return elements; }; -export const PronElementPicker = function () { - const characters = useAtomValue(repertoireAtom); - const algebra = useAtomValue(algebraAtom); +export default function ElementPicker() { const [element, setElement] = useState(undefined); - const [type, setType] = useState("声母"); - const syllables = [ - ...new Set( - Object.values(characters) - .map((x) => x.readings.map((y) => y.pinyin)) - .flat(), - ), + const [types, setTypes] = useState<[string, string]>(["shape", "字根"]); + const elements = useAllElements(); + const { shape, pronunciation, custom } = elements; + const [primary, secondary] = types; + const currentElements = elements[primary as PrimaryTypes].get(secondary)!; + const options: Option[] = [ + { + value: "shape", + label: "字形", + children: [...shape.keys()].map((v) => ({ + value: v, + label: v, + })), + }, + { + value: "pronunciation", + label: "字音", + children: [...pronunciation.keys()].map((v) => ({ + value: v, + label: v, + })), + }, + { + value: "custom", + label: "自定义", + children: [...custom.keys()].map((v) => ({ + value: v, + label: v, + })), + disabled: custom.size === 0, + }, ]; - const mergedAlgebras = [ - ...Object.entries(defaultAlgebra), - ...Object.entries(algebra), - ]; - const content: Map = new Map( - mergedAlgebras.map(([name, rules]) => { - const list = [ - ...new Set(syllables.map((s) => applyRules(name, rules, s))), - ].sort(); - return [name as PronunciationElementTypes, list]; - }), - ); return ( - - - { - return { - label: name, - key: name, - children: ( - - ), - }; - })} - onChange={(e) => { - setType(e as PronunciationElementTypes); - }} + + 元素选择器 + + 元素类型: + setTypes(x as [string, string])} + options={options} + /> + + + + + {primary === "pronunciation" && ( + setTypes(["pronunciation", s])} + /> + )} + ); -}; +} diff --git a/src/components/ElementPool.tsx b/src/components/ElementPool.tsx index c59f04e..e98ed1c 100644 --- a/src/components/ElementPool.tsx +++ b/src/components/ElementPool.tsx @@ -1,4 +1,5 @@ -import { useState } from "react"; +import type { FC } from "react"; +import { memo, useState } from "react"; import styled from "styled-components"; import Char from "./Character"; import { Button, Flex, Modal, Pagination, Popover, Typography } from "antd"; @@ -10,12 +11,13 @@ import { keyboardAtom, glyphAtom, } from "~/atoms"; -import { isPUA } from "~/lib"; +import { isPUA, makeFilter } from "~/lib"; import { StrokesView } from "./GlyphView"; -import StrokeSearch, { makeFilter } from "./CharacterSearch"; -import { ShapeElementTypes } from "./ElementPicker"; -import { PronunciationElementTypes } from "~/lib"; +import StrokeSearch from "./CharacterSearch"; +import type { ShapeElementTypes } from "./ElementPicker"; +import type { PronunciationElementTypes } from "~/lib"; import Classifier from "./Classifier"; +import { useDraggable } from "@dnd-kit/core"; const Content = styled(Flex)` padding: 8px; @@ -27,26 +29,27 @@ interface PoolProps { element?: string; setElement: (s: string | undefined) => void; content: string[]; - name: ShapeElementTypes | PronunciationElementTypes; + name: ShapeElementTypes | PronunciationElementTypes | string; } -const Element = ({ - element: x, - setElement, - currentElement, -}: { +interface ElementProps { element: string; setElement: (s: string | undefined) => void; currentElement?: string; +} + +const Element: FC = ({ + element: x, + setElement, + currentElement, }) => { const keyboard = useAtomValue(keyboardAtom); const { mapping, grouping } = keyboard; - const determiedRepertoire = useAtomValue(repertoireAtom); const glyphMap = useAtomValue(glyphAtom); const type = x === currentElement ? "primary" - : mapping[x] || grouping[x] + : mapping[x] || grouping?.[x] ? "link" : "default"; const display = useAtomValue(displayAtom); @@ -64,7 +67,9 @@ const Element = ({ return ( {} +
+ +
} > {core} @@ -74,20 +79,41 @@ const Element = ({ const MyPagination = styled(Pagination)``; -const ElementPool = ({ element, setElement, content, name }: PoolProps) => { +const DraggableElement = memo((props: ElementProps) => { + const { attributes, listeners, setNodeRef, transform } = useDraggable({ + id: props.element, + }); + const style = transform + ? { + transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`, + } + : undefined; + + return ( +
+ +
+ ); +}); + +export default function ElementPool({ + element, + setElement, + content, + name, +}: PoolProps) { const [page, setPage] = useState(1); const pageSize = 100; const [sequence, setSequence] = useState(""); const sequenceMap = useAtomValue(sequenceAtom); const determinedRepertoire = useAtomValue(repertoireAtom); - const filtered = - name === "字根" - ? content.filter( - (x) => - makeFilter(sequence, determinedRepertoire, sequenceMap)(x) && - (sequenceMap.get(x)?.length ?? 0) > 1, - ) - : content; + const filter = makeFilter(sequence, determinedRepertoire, sequenceMap); + const filtered = name === "字根" ? content.filter(filter) : content; const range = filtered.slice((page - 1) * pageSize, page * pageSize); const [isOpen, setOpen] = useState(false); return ( @@ -132,6 +158,4 @@ const ElementPool = ({ element, setElement, content, name }: PoolProps) => { )}
); -}; - -export default ElementPool; +} diff --git a/src/components/ElementSelect.tsx b/src/components/ElementSelect.tsx index 97d6844..aa26271 100644 --- a/src/components/ElementSelect.tsx +++ b/src/components/ElementSelect.tsx @@ -6,22 +6,19 @@ import { sequenceAtom, } from "~/atoms"; import { Select } from "./Utils"; +import type { SelectProps } from "antd"; +import type { ProFormSelectProps } from "@ant-design/pro-components"; -export interface ElementSelectProps { - char?: string; - onChange: (s: string) => void; +interface ElementSelectProps extends SelectProps { customFilter?: (s: string) => boolean; excludeGrouped?: boolean; onlyRootsAndStrokes?: boolean; } -export default function ElementSelect({ - char, - onChange, - customFilter, - excludeGrouped, - onlyRootsAndStrokes, -}: ElementSelectProps) { +export default function ElementSelect( + props: ElementSelectProps & ProFormSelectProps, +) { + const { customFilter, excludeGrouped, onlyRootsAndStrokes, ...rest } = props; const { mapping, grouping } = useAtomValue(keyboardAtom); const sequenceMap = useAtomValue(sequenceAtom); const repertoire = useAtomValue(repertoireAtom); @@ -38,14 +35,13 @@ export default function ElementSelect({ const display = useAtomValue(displayAtom); return ( setMappingType(event)} - options={[ - { label: "单编码", value: 1 }, - { label: "双编码", value: 2 }, - { label: "三编码", value: 3 }, - { label: "四编码", value: 4 }, - ]} - /> - - {importResult && } - + 键盘映射 + + + !alphabet.includes(x)) + .map((v) => ({ + label: v, + value: v, + }))} + /> + + + + + {importResult && } + + ); +}; + +const MappingRow = memo( + ({ symbol, roots }: { symbol: string; roots: MappedInfo[] }) => { + const [alphabet, setAlphabet] = useAtom(alphabetAtom); + const { isOver, setNodeRef } = useDroppable({ + id: symbol, + }); + const style: CSSProperties = { + backgroundColor: isOver ? "white" : undefined, + }; + return ( + + - { - const record: Record = {}; - const tsv = result - .trim() - .split("\n") - .map((x) => x.trim().split("\t")); - const unknownKeys: string[] = []; - const unknownValues: string[] = []; - for (const line of tsv) { - const [key, value] = line; - if (key === undefined || value === undefined) continue; - const glyph = repertoire[key]?.glyph; - if (glyph === undefined || isPUA(key)) { - unknownKeys.push(key); - continue; - } - if ("strokes" in glyph && glyph.strokes.length == 1) { - unknownKeys.push(key); - continue; - } - if (Array.from(value).some((x) => !alphabet.includes(x))) { - unknownValues.push(key); - continue; - } - record[key] = value.slice(0, mapping_type_default); - } - setMapping((mapping) => ({ ...mapping, ...record })); - setImportResult({ - success: Object.keys(record).length, - unknownKeys, - unknownValues, - }); - }} - text="导入键盘映射" - type="txt" + icon={} /> + {symbol} + + {roots.map(({ name, code }) => ( + + ))} + + ); + }, +); + +export default function Mapping() { + const { mapping } = useAtomValue(keyboardAtom); + const alphabet = useAtomValue(alphabetAtom); + + const reversedMapping = new Map( + Array.from(alphabet).map((key) => [key, []]), + ); + for (const [name, code] of Object.entries(mapping)) { + const main = code[0]; + if (typeof main === "string") { + reversedMapping.get(main)?.push({ name, code }); + } + } + return ( + + { - const [key, roots] = item; - return ( - - } + onFinish={async (values) => { + setWordRules(values.rules); + return true; + }} + > + + + + {({ length_equal, length_in_range }) => { + if (length_equal) + return ( + + ); + if (length_in_range) + return ( + + ); + }} + + + + + + + + + + ); +} diff --git a/src/components/Node.tsx b/src/components/Node.tsx index 3de76f0..f0e16f5 100644 --- a/src/components/Node.tsx +++ b/src/components/Node.tsx @@ -1,26 +1,15 @@ import { Button, Dropdown } from "antd"; -import type { PropsWithChildren } from "react"; -import type { Edge, Node, NodeProps } from "reactflow"; -import { Handle, Position, useReactFlow } from "reactflow"; +import { useContext, type PropsWithChildren } from "react"; +import type { NodeProps } from "reactflow"; +import { Handle, Position } from "reactflow"; import styled from "styled-components"; -import type { - MenuItemGroupType, - MenuItemType, -} from "antd/es/menu/hooks/useItems"; -// import { -// SubMenuType, -// } from "antd/es/menu/hooks/useItems"; import type { SourceData, ConditionData } from "./graph"; -import { - makeEdge, - getLayoutedElements, - makeSourceNode, - sortNodes, - makeConditionNode, - renderType, -} from "./graph"; +import { CacheContext, renderType } from "./graph"; +import type { Condition, Source } from "~/lib"; import { renderName } from "~/lib"; import { blue } from "@ant-design/colors"; +import type { MenuItemGroupType, MenuItemType } from "antd/es/menu/interface"; +import { sortBy } from "lodash-es"; const SourceButton = styled(Button)` width: 64px; @@ -31,6 +20,7 @@ const SourceButton = styled(Button)` &:focus { color: ${blue[4]}; border-color: ${blue[4]}; + outline: 2px solid ${blue[4]}; } `; @@ -38,88 +28,134 @@ const ConditionButton = styled(SourceButton)` border-radius: 0; `; +const sorter = (key: string) => parseInt(key.slice(1), 10); + +const getNewId = (sources: Record, type: "s" | "c") => { + let newId = 0; + const keys = sortBy(Object.keys(sources), sorter); + for (const currentId of keys) { + if (currentId !== `${type}${newId}`) break; + newId += 1; + } + return `${type}${newId}`; +}; + +const sortObject = function (unordered: Record) { + const keys = sortBy(Object.keys(unordered), sorter); + return keys.reduce( + (obj, key) => { + obj[key] = unordered[key]!; + return obj; + }, + {} as Record, + ); +}; + +type Creator = (etype?: "positive" | "negative") => MenuItemType; + const ContextMenu = ({ id, children }: PropsWithChildren<{ id: string }>) => { - const { setNodes, setEdges, getNodes, getEdges } = useReactFlow< - SourceData | ConditionData - >(); - const nodes = getNodes(); - const edges = getEdges(); - const setLayout = (newnodes: Node[], newedges: Edge[]) => { - const [lnodes, ledges] = getLayoutedElements(newnodes, newedges); - setNodes(lnodes); - setEdges(ledges); + const { sources, setSources, conditions, setConditions, setSelected } = + useContext(CacheContext); + if (sources[id] === undefined && conditions[id] === undefined) return null; + const createSourceNode: Creator = (etype) => { + const label = "添加源节点" + (etype ? `(${renderType[etype]})` : ""); + return { + key: `create-source-${etype}`, + label, + onClick: () => { + const newId = getNewId(sources, "s"); + const defaultSource: Source = { object: { type: "汉字" }, next: null }; + const newSources = sortObject({ ...sources, [newId]: defaultSource }); + const newConditions = { ...conditions }; + if (etype === undefined) { + newSources[id] = { ...newSources[id]!, next: newId }; + } else { + newConditions[id] = { + ...newConditions[id]!, + [etype]: newId, + }; + } + setSources(newSources); + setConditions(newConditions); + setSelected(newId); + }, + }; + }; + const createConditionNode: Creator = (etype) => { + const label = "添加条件节点" + (etype ? `(${renderType[etype]})` : ""); + return { + key: `create-condition-${etype}`, + label, + onClick: () => { + const newId = getNewId(conditions, "c"); + const newSources = { ...sources }; + const defaultCondition: Condition = { + object: { type: "汉字" }, + operator: "存在", + positive: null, + negative: null, + }; + const newConditions = sortObject({ + ...conditions, + [newId]: defaultCondition, + }); + if (etype === undefined) { + newSources[id] = { ...newSources[id]!, next: newId }; + } else { + newConditions[id] = { + ...newConditions[id]!, + [etype]: newId, + }; + } + setSources(newSources); + setConditions(newConditions); + setSelected(newId); + }, + }; }; - const createSourceNode: (etype: string | undefined) => MenuItemType = ( - etype, - ) => ({ - key: `create-source-${etype}`, - label: - "添加源节点" + - (etype ? `(${renderType[etype as keyof typeof renderType]})` : ""), - onClick: () => { - let newid = 0; - for (const node of nodes.filter((x) => x.id[0] === "s")) { - if (node.id !== `s${newid}`) break; - newid += 1; - } - const newnodes = nodes - .concat(makeSourceNode({ object: { type: "汉字" } }, `s${newid}`)) - .sort(sortNodes); - const newedges = edges.concat(makeEdge(id, `s${newid}`, etype)); - setLayout(newnodes, newedges); - }, - }); - const createConditionNode: (etype: string | undefined) => MenuItemType = ( - etype, - ) => ({ - key: `create-condition-${etype}`, - label: - "添加条件节点" + - (etype ? `(${renderType[etype as keyof typeof renderType]})` : ""), - onClick: () => { - let newid = 0; - for (const node of nodes.filter((x) => x.id[0] === "c")) { - if (node.id !== `c${newid}`) break; - newid += 1; - } - const newnodes = nodes - .concat( - makeConditionNode( - { object: { type: "汉字" }, operator: "存在" }, - `c${newid}`, - ), - ) - .sort(sortNodes); - const newedges = edges.concat(makeEdge(id, `c${newid}`, etype)); - setLayout(newnodes, newedges); - }, - }); const deleteNode: MenuItemType = { key: "delete", label: "删除节点", onClick: () => { - const newnodes = getNodes().filter((n) => n.id !== id); - const newedges = getEdges().filter( - ({ source, target }) => ![source, target].includes(id), - ); - setLayout(newnodes, newedges); + const newSources = { ...sources }; + const newConditions = { ...conditions }; + // 递归删除 + const stack = [id]; + while (stack.length) { + const currentId = stack.pop()!; + if (currentId[0] === "s") { + const next = newSources[currentId]?.next; + if (next) stack.push(next); + } else { + const positive = newConditions[currentId]?.positive; + if (positive) stack.push(positive); + const negative = newConditions[currentId]?.negative; + if (negative) stack.push(negative); + } + delete newSources[currentId]; + delete newConditions[currentId]; + } + for (const value of Object.values(newSources)) { + if (value.next === id) value.next = null; + } + for (const value of Object.values(newConditions)) { + if (value.positive === id) value.positive = null; + if (value.negative === id) value.negative = null; + } + setSelected(undefined); + setSources(newSources); + setConditions(newConditions); }, }; const items: (MenuItemType | MenuItemGroupType)[] = []; if (id[0] === "s") { if (id !== "s0") items.push(deleteNode); - if (!edges.some((e) => e.source === id)) - items.push(createSourceNode(undefined), createConditionNode(undefined)); + if (sources[id]!.next === null) + items.push(createSourceNode(), createConditionNode()); } else { items.push(deleteNode); - for (const label of ["positive", "negative"]) { - if ( - !edges.some( - (e) => - e.source === id && - e.label === renderType[label as keyof typeof renderType], - ) - ) + for (const label of ["positive", "negative"] as const) { + if (conditions[id]![label] === null) items.push(createSourceNode(label), createConditionNode(label)); } } diff --git a/src/components/Optimizer.tsx b/src/components/Optimizer.tsx index d60c79b..1121829 100644 --- a/src/components/Optimizer.tsx +++ b/src/components/Optimizer.tsx @@ -2,34 +2,21 @@ import { Button, Col, Flex, + List, Progress, Row, Statistic, Typography, notification, } from "antd"; -import { useAtom, useAtomValue } from "jotai"; +import { useAtomValue } from "jotai"; import { useState } from "react"; -import { - configAtom, - repertoireAtom, - assetsAtom, - dictionaryAtom, - DictEntry, - makeEncodeCallback, -} from "~/atoms"; -import { - assemble, - exportTSV, - exportYAML, - makeWorker, - stringifySequence, -} from "~/lib"; -import { LibchaiOutputEvent } from "~/worker"; +import { thread, metaheuristicAtom } from "~/atoms"; +import { exportYAML, formatDate } from "~/lib"; +import type { WorkerOutput } from "~/worker"; import { load } from "js-yaml"; -import { Solver } from "~/lib"; -import { analysisResultAtom, assemblyResultAtom } from "~/atoms/cache"; -import { analysis } from "~/lib"; +import type { Config, Solver } from "~/lib"; +import { nanoid } from "nanoid"; const Schedule = ({ params, @@ -78,19 +65,10 @@ const Schedule = ({ ); }; -const Optimizer = () => { - const assets = useAtomValue(assetsAtom); - const dictionary = useAtomValue(dictionaryAtom); - const config = useAtomValue(configAtom); - const [analysisResult, setAnalysisResult] = useAtom(analysisResultAtom); - const [assemblyResult, setAssemblyResult] = useAtom(assemblyResultAtom); - const repertoire = useAtomValue(repertoireAtom); - const list = Object.entries(repertoire) - .filter(([_, v]) => v.tygf > 0) - .map(([x]) => x); - const [out1, setOut1] = useState(""); - const [result, setResult] = useState<[Date, string][]>([]); - const [bestResult, setBestResult] = useState(undefined); +export default function Optimizer() { + const metaheuristic = useAtomValue(metaheuristicAtom); + const [result, setResult] = useState<{ date: Date; config: Config }[]>([]); + const [bestResult, setBestResult] = useState(undefined); const [bestMetric, setBestMetric] = useState(""); const [optimizing, setOptimizing] = useState(false); const [progress, setProgress] = useState< @@ -98,61 +76,12 @@ const Optimizer = () => { >(undefined); const [autoParams, setAutoParams] = useState>(undefined); - const params = config.optimization?.metaheuristic.parameters ?? autoParams; - const prepareInput = () => { - let v1 = analysisResult; - if (v1 === null) { - v1 = analysis(repertoire, config); - setAnalysisResult(v1); - } - let v2 = assemblyResult; - if (v2 === null) { - v2 = assemble(repertoire, config, list, dictionary, v1); - setAssemblyResult(v2); - } - return { - config, - info: stringifySequence(v2, config), - assets, - }; - }; + const params = metaheuristic.parameters ?? autoParams; return ( <> - 方案评测 - - {out1 ? ( - -
{out1}
-
- ) : null} - 方案优化
) : null} 全部方案 -
- - {result.map(([time, content], index) => ( - - {time.toISOString()} + ( + - exportYAML(load(content) as object, time.toISOString()) - } + key={index} + onClick={() => exportYAML(config, date.toISOString())} > 下载 - - - ))} - -
+ , + ]} + > + {date.toISOString()} + + )} + /> ); -}; - -export default Optimizer; +} diff --git a/src/components/PrimitiveDuplicationAnalyzer.tsx b/src/components/PrimitiveDuplicationAnalyzer.tsx deleted file mode 100644 index d39a3d2..0000000 --- a/src/components/PrimitiveDuplicationAnalyzer.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { - ProForm, - ProFormDependency, - ProFormDigit, - ProFormGroup, - ProFormSelect, - ProFormSwitch, -} from "@ant-design/pro-components"; -import { Form, Space, Typography } from "antd"; -import { useAtomValue } from "jotai"; -import { Frequency, maxLengthAtom } from "~/atoms"; -import { AssemblyResult, summarize } from "~/lib"; -import { Select } from "./Utils"; -import { Combined } from "./SequenceTable"; - -export interface AnalyzerForm { - type: "single" | "multi" | "all"; - filter: boolean; - length: number; - top: number; -} - -export const defaultAnalyzer: AnalyzerForm = { - type: "all", - filter: false, - length: 0, - top: 0, -}; - -export const analyzePrimitiveDuplication = ( - analyzer: AnalyzerForm, - characterFrequency: Frequency, - result: Combined[], -) => { - const duplicationMap = new Map(); - const topCharacters = Object.fromEntries( - Object.entries(characterFrequency).slice(0, analyzer.top), - ); - for (const assembly of result) { - const { name, sequence: elements } = assembly; - if ( - (analyzer.type === "single" && [...name].length > 1) || - (analyzer.type === "multi" && [...name].length === 1) - ) { - continue; - } - - if (analyzer.top !== 0 && !topCharacters[name]) { - continue; - } - const sliced = - analyzer.length === 0 ? elements : elements.slice(0, analyzer.length); - const summary = summarize(sliced); - duplicationMap.set( - summary, - (duplicationMap.get(summary) || []).concat(assembly), - ); - } - - const filtered: Combined[] = []; - let selections = 0; - for (const names of duplicationMap.values()) { - selections += names.length - 1; - if (analyzer.filter && names.length > 1) { - filtered.push(...names); - } - } - return [selections, filtered] as const; -}; - -export default function ({ - selections, - setAnalyzer, -}: { - selections: number; - setAnalyzer: (d: AnalyzerForm) => void; -}) { - const maxLength = useAtomValue(maxLengthAtom); - const [form] = Form.useForm(); - - return ( - <> - 原始重码分析 - - form={form} - layout="horizontal" - submitter={false} - initialValues={defaultAnalyzer} - onValuesChange={(_, values) => setAnalyzer(values)} - > - - {selections} - - - - - ({ - label: d === 0 ? "全部" : `前 ${d} 码`, - value: d, - }))} - allowClear={false} - /> - - {({ top }) => ( - - - ({ - label: x.toString(), - value: x, - }))} - onChange={setMaxLength} - /> - - - setAutoSelectPattern(e.target.value)} - style={{ width: 128 }} - /> - -
- -
- - + trigger={} + initialValues={encoder} + onFinish={async (values) => { + setEncoder({ ...encoder, ...values }); + return true; + }} + > + + + + + ({ label: x, value: x }))} /> - -
+ + ); } diff --git a/src/components/Selector.tsx b/src/components/Selector.tsx index 3fef8a6..3fb62ad 100644 --- a/src/components/Selector.tsx +++ b/src/components/Selector.tsx @@ -17,7 +17,7 @@ import { CSS } from "@dnd-kit/utilities"; import type { SieveName } from "~/lib"; import { useAtom, selectorAtom, useAppendAtom, useExcludeAtom } from "~/atoms"; -import { Button, Dropdown, Flex, Space, Typography } from "antd"; +import { Button, Dropdown, Flex, Typography } from "antd"; import MenuOutlined from "@ant-design/icons/MenuOutlined"; import PrioritizedRoots from "./PrioritizedRoots"; @@ -47,7 +47,7 @@ const SortableItem = ({ ); }; -const Selector = () => { +export default function Selector() { const sensors = useSensors( useSensor(PointerSensor), useSensor(KeyboardSensor, { @@ -96,6 +96,4 @@ const Selector = () => { {selector.includes("少弱字根") && } ); -}; - -export default Selector; +} diff --git a/src/components/SequenceTable.tsx b/src/components/SequenceTable.tsx index 92ef617..e027886 100644 --- a/src/components/SequenceTable.tsx +++ b/src/components/SequenceTable.tsx @@ -1,38 +1,18 @@ -import { useState } from "react"; -import { Alert, Button, Flex, Input, Space } from "antd"; +import { Button, Flex, Input, Space } from "antd"; import { useAtomValue, - configAtom, displayAtom, - repertoireAtom, - useAtom, assetsAtom, - dictionaryAtom, priorityShortCodesAtom, maxLengthAtom, - useSetAtom, - makeEncodeCallback, - DictEntry, + combinedResultAtom, } from "~/atoms"; -import type { Assembly, IndexedElement } from "~/lib"; -import { - assemble, - getPriorityMap, - stringifySequence, - summarize, - analysis, -} from "~/lib"; -import { exportTSV, makeWorker, renderIndexed, renderSuperScript } from "~/lib"; -import { - analysisResultAtom, - assemblyResultAtom, - encodeResultAtom, -} from "~/atoms/cache"; -import PrimitiveDuplicationAnalyzer, { - analyzePrimitiveDuplication, - defaultAnalyzer, -} from "~/components/PrimitiveDuplicationAnalyzer"; -import { ProColumns, ProTable } from "@ant-design/pro-components"; +import type { DictEntry, IndexedElement } from "~/lib"; +import { getPriorityMap, summarize } from "~/lib"; +import { exportTSV, renderIndexed, renderSuperScript } from "~/lib"; +import { assemblyResultAtom, encodeResultAtom } from "~/atoms"; +import type { ProColumns } from "@ant-design/pro-components"; +import { ProTable } from "@ant-design/pro-components"; import ProrityShortCodeSelector from "./ProrityShortCodeSelector"; interface MainEntry { @@ -47,41 +27,8 @@ interface MainEntry { [n: number]: IndexedElement; } -const RecomputeAssembly = () => { - const repertoire = useAtomValue(repertoireAtom); - const config = useAtomValue(configAtom); - const characters = Object.entries(repertoire) - .filter(([, v]) => v.tygf > 0) - .map(([x]) => x); - const [analysisResult, setAnalysisResult] = useAtom(analysisResultAtom); - const [assemblyResult, setAssemblyResult] = useAtom(assemblyResultAtom); - const dictionary = useAtomValue(dictionaryAtom); - return ( - - ); -}; - const ExportAssembly = () => { - const assemblyResult = useAtomValue(assemblyResultAtom) ?? []; + const assemblyResult = useAtomValue(assemblyResultAtom); const priorityShortCodes = useAtomValue(priorityShortCodesAtom); const priorityMap = getPriorityMap(priorityShortCodes); return ( @@ -98,49 +45,28 @@ const ExportAssembly = () => { const hash = `${object}-${pinyin_list.join(",")}`; const level = priorityMap.get(hash); if (level !== undefined) { - tsv.push([ - object, - summary, - String(importance ?? 100), - String(level), - ]); + tsv.push([object, summary, String(importance), String(level)]); } else { - tsv.push([object, summary, String(importance ?? 100)]); + tsv.push([object, summary, String(importance)]); } } exportTSV(tsv, "elements.txt"); }} > - 导出拆分表 - - ); -}; - -const RecomputeCode = () => { - const config = useAtomValue(configAtom); - const assemblyResult = useAtomValue(assemblyResultAtom); - const assets = useAtomValue(assetsAtom); - const setCode = useSetAtom(encodeResultAtom); - return ( - ); }; const ExportCode = () => { - const code = useAtomValue(encodeResultAtom); - const flatten = (x: DictEntry) => [x.name, x.full, x.short]; + const [code] = useAtomValue(encodeResultAtom); + const flatten = (x: DictEntry) => [ + x.name, + x.full, + x.full_rank.toString(), + x.short, + x.short_rank.toString(), + ]; return ( - - - - ); -} diff --git a/src/components/changelog/ChangelogDrawer.tsx b/src/components/changelog/ChangelogDrawer.tsx new file mode 100644 index 0000000..37bc601 --- /dev/null +++ b/src/components/changelog/ChangelogDrawer.tsx @@ -0,0 +1,33 @@ +import React, { useState, useEffect, useRef, useReducer } from "react"; +import * as A from "antd"; +import * as atoms from "~/atoms"; + +//#region ChangelogDrawer default component +export interface ChangelogDrawerProps {} +export default function ChangelogDrawer(props: ChangelogDrawerProps) { + const Content = React.lazy(() => import("./changelog.mdx")); + const [open, setOpen] = useState(false); + + return ( + <> + setOpen(true)}> + 更新历史 + + setOpen(false)} + closable + destroyOnClose + placement="right" + open={open} + > + +
+ +
+
+
+ + ); +} +//#endregion diff --git a/src/components/changelog/changelog.mdx b/src/components/changelog/changelog.mdx new file mode 100644 index 0000000..793f0f5 --- /dev/null +++ b/src/components/changelog/changelog.mdx @@ -0,0 +1,22 @@ +## v0.1.13 + +1. 支持加载三键、四键当量模型 +2. 支持差指法的分级数量统计 + +## v0.1.12 + +1. 所有计算操作自动化,减少人机交互 +2. 在编码页面实时计算基本的测评数据 +3. 增加码表层面的统计功能(序列表层面的为「统计一」,码表层面的为「统计二」) + +## v0.1.11 + +1. 修复 libchai 不支持固定键位的 bug +2. 修复 libchai 在网页上计算 7 码以上方案的溢出问题 +3. 增强了序列表层面的分析功能 +4. 用户体验优化 + +## v0.1.10 + +1. 支持设置词间速度当量和差指法的权重 +2. 支持自定义字音 diff --git a/src/components/charts.css b/src/components/charts.css new file mode 100644 index 0000000..4c5f4a5 --- /dev/null +++ b/src/components/charts.css @@ -0,0 +1,4 @@ +.g2-tooltip-list-item-value { + white-space: normal !important; + text-overflow: inherit !important; +} diff --git a/src/components/export/charts.ts b/src/components/export/charts.ts new file mode 100644 index 0000000..905d6d9 --- /dev/null +++ b/src/components/export/charts.ts @@ -0,0 +1,3 @@ +/** 请异步import此模块 */ + +export { Column, Heatmap } from "@ant-design/charts"; diff --git a/src/components/export/s2react.ts b/src/components/export/s2react.ts new file mode 100644 index 0000000..e7050ac --- /dev/null +++ b/src/components/export/s2react.ts @@ -0,0 +1,2 @@ +/** 异步引入 */ +export { SheetComponent } from "@antv/s2-react"; diff --git a/src/components/graph.ts b/src/components/graph.ts index eff3b98..4e70870 100644 --- a/src/components/graph.ts +++ b/src/components/graph.ts @@ -1,6 +1,16 @@ import type { Edge, Node } from "reactflow"; import type { BinaryCondition, Condition, Source, UnaryCondition } from "~/lib"; -import { add, sum } from "mathjs"; +import { add, sum } from "../lib/mathjs"; +import { createContext } from "react"; + +export const CacheContext = createContext<{ + sources: Record; + setSources: (sources: Record) => void; + conditions: Record; + setConditions: (conditions: Record) => void; + selected: string | undefined; + setSelected: (selected: string | undefined) => void; +}>({} as any); export type SourceData = Omit; @@ -131,12 +141,7 @@ export const getLayoutedElements = function ( }; export const sortNodes = (a: Node, b: Node) => { - const [typea, typeb] = [a.id[0], b.id[0]]; - if (typea === "s" && typeb === "c") return -1; - if (typea === "c" && typeb === "s") return 1; - const [indexa, indexb] = [ - parseInt(a.id.slice(1), 10), - parseInt(b.id.slice(1), 10), - ]; + const indexa = parseInt(a.id.slice(1), 10); + const indexb = parseInt(b.id.slice(1), 10); return indexa - indexb; }; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/index.tsx b/src/index.tsx index f394fd9..bbf1e40 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -11,11 +11,11 @@ import CusSpin from "~/components/CustomSpin"; import Error from "./components/Error"; import AutoRoute from "~react-pages"; +import "./index.css"; + const idpath = AutoRoute.find((v) => v.path === ":id"); idpath?.children?.forEach((v) => { - if (v.path === "analysis" || v.path === "element") { - v.errorElement = ; - } + v.errorElement = ; }); const GlobalStyle = createGlobalStyle` @@ -41,7 +41,7 @@ createRoot(document.getElementById("root")!).render( this.transformSVGStroke(x)); } } @@ -81,8 +92,8 @@ const affineMap: Record = { /** * 给定复合体数据和各部分渲染后的 SVG 图形,返回合并后的 SVG 图形 - * @param compound 复合体数据 - * @param glyphList 各部分渲染后的 SVG 图形 + * @param compound - 复合体数据 + * @param glyphList - 各部分渲染后的 SVG 图形 * @returns 合并后的 SVG 图形 */ export function affineMerge(compound: Compound, glyphList: SVGGlyph[]) { diff --git a/src/lib/assembly.ts b/src/lib/assembly.ts index 8e81e84..f3d36c4 100644 --- a/src/lib/assembly.ts +++ b/src/lib/assembly.ts @@ -1,21 +1,21 @@ import type { - BinaryCondition, + Algebra, Condition, - Config, + EncoderConfig, Grouping, + Keyboard, Mapping, Op, Source, WordRule, } from "./config"; import type { ComponentAnalysis } from "./component"; -import { recursiveRenderCompound, type CompoundAnalysis } from "./compound"; +import type { CompoundAnalysis } from "./compound"; import type { Extra } from "./element"; import { algebraCache, findElement } from "./element"; -import { Repertoire } from "./data"; -import { AnalysisResult, analysis } from "./repertoire"; -import { mergeClassifier } from "./classifier"; -import { Dictionary } from "~/atoms"; +import type { Repertoire } from "./data"; +import type { AnalysisResult } from "./repertoire"; +import type { Dictionary, CustomElementMap } from "./utils"; export const getPriorityMap = ( priorityShortCodes: [string, string, number][], @@ -53,22 +53,23 @@ const table: Record< export type CharacterResult = (ComponentAnalysis | CompoundAnalysis) & { char: string; pinyin: string; - importance?: number; + importance: number; + custom: Record; }; /** * 给定一个条件,判断是否满足 * - * @param condition 条件 - * @param result 中间结果 - * @param config 配置 - * @param extra 额外信息 - * @param totalMapping 映射 + * @param condition - 条件 + * @param result - 中间结果 + * @param config - 配置 + * @param extra - 额外信息 + * @param totalMapping - 映射 */ const satisfy = ( condition: Condition, result: CharacterResult, - config: Config, + config: Algebra, extra: Extra, totalMapping: Record, ) => { @@ -100,34 +101,40 @@ const merge = (mapping: Mapping, grouping: Grouping) => { }; export type IndexedElement = string | { element: string; index: number }; -export type Assembly = { +export interface Assembly { name: string; pinyin_list: string[]; sequence: IndexedElement[]; importance: number; level?: number; -}; +} export type AssemblyResult = Assembly[]; -const compile = (config: Config) => { - const { mapping, grouping, alphabet } = config.form; +const compile = ( + keyboard: Keyboard, + encoder: EncoderConfig, + algebra: Algebra, +) => { + const { mapping, grouping, alphabet } = keyboard; const totalMapping = merge(mapping, grouping ?? {}); return (result: CharacterResult, data: Repertoire, extra: Extra) => { let node: string | null = "s0"; const codes = [] as IndexedElement[]; while (node) { if (node.startsWith("s")) { - const source: Source = config.encoder.sources[node]!; + const source: Source = encoder.sources[node]!; const { object, next, index } = source; if (node !== "s0") { - const element = findElement(object!, result, config, extra); + const element = findElement(object!, result, algebra, extra); // 检查元素或键位是否有效 if (element === undefined) { node = next; continue; } + // 如果是固定编码,直接加入 if (element.length === 1 && alphabet.includes(element)) { codes.push(element); + node = next; continue; } const groupedElement = grouping?.[element] || element; @@ -159,44 +166,15 @@ const compile = (config: Config) => { } node = next; } else { - const condition: Condition = config.encoder.conditions[node]!; - if (satisfy(condition, result, config, extra, totalMapping)) { + const condition: Condition = encoder.conditions[node]!; + if (satisfy(condition, result, algebra, extra, totalMapping)) { node = condition.positive; } else { node = condition.negative; } } } - return codes.slice(0, config.encoder.max_length ?? codes.length); - }; -}; - -const extraAnalysis = function (repertoire: Repertoire, config: Config): Extra { - const { mapping, grouping } = config.form; - const classifier = mergeClassifier(config.analysis?.classifier); - const findSequence = (x: string) => { - if (x.match(/[0-9]+/)) { - return [...x].map(Number); - } - const glyph = repertoire[x]?.glyph; - if (glyph === undefined) { - return []; - } - if (glyph.type === "basic_component") { - return glyph.strokes.map((s) => classifier[s.feature]); - } else { - const sequence = recursiveRenderCompound(glyph, repertoire); - if (sequence instanceof Error) return []; - return sequence.map((s) => classifier[s.feature]); - } - }; - const rootSequence = new Map(); - const roots = Object.keys(mapping).concat(Object.keys(grouping ?? {})); - for (const root of roots) { - rootSequence.set(root, findSequence(root)); - } - return { - rootSequence, + return codes.slice(0, encoder.max_length ?? codes.length); }; }; @@ -234,29 +212,43 @@ const gather = (totalElements: IndexedElement[][], rules: WordRule[]) => { if (matched) return result; }; +interface AssembleConfig { + encoder: EncoderConfig; + keyboard: Keyboard; + algebra: Algebra; + priority: [string, string, number][]; +} + /** * 给定一个拆分结果,返回所有可能的编码 * - * @param repertoire 字符集 - * @param config 配置 - * @param characters 需要编码的汉字列表 - * @param analysisResult 分析结果 + * @param repertoire - 字符集 + * @param config - 配置 + * @param characters - 需要编码的汉字列表 + * @param analysisResult - 分析结果 * * @returns 组装结果 */ export const assemble = ( repertoire: Repertoire, - config: Config, + config: AssembleConfig, characters: string[], dictionary: Dictionary, analysisResult: AnalysisResult, + customElements: Record, ) => { const { customized, compoundResults } = analysisResult; - const extra = extraAnalysis(repertoire, config); - const func = compile(config); + const extra = { rootSequence: analysisResult.rootSequence }; + const func = compile(config.keyboard, config.encoder, config.algebra); const result: AssemblyResult = []; algebraCache.clear(); const characterCache = new Map(); + const customLookup = (character: string) => + Object.fromEntries( + Object.entries(customElements).map(([name, map]) => { + return [name, (map[character] ?? []).map((x) => `${name}-${x}`)]; + }), + ); // 一字词 for (const character of characters) { // TODO: 支持多个拆分结果 @@ -269,6 +261,7 @@ export const assemble = ( char: character, ...reading, ...shapeInfo, + custom: customLookup(character), }; const elements = func(result, repertoire, extra); characterCache.set(character + ":" + reading.pinyin, elements); @@ -276,8 +269,7 @@ export const assemble = ( let isDuplicated = false; for (const previous of final) { if (summarize(previous.sequence) === summary) { - previous.importance = - (previous.importance ?? 100) + (result.importance ?? 100); + previous.importance += result.importance; previous.pinyin_list.push(reading.pinyin); isDuplicated = true; break; @@ -287,7 +279,7 @@ export const assemble = ( final.push({ name: character, sequence: elements, - importance: result.importance ?? 100, + importance: result.importance, pinyin_list: [reading.pinyin], }); } @@ -318,7 +310,13 @@ export const assemble = ( valid = false; break; } - const result: CharacterResult = { char: character, pinyin, ...shapeInfo }; + const result: CharacterResult = { + char: character, + pinyin, + importance: 100, + ...shapeInfo, + custom: customLookup(character), + }; elements = func(result, repertoire, extra); totalElements.push(elements); } @@ -336,24 +334,27 @@ export const assemble = ( }); knownWords.add(hash); } - return result; + const priorityMap = getPriorityMap(config.priority); + return result.map((x) => { + const hash = `${x.name}-${x.pinyin_list.join(",")}`; + const level = priorityMap.get(hash); + return level !== undefined ? { ...x, level } : x; + }); }; -export const stringifySequence = (result: AssemblyResult, config: Config) => { - const priorityMap = getPriorityMap(config.encoder.priority_short_codes ?? []); +export const stringifySequence = (result: AssemblyResult) => { return result.map((x) => { - const hash = `${x.name}-${x.pinyin_list.join(",")}`; return { ...x, sequence: summarize(x.sequence), - level: priorityMap.get(hash) ?? -1, }; }); }; -export const summarize = (elements: IndexedElement[]) => { +export const summarize = (elements: (IndexedElement | undefined)[]) => { return elements .map((x) => { + if (x === undefined) return "ε"; if (typeof x === "string") return x; else if (x.index === 0) { return x.element; @@ -363,3 +364,13 @@ export const summarize = (elements: IndexedElement[]) => { }) .join(" "); }; + +export interface DictEntry { + name: string; + full: string; + full_rank: number; + short: string; + short_rank: number; +} + +export type EncodeResult = DictEntry[]; diff --git a/src/lib/bezier.ts b/src/lib/bezier.ts index 0ac8301..429c123 100644 --- a/src/lib/bezier.ts +++ b/src/lib/bezier.ts @@ -1,13 +1,5 @@ import type { Draw, Point, SVGStroke } from "./data"; -import { - add, - subtract, - mean, - multiply, - divide, - distance as _distance, - dot, -} from "mathjs"; +import { add, subtract, mean, multiply, divide, distance, dot } from "./mathjs"; /** * 一段 Bezier 曲线的主要朝向 @@ -131,7 +123,6 @@ const render = ({ feature, start, curveList }: SVGStroke) => { }; const area = (p: Point, q: Point) => p[0] * q[1] - p[1] * q[0]; -const distance = (p: Point, q: Point) => _distance(p, q) as number; type Interval = [number, number]; diff --git a/src/lib/classifier.ts b/src/lib/classifier.ts index c1f44db..3ff0786 100644 --- a/src/lib/classifier.ts +++ b/src/lib/classifier.ts @@ -17,6 +17,8 @@ export const classifier = { 平点: 4, 捺: 4, 平捺: 4, + 横捺: 4, + 挑捺: 4, 横钩: 5, 横撇: 5, 横折: 5, @@ -41,6 +43,8 @@ export const classifier = { 撇折: 5, 弯钩: 5, 斜钩: 5, + 撇钩: 5, + 圈: 5, }; /** @@ -78,6 +82,7 @@ export const schema: Record = { 横撇: ["h", "c"], 横折: ["h", "v"], 横折钩: ["h", "v"], + 横捺: ["h", "c"], 横斜钩: ["h", "c"], 横折提: ["h", "v", "h"], 横折折: ["h", "v", "h"], @@ -98,4 +103,7 @@ export const schema: Record = { 撇折: ["c", "h"], 弯钩: ["v"], 斜钩: ["c"], + 撇钩: ["c"], + 挑捺: ["c", "c"], + 圈: ["c"], }; diff --git a/src/lib/component.ts b/src/lib/component.ts index 13332e0..b9a004b 100644 --- a/src/lib/component.ts +++ b/src/lib/component.ts @@ -1,50 +1,78 @@ -import type { Config, SieveName } from "./config"; +import type { SieveName } from "./config"; import type { Repertoire, PrimitiveRepertoire, SVGGlyph, Component, } from "./data"; -import { generateSliceBinaries } from "./degenerator"; +import { defaultDegenerator, generateSliceBinaries } from "./degenerator"; import { select } from "./selector"; import { bisectLeft, bisectRight } from "d3-array"; -import type { RenderedGlyph, Topology } from "./topology"; -import { findTopology, renderSVGGlyph } from "./topology"; +import type { CornerSpecifier, RenderedGlyph, Topology } from "./topology"; +import { findCorners, findTopology, renderSVGGlyph } from "./topology"; import { mergeClassifier, type Classifier } from "./classifier"; -import { isComponent, isValidCJKChar } from "./utils"; -import { recursiveRenderCompound } from "."; +import { isComponent } from "./utils"; +import type { AnalysisConfig } from "./repertoire"; +import { recursiveRenderCompound } from "./compound"; export class InvalidGlyphError extends Error {} +export const makeIntervalSum = (strokes: number, rootsSet: Set) => { + const array = [...Array(strokes).keys()].map((x) => 1 << x).reverse(); + const intervalSums = new Set(); + for (let start = 0; start !== strokes - 1; ++start) { + let sum = array[start]!; + for (let end = start + 1; end !== strokes; ++end) { + sum += array[end]!; + if (rootsSet.has(sum)) { + intervalSums.add(sum); + } + } + } + return intervalSums; +}; + /** * 根据一个部件中包含的所有字根的情况,导出所有可能的拆分方案 * - * @param strokes 部件笔画数 - * @param roots 部件包含的字根列表,其中每个字根用二进制表示 + * @param strokes - 部件笔画数 + * @param roots - 部件包含的字根列表,其中每个字根用二进制表示 * * 函数通过递归的方式,每次选取剩余部分的第一笔,然后在字根列表中找到包含这个笔画的所有字根 * 将这些可能性与此前已经拆分的部分组合,得到新的拆分方案 * 直到所有的笔画都使用完毕 */ export const generateSchemes = (strokes: number, roots: number[]) => { + const rootsSet = new Set(roots); const schemeList: number[][] = []; const total = (1 << strokes) - 1; - const combineNext = (partialSum: number, scheme: number[]) => { + const intervalSums = makeIntervalSum(strokes, rootsSet); + const combineNext = ( + partialSum: number, + scheme: number[], + revcumsum: number[], + ) => { const restBin = total - partialSum; const restBin1st = 1 << (restBin.toString(2).length - 1); const start = bisectLeft(roots, restBin1st); const end = bisectRight(roots, restBin); for (const binary of roots.slice(start, end)) { if ((partialSum & binary) !== 0) continue; - const newBin = partialSum + binary; - if (newBin === total) { - schemeList.push(scheme.concat(binary)); + const newPartialSum = partialSum + binary; + const newRevcumsum = revcumsum.map((x) => x + binary); + const newScheme = scheme.concat(binary); + if (newRevcumsum.some((x) => intervalSums.has(x))) { + continue; + } + newRevcumsum.push(binary); + if (newPartialSum === total) { + schemeList.push(newScheme); } else { - combineNext(newBin, scheme.concat(binary)); + combineNext(newPartialSum, newScheme, newRevcumsum); } } }; - combineNext(0, []); + combineNext(0, [], []); return schemeList; }; @@ -58,6 +86,7 @@ export interface ComputedComponent { name: string; glyph: RenderedGlyph; topology: Topology; + corners: CornerSpecifier; } export class NoSchemeError extends Error {} @@ -65,10 +94,10 @@ export class MultipleSchemeError extends Error {} /** * 通过自动拆分算法,给定字根列表,对部件进行拆分 - * @param component 部件 - * @param rootData 字根列表 - * @param config 配置 - * @param classifier 笔画分类器 + * @param component - 部件 + * @param rootData - 字根列表 + * @param config - 配置 + * @param classifier - 笔画分类器 * * 如果拆分唯一,则返回拆分结果;否则返回错误 * @@ -79,13 +108,19 @@ export class MultipleSchemeError extends Error {} export const getComponentScheme = function ( component: ComputedComponent, rootData: ComputedComponent[], - config: Config, + config: AnalysisConfig, classifier: Classifier, ): ComponentAnalysis | NoSchemeError | MultipleSchemeError { - const { mapping } = config.form; - if (mapping[component.name]) + if ( + config.primaryRoots.has(component.name) || + config.secondaryRoots.has(component.name) + ) return { + strokes: component.glyph.length, sequence: [component.name], + full: [component.name], + corners: [0, 0, 0, 0], + operator: undefined, }; const rootMap = new Map( component.glyph.map((stroke, index) => { @@ -94,7 +129,11 @@ export const getComponentScheme = function ( }), ); for (const root of rootData) { - const binaries = generateSliceBinaries(config, component, root); + const binaries = generateSliceBinaries( + config.analysis?.degenerator ?? defaultDegenerator, + component, + root, + ); binaries.forEach((binary) => rootMap.set(binary, root.name)); } const roots = Array.from(rootMap.keys()).sort((a, b) => a - b); @@ -106,21 +145,57 @@ export const getComponentScheme = function ( if (selectResult instanceof Error) { return selectResult; } - const [bestScheme, schemeData] = selectResult; - const sequence = bestScheme.map((n) => rootMap.get(n)!); - const detail = bestScheme.map((n) => ({ name: rootMap.get(n)!, binary: n })); + const [best, schemes] = selectResult; + let sequence = best.scheme.map((n) => rootMap.get(n)!); + let corners = component.corners.map((corner) => + best.scheme.findIndex( + (x) => x & (1 << (component.glyph.length - corner - 1)), + ), + ) as CornerSpecifier; + if (config.analysis.serializer === "c3") { + // 根据四角信息对 sequence 进行排序 + // if (sequence.length > 3) { + // console.log(component.name, sequence, corners); + // } + const newSequence: string[] = []; + const newCorners: CornerSpecifier = [0, 0, 0, 0]; + newSequence.push(sequence[corners[0]]!); + if (corners[0] === corners[3]) { + // 左上角和右下角相同 + sequence.forEach((x, i) => { + if (i === corners[0]) return; + if (newSequence.length === 3) return; + newSequence.push(x); + }); + } else { + // 左上角和右下角不同 + let middle: number; + if (sequence.length > 2) { + middle = sequence.findIndex( + (_, i) => i !== corners[0] && i !== corners[3], + ); + } + sequence.forEach((x, i) => { + if (i === corners[3] || i === middle) { + newSequence.push(x); + } + if (i === corners[3]) { + newCorners[3] = newSequence.length - 1; + } + }); + } + sequence = newSequence; + corners = newCorners; + } return { sequence, - detail: detail, + full: sequence, strokes: component.glyph.length, map: rootMap, - schemes: schemeData.map((v) => { - return { - scheme: v.scheme, - sequence: v.scheme.map((x) => rootMap.get(x)!), - data: v.evaluation, - }; - }), + best, + schemes, + corners, + operator: undefined, }; }; @@ -132,27 +207,31 @@ export type ComponentAnalysis = | ComponentGenuineAnalysis; export interface SchemeWithData { - sequence: string[]; scheme: number[]; - data: Map; + evaluation: Map; +} + +export interface CommonAnalysis { + sequence: string[]; + full: string[]; + corners: CornerSpecifier; } /** - * 部件通过自动拆分算法分析得到的拆分结果的全部细节 + * 部件本身是字根字,或者是由自定义部件拆分指定的无理拆分,无拆分细节 */ -interface ComponentGenuineAnalysis { - sequence: string[]; - detail: { name: string; binary: number }[]; +export interface ComponentBasicAnalysis extends CommonAnalysis { strokes: number; - map: Map; - schemes: SchemeWithData[]; + operator: undefined; } /** - * 部件本身是字根字,或者是由自定义部件拆分指定的无理拆分,无拆分细节 + * 部件通过自动拆分算法分析得到的拆分结果的全部细节 */ -interface ComponentBasicAnalysis { - sequence: string[]; +export interface ComponentGenuineAnalysis extends ComponentBasicAnalysis { + map: Map; + best: SchemeWithData; + schemes: SchemeWithData[]; } export type ComponentResults = Map; @@ -161,9 +240,9 @@ export type ComponentResults = Map; * 递归渲染一个部件(基本部件或者衍生部件) * 如果是基本部件就直接返回,如果是衍生部件则先渲染源字的图形,然后解引用得到这个部件的图形 * - * @param component 部件 - * @param repertoire 原始字符集 - * @param glyphCache 部件缓存 + * @param component - 部件 + * @param repertoire - 原始字符集 + * @param glyphCache - 部件缓存 * * @returns 部件的 SVG 图形 * @throws InvalidGlyphError 无法渲染 @@ -197,6 +276,64 @@ export const recursiveRenderComponent = function ( return glyph; }; +const overrideCorners: Map = new Map([ + ["良", [0, 0, 4, 6]], + ["\uE06A", [0, 0, 4, 5]], + ["世", [0, 0, 4, 4]], + ["中", [0, 1, 3, 3]], + ["争", [0, 1, 5, 5]], + ["卡", [0, 0, 3, 3]], + ["毌", [0, 0, 0, 0]], + ["自", [0, 0, 5, 5]], + ["血", [0, 0, 5, 5]], + ["\uE097", [0, 0, 4, 4]], // 睾字头 + ["乜", [0, 0, 1, 1]], + ["也", [0, 0, 2, 2]], + ["㐄", [0, 0, 1, 2]], + ["义", [0, 0, 2, 2]], + ["亍", [0, 0, 2, 2]], + ["丰", [0, 0, 3, 3]], + ["午", [0, 1, 3, 3]], + ["巿", [0, 0, 3, 3]], + ["帀", [0, 0, 3, 3]], + ["\uE06D", [0, 0, 3, 3]], + ["\uE0C7", [0, 0, 3, 3]], + ["\uE0A4", [0, 1, 3, 3]], + ["乎", [0, 0, 4, 4]], + ["永", [0, 0, 1, 1]], + ["申", [0, 0, 4, 4]], + ["\uE098", [0, 0, 4, 4]], + ["屰", [0, 1, 5, 5]], + ["\uE061", [0, 0, 6, 6]], // 敢字旁 + ["\uE067", [0, 1, 7, 7]], // 曾字旁 + ["斥", [0, 0, 3, 3]], + ["\uE01C", [0, 0, 4, 4]], // 即字旁 + ["串", [0, 0, 6, 6]], + ["事", [0, 0, 7, 7]], + ["臾", [0, 0, 7, 7]], + ["\uE0CB", [0, 0, 5, 5]], // 追字心 + ["州", [0, 0, 5, 5]], + ["凢", [0, 0, 2, 2]], + ["首", [0, 1, 8, 8]], + ["甪", [0, 0, 5, 5]], + ["\uE13C", [0, 0, 2, 2]], + ["丯", [0, 0, 3, 3]], + ["\uEAF3", [0, 0, 2, 2]], + ["\uE076", [0, 0, 3, 3]], + ["\uE112", [0, 0, 5, 5]], // 帶字头 + ["\uE158", [0, 0, 3, 3]], // 飛字底 + ["亊", [0, 0, 6, 6]], + ["\uE16B", [0, 0, 6, 6]], // 龜字心 + ["\uE151", [0, 0, 2, 2]], // 嬽上角框 + ["平", [0, 0, 4, 4]], + ["乡", [0, 0, 2, 2]], + ["龜", [0, 0, 6, 6]], + ["㐧", [0, 0, 2, 2]], + ["\uE153", [0, 0, 3, 3]], // 虍无七 + ["\uE165", [0, 0, 3, 3]], // 幷字旁 + ["\uE166", [0, 0, 3, 3]], // 幷字边 +]); + /** * 把一个基本部件从 SVG 图形出发,先渲染成 Bezier 图形,然后计算拓扑 * @@ -205,9 +342,11 @@ export const recursiveRenderComponent = function ( export const computeComponent = (name: string, glyph: SVGGlyph) => { const renderedGlyph = renderSVGGlyph(glyph); const topology = findTopology(renderedGlyph); + const corners = overrideCorners.get(name) ?? findCorners(renderedGlyph); const cache: ComputedComponent = { glyph: renderedGlyph, topology, + corners, name, }; return cache; @@ -216,28 +355,22 @@ export const computeComponent = (name: string, glyph: SVGGlyph) => { /** * 将所有的字根都计算成 ComputedComponent * - * @param repertoire 字符集 - * @param config 配置 + * @param repertoire - 字符集 + * @param config - 配置 * * @returns 所有计算后字根的列表 */ -export const renderRootList = (repertoire: Repertoire, config: Config) => { - const { mapping, grouping } = config.form; - const roots = [ - ...Object.keys(mapping), - ...Object.keys(grouping ?? {}), - ].filter((x) => repertoire[x] !== undefined); - const rootList: ComputedComponent[] = []; - for (const root of roots) { +export const renderRootList = (repertoire: Repertoire, elements: string[]) => { + const rootList: Map = new Map(); + for (const root of elements) { const glyph = repertoire[root]?.glyph; if (glyph === undefined) continue; if (glyph.type === "basic_component") { - rootList.push(computeComponent(root, glyph.strokes)); + rootList.set(root, computeComponent(root, glyph.strokes)); } else { const rendered = recursiveRenderCompound(glyph, repertoire); if (rendered instanceof Error) continue; - const cache = computeComponent(root, rendered); - rootList.push(cache); + rootList.set(root, computeComponent(root, rendered)); } } return rootList; @@ -246,36 +379,40 @@ export const renderRootList = (repertoire: Repertoire, config: Config) => { /** * 对所有部件进行拆分 * - * @param repertoire 字符集 - * @param config 配置 + * @param repertoire - 字符集 + * @param config - 配置 * * @returns 拆分结果和无法拆分的汉字列表 */ export const disassembleComponents = function ( repertoire: Repertoire, - config: Config, + config: AnalysisConfig, + characters: string[], + components: Set, ): [ComponentResults, string[]] { - const rootList = renderRootList(repertoire, config); + const rootMap = renderRootList(repertoire, [ + ...config.primaryRoots, + ...config.secondaryRoots, + ]); + const rootList = [...rootMap.values()]; const classifier = mergeClassifier(config.analysis?.classifier); - const composables = new Set(); - for (const { glyph } of Object.values(repertoire)) { - if (glyph?.type !== "compound") continue; - glyph!.operandList.forEach((x) => composables.add(x)); - } - const result: ComponentResults = new Map(); + const result: [string, ComponentAnalysis][] = []; const error: string[] = []; Object.entries(repertoire).forEach(([name, character]) => { - if (character.glyph?.type !== "basic_component") return; - const cache = computeComponent(name, character.glyph.strokes); - if (!isValidCJKChar(name) && !composables.has(name)) { + if (character.glyph?.type !== "basic_component" || !components.has(name)) return; - } + const cache = rootMap.has(name) + ? rootMap.get(name)! + : computeComponent(name, character.glyph.strokes); const scheme = getComponentScheme(cache, rootList, config, classifier); if (scheme instanceof Error) { error.push(name); } else { - result.set(name, scheme); + result.push([name, scheme]); } }); - return [result, error]; + result.sort((a, b) => { + return a[1].strokes - b[1].strokes; + }); + return [new Map(result), error]; }; diff --git a/src/lib/compound.ts b/src/lib/compound.ts index df2c346..fc0c865 100644 --- a/src/lib/compound.ts +++ b/src/lib/compound.ts @@ -1,49 +1,45 @@ -import { affineMerge } from "."; -import { +import type { AnalysisConfig } from "./repertoire"; +import { affineMerge } from "./affine"; +import type { ComponentResults, ComponentAnalysis, - InvalidGlyphError, + CommonAnalysis, } from "./component"; -import { Config } from "./config"; -import { - Block, +import { InvalidGlyphError } from "./component"; +import type { Compound, - Character, Repertoire, Operator, - PrimitiveRepertoire, SVGGlyph, + CompoundCharacter, } from "./data"; +import type { CornerSpecifier } from "./topology"; -export type CompoundResults = Map; +export type CompoundResults = Map; type PartitionResult = ComponentAnalysis | CompoundAnalysis; export type CompoundAnalysis = CompoundBasicAnalysis | CompoundGenuineAnalysis; /** - * 复合体通过自动拆分算法导出的拆分结果 + * 复合体本身是字根字,没有拆分细节 */ -interface CompoundGenuineAnalysis { - sequence: string[]; - detail: { - operator: Operator; - partitionResults: PartitionResult[]; - }; +interface CompoundBasicAnalysis extends CommonAnalysis { + operator: Operator; } /** - * 复合体本身是字根字,没有拆分细节 + * 复合体通过自动拆分算法导出的拆分结果 */ -interface CompoundBasicAnalysis { - sequence: [string]; +interface CompoundGenuineAnalysis extends CompoundBasicAnalysis { + operandResults: PartitionResult[]; } /** * 将复合体递归渲染为 SVG 图形 * - * @param compound 复合体 - * @param repertoire 原始字符集 + * @param compound - 复合体 + * @param repertoire - 原始字符集 * * @returns SVG 图形 * @throws InvalidGlyphError 无法渲染 @@ -77,28 +73,33 @@ export const recursiveRenderCompound = function ( /** * 对字符集进行拓扑排序,得到复合体的拆分顺序 * - * @param repertoire 字符集 + * @param repertoire - 字符集 * * @returns 拓扑排序后的复合体 * * @remarks 这个实现目前比较低效,需要改进 */ -const topologicalSort = (repertoire: Repertoire) => { - let compounds = new Map(); +const topologicalSort = ( + repertoire: Repertoire, + required: Set, + config: AnalysisConfig, +) => { + let compounds = new Map(); for (let i = 0; i !== 10; ++i) { - const thisLevelCompound = new Map(); + const thisLevelCompound = new Map(); for (const [name, character] of Object.entries(repertoire)) { + if (!required.has(name) || compounds.get(name)) continue; const { glyph } = character; - if (compounds.get(name)) continue; if (glyph === undefined || glyph.type !== "compound") continue; - if ( - glyph.operandList.every( - (x) => - repertoire[x]?.glyph?.type === "basic_component" || - compounds.get(x) !== undefined, - ) - ) { - thisLevelCompound.set(name, character); + const wellKnown = glyph.operandList.every( + (x) => + repertoire[x]?.glyph?.type === "basic_component" || + compounds.get(x) !== undefined, + ); + const isRoot = + config.primaryRoots.has(name) || config.secondaryRoots.has(name); + if (wellKnown || isRoot) { + thisLevelCompound.set(name, character as CompoundCharacter); } } compounds = new Map([...compounds, ...thisLevelCompound]); @@ -106,16 +107,29 @@ const topologicalSort = (repertoire: Repertoire) => { return compounds; }; -const assembleSequence = ( - partitionResults: PartitionResult[], - order: Block[], -) => { +type Serializer = ( + r: PartitionResult[], + g: Compound, + name?: string, +) => CompoundAnalysis; + +const sequentialSerializer: Serializer = (operandResults, glyph) => { + const rest = { + corners: [0, 0, 0, 0] as CornerSpecifier, + full: [], + operator: glyph.operator, + operandResults, + }; + if (glyph.order === undefined) { + const sequence = operandResults.map((x) => x.sequence).flat(); + return { sequence, ...rest }; + } const sequence: string[] = []; - const subsequences = partitionResults.map((x) => ({ + const subsequences = operandResults.map((x) => ({ rest: x.sequence, taken: 0, })); - for (const { index, strokes } of order) { + for (const { index, strokes } of glyph.order) { const data = subsequences[index]; if (data === undefined) { continue; @@ -124,13 +138,13 @@ const assembleSequence = ( sequence.push(...data.rest); data.rest = []; } else { - const partitionResult = partitionResults[index]!; + const partitionResult = operandResults[index]!; if ("schemes" in partitionResult) { - const { detail, strokes: totalStrokes } = partitionResult; + const { best, strokes: totalStrokes } = partitionResult; const upperBound = 1 << (totalStrokes - data.taken); const lowerBound = 1 << (totalStrokes - data.taken - strokes); - const toTake = detail.filter( - ({ binary }) => binary >= lowerBound && binary < upperBound, + const toTake = best.scheme.filter( + (binary) => binary >= lowerBound && binary < upperBound, ).length; sequence.push(...data.rest.slice(0, toTake)); data.rest = data.rest.slice(toTake); @@ -140,52 +154,375 @@ const assembleSequence = ( } } } - return sequence; + // 不考虑四角 + return { sequence, ...rest }; +}; + +const zhenmaSerializer: Serializer = (operandResults, glyph) => { + const sequence: string[] = []; + if (glyph.operator === "⿶") { + sequence.push(...operandResults[1]!.sequence); + sequence.push(...operandResults[0]!.sequence); + } else { + operandResults.map((x) => x.sequence).forEach((x) => sequence.push(...x)); + } + return { + sequence, + corners: [0, 0, 0, 0] as CornerSpecifier, + full: [], + operator: glyph.operator, + operandResults, + }; +}; + +const robustPartition = ( + operandResults: PartitionResult[], + operator: Operator, +) => { + // 第一步:展开同一方向的结构 + // 不管在同一个方向上有多少个结构,都展开到同一个数组中,并用同一个符号表示 + const operatorMap: Map = new Map([ + ["⿲", "⿰"], + ["⿳", "⿱"], + ]); + const realOperator = operatorMap.get(operator) ?? operator; + const expanded: PartitionResult[] = []; + if (realOperator === "⿸") { + const first = operandResults[0]!; + if ("operandResults" in first && first.operator === "⿸") { + expanded.push(...first.operandResults); + const second = expanded.pop()!; + const last = operandResults.at(-1)!; + const combined = c3Serializer([second, last], { + operator: "⿱", + } as Compound); + expanded.push(combined); + return { operator: realOperator, operandResults: expanded }; + } + } + for (const part of operandResults) { + if ( + "operandResults" in part && + /[⿱⿰]/.test(part.operator) && + part.operator === realOperator + ) { + expanded.push(...part.operandResults); + } else { + expanded.push(part); + } + } + return { operator: realOperator, operandResults: expanded }; +}; + +// 另一种思路,包围结构取内部 +const _getBR = (x: PartitionResult, already?: boolean) => { + if (!already) return x.sequence[x.corners[3]]!; + if ("operandResults" in x && /[⿴⿵⿶⿷⿸⿹⿺]/.test(x.operator)) { + const inner = x.operandResults[1]!; + return inner.sequence[inner.corners[3]]!; + } else if (x.corners[3] !== x.corners[0]) { + return x.sequence[x.corners[3]]!; + } else { + return x.sequence.at(-1)!; + } +}; + +const getTL = (x: PartitionResult) => x.sequence[x.corners[0]]!; +const getBR = (x: PartitionResult, already?: boolean) => { + if (!already) return x.sequence[x.corners[3]]!; + if (x.corners[3] !== x.corners[0]) { + return x.sequence[x.corners[3]]!; + } else { + if ("operandResults" in x) { + const inner = x.operandResults[1]!; + return inner.sequence[inner.corners[3]]!; + } + return x.sequence.find((_, i) => i !== x.corners[0])!; + } +}; + +const c3Serializer: Serializer = (rawResults, glyph) => { + const { operandResults, operator } = robustPartition( + rawResults, + glyph.operator, + ); + const sequence: string[] = []; + const corners: CornerSpecifier = [0, 0, 0, 0]; + if (operator === "⿱") { + // 纵向结构特殊处理 + const first = operandResults[0]!; + const last = operandResults.at(-1)!; + if ("operandResults" in first && first.operator === "⿰") { + // 有叠眼,取叠眼首末 + sequence.push(getTL(first)); + sequence.push(getBR(first, true)); + sequence.push(getBR(last)); + corners[3] = 2; + } else { + // 没有叠眼,视同独体字 + sequence.push(getTL(first)); + if (first.sequence.length > 1) { + const next = first.sequence.find((_, i) => i !== first.corners[0])!; + sequence.push(next); + sequence.push(getBR(last)); + corners[3] = 2; + } else { + const second = operandResults[1]!; + sequence.push(getTL(second)); + if (operandResults.length > 2) { + sequence.push(getBR(last)); + corners[3] = 2; + } else if (second.sequence.length > 1) { + sequence.push(getBR(second, true)); + corners[3] = second.corners[0] === second.corners[3] ? 1 : 2; + } else { + corners[3] = 1; + } + } + } + } else if (operandResults.length > 2) { + // 横向三部及以上,取首首末 + operandResults.forEach((x, i) => { + if (i === 0 || i === 1) { + sequence.push(x.sequence[0]!); + } else if (i === operandResults.length - 1) { + sequence.push(getBR(x)); + } + }); + corners[3] = 2; + } else { + // 横向或外内两部,各取首末 + const [first, second] = [operandResults[0]!, operandResults[1]!]; + sequence.push(getTL(first)); + let firstBR: number; + let secondBR: number; + if (first.sequence.length > 1) { + sequence.push(getBR(first, true)); + firstBR = first.corners[0] === first.corners[3] ? 0 : 1; + sequence.push(getBR(second)); + secondBR = 2; + } else { + firstBR = 0; + sequence.push(getTL(second)); + if (second.sequence.length > 1) { + sequence.push(getBR(second, true)); + secondBR = second.corners[0] === second.corners[3] ? 1 : 2; + } else { + secondBR = 1; + } + } + corners[3] = /[⿰⿱⿸]/.test(operator) ? secondBR : firstBR; + } + return { + sequence, + corners, + full: [], + operator, + operandResults: operandResults, + }; +}; + +const regularize = (x: PartitionResult[], direction: Operator) => { + const result: PartitionResult[] = []; + const regex = direction === "⿰" ? /[⿰⿲]/ : /[⿱⿳]/; + for (const part of x) { + if ( + result.length < 2 && + "operandResults" in part && + regex.test(part.operator) + ) { + result.push(...part.operandResults); + } else { + result.push(part); + } + } + return result; +}; + +// eslint-disable-next-line complexity +const zhangmaSerializer: Serializer = (operandResults, glyph) => { + const corners: CornerSpecifier = [0, 0, 0, 0]; + const sequence: string[] = []; + const full: string[] = []; + if ( + glyph.operator === "⿶" || + (glyph.operator === "⿺" && glyph.operandList[0] === "\ue09d") + ) { + for (const part of operandResults.reverse()) full.push(...part.full); + } else { + for (const part of operandResults) full.push(...part.full); + } + const getShouMo = (x: string[]) => (x.length === 1 ? x : [x[0]!, x.at(-1)!]); + const regularizedResults = + operandResults.length === 2 && /[⿰⿱]/.test(glyph.operator) + ? regularize(operandResults, glyph.operator) + : operandResults; + if (/[⿱⿳]/.test(glyph.operator)) { + const dieyanIndex = regularizedResults.findIndex( + (x) => "operandResults" in x && /[⿰⿲]/.test(x.operator), + ); + const dieyan = regularizedResults.at( + dieyanIndex, + )! as CompoundGenuineAnalysis; + const aboveDieyanSequence: string[] = []; + switch (dieyanIndex) { + case -1: // 没有叠眼 + for (const part of regularizedResults) sequence.push(...part.full); + break; + case 0: // 叠眼在开头 + for (const part of dieyan.operandResults) + sequence.push(...part.full[0]!); + if (regularizedResults.length > 2) { + sequence.push(regularizedResults[1]!.full[0]!); + sequence.push(regularizedResults.at(-1)!.full.at(-1)!); + } else { + sequence.push(...getShouMo(regularizedResults[1]!.full)); + } + break; + default: // 叠眼在中间或末尾 + for (let index = 0; index < dieyanIndex; ++index) { + aboveDieyanSequence.push(...regularizedResults[index]!.full); + } + sequence.push(...aboveDieyanSequence.slice(0, 2)); + if (dieyanIndex + 1 < regularizedResults.length) { + // 叠眼在中间 + sequence.push(dieyan.operandResults[0]!.full[0]!); + if (sequence.length === 2) { + sequence.push(dieyan.operandResults.at(-1)!.full[0]!); + } + sequence.push(regularizedResults.at(-1)!.full.at(-1)!); + } else { + sequence.push(...dieyan.full); + } + } + } else if (/[⿰⿲]/.test(glyph.operator)) { + const left = regularizedResults[0]!; + if ("operandResults" in left && /[⿱⿳]/.test(left.operator)) { + // 左部是叠型 + const dieyanIndex = left.operandResults.findIndex( + (x) => "operandResults" in x && /[⿰⿲]/.test(x.operator), + ); + const dieyan = left.operandResults.at( + dieyanIndex, + )! as CompoundGenuineAnalysis; + if (dieyanIndex !== -1) { + sequence.push(left.operandResults[0]!.full[0]!); + if (dieyanIndex === 0) + sequence.push(dieyan.operandResults.at(-1)!.full[0]!); + else sequence.push(dieyan.operandResults[0]!.full[0]!); + sequence.push(left.operandResults.at(-1)!.full.at(-1)!); + } + } + if (sequence.length > 0) { + // 已经处理完左部,直接取右部末码即可 + sequence.push(regularizedResults.at(-1)!.full.at(-1)!); + } else { + // 一般情况,左部、中部最多各取首尾两根 + sequence.push(...getShouMo(left.full)); + if (regularizedResults.length > 2) { + sequence.push(...getShouMo(regularizedResults[1]!.full)); + } + // 如果左部和中部已经有 4 根,舍弃一根 + if (sequence.length === 4) sequence.pop(); + for ( + let index = Math.min(2, regularizedResults.length - 1); + index < regularizedResults.length; + ++index + ) { + sequence.push(...regularizedResults[index]!.full); + } + } + } else { + // 围型:先分解围框,再分解围芯 + sequence.push(...full); + } + // 不考虑四角 + return { + sequence, + corners, + full, + operator: glyph.operator, + operandResults: regularizedResults, + }; +}; + +const serializerMap: Record = { + sequential: sequentialSerializer, + c3: c3Serializer, + zhangma: zhangmaSerializer, + zhenma: zhenmaSerializer, }; /** * 对复合体进行拆分 * - * @param repertoire 字符集 - * @param config 配置 - * @param componentResults 部件拆分结果 + * @param repertoire - 字符集 + * @param config - 配置 + * @param componentResults - 部件拆分结果 */ export const disassembleCompounds = ( repertoire: Repertoire, - config: Config, + config: AnalysisConfig, componentResults: ComponentResults, + characters: string[], + requiredCompounds: Set, ) => { - const { mapping, grouping } = config.form; - const compounds = topologicalSort(repertoire); + const knownCharacters = new Set(characters); + const compounds = topologicalSort(repertoire, requiredCompounds, config); const compoundResults: CompoundResults = new Map(); const compoundError: string[] = []; const getResult = function (s: string): PartitionResult | undefined { return componentResults.get(s) || compoundResults.get(s); }; - for (const [char, glyph] of compounds.entries()) { - if (mapping[char] || grouping[char]) { + const serializerName = config.analysis.serializer ?? "sequential"; + const serializer = serializerMap[serializerName] ?? sequentialSerializer; + const display = (s: string) => repertoire[s]?.name ?? s; + const warninfo: string[] = []; + for (const [char, { glyph }] of compounds.entries()) { + if (config.primaryRoots.has(char) || config.secondaryRoots.has(char)) { // 复合体本身是一个字根 - compoundResults.set(char, { sequence: [char] }); + compoundResults.set(char, { + sequence: [char], + full: [char], + corners: [0, 0, 0, 0], + strokes: 0, + operator: undefined, + }); continue; } - const { operator, operandList, order } = glyph.glyph as Compound; - const rawPartitionResults = operandList.map(getResult); - if (rawPartitionResults.every((x) => x !== undefined)) { + const rawOperandResults = glyph.operandList.map(getResult); + if (rawOperandResults.every((x) => x !== undefined)) { // this is safe! - const partitionResults = rawPartitionResults as PartitionResult[]; - const sequence = - order === undefined - ? partitionResults.map((x) => x.sequence).flat() - : assembleSequence(partitionResults, order); - compoundResults.set(char, { - sequence, - detail: { - operator, - partitionResults, - }, - }); + const operandResults = rawOperandResults as PartitionResult[]; + const serialization = serializer(operandResults, glyph, char); + // 检查拆分是否满足递归条件 + const hash = serialization.sequence.map(display).join(" "); + for (const x of operandResults) { + const { sequence: rawSequence, corners } = x; + const sequence = rawSequence.map(display); + let subhash: string; + if (sequence.length === 1) { + subhash = sequence[0]!; + } else if (corners[0] !== corners[3]) { + subhash = `${sequence[corners[0]]} ${sequence[corners[3]]}`; + } else { + if ("operandResults" in x) { + const inner = x.operandResults[1]!; + const innerSequence = inner.sequence.map(display); + subhash = `${sequence[0]} ${innerSequence[inner.corners[3]]}`; + } else { + subhash = `${sequence[0]} ${sequence.find((_, i) => i !== corners[0])}`; + } + } + if (!hash.includes(subhash)) { + warninfo.push(`${display(char)}:${hash} 不含构件首尾 ${subhash}`); + } + } + compoundResults.set(char, serialization); } else { - compoundError.push(char); + if (knownCharacters.has(char)) { + compoundError.push(char); + } } } return [compoundResults, compoundError] as const; diff --git a/src/lib/config.ts b/src/lib/config.ts index 996f0cb..a418a9f 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,12 +1,8 @@ -import type { Classifier, Feature } from "./classifier"; -import type { - DerivedComponent, - Compound, - PrimitiveRepertoire, - Component, -} from "./data"; +import type { Feature } from "./classifier"; +import type { Compound, PrimitiveRepertoire, Component, Reading } from "./data"; import type { CodableObject } from "./element"; import type { Example } from "./templates"; +import type { CornerSpecifier } from "./topology"; // config.info begin export interface Info { @@ -18,15 +14,26 @@ export interface Info { // config.info end // config.data begin -export type Data = { + +export const characterSetSpecifiers = [ + "minimal", + "gb2312", + "general", + "basic", + "extended", +] as const; +export type CharacterSetSpecifier = (typeof characterSetSpecifiers)[number]; + +export interface Data { + character_set?: CharacterSetSpecifier; repertoire?: PrimitiveRepertoire; glyph_customization?: CustomGlyph; reading_customization?: CustomReadings; tags?: string[]; -}; +} export type CustomGlyph = Record; -export type CustomReadings = Record; +export type CustomReadings = Record; // config.data end // config.analysis begin @@ -35,8 +42,10 @@ export interface Analysis { degenerator?: Degenerator; selector?: Selector; customize?: Record; + customizeCorners?: Record; strong?: string[]; weak?: string[]; + serializer?: "sequential" | "c3"; } export interface Degenerator { @@ -178,25 +187,32 @@ export interface LevelWeights { frequency: number; } +export type FingeringWeights = (number | null)[]; + export interface TierWeights { top?: number; duplication?: number; levels?: LevelWeights[]; + fingering?: FingeringWeights; } -export interface FingeringWeights { - same_hand?: number; - same_finger_large_jump?: number; - same_finger_small_jump?: number; - little_finger_inteference?: number; - awkward_upside_down?: number; -} +export const fingeringLabels = [ + "同手", + "大跨", + "小跨", + "干扰", + "错手", + "三连", + "备用", + "备用", +]; export interface PartialWeights { tiers?: TierWeights[]; duplication?: number; key_distribution?: number; pair_equivalence?: number; + extended_pair_equivalence?: number; fingering?: FingeringWeights; levels?: LevelWeights[]; } diff --git a/src/lib/data.ts b/src/lib/data.ts index 80b9387..ea8dbc4 100644 --- a/src/lib/data.ts +++ b/src/lib/data.ts @@ -132,7 +132,7 @@ export interface Compound { export interface Reading { pinyin: string; - importance?: number; + importance: number; } /** @@ -166,6 +166,14 @@ export interface Character glyph: BasicComponent | Compound | undefined; } +export interface ComponentCharacter extends Character { + glyph: BasicComponent; +} + +export interface CompoundCharacter extends Character { + glyph: Compound; +} + /** 原始字符集,为字符名称到原始字符的映射 */ export type PrimitiveRepertoire = Record; diff --git a/src/lib/degenerator.ts b/src/lib/degenerator.ts index 835b5e2..3d08e28 100644 --- a/src/lib/degenerator.ts +++ b/src/lib/degenerator.ts @@ -1,5 +1,6 @@ import { isEqual } from "lodash-es"; -import { findTopology, RenderedGlyph } from "./topology"; +import type { RenderedGlyph } from "./topology"; +import { findTopology } from "./topology"; import type { Interval } from "./bezier"; import { curveLength, @@ -7,9 +8,9 @@ import { isCollinear, sortTwoNumbers, } from "./bezier"; -import { Config, Degenerator } from "./config"; -import { Feature } from "./classifier"; -import { ComputedComponent } from "./component"; +import type { Degenerator } from "./config"; +import type { Feature } from "./classifier"; +import type { ComputedComponent } from "./component"; export const indicesToBinary = (n: number) => (indices: number[]) => { let binaryCode = 0; @@ -47,9 +48,9 @@ const strokeFeatureEqual = ( * 对于一些特殊的字根,一般性的字根认同规则可能不足以区分它们,需要特殊处理 * 这里判断了待拆分部件中的某些笔画究竟是不是这个字根 * - * @param component 待拆分部件 - * @param root 字根 - * @param indices 笔画索引列表 + * @param component - 待拆分部件 + * @param root - 字根 + * @param indices - 笔画索引列表 */ const verifySpecialRoots = ( component: ComputedComponent, @@ -108,16 +109,15 @@ const verifySpecialRoots = ( * 给定一个部件和一个字根,找出这个部件所有包含这个字根的方式 * 如果部件不包含这个字根,就返回空列表 * - * @param config 配置 - * @param component 待拆分部件 - * @param root 字根 + * @param config - 配置 + * @param component - 待拆分部件 + * @param root - 字根 */ export const generateSliceBinaries = ( - config: Config, + degenerator: Degenerator, component: ComputedComponent, root: ComputedComponent, ) => { - const degenerator = config.analysis?.degenerator ?? defaultDegenerator; const { glyph: cglyph, topology: ctopology } = component; const { glyph: rglyph, topology: rtopology } = root; if (cglyph.length < rglyph.length) return []; diff --git a/src/lib/element.ts b/src/lib/element.ts index 0fe0fa8..e217270 100644 --- a/src/lib/element.ts +++ b/src/lib/element.ts @@ -1,4 +1,4 @@ -import type { Config, Rule } from "./config"; +import type { Algebra, Rule } from "./config"; import type { CharacterResult } from "./assembly"; export interface Extra { @@ -104,6 +104,17 @@ interface StrokePair extends Base { strokeIndex: number; } +interface Custom extends Base { + type: "自定义"; + subtype: string; + rootIndex: number; +} + +interface Special extends Base { + type: "特殊"; + subtype: string; +} + export type CodableObject = | This | Constant @@ -111,7 +122,9 @@ export type CodableObject = | Pronunciation | Root | Stroke - | StrokePair; + | StrokePair + | Custom + | Special; export const renderName = (object: CodableObject) => { switch (object.type) { @@ -130,6 +143,10 @@ export const renderName = (object: CodableObject) => { return `根 ${object.rootIndex} 笔 (${ object.strokeIndex * 2 - Math.sign(object.strokeIndex) }, ${object.strokeIndex * 2})`; + case "自定义": + return `${object.subtype} ${object.rootIndex}`; + case "特殊": + return object.subtype; } }; @@ -148,6 +165,10 @@ export const renderList = function ( return [...list, object.rootIndex, object.strokeIndex]; case "二笔": return [...list, object.rootIndex, object.strokeIndex]; + case "自定义": + return [...list, object.subtype, object.rootIndex]; + case "特殊": + return [...list, object.subtype]; } return list; }; @@ -173,6 +194,14 @@ export const parseList = function (value: (string | number)[]): CodableObject { rootIndex: value[1] as number, strokeIndex: value[2] as number, }; + case "自定义": + return { + type, + subtype: value[1] as string, + rootIndex: value[2] as number, + }; + case "特殊": + return { type, subtype: value[1] as string }; } return { type }; }; @@ -183,37 +212,83 @@ function signedIndex(a: T[], i: number): T | undefined { export const algebraCache = new Map(); +type Handler = (result: CharacterResult, extra: Extra) => string | undefined; + +// 张码补码 +const zhangmaSupplement: Handler = (result, { rootSequence }) => { + // 在补码时,竖钩视为竖,横折弯钩视为折 + const coalesce = (n: number) => { + if (n === 6) return 2; + if (n === 7) return 5; + return n; + }; + const { sequence } = result; + const first = rootSequence.get(sequence[0]!)!; + const last = rootSequence.get(sequence[sequence.length - 1]!)!; + const firstfirst = coalesce(first[0]!); + const lastlast = coalesce(last.at(-1)!); + // 单笔画补码用 61 表示 + if (sequence.length === 1 && first.length === 1) { + return "61"; + } + // 并型和左下围,首 + 末 + // 其他情况,末 + 首 + return result.operator && /[⿰⿲⿺]/.test(result.operator) + ? `${firstfirst}${lastlast}` + : `${lastlast}${firstfirst}`; +}; + +// 张码判断是否为准码元 +const zhangmaPseudoRoot: Handler = (result) => { + if (!("best" in result)) return "0"; + const { best } = result; + return best.scheme.length === 2 && best.evaluation.get("能连不交") + ? "1" + : "0"; +}; + +const specialElementHandlers: Record = { + 张码补码: zhangmaSupplement, + 张码准码元: zhangmaPseudoRoot, +}; + export const findElement = ( object: CodableObject, result: CharacterResult, - config: Config, + algebra: Algebra, extra: Extra, ) => { const { pinyin, sequence } = result; let root: string | undefined; let strokes: number[] | undefined; + let name: PronunciationElementTypes; + let hash: string; + let rules: Rule[]; + let transformed: string; + let stroke1: number | undefined; + let stroke2: number | undefined; switch (object.type) { case "汉字": return result.char; case "固定": return object.key; case "结构": - if ("detail" in result && "operator" in result.detail) { - return result.detail.operator; + if ("operator" in result) { + return result.operator; } return undefined; case "字音": - const name = object.subtype; - const hash = name + ":" + pinyin; + name = object.subtype; + hash = name + ":" + pinyin; if (algebraCache.has(hash)) return algebraCache.get(hash); - const rules = defaultAlgebra[name] || config.algebra?.[name]; - const transformed = applyRules(name, rules, pinyin); + rules = defaultAlgebra[name] || algebra?.[name]; + transformed = applyRules(name, rules, pinyin); algebraCache.set(hash, transformed); return transformed; case "字根": return signedIndex(sequence, object.rootIndex); case "笔画": - case "二笔": { + case "二笔": root = signedIndex(sequence, object.rootIndex); if (root === undefined) return undefined; strokes = extra.rootSequence.get(root); @@ -225,14 +300,16 @@ export const findElement = ( const number = signedIndex(strokes, object.strokeIndex); return number?.toString(); } - const [i1, i2] = [ + stroke1 = signedIndex( + strokes, object.strokeIndex * 2 - Math.sign(object.strokeIndex), - object.strokeIndex * 2, - ]; - const stroke1 = signedIndex(strokes, i1); + ); if (stroke1 === undefined) return undefined; - const stroke2 = signedIndex(strokes, i2); + stroke2 = signedIndex(strokes, object.strokeIndex * 2); return [stroke1, stroke2 ?? 0].join(""); - } + case "自定义": + return signedIndex(result.custom[object.subtype] ?? [], object.rootIndex); + case "特殊": + return specialElementHandlers[object.subtype]?.(result, extra); } }; diff --git a/src/lib/mathjs.ts b/src/lib/mathjs.ts new file mode 100644 index 0000000..d8d3654 --- /dev/null +++ b/src/lib/mathjs.ts @@ -0,0 +1,28 @@ +/** 为了更好的性能,替代mathjs的部分函数 */ + +import type { N2 } from "./data"; + +export const add = (a: N2, b: N2): N2 => [a[0] + b[0], a[1] + b[1]]; + +export const subtract = (a: N2, b: N2): N2 => [a[0] - b[0], a[1] - b[1]]; + +export const multiply = (a: number, b: N2): N2 => [a * b[0], a * b[1]]; + +export const divide = (a: N2, b: number): N2 => [a[0] / b, a[1] / b]; + +export const dot = (a: N2, b: N2): number => a[0] * b[0] + a[1] * b[1]; + +export const cross = (a: N2, b: N2): number => a[0] * b[1] - a[1] * b[0]; + +export const mean = (a: N2): number => (a[0] + a[1]) / 2; + +export const distance = (a: N2, b: N2): number => + Math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2); + +export const sum = (arr: number[]) => { + let result = 0; + for (let i = 0; i < arr.length; i++) { + result += arr[i]!; + } + return result; +}; diff --git a/src/lib/repertoire.ts b/src/lib/repertoire.ts index 587eec5..cd4d0ff 100644 --- a/src/lib/repertoire.ts +++ b/src/lib/repertoire.ts @@ -1,12 +1,15 @@ -import { +import { isEqual } from "lodash-es"; +import { mergeClassifier } from "./classifier"; +import type { ComponentResults, - ComponentAnalysis, - disassembleComponents, - recursiveRenderComponent, + ComponentBasicAnalysis, + ComponentGenuineAnalysis, } from "./component"; -import { CompoundResults, disassembleCompounds } from "./compound"; -import { Config, CustomGlyph } from "./config"; -import { +import { disassembleComponents, recursiveRenderComponent } from "./component"; +import type { CompoundResults } from "./compound"; +import { disassembleCompounds, recursiveRenderCompound } from "./compound"; +import type { Analysis, CustomGlyph, CustomReadings } from "./config"; +import type { Compound, Character, Repertoire, @@ -30,9 +33,10 @@ export const findGlyphIndex = ( * 将原始字符集转换为字符集 * 主要的工作是对每个字符,在数据库中的多个字形中选取一个 * - * @param repertoire 原始字符集 - * @param customization 自定义字形 - * @param tags 用户选择的标签 + * @param repertoire - 原始字符集 + * @param customGlyph - 自定义字形 + * @param customReadings - 自定义读音 + * @param tags - 用户选择的标签 * * 基本逻辑为,对于每个字符, * - 如果用户指定了字形,则使用用户指定的字形 @@ -41,16 +45,18 @@ export const findGlyphIndex = ( */ export const determine = ( repertoire: PrimitiveRepertoire, - customization: CustomGlyph = {}, + customGlyph: CustomGlyph = {}, + customReadings: CustomReadings = {}, tags: string[] = [], ) => { const determined: Repertoire = {}; const glyphCache: Map = new Map(); for (const [name, character] of Object.entries(repertoire)) { - const { ambiguous, glyphs, ...rest } = character; + const { ambiguous: _, glyphs, readings, ...rest } = character; const selectedIndex = findGlyphIndex(glyphs, tags); - const rawglyph = customization[name] ?? glyphs[selectedIndex]; - let glyph: Character["glyph"]; + const rawglyph = customGlyph[name] ?? glyphs[selectedIndex]; + let finalGlyph: Character["glyph"]; + const finalReadings = customReadings[name] ?? readings; if (rawglyph?.type === "derived_component") { const svgglyph = recursiveRenderComponent( rawglyph, @@ -60,15 +66,19 @@ export const determine = ( if (svgglyph instanceof Error) { continue; } - glyph = { + finalGlyph = { type: "basic_component", tags: rawglyph.tags, strokes: svgglyph, }; } else { - glyph = rawglyph; + finalGlyph = rawglyph; } - const determined_character: Character = { ...rest, glyph }; + const determined_character: Character = { + ...rest, + glyph: finalGlyph, + readings: finalReadings, + }; determined[name] = determined_character; } return determined; @@ -81,36 +91,139 @@ export interface AnalysisResult { customized: ComponentResults; compoundResults: CompoundResults; compoundError: string[]; + rootSequence: Map; } +export interface AnalysisConfig { + analysis: Analysis; + primaryRoots: Set; + secondaryRoots: Set; +} + +const getRootSequence = function ( + repertoire: Repertoire, + config: AnalysisConfig, +) { + const classifier = mergeClassifier(config.analysis?.classifier); + const findSequence = (x: string) => { + if (x.match(/[0-9]+/)) { + return [...x].map(Number); + } + const glyph = repertoire[x]?.glyph; + if (glyph === undefined) { + return []; + } + if (glyph.type === "basic_component") { + return glyph.strokes.map((s) => classifier[s.feature]); + } else { + const sequence = recursiveRenderCompound(glyph, repertoire); + if (sequence instanceof Error) return []; + return sequence.map((s) => classifier[s.feature]); + } + }; + const rootSequence = new Map(); + const roots = new Set([...config.primaryRoots, ...config.secondaryRoots]); + for (const root of roots) { + rootSequence.set(root, findSequence(root)); + } + for (const num of Object.values(classifier)) { + rootSequence.set(num.toString(), [num]); + } + return rootSequence; +}; + +/** + * 确定需要分析的字符 + */ +const getRequiredTargets = ( + repertoire: Repertoire, + config: AnalysisConfig, + characters: string[], +) => { + const queue = [...characters]; + const components = new Set(); + const compounds = new Set(); + const knownSet = new Set(characters); + while (queue.length) { + const char = queue.shift()!; + const glyph = repertoire[char]!.glyph!; + if (glyph.type === "compound") { + compounds.add(char); + if (config.primaryRoots.has(char) || config.secondaryRoots.has(char)) + continue; + glyph.operandList.forEach((x) => { + if (!knownSet.has(x)) { + knownSet.add(x); + queue.push(x); + } + }); + } else { + components.add(char); + } + } + return { components, compounds }; +}; + /** * 对整个字符集中的字符进行拆分 * - * @param repertoire 字符集 - * @param config 配置 + * @param repertoire - 字符集 + * @param config - 配置 */ export const analysis = function ( repertoire: Repertoire, - config: Config, + config: AnalysisConfig, + characters: string[], ): AnalysisResult { - const [componentResults, componentError] = disassembleComponents( + const { components, compounds } = getRequiredTargets( repertoire, config, + characters, ); - const customizations: ComponentResults = new Map( - Object.entries(config.analysis?.customize ?? {}).map( - ([component, sequence]) => { - const pseudoResult: ComponentAnalysis = { sequence: sequence }; - return [component, pseudoResult] as const; - }, - ), + const [componentResults, componentError] = disassembleComponents( + repertoire, + config, + characters, + components, ); + const customizations: ComponentResults = new Map(); + const customConfig = config.analysis?.customize ?? {}; + for (const [component, sequence] of Object.entries(customConfig)) { + const previousResult = componentResults.get(component); + if (previousResult !== undefined && "best" in previousResult) { + const maybeBetter = previousResult.schemes.find((x) => { + const list = x.scheme.map((y) => previousResult.map.get(y)!); + return isEqual(list, sequence); + }); + if (maybeBetter !== undefined) { + const genuineResult: ComponentGenuineAnalysis = { + ...previousResult, + best: maybeBetter, + sequence: sequence, + full: sequence, + }; + customizations.set(component, genuineResult); + continue; + } + } + const pseudoResult: ComponentBasicAnalysis = { + strokes: 0, + sequence: sequence, + full: sequence, + operator: undefined, + corners: [0, 0, 0, sequence.length - 1], + }; + customizations.set(component, pseudoResult); + } const customized = new Map([...componentResults, ...customizations]); const [compoundResults, compoundError] = disassembleCompounds( repertoire, config, customized, + characters, + compounds, ); + const rootSequence = getRootSequence(repertoire, config); return { componentResults, componentError, @@ -118,5 +231,6 @@ export const analysis = function ( customized, compoundResults, compoundError, + rootSequence, }; }; diff --git a/src/lib/selector.ts b/src/lib/selector.ts index 0dd3711..db16022 100644 --- a/src/lib/selector.ts +++ b/src/lib/selector.ts @@ -3,11 +3,12 @@ import { type ComputedComponent, NoSchemeError, } from "./component"; -import type { Config, SieveName } from "./config"; +import type { Analysis, SieveName } from "./config"; import { binaryToIndices } from "./degenerator"; -import { type CurveRelation } from "./topology"; +import type { CurveRelation } from "./topology"; import { isEqual } from "lodash-es"; import { sortTwoNumbers } from "./bezier"; +import type { AnalysisConfig } from "./repertoire"; export const defaultSelector: SieveName[] = [ "结构完整", @@ -22,18 +23,21 @@ export type Scheme = number[]; type Comparable = number | number[]; +export interface Environment { + component: ComputedComponent; + rootMap: Map; + analysis: Analysis; + primaryRoots: Set; + secondaryRoots: Set; +} + interface Sieve { title: SieveName; - key: ( - scheme: Scheme, - component: ComputedComponent, - config: Config, - rootMap: Map, - ) => T; + key: (scheme: Scheme, environment: Environment) => T; display?: (data: T) => string; } -function isLess(a: T, b: T) { +export function isLess(a: T, b: T) { if (typeof a === "number" && typeof b === "number") { return a < b; } else if (Array.isArray(a) && Array.isArray(b)) { @@ -88,7 +92,7 @@ export const unbias: Sieve = { */ export const order: Sieve = { title: "全符笔顺", - key: (scheme, component) => { + key: (scheme, { component }) => { const indices = scheme .map((x) => binaryToIndices(component.glyph.length)(x)) .flat(); @@ -106,13 +110,13 @@ export const order: Sieve = { */ export const order2: Sieve = { title: "连续笔顺", - key: (scheme, component) => { - const indices = scheme.map((x) => - binaryToIndices(component.glyph.length)(x), - ); + key: (scheme, { component }) => { + const indices = scheme.map(binaryToIndices(component.glyph.length)); + // 如果一个字根不是由连续的笔画构成,那么称它是不连续的 const unSorted = indices.filter( (x) => x.length - 1 !== x.at(-1)! - x[0]!, ).length; + // 让不连续的字根数量少者优先 return unSorted; }, }; @@ -126,9 +130,9 @@ export const order2: Sieve = { */ export const similar: Sieve = { title: "非形近根", - key: (scheme, _, config, rootMap) => { + key: (scheme, { rootMap, secondaryRoots }) => { const roots = scheme.map((x) => rootMap.get(x)!); - return roots.filter((x) => config.form.grouping[x] !== undefined).length; + return roots.filter((x) => secondaryRoots.has(x)).length; }, }; @@ -139,8 +143,8 @@ export const similar: Sieve = { */ export const strong: Sieve = { title: "多强字根", - key: (scheme, _, config, rootMap) => { - const strong = config.analysis?.strong || []; + key: (scheme, { rootMap, analysis }) => { + const strong = analysis?.strong || []; const roots = scheme.map((x) => rootMap.get(x)!); return -roots.filter((x) => strong.includes(x)).length; }, @@ -153,8 +157,8 @@ export const strong: Sieve = { */ export const weak: Sieve = { title: "少弱字根", - key: (scheme, _, config, rootMap) => { - const weak = config.analysis?.weak || []; + key: (scheme, { rootMap, analysis }) => { + const weak = analysis?.weak || []; const roots = scheme.map((x) => rootMap.get(x)!); return roots.filter((x) => weak.includes(x)).length; }, @@ -165,7 +169,7 @@ const makeTopologySieve = function ( avoidRelationType: CurveRelation["type"][], title: SieveName, ): Sieve { - const key: Sieve["key"] = (scheme, component) => { + const key: Sieve["key"] = (scheme, { component }) => { const parsedScheme = scheme.map((x) => binaryToIndices(component.glyph.length)(x), ); @@ -212,7 +216,7 @@ export const attaching = makeTopologySieve("连", ["交"], "能散不连"); */ export const orientation: Sieve = { title: "同向笔画", - key: (scheme, component) => { + key: (scheme, { component }) => { const n = component.glyph.length; const parsedScheme = scheme.map(binaryToIndices(n)); let totalCrosses = 0; @@ -229,7 +233,7 @@ export const orientation: Sieve = { r ||= oriented; } } - totalCrosses += +r; + totalCrosses += Number(r); } } return totalCrosses; @@ -237,8 +241,8 @@ export const orientation: Sieve = { }; /** - * @param b1 以二进制数表示的切片 - * @param b2 同上 + * @param b1 - 以二进制数表示的切片 + * @param b2 - 同上 * @returns 第一个切片是否包含第二个切片 */ const contains = (b1: number, b2: number) => (b1 | b2) === b1; @@ -252,7 +256,7 @@ const contains = (b1: number, b2: number) => (b1 | b2) === b1; */ export const integrity: Sieve = { title: "结构完整", - key: (scheme, _, __, rootMap) => { + key: (scheme, { rootMap }) => { const priorities = [ "口", "囗", @@ -263,6 +267,7 @@ export const integrity: Sieve = { "\ue009" /* 假右角 */, "勹", "尸", + "\uE407" /* 央三 */, ]; const shouldHave = [...rootMap] .filter(([_, name]) => priorities.includes(name)) @@ -291,16 +296,22 @@ export const sieveMap = new Map | Sieve>( ].map((x) => [x.title, x]), ); +interface SelectResult { + scheme: Scheme; + evaluation: Map; + excluded: boolean; +} + /** * 选择最优的拆分方案 * - * @param config 配置 - * @param component 待拆分部件 - * @param schemeList 拆分方案列表 - * @param rootMap 字根映射,从切片的二进制表示到字根名称的映射 + * @param config - 配置 + * @param component - 待拆分部件 + * @param schemeList - 拆分方案列表 + * @param rootMap - 字根映射,从切片的二进制表示到字根名称的映射 */ export const select = ( - config: Config, + config: AnalysisConfig, component: ComputedComponent, schemeList: Scheme[], rootMap: Map, @@ -310,12 +321,17 @@ export const select = ( evaluation: new Map(), excluded: false, })); - for (const sieveName of config.analysis?.selector ?? defaultSelector) { + const environment: Environment = { + component, + rootMap, + ...config, + }; + for (const sieveName of config.analysis.selector ?? defaultSelector) { const sieve = sieveMap.get(sieveName)!; let min: number | number[] | undefined; for (const data of schemeData) { if (data.excluded) continue; - const value = sieve.key(data.scheme, component, config, rootMap); + const value = sieve.key(data.scheme, environment); data.evaluation.set(sieve.title, value); if (min === undefined) { min = value; @@ -337,5 +353,6 @@ export const select = ( const best = schemeData.find((v) => !v.excluded); if (best === undefined) return new NoSchemeError(); // Correct result - return [best.scheme, schemeData] as const; + const result: [SelectResult, SelectResult[]] = [best, schemeData]; + return result; }; diff --git a/src/lib/templates.ts b/src/lib/templates.ts index 672357d..6c6077d 100644 --- a/src/lib/templates.ts +++ b/src/lib/templates.ts @@ -1,21 +1,53 @@ -import { Classifier } from "./classifier"; -import type { Analysis, Config, Keyboard } from "./config"; +import { mergeClassifier, type Classifier } from "./classifier"; +import type { Config } from "./config"; import { defaultDegenerator } from "./degenerator"; import { defaultSelector } from "./selector"; +import snow from "../../examples/snow.yaml"; +import bxm from "../../examples/bxm.yaml"; import mswb from "../../examples/mswb.yaml"; -import flypy from "../../examples/flypy.yaml"; -import yima from "../../examples/yima.yaml"; +import ziyuan from "../../examples/ziyuan.yaml"; +import jdh from "../../examples/jdh.yaml"; +import easy from "../../examples/easy.yaml"; +import yustar from "../../examples/yustar.yaml"; import zhengma from "../../examples/zhengma.yaml"; +import zhenma from "../../examples/zhenma.yaml"; +import zhangma from "../../examples/zhangma.yaml"; +import xuma from "../../examples/xuma.yaml"; +import huma from "../../examples/huma.yaml"; import type { ExampleConfig } from "./config"; -export type Example = "mswb" | "flypy" | "yima" | "zhengma"; +export type Example = + // 音码 + | "snow" + // 音形 + | "jdh" + // 形音 + | "bxm" + | "mswb" + | "ziyuan" + // 形码 + | "easy" + | "huma" + | "xuma" + | "yustar" + | "zhangma" + | "zhengma" + | "zhenma"; -export const examples: Record = { - mswb: mswb as ExampleConfig, - flypy: flypy as ExampleConfig, - yima: yima as ExampleConfig, - zhengma: zhengma as ExampleConfig, -}; +export const examples = { + snow, + jdh, + bxm, + mswb, + ziyuan, + easy, + huma, + xuma, + yustar, + zhangma, + zhengma, + zhenma, +} as Record; export const classifierTypes = [ "国标五分类", @@ -29,11 +61,31 @@ const classifierMap: Record = { 郑码七分类: examples.zhengma.analysis.classifier!, }; -export const keyboardTypes = ["郑码", "米十五笔", "无"] as const; +export const keyboardTypes = [ + "简单鹤", + "表形码", + "米十五笔", + "字源", + "宇浩·星陈", + "郑码", + "真码", + "张码", + "徐码", + "虎码", + "无", +] as const; export type KeyboardTypes = (typeof keyboardTypes)[number]; const keyboardMap: Record = { - 郑码: examples.zhengma.form, + 简单鹤: examples.jdh.form, + 表形码: examples.bxm.form, 米十五笔: examples.mswb.form, + 字源: examples.ziyuan.form, + 宇浩·星陈: examples.yustar.form, + 郑码: examples.zhengma.form, + 真码: examples.zhenma.form, + 张码: examples.zhangma.form, + 徐码: examples.xuma.form, + 虎码: examples.huma.form, 无: { alphabet: "qwertyuiopasdfghjklzxcvbnm", grouping: {}, @@ -42,15 +94,31 @@ const keyboardMap: Record = { }; export const encoderTypes = [ - "形音码", + "音形码(简单鹤)", + "形音码(表形码)", + "形音码(米十五笔)", + "形音码(字源)", + "单编形码(张码)", "双编形码(郑码)", + "双编形码(真码)", + "双编形码(徐码)", "双编形码(易码)", + "双编形码(宇浩·星陈)", + "双编形码(虎码)", ] as const; export type EncoderTypes = (typeof encoderTypes)[number]; const encoderMap: Record = { - 形音码: examples.mswb.encoder, + "音形码(简单鹤)": examples.jdh.encoder, + "形音码(表形码)": examples.bxm.encoder, + "形音码(米十五笔)": examples.mswb.encoder, + "形音码(字源)": examples.ziyuan.encoder, + "单编形码(张码)": examples.zhangma.encoder, "双编形码(郑码)": examples.zhengma.encoder, - "双编形码(易码)": examples.yima.encoder, + "双编形码(真码)": examples.zhenma.encoder, + "双编形码(徐码)": examples.xuma.encoder, + "双编形码(易码)": examples.easy.encoder, + "双编形码(宇浩·星陈)": examples.yustar.encoder, + "双编形码(虎码)": examples.huma.encoder, }; export interface StarterType { @@ -61,8 +129,19 @@ export interface StarterType { } export const createConfig = function (starter: StarterType): Config { + const form = keyboardMap[starter.keyboard]; + const classifier = classifierMap[starter.data]; + + // 确保笔画都在 mapping 里 + for (const value of Object.values(mergeClassifier(classifier))) { + const element = value.toString(); + if (!form.mapping[element]) { + form.mapping[element] = form.alphabet[0]!; + } + } + return { - version: APP_VERSION, + version: "0.1", source: null, info: { name: starter.name, @@ -71,11 +150,11 @@ export const createConfig = function (starter: StarterType): Config { description: "从模板创建", }, analysis: { - classifier: classifierMap[starter.data]!, + classifier, degenerator: defaultDegenerator, selector: defaultSelector, }, - form: keyboardMap[starter.keyboard], + form, encoder: encoderMap[starter.encoder], }; }; @@ -84,5 +163,5 @@ export const defaultConfig = createConfig({ name: "", data: "国标五分类", keyboard: "无", - encoder: "形音码", + encoder: "形音码(米十五笔)", }); diff --git a/src/lib/topology.ts b/src/lib/topology.ts index 5f57074..ca4392c 100644 --- a/src/lib/topology.ts +++ b/src/lib/topology.ts @@ -1,6 +1,6 @@ -import { isEqual } from "lodash-es"; -import type { SVGGlyph, SVGStroke } from "./data"; -import { subtract } from "mathjs"; +import { isEqual, minBy } from "lodash-es"; +import type { Point, SVGGlyph, SVGStroke } from "./data"; +import { subtract } from "./mathjs"; import type { Curve, LinearCurve, Position } from "./bezier"; import { area, @@ -200,6 +200,35 @@ const isConforming = (r1: CurveRelation, r2: CurveRelation) => { } }; +const hashPoint = (point: Point) => `${point[0]}-${point[1]}`; + +export type CornerSpecifier = [number, number, number, number]; + +const findCorners = (renderedGlyph: RenderedGlyph) => { + const extremes: Point[] = []; + const pointToStroke = new Map(); + for (const [strokeIndex, { curveList }] of renderedGlyph.entries()) { + const subExtremes: Point[] = []; + for (const [curveIndex, curve] of curveList.entries()) { + const [start, end] = getBoundingBox(curve); + if (curveIndex === 0) subExtremes.push(start); + subExtremes.push(end); + } + for (const point of subExtremes) { + const hash = hashPoint(point); + if (!pointToStroke.has(hash)) pointToStroke.set(hash, strokeIndex); + } + extremes.push(...subExtremes); + } + const topLeft = minBy(extremes, (p) => distance(p, [0, 0]))!; + const topRight = minBy(extremes, (p) => distance(p, [100, 0]))!; + const bottomLeft = minBy(extremes, (p) => distance(p, [0, 100]))!; + const bottomRight = minBy(extremes, (p) => distance(p, [100, 100]))!; + return [topLeft, topRight, bottomLeft, bottomRight].map( + (point) => pointToStroke.get(hashPoint(point))!, + ) as CornerSpecifier; +}; + const findTopology = function (renderedGlyph: RenderedGlyph) { const topology: Topology = { matrix: [], orientedPairs: [] }; for (const [index1, stroke1] of renderedGlyph.entries()) { @@ -247,10 +276,12 @@ const findTopology = function (renderedGlyph: RenderedGlyph) { }; export { + isConforming, curveRelation, strokeRelation, renderSVGStroke, renderSVGGlyph, findTopology, + findCorners, }; export type { CurveRelation, StrokeRelation, RenderedGlyph, Topology }; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 92c0c4e..8390379 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,4 +1,3 @@ -import { Distribution } from "~/atoms"; import type { Feature } from "./classifier"; import { schema } from "./classifier"; import type { @@ -11,15 +10,37 @@ import type { SVGStroke, BasicComponent, ReferenceStroke, + PrimitiveRepertoire, + PrimitiveCharacter, + Character, } from "./data"; import { range } from "lodash-es"; import { dump } from "js-yaml"; -import { IndexedElement, Key } from "."; +import type { Key } from "./config"; +import type { IndexedElement } from "./assembly"; + +interface Loss { + ideal: number; + lt_penalty: number; + gt_penalty: number; +} + +export type Dictionary = [string, string][]; +export type Frequency = Record; +export type AdaptedFrequency = Map; +export type Distribution = Record; +export type Equivalence = Record; + +export type CustomElementMap = Record; export const printableAscii = range(33, 127).map((x) => String.fromCodePoint(x), ); +export const formatDate = (date: Date) => { + return `${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`; +}; + export const unicodeBlock = (code: number) => { // ASCII if (code >= 0 && code <= 0x7f) return "ascii"; @@ -32,6 +53,12 @@ export const unicodeBlock = (code: number) => { return "unknown"; }; +export const isValidCJKBasicChar = (char: string) => { + const code = char.codePointAt(0)!; + const block = unicodeBlock(code); + return block === "cjk"; +}; + export const isValidCJKChar = (char: string) => { const code = char.codePointAt(0)!; const block = unicodeBlock(code); @@ -88,6 +115,7 @@ export const getDummySVGStroke = function ( return { command, parameterList: [20] }; case "c": case "z": + default: return { command, parameterList: [10, 10, 20, 20, 30, 30] }; } }), @@ -219,10 +247,12 @@ export const exportTSV = (data: string[][], filename: string) => { }; export const renderIndexed = ( - element: IndexedElement, + element: IndexedElement | undefined, display: (s: string) => string, ) => { - if (typeof element === "string") { + if (element === undefined) { + return "ε"; + } else if (typeof element === "string") { return display(element); } else { return renderSuperScript(display(element.element), element.index); @@ -249,8 +279,157 @@ export const renderMapped = (mapped: string | Key[]) => { }); }; -export const makeWorker = () => { - return new Worker(new URL("../worker.ts", import.meta.url), { - type: "module", - }); +const match = ( + character: PrimitiveCharacter | Character, + input: CharacterFilter, +) => { + const { tag, operator, part } = input; + if ("glyphs" in character) { + const isTagMatched = + tag === undefined || character.glyphs.some((x) => x.tags?.includes(tag)); + const isOperatorMatched = + operator === undefined || + character.glyphs.some( + (x) => "operator" in x && x.operator.includes(operator), + ); + const isPartMatched = + part === undefined || + character.glyphs.some( + (x) => "operandList" in x && x.operandList.includes(part), + ); + return isTagMatched && isOperatorMatched && isPartMatched; + } else { + const isTagMatched = + tag === undefined || character.glyph?.tags?.includes(tag); + const isOperatorMatched = + operator === undefined || + (character.glyph?.type === "compound" && + character.glyph.operator.includes(operator)); + const isPartMatched = + part === undefined || + (character.glyph?.type === "compound" && + character.glyph.operandList.includes(part)); + return isTagMatched && isOperatorMatched && isPartMatched; + } }; + +export const makeCharacterFilter = ( + input: CharacterFilter, + repertoire: Repertoire | PrimitiveRepertoire, + sequenceMap: Map, +) => + function (name: string) { + const character = repertoire[name]; + if (character === undefined) return false; + const sequence = sequenceMap.get(name) ?? ""; + const isNameMatched = ((character.name ?? "") + name).includes( + input.name ?? "", + ); + const isSequenceMatched = sequence.startsWith(input.sequence ?? ""); + const isUnicodeMatched = + input.unicode === undefined || input.unicode === name.codePointAt(0); + const isMatched = match(character, input); + return isNameMatched && isSequenceMatched && isUnicodeMatched && isMatched; + }; + +export interface CharacterFilter { + name?: string; + sequence?: string; + unicode?: number; + tag?: string; + part?: string; + operator?: Operator; +} + +export const makeFilter = + (input: string, form: Repertoire, sequence: Map) => + (char: string) => { + if ((sequence.get(char)?.length ?? 0) <= 1) return false; + let name = form[char]?.name ?? ""; + let seq = sequence.get(char) ?? ""; + return ( + name.includes(input) || char.includes(input) || seq.startsWith(input) + ); + }; + +export interface AnalyzerForm { + type: "single" | "multi" | "all"; + position: number[]; + top: number; +} + +export const makeDefaultAnalyzer = (maxLength: number) => { + const form: AnalyzerForm = { + type: "all", + position: range(0, maxLength), + top: 0, + }; + return form; +}; + +interface LevelMetric { + length: number; + frequency: number; +} + +interface TierMetric { + top?: number; + duplication?: number; + levels?: LevelMetric[]; + fingering?: (number | undefined)[]; +} + +export interface PartialMetric { + tiers?: TierMetric[]; + duplication?: number; + key_distribution?: number; + pair_equivalence?: number; + extended_pair_equivalence?: number; + fingering?: (number | undefined)[]; + levels?: LevelMetric[]; +} + +export interface Metric { + characters_full?: PartialMetric; + characters_short?: PartialMetric; + words_full?: PartialMetric; + words_short?: PartialMetric; +} + +// 使用使用逆向最大匹配算法来分词 +export const adapt = (frequency: Frequency, words: Set) => { + const result: Map = new Map(); + for (const [word, value] of Object.entries(frequency)) { + if (words.has(word)) { + result.set(word, (result.get(word) ?? 0) + value); + } else { + let chars = [...word]; + let end = chars.length; + let start: number; + while (end > 0) { + start = end - 1; + if (!words.has(chars[start]!)) { + end -= 1; + continue; + } + while (start > 0 && words.has(chars.slice(start - 1, end).join(""))) { + start -= 1; + } + const subword = chars.slice(start, end).join(""); + result.set(subword, (result.get(subword) ?? 0) + value); + end = start; + } + } + } + return result; +}; + +export type Tuple = N extends N + ? number extends N + ? T[] + : _TupleOf + : never; + +type _TupleOf = R["length"] extends N + ? R + : _TupleOf; diff --git a/src/pages/[id].tsx b/src/pages/[id].tsx index 7429088..ee05c75 100644 --- a/src/pages/[id].tsx +++ b/src/pages/[id].tsx @@ -1,4 +1,4 @@ -import { Suspense, useState } from "react"; +import { Suspense, useEffect, useState } from "react"; import { Button, Flex, Layout, Menu, Avatar, Tooltip, Empty } from "antd"; import DatabaseOutlined from "@ant-design/icons/DatabaseOutlined"; import MailOutlined from "@ant-design/icons/MailOutlined"; @@ -7,22 +7,23 @@ import ProfileOutlined from "@ant-design/icons/ProfileOutlined"; import BoldOutlined from "@ant-design/icons/BoldOutlined"; import OrderedListOutlined from "@ant-design/icons/OrderedListOutlined"; import RiseOutlined from "@ant-design/icons/RiseOutlined"; +import NumberOutlined from "@ant-design/icons/NumberOutlined"; import type { MenuProps } from "antd"; import { Link, Outlet, useLocation, useNavigate } from "react-router-dom"; import CusSpin from "~/components/CustomSpin"; -import { DevTools } from "jotai-devtools"; import { - configIdAtom, infoAtom, useSetAtom, useAtomValue, - useAtom, fetchAsset, primitiveRepertoireAtom, + useAtom, + syncConfig, + syncAssets, + syncInfo, } from "~/atoms"; -import { listToObject } from "~/lib"; -import { LoadAssets } from "~/components/Utils"; +import { examples, listToObject } from "~/lib"; const items: MenuProps["items"] = [ { @@ -50,6 +51,21 @@ const items: MenuProps["items"] = [ key: "assembly", icon: , }, + { + label: "校对", + key: "debug", + icon: , + }, + { + label: "统计一", + key: "statistics", + icon: , + }, + { + label: "统计二", + key: "statistics2", + icon: , + }, { label: "优化", key: "optimization", @@ -57,11 +73,22 @@ const items: MenuProps["items"] = [ }, ]; +const Header = ({ isCollapsed }: { isCollapsed: boolean }) => { + const info = useAtomValue(infoAtom); + return ( + +
{info?.name ?? "未命名"}
+
+ ); +}; + function EditorLayout() { + useAtom(syncConfig); + useAtom(syncAssets); + useAtom(syncInfo); const navigate = useNavigate(); const { pathname } = useLocation(); const relativePath = pathname.split("/").slice(2).join("/"); - const configInfo = useAtomValue(infoAtom); const [isCollapsed, setCollapsed] = useState(false); return ( @@ -90,16 +117,20 @@ function EditorLayout() { > + setModal(0)} + > + + + + ); +}; + +const AnalysisResults = ({ filter }: { filter: CharacterFilter }) => { const [step, setStep] = useState(0 as 0 | 1); const repertoire = useAtomValue(repertoireAtom); const sequenceMap = useAtomValue(sequenceAtom); - const [analysisResult, setAnalysisResult] = useAtom(analysisResultAtom); - const componentResults: ComponentResults = - analysisResult?.componentResults ?? new Map(); - const compoundResults: CompoundResults = - analysisResult?.compoundResults ?? new Map(); - const componentCustomizations: ComponentResults = - analysisResult?.customizations ?? new Map(); - const componentError = analysisResult?.componentError ?? []; - const compoundError = analysisResult?.compoundError ?? []; - const characters = Object.entries(repertoire) - .filter(([, v]) => v.tygf > 0) - .map(([x]) => x); - - const config = useAtomValue(configAtom); + const analysisResult = useAtomValue(analysisResultAtom); + const { componentResults, compoundResults, componentError, compoundError } = + analysisResult; + const characters = useAtomValue(charactersAtom); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(50); const display = useAtomValue(displayAtom); + const customize = useAtomValue(customizeAtom); const filterFn = makeCharacterFilter(filter, repertoire, sequenceMap); - const displays = [ - [...componentResults] - .filter(([x]) => filterFn(x)) - .filter(([, v]) => v.sequence.length > 1) - .map(([key, res]) => { - return { - key, - label: ( - v.sequence.length > 1, + ); + const componentDisplay = componentsNeedAnalysis + .filter(([x]) => !customizedOnly || customize[x]) + .filter(([x]) => filterFn(x)) + .map(([key, res]) => { + return { + key, + label: , + children: + "schemes" in res ? ( + - ), - children: - "schemes" in res ? ( - - ) : null, - }; - }), - [...compoundResults] - .filter(([x]) => filterFn(x)) - .map(([key, res]) => { - return { - key, - label: , - }; - }), - ] as const; + ) : null, + }; + }); + const compoundDisplay = [...compoundResults] + .filter(([x]) => filterFn(x)) + .map(([key, res]) => { + return { + key, + label: , + }; + }); + const displays = [componentDisplay, compoundDisplay] as const; return ( - - - 规则 - - - 自定义部件拆分 - - 此处只能自定义部件拆分,复合体的拆分无法自定义。如需改变复合体的拆分结果,请在字形数据中改变它的分部方式。 - - - - - 拆分结果 - {componentError.length + compoundError.length > 0 ? ( - + {componentError.length + compoundError.length > 0 ? ( + + ) : null} + + setStep(e.target.value as 0)} + style={{ minWidth: "200px" }} + > + 部件拆分 + 复合体拆分 + + + + +
+ + + + - ) : null} - - setStep(e.target.value as 0)} - style={{ minWidth: "200px" }} - > - 部件拆分 - 复合体拆分 - - - + - 导出 - - - - {displays[step].length ? ( - <> - - { - setPage(page); - setPageSize(pageSize); - }} - total={displays[step].length} - pageSize={pageSize} + /> + + + + + + + 只显示自定义 + setCustomizedOnly((x) => !x)} /> - - ) : ( - - )} - - + + + + + { + setPage(page); + setPageSize(pageSize); + }} + total={displays[step].length} + pageSize={pageSize} + /> + ); }; -export default Analysis; +export default function Analysis() { + useChaifenTitle("拆分"); + const [filter, setFilter] = useState({}); + + return ( + + + + + + }> + + + + ); +} diff --git a/src/pages/[id]/assembly.tsx b/src/pages/[id]/assembly.tsx index 8ae0973..fdae4c9 100644 --- a/src/pages/[id]/assembly.tsx +++ b/src/pages/[id]/assembly.tsx @@ -1,58 +1,20 @@ -import { useState } from "react"; -import { Button, Flex, Modal } from "antd"; -import EncoderGraph from "~/components/EncoderGraph"; -import { ReactFlowProvider } from "reactflow"; -import WordRules from "~/components/WordRules"; +import { Suspense } from "react"; +import { Flex, Skeleton } from "antd"; +import SingleRules from "~/components/SingleRules"; +import MultipleRules from "~/components/MultipleRules"; import SequenceTable from "~/components/SequenceTable"; import ShortCodeRules from "~/components/ShortCodeRules"; import { useChaifenTitle } from "~/atoms"; import SelectRules from "~/components/SelectRules"; +import MetricTable from "~/components/MetricTable"; const ConfigureRules = () => { - const [modal, setModal] = useState(0); return ( - - - - - setModal(0)} - width={1080} - > -
- - - -
-
- setModal(0)} - > - - - setModal(0)} - > - - - setModal(0)} - > - - + + + +
); }; @@ -62,7 +24,10 @@ export default function Assembly() { return ( - + }> + + + ); } diff --git a/src/pages/[id]/debug.tsx b/src/pages/[id]/debug.tsx new file mode 100644 index 0000000..8caf059 --- /dev/null +++ b/src/pages/[id]/debug.tsx @@ -0,0 +1,15 @@ +import { Flex, Skeleton } from "antd"; +import { Suspense } from "react"; +import { useChaifenTitle } from "~/atoms"; +import Debugger from "~/components/Debugger"; + +export default function Assembly() { + useChaifenTitle("编码"); + return ( + + }> + + + + ); +} diff --git a/src/pages/[id]/element.tsx b/src/pages/[id]/element.tsx index 4415761..9dbf6fb 100644 --- a/src/pages/[id]/element.tsx +++ b/src/pages/[id]/element.tsx @@ -1,38 +1,46 @@ import Mapping from "~/components/Mapping"; -import { Typography } from "antd"; -import { EditorColumn, EditorRow } from "~/components/Utils"; +import ElementPicker from "~/components/ElementPicker"; import { - ShapeElementPicker, - PronElementPicker, -} from "~/components/ElementPicker"; -import { useChaifenTitle } from "~/atoms"; + mappingAtom, + useAddAtom, + useAtomValue, + useChaifenTitle, +} from "~/atoms"; +import { DndContext } from "@dnd-kit/core"; +import { Flex } from "antd"; export default function Element() { useChaifenTitle("元素"); + const mapping = useAtomValue(mappingAtom); + const addMapping = useAddAtom(mappingAtom); return ( - - - 字形元素 - - 字音元素 -
    -
  • - 「声母」和「韵母」是按照《汉语拼音方案》中所规定的声母和韵母来切分一个音节,例如 - yan 分析为零声母 + ian; -
  • -
  • - 「双拼声母」和「双拼韵母」是按照自然码等双拼方案中的习惯来切分一个音节,例如 - yan 分析为 y + an; -
  • -
  • 「首字母」和「末字母」是二笔和形音码等方案中采取的元素类型;
  • -
  • 您可利用拼写运算创造新的字音元素类型。
  • -
- -
- - 键盘映射 + { + if (over === null) return; + const activeId = active.id as string; + const overId = over.id as string; + const element = activeId.startsWith("onsite-") + ? activeId.slice(7) + : activeId; + const current = mapping[element]; + if (!current) { + addMapping(element, overId); + } else { + if (typeof current === "string") { + if (overId === current[0]) return; + const next = overId + current.slice(1); + addMapping(element, next); + } else { + if (overId === current[0]) return; + addMapping(element, [overId, ...current.slice(1)]); + } + } + }} + > + + - -
+ + ); } diff --git a/src/pages/[id]/index.tsx b/src/pages/[id]/index.tsx index 67aaaa2..eeac380 100644 --- a/src/pages/[id]/index.tsx +++ b/src/pages/[id]/index.tsx @@ -1,11 +1,9 @@ -import { Button, Flex, Space, Typography, Upload } from "antd"; +import { Button, Flex, Input, Space, Typography, Upload } from "antd"; import { Atom, - Dictionary, - Distribution, - Equivalence, SetStateAction, WritableAtom, + characterSetAtom, defaultDictionaryAtom, frequencyAtom, infoAtom, @@ -15,21 +13,43 @@ import { useAtomValue, useChaifenTitle, } from "~/atoms"; -import { Info, exportTSV, getDictFromTSV, getDistributionFromTSV } from "~/lib"; +import { + CharacterSetSpecifier, + Dictionary, + Distribution, + Equivalence, + Info, + characterSetSpecifiers, + exportTSV, + getDictFromTSV, + getDistributionFromTSV, +} from "~/lib"; import ConfigManager from "~/components/ConfigManager"; import { ProForm, ProFormText, ProFormTextArea, } from "@ant-design/pro-components"; -import { EditorColumn, EditorRow, Uploader } from "~/components/Utils"; +import { EditorColumn, EditorRow, Select, Uploader } from "~/components/Utils"; import { userFrequencyAtom, userKeyDistributionAtom, userPairEquivalenceAtom, userDictionaryAtom, -} from "~/atoms/assets"; + customElementsAtom, +} from "~/atoms"; import { getRecordFromTSV } from "~/lib"; +import { useEffect, useState } from "react"; + +const getTSVFromRecord = (record: Equivalence) => + Object.entries(record).map(([k, v]) => [k, v.toString()]); + +const getTSVFromDistribution = (distribution: Distribution) => { + return Object.entries(distribution).map(([k, v]) => { + const { ideal, lt_penalty, gt_penalty } = v; + return [k, ideal.toString(), lt_penalty.toString(), gt_penalty.toString()]; + }); +}; function AssetUploader({ atom, @@ -37,18 +57,18 @@ function AssetUploader({ title, description, parser, + dumper, }: { atom: WritableAtom], void>; - defaultAtom: Atom; + defaultAtom: Atom>; title: string; description: string; parser: (text: string) => V; + dumper: (value: V) => string[][]; }) { const [value, setValue] = useAtom(atom); const defaultValue = useAtomValue(defaultAtom); - const tsv = Array.isArray(defaultValue) - ? defaultValue - : Object.entries(defaultValue).map(([s, n]) => [s, n.toString()]); + const tsv = dumper(defaultValue); return ( <> @@ -73,29 +93,134 @@ function AssetUploader({ ); } +const CustomElementUploader = () => { + const [customElements, setCustomElements] = useAtom(customElementsAtom); + const [name, setName] = useState(""); + return ( + + {Object.entries(customElements).map(([name, map]) => { + return ( + + + {name}(条目数量:{Object.entries(map).length}) + +
+ + + + ); + })} + + setName(e.target.value)} + /> + { + const lines = text.trim().split("\n"); + const map: Record = {}; + for (const line of lines) { + const [key, values] = line.trim().split("\t"); + if (key === undefined || values === undefined) continue; + map[key] = values.trim().split(" "); + } + setCustomElements({ ...customElements, [name]: map }); + }} + /> + + + ); +}; + +const ConfigInfo = () => { + const [info, setInfo] = useAtom(infoAtom); + const [form] = ProForm.useForm(); + useEffect(() => { + form.setFieldsValue(info); + }, [info]); + return ( + <> + 基本信息 + + form={form} + layout="horizontal" + labelCol={{ span: 6 }} + wrapperCol={{ span: 16 }} + initialValues={info} + onValuesChange={(_, values) => setInfo(values)} + submitter={false} + autoFocusFirstInput={false} + > + + + + + + + ); +}; + export default function Index() { useChaifenTitle("基本信息"); - const [info, setInfo] = useAtom(infoAtom); + const [characterSet, setCharacterSet] = useAtom(characterSetAtom); + const specifierNames: Record = { + gb2312: "GB2312", + general: "通用", + basic: "基本", + extended: "扩展", + }; return ( 方案 管理配置 - 基本信息 - - layout="horizontal" - labelCol={{ span: 6 }} - wrapperCol={{ span: 16 }} - initialValues={info} - onValuesChange={(_, values) => setInfo(values)} - submitter={false} - > - - - - - + + + 字集 + { + const top = value === 0 ? 0 : 500; + form.setFieldValue("top", top); + setAnalyzer({ ...form.getFieldsValue(), top }); + }} + style={{ width: 96 }} + /> + + + + )} + + + + ); +}; + +const MultiDistribution = ({ init }: { init: AnalyzerForm }) => { + const maxLength = useAtomValue(maxLengthAtom); + const [analyzer, setAnalyzer] = useState(init); + const assemblyResult = useAtomValue(assemblyResultAtom); + const frequency = useAtomValue(adaptedFrequencyAtom); + const display = useAtomValue(displayAtom); + const reverseMap = analyzePrimitiveDuplication( + analyzer, + frequency, + assemblyResult, + display, + maxLength, + ); + const alphabet = useAtomValue(alphabetAtom); + const dataSource = [...reverseMap] + .sort((a, b) => b[1].length - a[1].length) + .map(([name, items]) => ({ name, items })); + const lengths = dataSource.map((x) => x.items.length); + const columns: ColumnsType = [ + { + title: "元素序列", + dataIndex: "name", + key: "name", + width: 192, + }, + { + title: "数量", + dataIndex: "items", + key: "density", + render: (items) => items.length, + width: 64, + }, + { + title: "对象", + dataIndex: "items", + key: "items", + render: (items) => items.join("、"), + }, + ]; + + const coorder = render(maxLength - analyzer.position.length); + const space = Math.pow(alphabet.length, maxLength - analyzer.position.length); + const estimation = sumBy(lengths, (x) => + analyzer.position.length === maxLength ? x - 1 : (x * x) / 2 / space, + ); + return ( + <> + + 多元分布({coorder}阶重码估计:{Math.round(estimation)}) + + +
+ + ); +}; + +interface UnaryDensity { + name: string; + items: Set[]; + total: number; +} + +const UnaryDistribution = ({ init }: { init: AnalyzerForm }) => { + const maxLength = useAtomValue(maxLengthAtom); + const [analyzer, setAnalyzer] = useState(init); + const assemblyResult = useAtomValue(assemblyResultAtom); + const frequency = useAtomValue(adaptedFrequencyAtom); + const display = useAtomValue(displayAtom); + const reverseMap = new Map[]>(); + const relevant = filterRelevant(assemblyResult, analyzer, frequency); + for (const assembly of relevant) { + const { name, sequence } = assembly; + sequence.forEach((x, i) => { + const key = renderIndexed(x, display); + if (!reverseMap.has(key)) + reverseMap.set( + key, + range(maxLength).map(() => new Set()), + ); + reverseMap.get(key)![i]!.add(name); + }); + } + const dataSource = [...reverseMap] + .map(([name, items]) => ({ + name, + items, + total: sumBy(items, (x) => x.size), + })) + .sort((a, b) => b.total - a.total); + const columns: ColumnsType = [ + { + title: "元素序列", + dataIndex: "name", + key: "name", + width: 192, + }, + ...range(maxLength).map((i) => ({ + title: `第 ${i + 1} 码`, + dataIndex: "items", + key: `density-${i}`, + render: (items: Set[]) => ( + {[...items[i]!].join("、")} + } + > + {items[i]?.size ?? 0} + + ), + width: 64, + sortDirections: ["descend", "ascend"] as ("descend" | "ascend")[], + sorter: (a: UnaryDensity, b: UnaryDensity) => + (a.items[i]?.size ?? 0) - (b.items[i]?.size ?? 0), + })), + { + title: "总数量", + dataIndex: "total", + key: "density", + width: 64, + sortDirections: ["descend", "ascend"], + sorter: (a, b) => a.total - b.total, + }, + ]; + return ( + <> + 一元分布 + +
+ + ); +}; + +const MarginalFirstOrderDuplication = () => { + const assemblyResult = useAtomValue(assemblyResultAtom); + const frequency = useAtomValue(adaptedFrequencyAtom); + const maxLength = useAtomValue(maxLengthAtom); + const display = useAtomValue(displayAtom); + const sequenceMap = useAtomValue(sequenceAtom); + const repertoire = useAtomValue(repertoireAtom); + const hashedElements = new Set(); + for (const { sequence } of assemblyResult) { + sequence.forEach((x) => { + hashedElements.add(renderIndexed(x, display)); + }); + } + const allElements = [...hashedElements].sort(); + + const [elements, setElements] = useState(allElements.slice(0, 2)); + const [analyzer, setAnalyzer] = useState({ + type: "single", + position: range(0, maxLength), + top: 0, + }); + + const rmBefore = analyzePrimitiveDuplication( + analyzer, + frequency, + assemblyResult, + display, + maxLength, + ); + const szBefore = new Set(); + rmBefore.forEach((items) => { + if (items.length > 1) items.forEach((x) => szBefore.add(x)); + }); + const rmAfter = analyzePrimitiveDuplication( + analyzer, + frequency, + assemblyResult, + display, + maxLength, + (d) => (elements.includes(d) ? "^" : d), + ); + const szAfter = new Set(); + rmAfter.forEach((items) => { + if (items.length > 1) items.forEach((x) => szAfter.add(x)); + }); + return ( + <> + 边际一阶重码计算 + + + +
+ + ); +}; + +export default function Statistics() { + useChaifenTitle("统计"); + return ( + + }> + + + + + + + ); +} diff --git a/src/pages/[id]/statistics3.tsx b/src/pages/[id]/statistics3.tsx new file mode 100644 index 0000000..ce145da --- /dev/null +++ b/src/pages/[id]/statistics3.tsx @@ -0,0 +1,152 @@ +import { Flex, Popover, Select, Skeleton, Table } from "antd"; +import { + displayAtom, + repertoireAtom, + sequenceAtom, + useChaifenTitle, +} from "~/atoms"; +import { Form, Space, Typography } from "antd"; +import { useAtomValue } from "jotai"; +import { maxLengthAtom } from "~/atoms"; +import { renderIndexed } from "~/lib"; +import { Suspense, useState } from "react"; +import { assemblyResultAtom } from "~/atoms"; +import { range, sumBy } from "lodash-es"; +import type { HeatmapConfig } from "@ant-design/charts"; +import { Heatmap } from "@ant-design/charts"; +import { blue } from "@ant-design/colors"; +import "~/components/charts.css"; + +const DuplicationMatrix = () => { + const assemblyResult = useAtomValue(assemblyResultAtom); + const sequenceMap = useAtomValue(sequenceAtom); + const repertoire = useAtomValue(repertoireAtom); + const display = useAtomValue(displayAtom); + const processed = assemblyResult.map((x) => { + const sequence = x.sequence.map((y) => renderIndexed(y, display)); + return { sequence, name: x.name }; + }); + const hashedElements = new Set(); + for (const { sequence } of assemblyResult) { + sequence.forEach((x) => { + hashedElements.add(renderIndexed(x, display)); + }); + } + const allElements = [...hashedElements].sort(); + const [elements, setElements] = useState([ + ..."氵艹口扌木亻钅土讠纟月虫忄竹女辶疒石王日足山礻火宀犭鱼卩禾广目尸酉车门马饣米贝彳雨穴舟囗匚立牛耳歹羊田弓革气白1234二三", + ]); + + const data: { x: string; y: string; count: number; items: string[] }[] = []; + + for (const [i, x] of elements.entries()) { + for (const [j, y] of elements.entries()) { + if (i >= j) continue; + if (i < 15 && j < 15) continue; + const res: Map = new Map(); + for (const { name, sequence } of processed) { + const key = sequence.slice(1).join("-"); + if (sequence[0] === x) { + if (!res.has(key)) { + res.set(key, { flag: 1, items: [] }); + } + res.get(key)!.flag *= 2; + res.get(key)!.items.push(name); + } else if (sequence[0] === y) { + if (!res.has(key)) { + res.set(key, { flag: 1, items: [] }); + } + res.get(key)!.flag *= 3; + res.get(key)!.items.push(name); + } + } + const count = sumBy([...res.values()], (x) => (x.flag % 6 === 0 ? 1 : 0)); + const items = [...res.values()] + .filter((x) => x.flag % 6 === 0) + .map((x) => x.items.join("/")); + data.push({ x, y, count, items }); + } + } + + const config: HeatmapConfig = { + data, + xField: "y", + yField: "x", + axis: { + x: { + title: "第二码", + }, + y: { + title: "第一码", + }, + }, + mark: "cell", + colorField: "count", + width: 1100, + height: 1000, + label: { + text: (d: any) => d.count, + }, + tooltip: { + title: "重码", + items: [ + { + field: "items", + name: "重码", + color: false, + valueFormatter: (v: string[]) => v.join(" "), + }, + ], + }, + scale: { + color: { range: [blue[4], "#f5f5f5"], domain: [0, 10] }, + }, + }; + return ( + <> + 重码矩阵 + + +