@kensio/pinyinjs 1.8.5 → 1.9.0

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 (42) hide show
  1. package/data/core.entries +27 -27
  2. package/data/core.freq +0 -0
  3. package/data/core.keys +1 -1
  4. package/data/full.counts +0 -0
  5. package/data/full.entries +4139 -4139
  6. package/data/full.freq +0 -0
  7. package/data/manifest.json +11 -11
  8. package/data/script.map +3 -2
  9. package/data/standard.entries +385 -385
  10. package/data/standard.freq +0 -0
  11. package/data/standard.keys +1 -1
  12. package/dist/decode/liao-frames.d.ts +2 -1
  13. package/dist/decode/liao-frames.d.ts.map +1 -1
  14. package/dist/decode/liao-frames.js +6 -2
  15. package/dist/decode/liao-frames.js.map +1 -1
  16. package/dist/decode/obtain-frames.d.ts +11 -0
  17. package/dist/decode/obtain-frames.d.ts.map +1 -0
  18. package/dist/decode/obtain-frames.js +150 -0
  19. package/dist/decode/obtain-frames.js.map +1 -0
  20. package/dist/decode/obtain-rule.d.ts +14 -0
  21. package/dist/decode/obtain-rule.d.ts.map +1 -0
  22. package/dist/decode/obtain-rule.js +56 -0
  23. package/dist/decode/obtain-rule.js.map +1 -0
  24. package/dist/decode/reading-rules.d.ts +1 -0
  25. package/dist/decode/reading-rules.d.ts.map +1 -1
  26. package/dist/decode/reading-rules.js +3 -0
  27. package/dist/decode/reading-rules.js.map +1 -1
  28. package/dist/dictionary/character-defaults.d.ts.map +1 -1
  29. package/dist/dictionary/character-defaults.js +4 -1
  30. package/dist/dictionary/character-defaults.js.map +1 -1
  31. package/dist/dictionary/character-readings.d.ts.map +1 -1
  32. package/dist/dictionary/character-readings.js +9 -0
  33. package/dist/dictionary/character-readings.js.map +1 -1
  34. package/dist/dictionary/free-readings.d.ts +70 -0
  35. package/dist/dictionary/free-readings.d.ts.map +1 -0
  36. package/dist/dictionary/free-readings.js +108 -0
  37. package/dist/dictionary/free-readings.js.map +1 -0
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/package.json +1 -1
Binary file
@@ -67108,6 +67108,7 @@ B
67108
67108
  網關
67109
67109
  網頁
67110
67110
  網點
67111
+ 綳
67111
67112
  綴
67112
67113
  綵
67113
67114
  綷
@@ -96968,7 +96969,6 @@ B
96968
96969
  麩
96969
96970
  麫
96970
96971
  麮
96971
- 麯
96972
96972
  麰
96973
96973
  麳
96974
96974
  麴
@@ -5,7 +5,8 @@ import { type EdgeContext } from "./rules.js";
5
5
  * 吃得了 is "able to eat it all" and reads `chī de liǎo`, the positive of
6
6
  * 吃不了. The verb in front of the 得 has to be a word of its own, so a verb
7
7
  * that makes a word with the 得 keeps the aspect 了 unless it is listed in
8
- * {@link POTENTIAL_STEMS}. 得了吧 and 他得了病 have no verb in front of the 得.
8
+ * {@link POTENTIAL_STEMS}. 得了吧 and 他得了病 have no verb in front of the 得,
9
+ * and in 确诊得了肺炎 the illness after the 了 makes the 得 "to contract".
9
10
  */
10
11
  export declare function isPotentialAt(context: EdgeContext, at: number): boolean;
11
12
  //# sourceMappingURL=liao-frames.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"liao-frames.d.ts","sourceRoot":"","sources":["../../src/decode/liao-frames.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAwFpB;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAavE"}
1
+ {"version":3,"file":"liao-frames.d.ts","sourceRoot":"","sources":["../../src/decode/liao-frames.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAwFpB;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAiBvE"}
@@ -2,6 +2,7 @@
2
2
  * Whether a 了 closes a potential complement, as in 吃得了.
3
3
  */
4
4
  import { toCharacters } from "../script/characters.js";
5
+ import { obtainsAt } from "./obtain-frames.js";
5
6
  import { tagOf, wordEndingAt, wordsEndingAt, } from "./rules.js";
6
7
  /**
7
8
  * The verbs that put a 得 in front of a 了 without making a complement.
@@ -87,11 +88,14 @@ const LEXICAL_STEMS = new Set([
87
88
  * 吃得了 is "able to eat it all" and reads `chī de liǎo`, the positive of
88
89
  * 吃不了. The verb in front of the 得 has to be a word of its own, so a verb
89
90
  * that makes a word with the 得 keeps the aspect 了 unless it is listed in
90
- * {@link POTENTIAL_STEMS}. 得了吧 and 他得了病 have no verb in front of the 得.
91
+ * {@link POTENTIAL_STEMS}. 得了吧 and 他得了病 have no verb in front of the 得,
92
+ * and in 确诊得了肺炎 the illness after the 了 makes the 得 "to contract".
91
93
  */
92
94
  export function isPotentialAt(context, at) {
93
95
  const { characters } = context;
94
- if (characters[at] !== "了" || characters[at - 1] !== "得") {
96
+ if (characters[at] !== "了" ||
97
+ characters[at - 1] !== "得" ||
98
+ obtainsAt(context, at - 1)) {
95
99
  return false;
96
100
  }
97
101
  const lexical = wordsEndingAt(context, at).some((word) => toCharacters(word).length > 1 && !POTENTIAL_STEMS.has(word));
@@ -1 +1 @@
1
- {"version":3,"file":"liao-frames.js","sourceRoot":"","sources":["../../src/decode/liao-frames.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAEL,KAAK,EACL,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,GAAG;IACH,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;CACL,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,YAAY,CAAC,yBAAyB,CAAC,CACxC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,OAAoB,EAAE,IAAY;IACzD,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,WAAW,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,GAAG,YAAY,CAAC,sBAAsB,CAAC;IACvC,GAAG,YAAY,CAAC,WAAW,CAAC;IAC5B,GAAG,YAAY,CAAC,cAAc,CAAC;CAChC,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,EAAU;IAC5D,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/B,IAAI,UAAU,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CACtE,CAAC;IACF,IAAI,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"liao-frames.js","sourceRoot":"","sources":["../../src/decode/liao-frames.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAEL,KAAK,EACL,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,GAAG;IACH,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;CACL,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,YAAY,CAAC,yBAAyB,CAAC,CACxC,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,OAAoB,EAAE,IAAY;IACzD,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,WAAW,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,GAAG,YAAY,CAAC,sBAAsB,CAAC;IACvC,GAAG,YAAY,CAAC,WAAW,CAAC;IAC5B,GAAG,YAAY,CAAC,cAAc,CAAC;CAChC,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,EAAU;IAC5D,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/B,IACE,UAAU,CAAC,EAAE,CAAC,KAAK,GAAG;QACtB,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG;QAC1B,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CACtE,CAAC;IACF,IAAI,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI,KAAK,SAAS,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { EdgeContext } from "./rules.js";
2
+ /**
3
+ * Whether the 得 at a position is the verb "to obtain", with 了 after it and
4
+ * an illness, a score or a prize after that.
5
+ *
6
+ * 他上周被确诊得了肺炎, 他得了感冒 and 他得了几分 are all `dé le`. A verb in
7
+ * front of the 得 would otherwise make it the particle of a potential
8
+ * complement, and 确诊得了肺炎 came out `quèzhěn de liǎo fèiyán`.
9
+ */
10
+ export declare function obtainsAt(context: EdgeContext, at: number): boolean;
11
+ //# sourceMappingURL=obtain-frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obtain-frames.d.ts","sourceRoot":"","sources":["../../src/decode/obtain-frames.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8K9C;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAMnE"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Whether a 得了 is the verb "to obtain", as in 得了肺炎 and 得了一百分.
3
+ */
4
+ import { toCharacters } from "../script/characters.js";
5
+ /**
6
+ * The characters an illness's name ends with.
7
+ *
8
+ * 肺炎, 精神病, 焦虑症, 肺癌, 肿瘤, 湿疹, 疟疾.
9
+ */
10
+ const ILLNESS_ENDS = new Set(toCharacters("病症炎癌瘤疮瘡疹疾痢癣癬痘痨癆"));
11
+ /**
12
+ * The characters that make a word of an illness character without naming an
13
+ * illness.
14
+ *
15
+ * 病人, 病房, 病情 and 病假 are about the ill rather than what they have, and
16
+ * 帮得了病人 and 控制得了病情 are potential complements.
17
+ */
18
+ const NOT_ILLNESS_AFTER = new Set(toCharacters("人房院床假历歷例号號友情况況"));
19
+ /**
20
+ * The illnesses whose names end with none of {@link ILLNESS_ENDS}.
21
+ */
22
+ const ILLNESS_WORDS = new Set([
23
+ "感冒",
24
+ "流感",
25
+ "发烧",
26
+ "發燒",
27
+ "中风",
28
+ "中風",
29
+ "中暑",
30
+ "艾滋",
31
+ "抑郁",
32
+ "抑鬱",
33
+ "失眠",
34
+ "哮喘",
35
+ ]);
36
+ /**
37
+ * An illness, which a 得 contracts: 他得了感冒, 我邻居得了焦虑症.
38
+ *
39
+ * 诊 is not among the verbs, since 确诊得了肺炎 is "diagnosed as having
40
+ * pneumonia".
41
+ */
42
+ const ILLNESS = {
43
+ namedAt: (characters, at) => (ILLNESS_ENDS.has(characters[at] ?? "") &&
44
+ !NOT_ILLNESS_AFTER.has(characters[at + 1] ?? "")) ||
45
+ ILLNESS_WORDS.has(characters.slice(at, at + 2).join("")),
46
+ potentialVerbs: new Set(toCharacters("治医醫看防控制抗扛挺忍熬")),
47
+ };
48
+ /**
49
+ * The characters that make a word of 分 that is not a score.
50
+ *
51
+ * 坚持得了十分钟 is "able to hold out ten minutes", and 吃得了三分之一 a
52
+ * third.
53
+ */
54
+ const NOT_SCORE_AFTER = new Set(toCharacters("钟鐘之"));
55
+ /**
56
+ * The prizes and placings a 得 wins whose names do not end in 分 or 名.
57
+ */
58
+ const PRIZE_WORDS = new Set([
59
+ "冠军",
60
+ "冠軍",
61
+ "亚军",
62
+ "亞軍",
63
+ "季军",
64
+ "季軍",
65
+ "金牌",
66
+ "银牌",
67
+ "銀牌",
68
+ "铜牌",
69
+ "銅牌",
70
+ ]);
71
+ /**
72
+ * The characters a count is written with, for the 分 of 一百分 and the 名 of
73
+ * 第三名.
74
+ *
75
+ * 满分 and 高分 are scores too. 部分 is not, and 吃得了一部分 is a potential
76
+ * complement.
77
+ */
78
+ const NUMERALS = new Set(toCharacters("一二三四五六七八九十百千两兩零几幾满滿高低少01234567890123456789"));
79
+ /**
80
+ * Whether a character is preceded by a count.
81
+ */
82
+ function countedAt(characters, at) {
83
+ return NUMERALS.has(characters[at - 1] ?? "");
84
+ }
85
+ /**
86
+ * A score, a prize or a placing, which a 得 wins: 得了几分, 得了奖, 得了冠军,
87
+ * 得了第三名.
88
+ */
89
+ const PRIZE = {
90
+ namedAt: (characters, at) => {
91
+ const character = characters[at] ?? "";
92
+ return ((character === "分" &&
93
+ countedAt(characters, at) &&
94
+ !NOT_SCORE_AFTER.has(characters[at + 1] ?? "")) ||
95
+ character === "奖" ||
96
+ character === "獎" ||
97
+ (character === "名" && countedAt(characters, at)) ||
98
+ PRIZE_WORDS.has(characters.slice(at, at + 2).join("")));
99
+ },
100
+ potentialVerbs: new Set(toCharacters("拿考")),
101
+ };
102
+ const KINDS = [ILLNESS, PRIZE];
103
+ /**
104
+ * The characters an object is never read across.
105
+ *
106
+ * 吃得了药的病人 has a 病 four characters on, but the 的 in front of it has
107
+ * already closed the object of the 吃.
108
+ */
109
+ const BOUNDARIES = new Set(toCharacters("的了吗嗎呢吧啊"));
110
+ /**
111
+ * How far past the 了 the object's name can end.
112
+ *
113
+ * Three characters takes in 精神病, 焦虑症 and 一百分, and a fourth a
114
+ * modifier such as 重感冒 or 第一名.
115
+ */
116
+ const REACH = 4;
117
+ /**
118
+ * Whether one kind of thing is named between a 了 and the next boundary.
119
+ */
120
+ function namesKindAfter(characters, at, kind) {
121
+ if (kind.potentialVerbs.has(characters[at - 1] ?? "")) {
122
+ return false;
123
+ }
124
+ const end = Math.min(characters.length, at + 2 + REACH);
125
+ for (let next = at + 2; next < end; next++) {
126
+ if (BOUNDARIES.has(characters[next] ?? "")) {
127
+ return false;
128
+ }
129
+ if (kind.namedAt(characters, next)) {
130
+ return true;
131
+ }
132
+ }
133
+ return false;
134
+ }
135
+ /**
136
+ * Whether the 得 at a position is the verb "to obtain", with 了 after it and
137
+ * an illness, a score or a prize after that.
138
+ *
139
+ * 他上周被确诊得了肺炎, 他得了感冒 and 他得了几分 are all `dé le`. A verb in
140
+ * front of the 得 would otherwise make it the particle of a potential
141
+ * complement, and 确诊得了肺炎 came out `quèzhěn de liǎo fèiyán`.
142
+ */
143
+ export function obtainsAt(context, at) {
144
+ const { characters } = context;
145
+ if (characters[at] !== "得" || characters[at + 1] !== "了") {
146
+ return false;
147
+ }
148
+ return KINDS.some((kind) => namesKindAfter(characters, at, kind));
149
+ }
150
+ //# sourceMappingURL=obtain-frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obtain-frames.js","sourceRoot":"","sources":["../../src/decode/obtain-frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { EdgeRule } from "./rules.js";
2
+ /**
3
+ * 得了 read `dé le` in front of an illness, a score or a prize, as in
4
+ * 他得了感冒 and 他得了几分.
5
+ *
6
+ * 得 is stored as the particle `de`, so a bare 得 with no word around it came
7
+ * out `de` here too: 他得了感冒 read `tā de le gǎnmào`. After a verb it was
8
+ * worse, since {@link import("./liao-rule.js").POTENTIAL_LIAO} took the 得 for
9
+ * the marker of a potential complement, and 被确诊得了肺炎 read
10
+ * `quèzhěn de liǎo fèiyán`. That rule now steps aside for the same frame, and
11
+ * this one takes the particle and `liǎo` off the lattice.
12
+ */
13
+ export declare const OBTAINING_DE: EdgeRule;
14
+ //# sourceMappingURL=obtain-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obtain-rule.d.ts","sourceRoot":"","sources":["../../src/decode/obtain-rule.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAe,QAAQ,EAAe,MAAM,YAAY,CAAC;AAqCrE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,QAc1B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { obtainsAt } from "./obtain-frames.js";
2
+ /**
3
+ * Whether a syllable is `dé`, the reading 得 takes as a verb of its own.
4
+ */
5
+ function isDe(syllable) {
6
+ return (syllable?.initial === "d" && syllable.final === "e" && syllable.tone === 2);
7
+ }
8
+ /**
9
+ * Whether a syllable is `le`, the aspect reading of 了.
10
+ */
11
+ function isLe(syllable) {
12
+ return (syllable?.initial === "l" && syllable.final === "e" && syllable.tone === 5);
13
+ }
14
+ /**
15
+ * What the rule says about the character of an edge at one position.
16
+ *
17
+ * Only edges starting at the 得 or the 了 are judged. A word ending in the 得,
18
+ * such as 获得, already reads it `dé` or is no business of this rule.
19
+ */
20
+ function verdictAt(context, at) {
21
+ const { edge } = context;
22
+ if (obtainsAt(context, at)) {
23
+ return edge.from === at && !isDe(edge.reading[0]) ? "forbid" : "keep";
24
+ }
25
+ if (obtainsAt(context, at - 1)) {
26
+ return edge.from === at && !isLe(edge.reading[0]) ? "forbid" : "keep";
27
+ }
28
+ return "keep";
29
+ }
30
+ /**
31
+ * 得了 read `dé le` in front of an illness, a score or a prize, as in
32
+ * 他得了感冒 and 他得了几分.
33
+ *
34
+ * 得 is stored as the particle `de`, so a bare 得 with no word around it came
35
+ * out `de` here too: 他得了感冒 read `tā de le gǎnmào`. After a verb it was
36
+ * worse, since {@link import("./liao-rule.js").POTENTIAL_LIAO} took the 得 for
37
+ * the marker of a potential complement, and 被确诊得了肺炎 read
38
+ * `quèzhěn de liǎo fèiyán`. That rule now steps aside for the same frame, and
39
+ * this one takes the particle and `liǎo` off the lattice.
40
+ */
41
+ export const OBTAINING_DE = {
42
+ name: "obtaining-de",
43
+ verdictFor: (context) => {
44
+ const { edge } = context;
45
+ if (edge.reading.length !== edge.to - edge.from) {
46
+ return "keep";
47
+ }
48
+ for (let at = edge.from; at < edge.to; at++) {
49
+ if (verdictAt(context, at) === "forbid") {
50
+ return "forbid";
51
+ }
52
+ }
53
+ return "keep";
54
+ },
55
+ };
56
+ //# sourceMappingURL=obtain-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obtain-rule.js","sourceRoot":"","sources":["../../src/decode/obtain-rule.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C;;GAEG;AACH,SAAS,IAAI,CAAC,QAA8B;IAC1C,OAAO,CACL,QAAQ,EAAE,OAAO,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,IAAI,CAAC,QAA8B;IAC1C,OAAO,CACL,QAAQ,EAAE,OAAO,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,OAAoB,EAAE,EAAU;IACjD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAa;IACpC,IAAI,EAAE,cAAc;IACpB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -7,6 +7,7 @@ export { RETURNING_HUAN } from "./huan-rule.js";
7
7
  export { CONCERNING_GAN } from "./gan-rule.js";
8
8
  export { COUNTING_ZHI } from "./zhi-rule.js";
9
9
  export { POTENTIAL_LIAO } from "./liao-rule.js";
10
+ export { OBTAINING_DE } from "./obtain-rule.js";
10
11
  export { REDUPLICATED_VERB } from "./reduplication-rule.js";
11
12
  import { type EdgeRule } from "./rules.js";
12
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"reading-rules.d.ts","sourceRoot":"","sources":["../../src/decode/reading-rules.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,cAAc,EAAE,QAY5B,CAAC;AAsCF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,eAAe,EAAE,QAuB7B,CAAC;AAIF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,QAAQ,EAiB5C,CAAC"}
1
+ {"version":3,"file":"reading-rules.d.ts","sourceRoot":"","sources":["../../src/decode/reading-rules.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,cAAc,EAAE,QAY5B,CAAC;AAsCF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,eAAe,EAAE,QAuB7B,CAAC;AAIF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,QAAQ,EAkB5C,CAAC"}
@@ -8,6 +8,7 @@ import { RETURNING_HUAN } from "./huan-rule.js";
8
8
  import { CONCERNING_GAN } from "./gan-rule.js";
9
9
  import { COUNTING_ZHI } from "./zhi-rule.js";
10
10
  import { POTENTIAL_LIAO } from "./liao-rule.js";
11
+ import { OBTAINING_DE } from "./obtain-rule.js";
11
12
  import { REDUPLICATED_VERB } from "./reduplication-rule.js";
12
13
  export { MODAL_DE, PARTICLE_DE, POTENTIAL_DE } from "./de-rule.js";
13
14
  export { TAXI_DI } from "./taxi-rule.js";
@@ -18,6 +19,7 @@ export { RETURNING_HUAN } from "./huan-rule.js";
18
19
  export { CONCERNING_GAN } from "./gan-rule.js";
19
20
  export { COUNTING_ZHI } from "./zhi-rule.js";
20
21
  export { POTENTIAL_LIAO } from "./liao-rule.js";
22
+ export { OBTAINING_DE } from "./obtain-rule.js";
21
23
  export { REDUPLICATED_VERB } from "./reduplication-rule.js";
22
24
  import { toCharacters } from "../script/characters.js";
23
25
  import { tagOf, wordEndingAt, } from "./rules.js";
@@ -159,5 +161,6 @@ export const READING_RULES = [
159
161
  CONCERNING_GAN,
160
162
  COUNTING_ZHI,
161
163
  POTENTIAL_LIAO,
164
+ OBTAINING_DE,
162
165
  ];
163
166
  //# sourceMappingURL=reading-rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reading-rules.js","sourceRoot":"","sources":["../../src/decode/reading-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reading-rules.js","sourceRoot":"","sources":["../../src/decode/reading-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAGL,KAAK,EACL,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;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;AAEF;;GAEG;AACH,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,OAAoB,EAAE,EAAU;IACnD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,IAAI,GAAG,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,EAAE,CAAC;IACT,CAAC;IACD,IAAI,IAAI,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC1E,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,IAAI,EAAE,iBAAiB;IACvB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACrC,yEAAyE;QACzE,yEAAyE;QACzE,yEAAyE;QACzE,WAAW;QACX,IACE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAC3C,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO;YACtD,IAAI,CAAC,YAAY,KAAK,OAAO;YAC7B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;CACF,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,OAAO;IACP,aAAa;IACb,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,YAAY;IACZ,cAAc;IACd,YAAY;CACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"character-defaults.d.ts","sourceRoot":"","sources":["../../src/dictionary/character-defaults.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAGL,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,SAAS,CAEtB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACzD,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GACxD,iBAAiB,CAiDnB"}
1
+ {"version":3,"file":"character-defaults.d.ts","sourceRoot":"","sources":["../../src/dictionary/character-defaults.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAGL,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,SAAS,CAEtB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,EACzD,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,GACxD,iBAAiB,CAsDnB"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { countCorpusMass, rankByCorpusMass } from "./corpus-mass.js";
10
10
  import { demoteReducedNeutrals, isNeutralAlone, resolveFrequencyTones, } from "./frequency-tones.js";
11
+ import { leadWithFreeReading } from "./free-readings.js";
11
12
  import { readAlignedReading, readDictionaryReading } from "./reading.js";
12
13
  import { pairScripts, TraditionalTable, } from "./traditional.js";
13
14
  /**
@@ -39,6 +40,8 @@ export function buildCharacterDefaults(sources, cedictByWord, cedictByHant) {
39
40
  // Unihan ranks the readings and the corpus re-ranks the ones it has seen: a
40
41
  // character's default is whichever of its readings the dictionary's own words
41
42
  // spend the most of jieba's corpus on, and Unihan's order decides the rest.
43
+ // A character listed in FREE_READINGS then leads with the reading it takes
44
+ // standing alone, which neither ranking can see.
42
45
  const mass = countCorpusMass({ phrase, cedict, jieba }, traditional);
43
46
  const defaults = new Map();
44
47
  let reducedNeutrals = 0;
@@ -59,7 +62,7 @@ export function buildCharacterDefaults(sources, cedictByWord, cedictByHant) {
59
62
  .map((reading) => characterSyllable(character, reading))
60
63
  .filter((syllable) => syllable !== undefined);
61
64
  if (parsed.length > 0) {
62
- defaults.set(character, rankByCorpusMass(character, parsed, readings.fields, mass));
65
+ defaults.set(character, leadWithFreeReading(character, rankByCorpusMass(character, parsed, readings.fields, mass)));
63
66
  }
64
67
  }
65
68
  return { traditional, defaults, reducedNeutrals };
@@ -1 +1 @@
1
- {"version":3,"file":"character-defaults.js","sourceRoot":"","sources":["../../src/dictionary/character-defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character-defaults.js","sourceRoot":"","sources":["../../src/dictionary/character-defaults.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"character-readings.d.ts","sourceRoot":"","sources":["../../src/dictionary/character-readings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,eAAO,MAAM,kBAAkB,EAAE,SAAS,cAAc,EAsBvD,CAAC"}
1
+ {"version":3,"file":"character-readings.d.ts","sourceRoot":"","sources":["../../src/dictionary/character-readings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,eAAO,MAAM,kBAAkB,EAAE,SAAS,cAAc,EA+BvD,CAAC"}
@@ -21,5 +21,14 @@ export const CHARACTER_READINGS = [
21
21
  reads("子", "zǐ", "and a suffix sense is not a claim about the character"),
22
22
  reads("夫", "fū", "nor is 大夫's and 丈夫's reduction"),
23
23
  reads("吗", "ma", "but a 语气词 CC-CEDICT reads 轻声 alone keeps it"),
24
+ // FREE_READINGS: the free verb or classifier leads, and the compounds that
25
+ // ranked the other reading first keep it.
26
+ reads("剥", "bāo", "the free verb, not 剥削's bō"),
27
+ reads("剥削", "bō xuē", "and the compounds keep the literary reading"),
28
+ reads("切", "qiē", "kHanyuPinlu's qiè is nearly all 一切"),
29
+ reads("一切", "yī qiè", "which keeps it"),
30
+ reads("幢", "zhuàng", "the classifier, not 经幢's banner"),
31
+ reads("脏", "zāng", "dirty, not the organ"),
32
+ reads("心脏", "xīn zàng", "which 心脏 keeps"),
24
33
  ];
25
34
  //# sourceMappingURL=character-readings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"character-readings.js","sourceRoot":"","sources":["../../src/dictionary/character-readings.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAA8B;IAC3D,oEAAoE;IACpE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,gEAAgE;IAChE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,uCAAuC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,6CAA6C,CAAC;IACrE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,gDAAgD,CAAC;IACvE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,4EAA4E;IAC5E,uDAAuD;IACvD,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,yCAAyC,CAAC;IAC3D,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,+CAA+C,CAAC;IAClE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,4CAA4C,CAAC;IAC9D,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,mDAAmD,CAAC;IAC1E,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,8CAA8C,CAAC;IAChE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,uDAAuD,CAAC;IACzE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,gCAAgC,CAAC;IAClD,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,6CAA6C,CAAC;CAChE,CAAC"}
1
+ {"version":3,"file":"character-readings.js","sourceRoot":"","sources":["../../src/dictionary/character-readings.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAA8B;IAC3D,oEAAoE;IACpE,wEAAwE;IACxE,0EAA0E;IAC1E,yEAAyE;IACzE,gEAAgE;IAChE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,uCAAuC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,6CAA6C,CAAC;IACrE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,gDAAgD,CAAC;IACvE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,4EAA4E;IAC5E,uDAAuD;IACvD,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,yCAAyC,CAAC;IAC3D,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,+CAA+C,CAAC;IAClE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,4CAA4C,CAAC;IAC9D,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,mDAAmD,CAAC;IAC1E,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,8CAA8C,CAAC;IAChE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,uDAAuD,CAAC;IACzE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,gCAAgC,CAAC;IAClD,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,6CAA6C,CAAC;IAC/D,2EAA2E;IAC3E,0CAA0C;IAC1C,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,4BAA4B,CAAC;IAC/C,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,6CAA6C,CAAC;IACpE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,oCAAoC,CAAC;IACvD,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IACvC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,iCAAiC,CAAC;IACvD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,sBAAsB,CAAC;IAC1C,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC;CAC1C,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { type Syllable } from "../syllable/syllable.js";
2
+ /**
3
+ * A character whose reading as a word of its own is not the one it leads with.
4
+ */
5
+ export interface FreeReading {
6
+ /** The character, in either script. */
7
+ readonly character: string;
8
+ /** The reading it takes standing alone, as tone-marked pinyin. */
9
+ readonly reading: string;
10
+ /** The words that carry the other reading, which is why the sources rank it
11
+ * first. */
12
+ readonly displaces: string;
13
+ }
14
+ /**
15
+ * Characters that read one way inside words and another standing alone.
16
+ *
17
+ * A character's default is ranked by `kHanyuPinlu` where it lists several
18
+ * readings and by the corpus mass of the dictionary's words where it does not,
19
+ * and both count the character *inside words*. That is the right evidence for
20
+ * most polyphones and the wrong evidence for these, which have a literary
21
+ * reading in their compounds and an everyday one as a free verb or classifier.
22
+ * 剥削, 剥夺 and 剥落 give 剥 `bō`, and a reader peeling an orange says `bāo`.
23
+ * `kHanyuPinlu` counts 切 `qiè` 998 times against `qiē` 70, nearly all of it
24
+ * 一切, and 切土豆 is `qiē`.
25
+ *
26
+ * The compounds are dictionary words and keep their own readings. The default
27
+ * is what a character segmented on its own is read with, which is where these
28
+ * stand as free words, and what an unknown compound is derived from.
29
+ *
30
+ * **What is listed here.** A character whose 现代汉语词典 entry gives the listed
31
+ * reading to its free use and the other to its compounds or a literary sense,
32
+ * found by reading example sentences rather than by a measure. CPP labels
33
+ * news text, where these characters mostly sit inside words, so it is the check
34
+ * that nothing broke rather than the evidence for the list. What is *not*
35
+ * listed is a character whose free uses split, such as 卡 (a card, `kǎ`, and
36
+ * stuck, `qiǎ`) or 背 (the back and to recite, `bèi`, and to carry, `bēi`): a
37
+ * default cannot choose between two free words, and a context rule can. Nor
38
+ * is a character that names and transliterations use on its own: 勒 is `lēi`
39
+ * in 勒得难受 and `lè` in every 希特勒 and 达勒姆 the dictionary lacks, and 盛 is
40
+ * `chéng` in 盛汤 and the surname `Shèng` in 刘盛. Listing either cost CPP 25
41
+ * and 7 cases.
42
+ *
43
+ * **The reading must be one the sources already give the character.** It is
44
+ * moved to the front of the ranking rather than written over it, so a source
45
+ * refresh that dropped it would fail the build rather than leave a reading
46
+ * nothing attests. That is why 剝 and 掙 are missing beside 剥 and 挣: Unihan
47
+ * gives them `bō` and `zhēng` alone.
48
+ */
49
+ export declare const FREE_READINGS: readonly FreeReading[];
50
+ /**
51
+ * Read a free reading into a syllable, throwing if it is not one.
52
+ *
53
+ * Throwing for the reason {@link import("./overrides.js").readOverrideReading}
54
+ * does: an entry that failed to parse would leave the ranking it was written
55
+ * to correct, and nothing would notice.
56
+ */
57
+ export declare function freeSyllable(free: FreeReading): Syllable;
58
+ /**
59
+ * The table, keyed by character and parsed into syllables.
60
+ */
61
+ export declare const FREE_SYLLABLES: ReadonlyMap<string, Syllable>;
62
+ /**
63
+ * Lead a character's ranked readings with its free reading, where it has one.
64
+ *
65
+ * The rest keep the order the ranking gave them. A listed reading the ranking
66
+ * does not hold throws, which is the build failing on a source that stopped
67
+ * attesting it.
68
+ */
69
+ export declare function leadWithFreeReading(character: string, ranked: readonly Syllable[]): readonly Syllable[];
70
+ //# sourceMappingURL=free-readings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-readings.d.ts","sourceRoot":"","sources":["../../src/dictionary/free-readings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;gBACY;IACZ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EA0B/C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAQxD;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAExD,CAAC;AAaF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,QAAQ,EAAE,GAC1B,SAAS,QAAQ,EAAE,CAYrB"}