@kensio/pinyinjs 1.9.2 → 1.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/data/core.entries +3 -3
  2. package/data/full.entries +10423 -10423
  3. package/data/manifest.json +6 -6
  4. package/data/standard.entries +1148 -1148
  5. package/dist/decode/cai-rule.d.ts +25 -0
  6. package/dist/decode/cai-rule.d.ts.map +1 -0
  7. package/dist/decode/cai-rule.js +78 -0
  8. package/dist/decode/cai-rule.js.map +1 -0
  9. package/dist/decode/dou-rule.d.ts +23 -0
  10. package/dist/decode/dou-rule.d.ts.map +1 -0
  11. package/dist/decode/dou-rule.js +40 -0
  12. package/dist/decode/dou-rule.js.map +1 -0
  13. package/dist/decode/erhua-rule.d.ts +26 -0
  14. package/dist/decode/erhua-rule.d.ts.map +1 -0
  15. package/dist/decode/erhua-rule.js +34 -0
  16. package/dist/decode/erhua-rule.js.map +1 -0
  17. package/dist/decode/ge-rule.d.ts +23 -0
  18. package/dist/decode/ge-rule.d.ts.map +1 -0
  19. package/dist/decode/ge-rule.js +77 -0
  20. package/dist/decode/ge-rule.js.map +1 -0
  21. package/dist/decode/hua-modified.d.ts +19 -0
  22. package/dist/decode/hua-modified.d.ts.map +1 -0
  23. package/dist/decode/hua-modified.js +62 -0
  24. package/dist/decode/hua-modified.js.map +1 -0
  25. package/dist/decode/hua-rule.d.ts +2 -1
  26. package/dist/decode/hua-rule.d.ts.map +1 -1
  27. package/dist/decode/hua-rule.js +5 -1
  28. package/dist/decode/hua-rule.js.map +1 -1
  29. package/dist/decode/hua-words.d.ts +14 -0
  30. package/dist/decode/hua-words.d.ts.map +1 -1
  31. package/dist/decode/hua-words.js +67 -0
  32. package/dist/decode/hua-words.js.map +1 -1
  33. package/dist/decode/mei-rule.d.ts +22 -0
  34. package/dist/decode/mei-rule.d.ts.map +1 -0
  35. package/dist/decode/mei-rule.js +95 -0
  36. package/dist/decode/mei-rule.js.map +1 -0
  37. package/dist/decode/name-count-rule.d.ts +15 -0
  38. package/dist/decode/name-count-rule.d.ts.map +1 -0
  39. package/dist/decode/name-count-rule.js +81 -0
  40. package/dist/decode/name-count-rule.js.map +1 -0
  41. package/dist/decode/polyphone-rules.d.ts +3 -1
  42. package/dist/decode/polyphone-rules.d.ts.map +1 -1
  43. package/dist/decode/polyphone-rules.js +3 -1
  44. package/dist/decode/polyphone-rules.js.map +1 -1
  45. package/dist/decode/reading-rules.d.ts +5 -22
  46. package/dist/decode/reading-rules.d.ts.map +1 -1
  47. package/dist/decode/reading-rules.js +15 -35
  48. package/dist/decode/reading-rules.js.map +1 -1
  49. package/dist/dictionary/entry-invariants.d.ts.map +1 -1
  50. package/dist/dictionary/entry-invariants.js +16 -13
  51. package/dist/dictionary/entry-invariants.js.map +1 -1
  52. package/dist/dictionary/merge-types.d.ts +3 -0
  53. package/dist/dictionary/merge-types.d.ts.map +1 -1
  54. package/dist/dictionary/merge-types.js.map +1 -1
  55. package/dist/dictionary/merge-word.d.ts.map +1 -1
  56. package/dist/dictionary/merge-word.js +2 -2
  57. package/dist/dictionary/merge-word.js.map +1 -1
  58. package/dist/dictionary/merge.d.ts.map +1 -1
  59. package/dist/dictionary/merge.js +2 -0
  60. package/dist/dictionary/merge.js.map +1 -1
  61. package/dist/dictionary/proper-noun.d.ts +14 -1
  62. package/dist/dictionary/proper-noun.d.ts.map +1 -1
  63. package/dist/dictionary/proper-noun.js +46 -7
  64. package/dist/dictionary/proper-noun.js.map +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +1 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/sources/cedict.d.ts +8 -0
  70. package/dist/sources/cedict.d.ts.map +1 -1
  71. package/dist/sources/cedict.js +11 -0
  72. package/dist/sources/cedict.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The 才能 that is 才 *only then* and 能 *can*, and not the noun *talent*.
3
+ *
4
+ * 才能 is a word, *talent* or *ability*, and every source counts it. The same
5
+ * two characters are far more often the adverb 才 and the modal 能 in front of
6
+ * a verb: 怎样才能提高爆发力, 必须先完成这件事才能回家, 到北方才能吃到真正的饺子.
7
+ * The decode read every one of them as the noun.
8
+ */
9
+ import { type EdgeRule } from "./rules.js";
10
+ /**
11
+ * 才能 is taken apart where a verb is left for 能 to be the modal of.
12
+ *
13
+ * The noun is kept after a 的 or a 有, and before a 的, a 是, a degree word or
14
+ * the end of the run.
15
+ * Everywhere else the 才 is the adverb and the 能 the modal. Taking the edge
16
+ * away leaves the two to read as themselves. The readings are `cái néng`
17
+ * either way, so this changes the segmentation and the spacing.
18
+ *
19
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
20
+ * sentences, the decode read 才能 as the word in 184 runs. The rule splits 164,
21
+ * and one of them is wrong: 他的钢琴才能为他在音乐专家中赢得了美名 is talent before a
22
+ * 为 that reads like a verb.
23
+ */
24
+ export declare const MODAL_CAI: EdgeRule;
25
+ //# sourceMappingURL=cai-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cai-rule.d.ts","sourceRoot":"","sources":["../../src/decode/cai-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,KAAK,QAAQ,EAId,MAAM,YAAY,CAAC;AAwDpB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS,EAAE,QAUvB,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The 才能 that is 才 *only then* and 能 *can*, and not the noun *talent*.
3
+ *
4
+ * 才能 is a word, *talent* or *ability*, and every source counts it. The same
5
+ * two characters are far more often the adverb 才 and the modal 能 in front of
6
+ * a verb: 怎样才能提高爆发力, 必须先完成这件事才能回家, 到北方才能吃到真正的饺子.
7
+ * The decode read every one of them as the noun.
8
+ */
9
+ import { tagOf, wordsEndingAt, wordsStartingAt, } from "./rules.js";
10
+ /**
11
+ * The word, in both scripts.
12
+ */
13
+ const TALENT = new Set(["才能"]);
14
+ /**
15
+ * The characters that close a word in front of the noun.
16
+ *
17
+ * 的 makes 才能 something owned or described (他的才能, 一定的才能), and 有 is
18
+ * having it (有才能, 富有才能, 具有才能, 很有才能). 才 and 能 can follow neither.
19
+ */
20
+ const BEFORE_NOUN = new Set(["的", "有"]);
21
+ /**
22
+ * What can follow the noun and not the modal.
23
+ *
24
+ * 能 needs a verb after it, so a 的 (有才能的人) or the end of the run (你很有才能,
25
+ * 她具有卓越才能) leaves it nothing to be the modal of. A 是 or a degree word
26
+ * says something about the talent (音乐才能是可以培养的, 她的唱歌才能非常出众).
27
+ */
28
+ const AFTER_NOUN = new Set(["的", "是", "很", "非常", "十分"]);
29
+ /**
30
+ * Whether a longer word ends at the 才, and would take it once 才能 is gone.
31
+ *
32
+ * 处方才能买 is 处方 and then 才能, and taking the edge away let 方才 *just
33
+ * now* take the 才, reading 处方 as `chù fāng`. 刚才能 and 人才能 have the same
34
+ * shape. Which word the 才 belongs to there is a question this rule cannot
35
+ * answer, so it leaves the decode as it was. Only a tagged word counts, since
36
+ * the full tier holds untagged keys such as 时才 that no decode would choose.
37
+ */
38
+ function isClaimed(context, from) {
39
+ return wordsEndingAt(context, from + 1).some((word) => word.length > 1 && tagOf(context, word) !== "");
40
+ }
41
+ /**
42
+ * Whether the context at a 才能 says it is the noun.
43
+ */
44
+ function isNoun(context, from, to) {
45
+ if (wordsEndingAt(context, from).some((word) => BEFORE_NOUN.has(word.at(-1) ?? ""))) {
46
+ return true;
47
+ }
48
+ // Every word starting there is asked, since the longest hides the one the
49
+ // rule is looking for: 音乐才能是否可以培养 has 是否 wrapped around its 是.
50
+ const next = wordsStartingAt(context, to);
51
+ return next.length === 0 || next.some((word) => AFTER_NOUN.has(word));
52
+ }
53
+ /**
54
+ * 才能 is taken apart where a verb is left for 能 to be the modal of.
55
+ *
56
+ * The noun is kept after a 的 or a 有, and before a 的, a 是, a degree word or
57
+ * the end of the run.
58
+ * Everywhere else the 才 is the adverb and the 能 the modal. Taking the edge
59
+ * away leaves the two to read as themselves. The readings are `cái néng`
60
+ * either way, so this changes the segmentation and the spacing.
61
+ *
62
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
63
+ * sentences, the decode read 才能 as the word in 184 runs. The rule splits 164,
64
+ * and one of them is wrong: 他的钢琴才能为他在音乐专家中赢得了美名 is talent before a
65
+ * 为 that reads like a verb.
66
+ */
67
+ export const MODAL_CAI = {
68
+ name: "modal-cai",
69
+ verdictFor: (context) => {
70
+ const { edge } = context;
71
+ return TALENT.has(edge.text) &&
72
+ !isClaimed(context, edge.from) &&
73
+ !isNoun(context, edge.from, edge.to)
74
+ ? "forbid"
75
+ : "keep";
76
+ },
77
+ };
78
+ //# sourceMappingURL=cai-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cai-rule.js","sourceRoot":"","sources":["../../src/decode/cai-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAGL,KAAK,EACL,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAExD;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,OAAoB,EAAE,IAAY;IACnD,OAAO,aAAa,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CACzD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,OAAoB,EAAE,IAAY,EAAE,EAAU;IAC5D,IACE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACzC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CACnC,EACD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0EAA0E;IAC1E,+DAA+D;IAC/D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,SAAS,GAAa;IACjC,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;YAC9B,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACpC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The 都 that is the adverb *all*, read into a place name in front of it.
3
+ *
4
+ * 花都 is a district of Guangzhou, `Huādū`, and the dictionary holds it as a
5
+ * proper noun. In running text it is nearly always 花 *flowers* and 都 *all*:
6
+ * 花都开了, 公园里的花都开了, 所有的花都是纸做的. The decode read the name,
7
+ * capital and `dū` included.
8
+ */
9
+ import { type EdgeRule } from "./rules.js";
10
+ /**
11
+ * 花都 is taken apart where no noun follows it.
12
+ *
13
+ * The district names what it holds: 花都区, 花都机场. Where a verb, an
14
+ * adverb, a 是 or the end of the run follows, the 都 is the adverb and sums up
15
+ * the flowers. Taking the edge away leaves 花 and 都 to read as themselves,
16
+ * `huā dōu`.
17
+ *
18
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
19
+ * sentences, the decode read 花都 as the name in 11 runs, and none of them was
20
+ * the district.
21
+ */
22
+ export declare const SUMMING_DOU: EdgeRule;
23
+ //# sourceMappingURL=dou-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dou-rule.d.ts","sourceRoot":"","sources":["../../src/decode/dou-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,YAAY,CAAC;AAYpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,EAAE,QASzB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The 都 that is the adverb *all*, read into a place name in front of it.
3
+ *
4
+ * 花都 is a district of Guangzhou, `Huādū`, and the dictionary holds it as a
5
+ * proper noun. In running text it is nearly always 花 *flowers* and 都 *all*:
6
+ * 花都开了, 公园里的花都开了, 所有的花都是纸做的. The decode read the name,
7
+ * capital and `dū` included.
8
+ */
9
+ import { tagOf, wordStartingAt, } from "./rules.js";
10
+ /**
11
+ * The place names whose first character is a common noun that 都 can sum up.
12
+ */
13
+ const NAMES = new Set(["花都"]);
14
+ /**
15
+ * The tag prefix jieba gives a noun.
16
+ */
17
+ const NOUN_TAG = "n";
18
+ /**
19
+ * 花都 is taken apart where no noun follows it.
20
+ *
21
+ * The district names what it holds: 花都区, 花都机场. Where a verb, an
22
+ * adverb, a 是 or the end of the run follows, the 都 is the adverb and sums up
23
+ * the flowers. Taking the edge away leaves 花 and 都 to read as themselves,
24
+ * `huā dōu`.
25
+ *
26
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
27
+ * sentences, the decode read 花都 as the name in 11 runs, and none of them was
28
+ * the district.
29
+ */
30
+ export const SUMMING_DOU = {
31
+ name: "summing-dou",
32
+ verdictFor: (context) => {
33
+ const { edge } = context;
34
+ return NAMES.has(edge.text) &&
35
+ !tagOf(context, wordStartingAt(context, edge.to)).startsWith(NOUN_TAG)
36
+ ? "forbid"
37
+ : "keep";
38
+ },
39
+ };
40
+ //# sourceMappingURL=dou-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dou-rule.js","sourceRoot":"","sources":["../../src/decode/dou-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAGL,KAAK,EACL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,WAAW,GAAa;IACnC,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;YACtE,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The 儿 that belongs to the word in front of it.
3
+ */
4
+ import type { EdgeRule } from "./rules.js";
5
+ /**
6
+ * 儿 does not stand on its own where the dictionary attests the 儿化.
7
+ *
8
+ * 儿化 is a per-word dictionary fact taken from CC-CEDICT's explicit `r5`
9
+ * token, and 2,009 of the 2,067 keys ending in 儿 carry it. What that leaves is
10
+ * an edge: 这边儿, 上边儿 and 旁边儿 are all listed and 那边儿 is not, so
11
+ * 我得跑到那边儿去 read the 儿 as a syllable of its own — `nàbian ér` — and the
12
+ * decode was choosing between 那边 plus 儿 and 那 plus 边儿 on frequency alone.
13
+ *
14
+ * This forbids the bare 儿 edge when the character in front of it makes an
15
+ * attested 儿化 word, so the only paths left are the ones that absorb it. That
16
+ * asserts nothing the dictionary does not already say — 边儿 is `biānr` because
17
+ * CC-CEDICT says so — which is what separates it from synthesising 儿化 with a
18
+ * suffix rule, the thing ORTHOGRAPHY.md rejects and the old project got wrong.
19
+ *
20
+ * Measured over the same 88,866 lines it fires 7 times, and all 7 are right:
21
+ * 照片儿, 出门儿, 热点儿, 辣味儿, 晚会儿, 针管儿, 碍事儿. It is deliberately
22
+ * silent on the 20 bare 儿 with no attested 儿化 behind them, which are 马儿,
23
+ * 门铃儿 and a row of Mongol names transliterated with 儿.
24
+ */
25
+ export declare const ATTESTED_ERHUA: EdgeRule;
26
+ //# sourceMappingURL=erhua-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erhua-rule.d.ts","sourceRoot":"","sources":["../../src/decode/erhua-rule.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,cAAc,EAAE,QAY5B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 儿 does not stand on its own where the dictionary attests the 儿化.
3
+ *
4
+ * 儿化 is a per-word dictionary fact taken from CC-CEDICT's explicit `r5`
5
+ * token, and 2,009 of the 2,067 keys ending in 儿 carry it. What that leaves is
6
+ * an edge: 这边儿, 上边儿 and 旁边儿 are all listed and 那边儿 is not, so
7
+ * 我得跑到那边儿去 read the 儿 as a syllable of its own — `nàbian ér` — and the
8
+ * decode was choosing between 那边 plus 儿 and 那 plus 边儿 on frequency alone.
9
+ *
10
+ * This forbids the bare 儿 edge when the character in front of it makes an
11
+ * attested 儿化 word, so the only paths left are the ones that absorb it. That
12
+ * asserts nothing the dictionary does not already say — 边儿 is `biānr` because
13
+ * CC-CEDICT says so — which is what separates it from synthesising 儿化 with a
14
+ * suffix rule, the thing ORTHOGRAPHY.md rejects and the old project got wrong.
15
+ *
16
+ * Measured over the same 88,866 lines it fires 7 times, and all 7 are right:
17
+ * 照片儿, 出门儿, 热点儿, 辣味儿, 晚会儿, 针管儿, 碍事儿. It is deliberately
18
+ * silent on the 20 bare 儿 with no attested 儿化 behind them, which are 马儿,
19
+ * 门铃儿 and a row of Mongol names transliterated with 儿.
20
+ */
21
+ export const ATTESTED_ERHUA = {
22
+ name: "attested-erhua",
23
+ verdictFor: (context) => {
24
+ const { characters, edge } = context;
25
+ if (edge.text !== "儿" || edge.from === 0) {
26
+ return "keep";
27
+ }
28
+ /* c8 ignore next -- the edge starts inside the run it was built from */
29
+ const absorbed = `${characters[edge.from - 1] ?? ""}儿`;
30
+ const reading = context.dictionary.lookup(absorbed)?.reading;
31
+ return (reading?.at(-1)?.erhua ?? false) ? "forbid" : "keep";
32
+ },
33
+ };
34
+ //# sourceMappingURL=erhua-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erhua-rule.js","sourceRoot":"","sources":["../../src/decode/erhua-rule.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAa;IACtC,IAAI,EAAE,gBAAgB;IACtB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,wEAAwE;QACxE,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC7D,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,CAAC;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The 个人 whose 个 is counting one 人, and not the word *individual*.
3
+ *
4
+ * {@link import("./measure-rule.js").COUNTED_MEASURE} takes 个人 apart after a
5
+ * number, so 三个人 is three people. A bare 个 with no number at all stands for
6
+ * 一个 after a verb that introduces somebody, and the measure rule has nothing
7
+ * to go on there: 门口有个人, 想找个人聊聊天, 我今天雇了个人.
8
+ */
9
+ import { type EdgeRule } from "./rules.js";
10
+ /**
11
+ * 个人 is taken apart where an introducing verb makes its 个 count one 人.
12
+ *
13
+ * Taking the edge away leaves 个 and 人 to read as themselves. The readings
14
+ * are `gè rén` either way, so this changes the segmentation and the spacing.
15
+ *
16
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
17
+ * sentences, the decode kept 个人 as one word in 61 runs. The rule splits 12,
18
+ * and every one of them is somebody. A rough number in front (十几个人,
19
+ * 一百多个人) is left alone, because taking the edge away there moves the 个
20
+ * onto the 几 and reads 十 几个 人.
21
+ */
22
+ export declare const COUNTED_GE: EdgeRule;
23
+ //# sourceMappingURL=ge-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ge-rule.d.ts","sourceRoot":"","sources":["../../src/decode/ge-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,YAAY,CAAC;AAoDpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,QASxB,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The 个人 whose 个 is counting one 人, and not the word *individual*.
3
+ *
4
+ * {@link import("./measure-rule.js").COUNTED_MEASURE} takes 个人 apart after a
5
+ * number, so 三个人 is three people. A bare 个 with no number at all stands for
6
+ * 一个 after a verb that introduces somebody, and the measure rule has nothing
7
+ * to go on there: 门口有个人, 想找个人聊聊天, 我今天雇了个人.
8
+ */
9
+ import { tagOf, wordStartingAt, } from "./rules.js";
10
+ /**
11
+ * The word, in both scripts.
12
+ */
13
+ const INDIVIDUAL = new Set(["个人", "個人"]);
14
+ /**
15
+ * The verbs that bring an unnamed somebody into a sentence.
16
+ *
17
+ * 有个人 is *somebody*, 找个人 and 叫个人 are finding and sending one, 雇了个人
18
+ * is hiring one and 换了个人 is becoming somebody else.
19
+ */
20
+ const INTRODUCING = new Set([
21
+ "有",
22
+ "找",
23
+ "叫",
24
+ "请",
25
+ "請",
26
+ "雇",
27
+ "换",
28
+ "換",
29
+ "派",
30
+ ]);
31
+ /**
32
+ * The aspect particle that can sit between the verb and the 个.
33
+ */
34
+ const PERFECTIVE = "了";
35
+ /**
36
+ * The tag prefix jieba gives a noun.
37
+ */
38
+ const NOUN_TAG = "n";
39
+ /**
40
+ * Whether a verb that introduces somebody stands in front of a 个人, with or
41
+ * without a 了 after it.
42
+ *
43
+ * The word after the 个人 is asked about too. 个人 in front of a noun is the
44
+ * modifier *personal* (我有个人问题, 有个人信息), and only a verb, a particle
45
+ * or the end of the run leaves the 人 to be the person.
46
+ */
47
+ function isIntroduced(context, from, to) {
48
+ const { characters } = context;
49
+ const verb = characters[from - 1] === PERFECTIVE ? from - 2 : from - 1;
50
+ if (!INTRODUCING.has(characters[verb] ?? "")) {
51
+ return false;
52
+ }
53
+ return !tagOf(context, wordStartingAt(context, to)).startsWith(NOUN_TAG);
54
+ }
55
+ /**
56
+ * 个人 is taken apart where an introducing verb makes its 个 count one 人.
57
+ *
58
+ * Taking the edge away leaves 个 and 人 to read as themselves. The readings
59
+ * are `gè rén` either way, so this changes the segmentation and the spacing.
60
+ *
61
+ * Over the 139,893 distinct Han runs of Tatoeba and the Chinese Boost example
62
+ * sentences, the decode kept 个人 as one word in 61 runs. The rule splits 12,
63
+ * and every one of them is somebody. A rough number in front (十几个人,
64
+ * 一百多个人) is left alone, because taking the edge away there moves the 个
65
+ * onto the 几 and reads 十 几个 人.
66
+ */
67
+ export const COUNTED_GE = {
68
+ name: "counted-ge",
69
+ verdictFor: (context) => {
70
+ const { edge } = context;
71
+ return INDIVIDUAL.has(edge.text) &&
72
+ isIntroduced(context, edge.from, edge.to)
73
+ ? "forbid"
74
+ : "keep";
75
+ },
76
+ };
77
+ //# sourceMappingURL=ge-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ge-rule.js","sourceRoot":"","sources":["../../src/decode/ge-rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAGL,KAAK,EACL,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;CACJ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;GAEG;AACH,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,OAAoB,EAAE,IAAY,EAAE,EAAU;IAClE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,UAAU,GAAa;IAClC,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACzC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;CACF,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type EdgeContext } from "./rules.js";
2
+ /**
3
+ * Whether the 的 follows an adjective of speech that somebody said.
4
+ *
5
+ * The adjective can carry a degree (很蠢, 这么卑鄙), and before it stands a
6
+ * speaker (他刻薄的话), a verb of speaking (说出这么卑鄙的话, 说了很蠢的话) or
7
+ * another 的 (我说过的最愚蠢的话). A bare 难听的话 is left to the conditional.
8
+ */
9
+ export declare function describesSpeech(context: EdgeContext, from: number): boolean;
10
+ /**
11
+ * Whether the 话 is the words something is put in: 用通俗的话解释.
12
+ *
13
+ * A 用 in the few characters before the 的, standing as a word of its own, and
14
+ * a verb of explaining at the 话's end or one character on (再说一遍,
15
+ * 做解释). 用电脑的话就快多了 has no such verb and stays the conditional, and so
16
+ * does 有用的话, whose 用 is half of another word.
17
+ */
18
+ export declare function explainsIn(context: EdgeContext, from: number, to: number): boolean;
19
+ //# sourceMappingURL=hua-modified.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hua-modified.d.ts","sourceRoot":"","sources":["../../src/decode/hua-modified.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAWpB;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAyB3E;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAmBT"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * What the modifier before a 的 says about the 话 after it: 他刻薄的话,
3
+ * 说了很蠢的话, 用通俗的话解释.
4
+ */
5
+ import { toCharacters } from "../script/characters.js";
6
+ import { wordEndingAt, wordsEndingAt, wordStartingAt, } from "./rules.js";
7
+ import { at } from "./hua-speaking.js";
8
+ import { DEGREE, EXPLAINING, OF_SPEECH, PERSONS, SPEAKING, SPEAKING_TAIL, } from "./hua-words.js";
9
+ /**
10
+ * Whether the 的 follows an adjective of speech that somebody said.
11
+ *
12
+ * The adjective can carry a degree (很蠢, 这么卑鄙), and before it stands a
13
+ * speaker (他刻薄的话), a verb of speaking (说出这么卑鄙的话, 说了很蠢的话) or
14
+ * another 的 (我说过的最愚蠢的话). A bare 难听的话 is left to the conditional.
15
+ */
16
+ export function describesSpeech(context, from) {
17
+ const quality = wordsEndingAt(context, from, 2).find((word) => OF_SPEECH.has(word));
18
+ if (quality === undefined) {
19
+ return false;
20
+ }
21
+ let start = from - toCharacters(quality).length;
22
+ const degree = wordsEndingAt(context, start, 2).find((word) => DEGREE.has(word));
23
+ if (degree !== undefined) {
24
+ start -= toCharacters(degree).length;
25
+ }
26
+ if (at(context, start - 1) === "的" ||
27
+ wordsEndingAt(context, start, 2).some((word) => PERSONS.has(word))) {
28
+ return true;
29
+ }
30
+ let verb = start - 1;
31
+ while (verb > start - 4 && SPEAKING_TAIL.has(at(context, verb))) {
32
+ verb -= 1;
33
+ }
34
+ return SPEAKING.has(at(context, verb));
35
+ }
36
+ /**
37
+ * Whether the 话 is the words something is put in: 用通俗的话解释.
38
+ *
39
+ * A 用 in the few characters before the 的, standing as a word of its own, and
40
+ * a verb of explaining at the 话's end or one character on (再说一遍,
41
+ * 做解释). 用电脑的话就快多了 has no such verb and stays the conditional, and so
42
+ * does 有用的话, whose 用 is half of another word.
43
+ */
44
+ export function explainsIn(context, from, to) {
45
+ let uses = false;
46
+ for (let index = from - 1; index >= Math.max(0, from - 5); index--) {
47
+ const character = at(context, index);
48
+ if (character === "的") {
49
+ return false;
50
+ }
51
+ if (character === "用" && wordEndingAt(context, index + 1, 2) === "用") {
52
+ uses = true;
53
+ break;
54
+ }
55
+ }
56
+ return (uses &&
57
+ [to, to + 1].some((index) => {
58
+ const word = wordStartingAt(context, index);
59
+ return word !== undefined && EXPLAINING.includes(word);
60
+ }));
61
+ }
62
+ //# sourceMappingURL=hua-modified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hua-modified.js","sourceRoot":"","sources":["../../src/decode/hua-modified.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,8 @@ import { type EdgeRule } from "./rules.js";
5
5
  * The conditional is the default, since it is what the word is, and the rule
6
6
  * names the contexts where it cannot be: a 吗 or 里 after the 话, a time the
7
7
  * words were said, a verb of speaking before the 的, a kind of words that verb
8
- * is saying, a 句 counting them, or a person whose words they are. Taking the edge away leaves 的 and 话
8
+ * is saying, a 句 counting them, an adjective of speech, the words something
9
+ * is explained in, or a person whose words they are. Taking the edge away leaves 的 and 话
9
10
  * to read as themselves, which they already did, so this changes the spacing
10
11
  * and the segmentation rather than any syllable: `shuō de huà`, not
11
12
  * `shuō dehuà`.
@@ -1 +1 @@
1
- {"version":3,"file":"hua-rule.d.ts","sourceRoot":"","sources":["../../src/decode/hua-rule.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,QAAQ,EAId,MAAM,YAAY,CAAC;AAsDpB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC"}
1
+ {"version":3,"file":"hua-rule.d.ts","sourceRoot":"","sources":["../../src/decode/hua-rule.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,QAAQ,EAId,MAAM,YAAY,CAAC;AAuDpB;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,QAAQ,EAAE,QAoBtB,CAAC"}
@@ -10,6 +10,7 @@
10
10
  import { toCharacters } from "../script/characters.js";
11
11
  import { tagOf, wordEndingAt, wordsEndingAt, } from "./rules.js";
12
12
  import { DE_HUA, AFTER_NOUN, PERSONS, OWNER_TAGS, RECEIVING, NEGATION, RECEIVING_TAIL, EARLIER, } from "./hua-words.js";
13
+ import { describesSpeech, explainsIn } from "./hua-modified.js";
13
14
  import { at, followsSpeaking, isCounted, saysKind } from "./hua-speaking.js";
14
15
  /**
15
16
  * Whether the 的 marks whose words they are, 他的话 and 听老师的话.
@@ -53,7 +54,8 @@ function isOwned(context, from, to) {
53
54
  * The conditional is the default, since it is what the word is, and the rule
54
55
  * names the contexts where it cannot be: a 吗 or 里 after the 话, a time the
55
56
  * words were said, a verb of speaking before the 的, a kind of words that verb
56
- * is saying, a 句 counting them, or a person whose words they are. Taking the edge away leaves 的 and 话
57
+ * is saying, a 句 counting them, an adjective of speech, the words something
58
+ * is explained in, or a person whose words they are. Taking the edge away leaves 的 and 话
57
59
  * to read as themselves, which they already did, so this changes the spacing
58
60
  * and the segmentation rather than any syllable: `shuō de huà`, not
59
61
  * `shuō dehuà`.
@@ -75,6 +77,8 @@ export const NOUN_HUA = {
75
77
  followsSpeaking(context, from) ||
76
78
  saysKind(context, from) ||
77
79
  isCounted(context, from) ||
80
+ describesSpeech(context, from) ||
81
+ explainsIn(context, from, to) ||
78
82
  isOwned(context, from, to)
79
83
  ? "forbid"
80
84
  : "keep";
@@ -1 +1 @@
1
- {"version":3,"file":"hua-rule.js","sourceRoot":"","sources":["../../src/decode/hua-rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hua-rule.js","sourceRoot":"","sources":["../../src/decode/hua-rule.ts"],"names":[],"mappings":"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"}
@@ -70,4 +70,18 @@ export declare const RECEIVING_TAIL: Set<string>;
70
70
  * When the words were said, which a conditional cannot be about: 刚才的话.
71
71
  */
72
72
  export declare const EARLIER: Set<string>;
73
+ /**
74
+ * The adjectives that describe what was said, 刻薄的话 and 难听的话.
75
+ *
76
+ * Only adjectives that hardly describe a person or a state. 你累的话 and
77
+ * 你无聊的话 are conditionals, so 累 and 无聊 stay out.
78
+ */
79
+ export declare const OF_SPEECH: Set<string>;
80
+ /** The degree an adjective of speech can carry: 很蠢, 最愚蠢, 这么卑鄙. */
81
+ export declare const DEGREE: Set<string>;
82
+ /**
83
+ * The verbs of explaining that follow the words something is put in:
84
+ * 用通俗的话解释, 用简练的话介绍.
85
+ */
86
+ export declare const EXPLAINING: string[];
73
87
  //# sourceMappingURL=hua-words.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hua-words.d.ts","sourceRoot":"","sources":["../../src/decode/hua-words.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sEAAsE;AACtE,eAAO,MAAM,MAAM,aAAwB,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,aAAqC,CAAC;AAE7D,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,aAAgC,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,aASvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,aAAgC,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,aAAa,aASxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,MAAM,aASjB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,IAAI,aAQf,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,OAAO,aAoBlB,CAAC;AAEH,yDAAyD;AACzD,eAAO,MAAM,UAAU,QAAyB,CAAC;AAEjD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,aAiCpB,CAAC;AAEH,yEAAyE;AACzE,eAAO,MAAM,QAAQ,QAAY,CAAC;AAElC,4EAA4E;AAC5E,eAAO,MAAM,cAAc,aAAsB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,OAAO,aAAoC,CAAC"}
1
+ {"version":3,"file":"hua-words.d.ts","sourceRoot":"","sources":["../../src/decode/hua-words.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sEAAsE;AACtE,eAAO,MAAM,MAAM,aAAwB,CAAC;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,aAAqC,CAAC;AAE7D,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,aAAgC,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,aASvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,aAAgC,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,aAAa,aASxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,MAAM,aASjB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,IAAI,aAQf,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,OAAO,aAoBlB,CAAC;AAEH,yDAAyD;AACzD,eAAO,MAAM,UAAU,QAAyB,CAAC;AAEjD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,aAqCpB,CAAC;AAEH,yEAAyE;AACzE,eAAO,MAAM,QAAQ,QAAY,CAAC;AAElC,4EAA4E;AAC5E,eAAO,MAAM,cAAc,aAAsB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,OAAO,aAAoC,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,aAwBpB,CAAC;AAEH,kEAAkE;AAClE,eAAO,MAAM,MAAM,aASjB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,UAAU,UAgBtB,CAAC"}
@@ -141,6 +141,10 @@ export const RECEIVING = new Set([
141
141
  "聽不懂",
142
142
  "判断",
143
143
  "判斷",
144
+ "印证",
145
+ "印證",
146
+ "证实",
147
+ "證實",
144
148
  "记得",
145
149
  "記得",
146
150
  "因为",
@@ -158,4 +162,67 @@ export const RECEIVING_TAIL = new Set(["了", "完"]);
158
162
  * When the words were said, which a conditional cannot be about: 刚才的话.
159
163
  */
160
164
  export const EARLIER = new Set(["刚才", "剛才", "刚刚", "剛剛"]);
165
+ /**
166
+ * The adjectives that describe what was said, 刻薄的话 and 难听的话.
167
+ *
168
+ * Only adjectives that hardly describe a person or a state. 你累的话 and
169
+ * 你无聊的话 are conditionals, so 累 and 无聊 stay out.
170
+ */
171
+ export const OF_SPEECH = new Set([
172
+ "刻薄",
173
+ "卑鄙",
174
+ "愚蠢",
175
+ "蠢",
176
+ "难听",
177
+ "難聽",
178
+ "好听",
179
+ "好聽",
180
+ "动听",
181
+ "動聽",
182
+ "中听",
183
+ "中聽",
184
+ "粗鲁",
185
+ "粗魯",
186
+ "粗俗",
187
+ "下流",
188
+ "肉麻",
189
+ "恶毒",
190
+ "惡毒",
191
+ "刺耳",
192
+ "尖酸",
193
+ "伤人",
194
+ "傷人",
195
+ ]);
196
+ /** The degree an adjective of speech can carry: 很蠢, 最愚蠢, 这么卑鄙. */
197
+ export const DEGREE = new Set([
198
+ "很",
199
+ "最",
200
+ "更",
201
+ "太",
202
+ "多么",
203
+ "多麼",
204
+ "如此",
205
+ ...MANNER,
206
+ ]);
207
+ /**
208
+ * The verbs of explaining that follow the words something is put in:
209
+ * 用通俗的话解释, 用简练的话介绍.
210
+ */
211
+ export const EXPLAINING = [
212
+ "解释",
213
+ "解釋",
214
+ "介绍",
215
+ "介紹",
216
+ "说",
217
+ "說",
218
+ "讲",
219
+ "講",
220
+ "表达",
221
+ "表達",
222
+ "描述",
223
+ "概括",
224
+ "回答",
225
+ "写",
226
+ "寫",
227
+ ];
161
228
  //# sourceMappingURL=hua-words.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hua-words.js","sourceRoot":"","sources":["../../src/decode/hua-words.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hua-words.js","sourceRoot":"","sources":["../../src/decode/hua-words.ts"],"names":[],"mappings":"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"}