@kensio/pinyinjs 1.7.4 → 1.7.5

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 (695) hide show
  1. package/dist/accuracy/score-case.d.ts +23 -0
  2. package/dist/accuracy/score-case.d.ts.map +1 -0
  3. package/dist/accuracy/score-case.js +63 -0
  4. package/dist/accuracy/score-case.js.map +1 -0
  5. package/dist/accuracy/score.d.ts +1 -8
  6. package/dist/accuracy/score.d.ts.map +1 -1
  7. package/dist/accuracy/score.js +1 -55
  8. package/dist/accuracy/score.js.map +1 -1
  9. package/dist/cli/arguments.d.ts +4 -290
  10. package/dist/cli/arguments.d.ts.map +1 -1
  11. package/dist/cli/arguments.js +5 -357
  12. package/dist/cli/arguments.js.map +1 -1
  13. package/dist/cli/check-command.d.ts +9 -0
  14. package/dist/cli/check-command.d.ts.map +1 -0
  15. package/dist/cli/check-command.js +95 -0
  16. package/dist/cli/check-command.js.map +1 -0
  17. package/dist/cli/cli-input.d.ts +49 -0
  18. package/dist/cli/cli-input.d.ts.map +1 -0
  19. package/dist/cli/cli-input.js +31 -0
  20. package/dist/cli/cli-input.js.map +1 -0
  21. package/dist/cli/command.d.ts +97 -0
  22. package/dist/cli/command.d.ts.map +1 -0
  23. package/dist/cli/command.js +40 -0
  24. package/dist/cli/command.js.map +1 -0
  25. package/dist/cli/commands.d.ts +7 -110
  26. package/dist/cli/commands.d.ts.map +1 -1
  27. package/dist/cli/commands.js +14 -991
  28. package/dist/cli/commands.js.map +1 -1
  29. package/dist/cli/convert-command.d.ts +6 -0
  30. package/dist/cli/convert-command.d.ts.map +1 -0
  31. package/dist/cli/convert-command.js +52 -0
  32. package/dist/cli/convert-command.js.map +1 -0
  33. package/dist/cli/environment.d.ts +1 -1
  34. package/dist/cli/environment.d.ts.map +1 -1
  35. package/dist/cli/explain-command.d.ts +6 -0
  36. package/dist/cli/explain-command.d.ts.map +1 -0
  37. package/dist/cli/explain-command.js +40 -0
  38. package/dist/cli/explain-command.js.map +1 -0
  39. package/dist/cli/explain-syllable.d.ts +10 -0
  40. package/dist/cli/explain-syllable.d.ts.map +1 -0
  41. package/dist/cli/explain-syllable.js +70 -0
  42. package/dist/cli/explain-syllable.js.map +1 -0
  43. package/dist/cli/flag-help.d.ts +18 -0
  44. package/dist/cli/flag-help.d.ts.map +1 -0
  45. package/dist/cli/flag-help.js +78 -0
  46. package/dist/cli/flag-help.js.map +1 -0
  47. package/dist/cli/flag-lists.d.ts +49 -0
  48. package/dist/cli/flag-lists.d.ts.map +1 -0
  49. package/dist/cli/flag-lists.js +58 -0
  50. package/dist/cli/flag-lists.js.map +1 -0
  51. package/dist/cli/flag-values.d.ts +44 -0
  52. package/dist/cli/flag-values.d.ts.map +1 -0
  53. package/dist/cli/flag-values.js +56 -0
  54. package/dist/cli/flag-values.js.map +1 -0
  55. package/dist/cli/flags.d.ts +193 -0
  56. package/dist/cli/flags.d.ts.map +1 -0
  57. package/dist/cli/flags.js +133 -0
  58. package/dist/cli/flags.js.map +1 -0
  59. package/dist/cli/format-options.d.ts +29 -0
  60. package/dist/cli/format-options.d.ts.map +1 -0
  61. package/dist/cli/format-options.js +72 -0
  62. package/dist/cli/format-options.js.map +1 -0
  63. package/dist/cli/global-help.d.ts +23 -0
  64. package/dist/cli/global-help.d.ts.map +1 -0
  65. package/dist/cli/global-help.js +40 -0
  66. package/dist/cli/global-help.js.map +1 -0
  67. package/dist/cli/help.d.ts +1 -1
  68. package/dist/cli/help.d.ts.map +1 -1
  69. package/dist/cli/help.js +5 -99
  70. package/dist/cli/help.js.map +1 -1
  71. package/dist/cli/html-commands.d.ts +13 -0
  72. package/dist/cli/html-commands.d.ts.map +1 -0
  73. package/dist/cli/html-commands.js +49 -0
  74. package/dist/cli/html-commands.js.map +1 -0
  75. package/dist/cli/info-command.d.ts +7 -0
  76. package/dist/cli/info-command.d.ts.map +1 -0
  77. package/dist/cli/info-command.js +39 -0
  78. package/dist/cli/info-command.js.map +1 -0
  79. package/dist/cli/lookup-commands.d.ts +10 -0
  80. package/dist/cli/lookup-commands.d.ts.map +1 -0
  81. package/dist/cli/lookup-commands.js +101 -0
  82. package/dist/cli/lookup-commands.js.map +1 -0
  83. package/dist/cli/match-command.d.ts +11 -0
  84. package/dist/cli/match-command.d.ts.map +1 -0
  85. package/dist/cli/match-command.js +76 -0
  86. package/dist/cli/match-command.js.map +1 -0
  87. package/dist/cli/number-command.d.ts +12 -0
  88. package/dist/cli/number-command.d.ts.map +1 -0
  89. package/dist/cli/number-command.js +89 -0
  90. package/dist/cli/number-command.js.map +1 -0
  91. package/dist/cli/options.d.ts +30 -0
  92. package/dist/cli/options.d.ts.map +1 -0
  93. package/dist/cli/options.js +54 -0
  94. package/dist/cli/options.js.map +1 -0
  95. package/dist/cli/run-command.d.ts +24 -0
  96. package/dist/cli/run-command.d.ts.map +1 -0
  97. package/dist/cli/run-command.js +40 -0
  98. package/dist/cli/run-command.js.map +1 -0
  99. package/dist/cli/run.d.ts +4 -42
  100. package/dist/cli/run.d.ts.map +1 -1
  101. package/dist/cli/run.js +6 -61
  102. package/dist/cli/run.js.map +1 -1
  103. package/dist/cli/script-command.d.ts +10 -0
  104. package/dist/cli/script-command.d.ts.map +1 -0
  105. package/dist/cli/script-command.js +58 -0
  106. package/dist/cli/script-command.js.map +1 -0
  107. package/dist/cli/segment-command.d.ts +11 -0
  108. package/dist/cli/segment-command.d.ts.map +1 -0
  109. package/dist/cli/segment-command.js +53 -0
  110. package/dist/cli/segment-command.js.map +1 -0
  111. package/dist/cli/slug-command.d.ts +10 -0
  112. package/dist/cli/slug-command.d.ts.map +1 -0
  113. package/dist/cli/slug-command.js +28 -0
  114. package/dist/cli/slug-command.js.map +1 -0
  115. package/dist/cli/syllable-command.d.ts +14 -0
  116. package/dist/cli/syllable-command.d.ts.map +1 -0
  117. package/dist/cli/syllable-command.js +82 -0
  118. package/dist/cli/syllable-command.js.map +1 -0
  119. package/dist/cli/system-table.d.ts +12 -0
  120. package/dist/cli/system-table.d.ts.map +1 -0
  121. package/dist/cli/system-table.js +48 -0
  122. package/dist/cli/system-table.js.map +1 -0
  123. package/dist/cli/systems.d.ts +57 -0
  124. package/dist/cli/systems.d.ts.map +1 -0
  125. package/dist/cli/systems.js +27 -0
  126. package/dist/cli/systems.js.map +1 -0
  127. package/dist/cli/transcribe-command.d.ts +18 -0
  128. package/dist/cli/transcribe-command.d.ts.map +1 -0
  129. package/dist/cli/transcribe-command.js +86 -0
  130. package/dist/cli/transcribe-command.js.map +1 -0
  131. package/dist/cli/transcribe-reading.d.ts +15 -0
  132. package/dist/cli/transcribe-reading.d.ts.map +1 -0
  133. package/dist/cli/transcribe-reading.js +90 -0
  134. package/dist/cli/transcribe-reading.js.map +1 -0
  135. package/dist/cli/transcribe-rows.d.ts +26 -0
  136. package/dist/cli/transcribe-rows.d.ts.map +1 -0
  137. package/dist/cli/transcribe-rows.js +30 -0
  138. package/dist/cli/transcribe-rows.js.map +1 -0
  139. package/dist/cli/usage-error.d.ts +9 -0
  140. package/dist/cli/usage-error.d.ts.map +1 -0
  141. package/dist/cli/usage-error.js +9 -0
  142. package/dist/cli/usage-error.js.map +1 -0
  143. package/dist/decode/alternatives.d.ts +16 -0
  144. package/dist/decode/alternatives.d.ts.map +1 -0
  145. package/dist/decode/alternatives.js +31 -0
  146. package/dist/decode/alternatives.js.map +1 -0
  147. package/dist/decode/confidence.d.ts.map +1 -1
  148. package/dist/decode/confidence.js +3 -118
  149. package/dist/decode/confidence.js.map +1 -1
  150. package/dist/decode/convert-options.d.ts +116 -0
  151. package/dist/decode/convert-options.d.ts.map +1 -0
  152. package/dist/decode/convert-options.js +2 -0
  153. package/dist/decode/convert-options.js.map +1 -0
  154. package/dist/decode/convert-pipeline.d.ts +18 -0
  155. package/dist/decode/convert-pipeline.d.ts.map +1 -0
  156. package/dist/decode/convert-pipeline.js +66 -0
  157. package/dist/decode/convert-pipeline.js.map +1 -0
  158. package/dist/decode/convert.d.ts +9 -118
  159. package/dist/decode/convert.d.ts.map +1 -1
  160. package/dist/decode/convert.js +5 -453
  161. package/dist/decode/convert.js.map +1 -1
  162. package/dist/decode/decode.d.ts +2 -15
  163. package/dist/decode/decode.d.ts.map +1 -1
  164. package/dist/decode/decode.js +2 -121
  165. package/dist/decode/decode.js.map +1 -1
  166. package/dist/decode/decoders.d.ts +32 -0
  167. package/dist/decode/decoders.d.ts.map +1 -0
  168. package/dist/decode/decoders.js +29 -0
  169. package/dist/decode/decoders.js.map +1 -0
  170. package/dist/decode/edge-context.d.ts +38 -0
  171. package/dist/decode/edge-context.d.ts.map +1 -0
  172. package/dist/decode/edge-context.js +57 -0
  173. package/dist/decode/edge-context.js.map +1 -0
  174. package/dist/decode/hint-lattice.d.ts +45 -0
  175. package/dist/decode/hint-lattice.d.ts.map +1 -0
  176. package/dist/decode/hint-lattice.js +140 -0
  177. package/dist/decode/hint-lattice.js.map +1 -0
  178. package/dist/decode/hints.d.ts +2 -45
  179. package/dist/decode/hints.d.ts.map +1 -1
  180. package/dist/decode/hints.js +1 -139
  181. package/dist/decode/hints.js.map +1 -1
  182. package/dist/decode/jiao-rule.d.ts +58 -0
  183. package/dist/decode/jiao-rule.d.ts.map +1 -0
  184. package/dist/decode/jiao-rule.js +76 -0
  185. package/dist/decode/jiao-rule.js.map +1 -0
  186. package/dist/decode/lattice-costs.d.ts +55 -0
  187. package/dist/decode/lattice-costs.d.ts.map +1 -0
  188. package/dist/decode/lattice-costs.js +90 -0
  189. package/dist/decode/lattice-costs.js.map +1 -0
  190. package/dist/decode/lattice-edges.d.ts +29 -0
  191. package/dist/decode/lattice-edges.d.ts.map +1 -0
  192. package/dist/decode/lattice-edges.js +78 -0
  193. package/dist/decode/lattice-edges.js.map +1 -0
  194. package/dist/decode/lattice-slice.d.ts +37 -0
  195. package/dist/decode/lattice-slice.d.ts.map +1 -0
  196. package/dist/decode/lattice-slice.js +43 -0
  197. package/dist/decode/lattice-slice.js.map +1 -0
  198. package/dist/decode/lattice-types.d.ts +82 -0
  199. package/dist/decode/lattice-types.d.ts.map +1 -0
  200. package/dist/decode/lattice-types.js +44 -0
  201. package/dist/decode/lattice-types.js.map +1 -0
  202. package/dist/decode/lattice.d.ts +2 -59
  203. package/dist/decode/lattice.d.ts.map +1 -1
  204. package/dist/decode/lattice.js +2 -118
  205. package/dist/decode/lattice.js.map +1 -1
  206. package/dist/decode/number-pieces.d.ts +62 -0
  207. package/dist/decode/number-pieces.d.ts.map +1 -0
  208. package/dist/decode/number-pieces.js +106 -0
  209. package/dist/decode/number-pieces.js.map +1 -0
  210. package/dist/decode/numbers.d.ts +53 -0
  211. package/dist/decode/numbers.d.ts.map +1 -0
  212. package/dist/decode/numbers.js +69 -0
  213. package/dist/decode/numbers.js.map +1 -0
  214. package/dist/decode/pieces.d.ts +78 -0
  215. package/dist/decode/pieces.d.ts.map +1 -0
  216. package/dist/decode/pieces.js +136 -0
  217. package/dist/decode/pieces.js.map +1 -0
  218. package/dist/decode/polyphone-rules.d.ts +31 -0
  219. package/dist/decode/polyphone-rules.d.ts.map +1 -0
  220. package/dist/decode/polyphone-rules.js +159 -0
  221. package/dist/decode/polyphone-rules.js.map +1 -0
  222. package/dist/decode/reading-rules.d.ts +2 -97
  223. package/dist/decode/reading-rules.d.ts.map +1 -1
  224. package/dist/decode/reading-rules.js +4 -365
  225. package/dist/decode/reading-rules.js.map +1 -1
  226. package/dist/decode/rules.d.ts +1 -17
  227. package/dist/decode/rules.d.ts.map +1 -1
  228. package/dist/decode/rules.js +1 -43
  229. package/dist/decode/rules.js.map +1 -1
  230. package/dist/decode/run-lattice.d.ts +52 -0
  231. package/dist/decode/run-lattice.d.ts.map +1 -0
  232. package/dist/decode/run-lattice.js +91 -0
  233. package/dist/decode/run-lattice.js.map +1 -0
  234. package/dist/decode/sandhi-tones.d.ts +69 -0
  235. package/dist/decode/sandhi-tones.d.ts.map +1 -0
  236. package/dist/decode/sandhi-tones.js +88 -0
  237. package/dist/decode/sandhi-tones.js.map +1 -0
  238. package/dist/decode/sandhi.d.ts +1 -1
  239. package/dist/decode/sandhi.d.ts.map +1 -1
  240. package/dist/decode/sandhi.js +1 -81
  241. package/dist/decode/sandhi.js.map +1 -1
  242. package/dist/decode/script-types.d.ts +76 -0
  243. package/dist/decode/script-types.d.ts.map +1 -0
  244. package/dist/decode/script-types.js +35 -0
  245. package/dist/decode/script-types.js.map +1 -0
  246. package/dist/decode/script-words.d.ts +32 -0
  247. package/dist/decode/script-words.d.ts.map +1 -0
  248. package/dist/decode/script-words.js +77 -0
  249. package/dist/decode/script-words.js.map +1 -0
  250. package/dist/decode/script.d.ts +3 -73
  251. package/dist/decode/script.d.ts.map +1 -1
  252. package/dist/decode/script.js +3 -109
  253. package/dist/decode/script.js.map +1 -1
  254. package/dist/decode/tan-rule.d.ts +68 -0
  255. package/dist/decode/tan-rule.d.ts.map +1 -0
  256. package/dist/decode/tan-rule.js +131 -0
  257. package/dist/decode/tan-rule.js.map +1 -0
  258. package/dist/decode/write-run.d.ts +28 -0
  259. package/dist/decode/write-run.d.ts.map +1 -0
  260. package/dist/decode/write-run.js +77 -0
  261. package/dist/decode/write-run.js.map +1 -0
  262. package/dist/dictionary/artifact-claims.d.ts +25 -0
  263. package/dist/dictionary/artifact-claims.d.ts.map +1 -0
  264. package/dist/dictionary/artifact-claims.js +47 -0
  265. package/dist/dictionary/artifact-claims.js.map +1 -0
  266. package/dist/dictionary/artifact-format.d.ts +86 -0
  267. package/dist/dictionary/artifact-format.d.ts.map +1 -0
  268. package/dist/dictionary/artifact-format.js +91 -0
  269. package/dist/dictionary/artifact-format.js.map +1 -0
  270. package/dist/dictionary/artifact-read.d.ts +34 -0
  271. package/dist/dictionary/artifact-read.d.ts.map +1 -0
  272. package/dist/dictionary/artifact-read.js +114 -0
  273. package/dist/dictionary/artifact-read.js.map +1 -0
  274. package/dist/dictionary/artifact.d.ts +4 -63
  275. package/dist/dictionary/artifact.d.ts.map +1 -1
  276. package/dist/dictionary/artifact.js +12 -229
  277. package/dist/dictionary/artifact.js.map +1 -1
  278. package/dist/dictionary/assertions.d.ts +5 -57
  279. package/dist/dictionary/assertions.d.ts.map +1 -1
  280. package/dist/dictionary/assertions.js +4 -317
  281. package/dist/dictionary/assertions.js.map +1 -1
  282. package/dist/dictionary/build-assertions.d.ts +12 -0
  283. package/dist/dictionary/build-assertions.d.ts.map +1 -0
  284. package/dist/dictionary/build-assertions.js +13 -0
  285. package/dist/dictionary/build-assertions.js.map +1 -0
  286. package/dist/dictionary/built-dictionary.d.ts +46 -0
  287. package/dist/dictionary/built-dictionary.d.ts.map +1 -0
  288. package/dist/dictionary/built-dictionary.js +97 -0
  289. package/dist/dictionary/built-dictionary.js.map +1 -0
  290. package/dist/dictionary/cedict-senses.d.ts +80 -0
  291. package/dist/dictionary/cedict-senses.d.ts.map +1 -0
  292. package/dist/dictionary/cedict-senses.js +114 -0
  293. package/dist/dictionary/cedict-senses.js.map +1 -0
  294. package/dist/dictionary/character-defaults.d.ts +26 -0
  295. package/dist/dictionary/character-defaults.d.ts.map +1 -0
  296. package/dist/dictionary/character-defaults.js +67 -0
  297. package/dist/dictionary/character-defaults.js.map +1 -0
  298. package/dist/dictionary/character-readings.d.ts +10 -0
  299. package/dist/dictionary/character-readings.d.ts.map +1 -0
  300. package/dist/dictionary/character-readings.js +25 -0
  301. package/dist/dictionary/character-readings.js.map +1 -0
  302. package/dist/dictionary/dictionary-entry.d.ts +37 -0
  303. package/dist/dictionary/dictionary-entry.d.ts.map +1 -0
  304. package/dist/dictionary/dictionary-entry.js +41 -0
  305. package/dist/dictionary/dictionary-entry.js.map +1 -0
  306. package/dist/dictionary/dictionary-readings.d.ts +56 -0
  307. package/dist/dictionary/dictionary-readings.d.ts.map +1 -0
  308. package/dist/dictionary/dictionary-readings.js +93 -0
  309. package/dist/dictionary/dictionary-readings.js.map +1 -0
  310. package/dist/dictionary/dictionary.d.ts +6 -60
  311. package/dist/dictionary/dictionary.d.ts.map +1 -1
  312. package/dist/dictionary/dictionary.js +9 -169
  313. package/dist/dictionary/dictionary.js.map +1 -1
  314. package/dist/dictionary/entry-invariants.d.ts +3 -0
  315. package/dist/dictionary/entry-invariants.d.ts.map +1 -0
  316. package/dist/dictionary/entry-invariants.js +67 -0
  317. package/dist/dictionary/entry-invariants.js.map +1 -0
  318. package/dist/dictionary/entry-lines.d.ts +35 -0
  319. package/dist/dictionary/entry-lines.d.ts.map +1 -0
  320. package/dist/dictionary/entry-lines.js +70 -0
  321. package/dist/dictionary/entry-lines.js.map +1 -0
  322. package/dist/dictionary/erhua-repair.d.ts +26 -0
  323. package/dist/dictionary/erhua-repair.d.ts.map +1 -0
  324. package/dist/dictionary/erhua-repair.js +49 -0
  325. package/dist/dictionary/erhua-repair.js.map +1 -0
  326. package/dist/dictionary/frequency-tones.d.ts +74 -0
  327. package/dist/dictionary/frequency-tones.d.ts.map +1 -0
  328. package/dist/dictionary/frequency-tones.js +128 -0
  329. package/dist/dictionary/frequency-tones.js.map +1 -0
  330. package/dist/dictionary/inventory-invariants.d.ts +3 -0
  331. package/dist/dictionary/inventory-invariants.d.ts.map +1 -0
  332. package/dist/dictionary/inventory-invariants.js +54 -0
  333. package/dist/dictionary/inventory-invariants.js.map +1 -0
  334. package/dist/dictionary/locale-candidates.d.ts +40 -0
  335. package/dist/dictionary/locale-candidates.d.ts.map +1 -0
  336. package/dist/dictionary/locale-candidates.js +77 -0
  337. package/dist/dictionary/locale-candidates.js.map +1 -0
  338. package/dist/dictionary/locale-segments.d.ts +47 -0
  339. package/dist/dictionary/locale-segments.d.ts.map +1 -0
  340. package/dist/dictionary/locale-segments.js +141 -0
  341. package/dist/dictionary/locale-segments.js.map +1 -0
  342. package/dist/dictionary/locale.d.ts +1 -21
  343. package/dist/dictionary/locale.d.ts.map +1 -1
  344. package/dist/dictionary/locale.js +9 -198
  345. package/dist/dictionary/locale.js.map +1 -1
  346. package/dist/dictionary/merge-types.d.ts +121 -0
  347. package/dist/dictionary/merge-types.d.ts.map +1 -0
  348. package/dist/dictionary/merge-types.js +35 -0
  349. package/dist/dictionary/merge-types.js.map +1 -0
  350. package/dist/dictionary/merge-word.d.ts +7 -0
  351. package/dist/dictionary/merge-word.d.ts.map +1 -0
  352. package/dist/dictionary/merge-word.js +91 -0
  353. package/dist/dictionary/merge-word.js.map +1 -0
  354. package/dist/dictionary/merge.d.ts +5 -62
  355. package/dist/dictionary/merge.d.ts.map +1 -1
  356. package/dist/dictionary/merge.js +30 -713
  357. package/dist/dictionary/merge.js.map +1 -1
  358. package/dist/dictionary/proper-noun.d.ts +28 -0
  359. package/dist/dictionary/proper-noun.d.ts.map +1 -0
  360. package/dist/dictionary/proper-noun.js +43 -0
  361. package/dist/dictionary/proper-noun.js.map +1 -0
  362. package/dist/dictionary/reading-agreement.d.ts +71 -0
  363. package/dist/dictionary/reading-agreement.d.ts.map +1 -0
  364. package/dist/dictionary/reading-agreement.js +156 -0
  365. package/dist/dictionary/reading-agreement.js.map +1 -0
  366. package/dist/dictionary/script-conversion.d.ts +28 -0
  367. package/dist/dictionary/script-conversion.d.ts.map +1 -0
  368. package/dist/dictionary/script-conversion.js +58 -0
  369. package/dist/dictionary/script-conversion.js.map +1 -0
  370. package/dist/dictionary/script-pairings.d.ts +74 -0
  371. package/dist/dictionary/script-pairings.d.ts.map +1 -0
  372. package/dist/dictionary/script-pairings.js +120 -0
  373. package/dist/dictionary/script-pairings.js.map +1 -0
  374. package/dist/dictionary/script-tables.d.ts.map +1 -1
  375. package/dist/dictionary/script-tables.js +2 -165
  376. package/dist/dictionary/script-tables.js.map +1 -1
  377. package/dist/dictionary/taiwan-reading.d.ts +8 -0
  378. package/dist/dictionary/taiwan-reading.d.ts.map +1 -0
  379. package/dist/dictionary/taiwan-reading.js +38 -0
  380. package/dist/dictionary/taiwan-reading.js.map +1 -0
  381. package/dist/dictionary/tone-invariants.d.ts +3 -0
  382. package/dist/dictionary/tone-invariants.d.ts.map +1 -0
  383. package/dist/dictionary/tone-invariants.js +64 -0
  384. package/dist/dictionary/tone-invariants.js.map +1 -0
  385. package/dist/dictionary/traditional-form.d.ts +21 -0
  386. package/dist/dictionary/traditional-form.d.ts.map +1 -0
  387. package/dist/dictionary/traditional-form.js +59 -0
  388. package/dist/dictionary/traditional-form.js.map +1 -0
  389. package/dist/dictionary/traditional-ranking.d.ts +22 -0
  390. package/dist/dictionary/traditional-ranking.d.ts.map +1 -0
  391. package/dist/dictionary/traditional-ranking.js +74 -0
  392. package/dist/dictionary/traditional-ranking.js.map +1 -0
  393. package/dist/dictionary/traditional-table.d.ts +51 -0
  394. package/dist/dictionary/traditional-table.d.ts.map +1 -0
  395. package/dist/dictionary/traditional-table.js +98 -0
  396. package/dist/dictionary/traditional-table.js.map +1 -0
  397. package/dist/dictionary/traditional.d.ts +3 -56
  398. package/dist/dictionary/traditional.d.ts.map +1 -1
  399. package/dist/dictionary/traditional.js +3 -186
  400. package/dist/dictionary/traditional.js.map +1 -1
  401. package/dist/dictionary/variant-counts.d.ts +39 -0
  402. package/dist/dictionary/variant-counts.d.ts.map +1 -0
  403. package/dist/dictionary/variant-counts.js +38 -0
  404. package/dist/dictionary/variant-counts.js.map +1 -0
  405. package/dist/dictionary/word-reading.d.ts +26 -0
  406. package/dist/dictionary/word-reading.d.ts.map +1 -0
  407. package/dist/dictionary/word-reading.js +76 -0
  408. package/dist/dictionary/word-reading.js.map +1 -0
  409. package/dist/dictionary/word-readings.d.ts +15 -0
  410. package/dist/dictionary/word-readings.d.ts.map +1 -0
  411. package/dist/dictionary/word-readings.js +38 -0
  412. package/dist/dictionary/word-readings.js.map +1 -0
  413. package/dist/format/annotate.d.ts +90 -0
  414. package/dist/format/annotate.d.ts.map +1 -0
  415. package/dist/format/annotate.js +168 -0
  416. package/dist/format/annotate.js.map +1 -0
  417. package/dist/format/html.d.ts +15 -46
  418. package/dist/format/html.d.ts.map +1 -1
  419. package/dist/format/html.js +3 -162
  420. package/dist/format/html.js.map +1 -1
  421. package/dist/format/slug-hash.d.ts +51 -0
  422. package/dist/format/slug-hash.d.ts.map +1 -0
  423. package/dist/format/slug-hash.js +74 -0
  424. package/dist/format/slug-hash.js.map +1 -0
  425. package/dist/format/slug-options.d.ts +98 -0
  426. package/dist/format/slug-options.d.ts.map +1 -0
  427. package/dist/format/slug-options.js +2 -0
  428. package/dist/format/slug-options.js.map +1 -0
  429. package/dist/format/slug-words.d.ts +27 -0
  430. package/dist/format/slug-words.d.ts.map +1 -0
  431. package/dist/format/slug-words.js +0 -0
  432. package/dist/format/slug-words.js.map +1 -0
  433. package/dist/format/slug.d.ts +3 -128
  434. package/dist/format/slug.d.ts.map +1 -1
  435. package/dist/format/slug.js +0 -0
  436. package/dist/format/slug.js.map +1 -1
  437. package/dist/grade/check-readings.d.ts +41 -0
  438. package/dist/grade/check-readings.d.ts.map +1 -0
  439. package/dist/grade/check-readings.js +36 -0
  440. package/dist/grade/check-readings.js.map +1 -0
  441. package/dist/grade/check.d.ts +4 -4
  442. package/dist/grade/check.d.ts.map +1 -1
  443. package/dist/grade/check.js +5 -270
  444. package/dist/grade/check.js.map +1 -1
  445. package/dist/grade/pair-syllables.d.ts +48 -0
  446. package/dist/grade/pair-syllables.d.ts.map +1 -0
  447. package/dist/grade/pair-syllables.js +71 -0
  448. package/dist/grade/pair-syllables.js.map +1 -0
  449. package/dist/grade/reading-syllables.d.ts +62 -0
  450. package/dist/grade/reading-syllables.d.ts.map +1 -0
  451. package/dist/grade/reading-syllables.js +58 -0
  452. package/dist/grade/reading-syllables.js.map +1 -0
  453. package/dist/grade/reading-tolerance.d.ts +72 -0
  454. package/dist/grade/reading-tolerance.d.ts.map +1 -0
  455. package/dist/grade/reading-tolerance.js +107 -0
  456. package/dist/grade/reading-tolerance.js.map +1 -0
  457. package/dist/grade/typed-reading.d.ts +28 -0
  458. package/dist/grade/typed-reading.d.ts.map +1 -0
  459. package/dist/grade/typed-reading.js +36 -0
  460. package/dist/grade/typed-reading.js.map +1 -0
  461. package/dist/numerals/numeral-parse.d.ts +32 -0
  462. package/dist/numerals/numeral-parse.d.ts.map +1 -0
  463. package/dist/numerals/numeral-parse.js +44 -0
  464. package/dist/numerals/numeral-parse.js.map +1 -0
  465. package/dist/numerals/numeral-shapes.d.ts +89 -0
  466. package/dist/numerals/numeral-shapes.d.ts.map +1 -0
  467. package/dist/numerals/numeral-shapes.js +99 -0
  468. package/dist/numerals/numeral-shapes.js.map +1 -0
  469. package/dist/numerals/numerals.d.ts.map +1 -1
  470. package/dist/numerals/numerals.js +2 -36
  471. package/dist/numerals/numerals.js.map +1 -1
  472. package/dist/numerals/read-numeral.d.ts +76 -0
  473. package/dist/numerals/read-numeral.d.ts.map +1 -0
  474. package/dist/numerals/read-numeral.js +88 -0
  475. package/dist/numerals/read-numeral.js.map +1 -0
  476. package/dist/numerals/text.d.ts +3 -37
  477. package/dist/numerals/text.d.ts.map +1 -1
  478. package/dist/numerals/text.js +3 -254
  479. package/dist/numerals/text.js.map +1 -1
  480. package/dist/numerals/time.d.ts +34 -0
  481. package/dist/numerals/time.d.ts.map +1 -0
  482. package/dist/numerals/time.js +93 -0
  483. package/dist/numerals/time.js.map +1 -0
  484. package/dist/orthography/address-grouping.d.ts +34 -0
  485. package/dist/orthography/address-grouping.d.ts.map +1 -0
  486. package/dist/orthography/address-grouping.js +52 -0
  487. package/dist/orthography/address-grouping.js.map +1 -0
  488. package/dist/orthography/grouping.d.ts +3 -87
  489. package/dist/orthography/grouping.d.ts.map +1 -1
  490. package/dist/orthography/grouping.js +4 -270
  491. package/dist/orthography/grouping.js.map +1 -1
  492. package/dist/orthography/place-grouping.d.ts +39 -0
  493. package/dist/orthography/place-grouping.d.ts.map +1 -0
  494. package/dist/orthography/place-grouping.js +83 -0
  495. package/dist/orthography/place-grouping.js.map +1 -0
  496. package/dist/orthography/word-grouping.d.ts +48 -0
  497. package/dist/orthography/word-grouping.d.ts.map +1 -0
  498. package/dist/orthography/word-grouping.js +147 -0
  499. package/dist/orthography/word-grouping.js.map +1 -0
  500. package/dist/script/conversion-format.d.ts +22 -0
  501. package/dist/script/conversion-format.d.ts.map +1 -0
  502. package/dist/script/conversion-format.js +22 -0
  503. package/dist/script/conversion-format.js.map +1 -0
  504. package/dist/script/conversion-read.d.ts +9 -0
  505. package/dist/script/conversion-read.d.ts.map +1 -0
  506. package/dist/script/conversion-read.js +69 -0
  507. package/dist/script/conversion-read.js.map +1 -0
  508. package/dist/script/conversion-write.d.ts +14 -0
  509. package/dist/script/conversion-write.d.ts.map +1 -0
  510. package/dist/script/conversion-write.js +34 -0
  511. package/dist/script/conversion-write.js.map +1 -0
  512. package/dist/script/conversion.d.ts +10 -16
  513. package/dist/script/conversion.d.ts.map +1 -1
  514. package/dist/script/conversion.js +2 -115
  515. package/dist/script/conversion.js.map +1 -1
  516. package/dist/search/candidate-narrowing.d.ts +56 -0
  517. package/dist/search/candidate-narrowing.d.ts.map +1 -0
  518. package/dist/search/candidate-narrowing.js +55 -0
  519. package/dist/search/candidate-narrowing.js.map +1 -0
  520. package/dist/search/candidate-query.d.ts +25 -0
  521. package/dist/search/candidate-query.d.ts.map +1 -0
  522. package/dist/search/candidate-query.js +28 -0
  523. package/dist/search/candidate-query.js.map +1 -0
  524. package/dist/search/candidate-writings.d.ts +24 -0
  525. package/dist/search/candidate-writings.d.ts.map +1 -0
  526. package/dist/search/candidate-writings.js +114 -0
  527. package/dist/search/candidate-writings.js.map +1 -0
  528. package/dist/search/candidates.d.ts +7 -41
  529. package/dist/search/candidates.d.ts.map +1 -1
  530. package/dist/search/candidates.js +10 -164
  531. package/dist/search/candidates.js.map +1 -1
  532. package/dist/search/match-chunks.d.ts +19 -0
  533. package/dist/search/match-chunks.d.ts.map +1 -0
  534. package/dist/search/match-chunks.js +30 -0
  535. package/dist/search/match-chunks.js.map +1 -0
  536. package/dist/search/match-ranking.d.ts +39 -0
  537. package/dist/search/match-ranking.d.ts.map +1 -0
  538. package/dist/search/match-ranking.js +51 -0
  539. package/dist/search/match-ranking.js.map +1 -0
  540. package/dist/search/match-readings.d.ts +43 -0
  541. package/dist/search/match-readings.d.ts.map +1 -0
  542. package/dist/search/match-readings.js +83 -0
  543. package/dist/search/match-readings.js.map +1 -0
  544. package/dist/search/match-scoring.d.ts +146 -0
  545. package/dist/search/match-scoring.d.ts.map +1 -0
  546. package/dist/search/match-scoring.js +114 -0
  547. package/dist/search/match-scoring.js.map +1 -0
  548. package/dist/search/match-search.d.ts +28 -0
  549. package/dist/search/match-search.d.ts.map +1 -0
  550. package/dist/search/match-search.js +128 -0
  551. package/dist/search/match-search.js.map +1 -0
  552. package/dist/search/match.d.ts +5 -36
  553. package/dist/search/match.d.ts.map +1 -1
  554. package/dist/search/match.js +2 -379
  555. package/dist/search/match.js.map +1 -1
  556. package/dist/search/reverse-index-build.d.ts +30 -0
  557. package/dist/search/reverse-index-build.d.ts.map +1 -0
  558. package/dist/search/reverse-index-build.js +72 -0
  559. package/dist/search/reverse-index-build.js.map +1 -0
  560. package/dist/search/reverse-index-format.d.ts +60 -0
  561. package/dist/search/reverse-index-format.d.ts.map +1 -0
  562. package/dist/search/reverse-index-format.js +54 -0
  563. package/dist/search/reverse-index-format.js.map +1 -0
  564. package/dist/search/reverse-index-groups.d.ts +37 -0
  565. package/dist/search/reverse-index-groups.d.ts.map +1 -0
  566. package/dist/search/reverse-index-groups.js +71 -0
  567. package/dist/search/reverse-index-groups.js.map +1 -0
  568. package/dist/search/reverse-index-passes.d.ts +78 -0
  569. package/dist/search/reverse-index-passes.d.ts.map +1 -0
  570. package/dist/search/reverse-index-passes.js +59 -0
  571. package/dist/search/reverse-index-passes.js.map +1 -0
  572. package/dist/search/reverse-index-state.d.ts +36 -0
  573. package/dist/search/reverse-index-state.d.ts.map +1 -0
  574. package/dist/search/reverse-index-state.js +95 -0
  575. package/dist/search/reverse-index-state.js.map +1 -0
  576. package/dist/search/reverse-index.d.ts +8 -67
  577. package/dist/search/reverse-index.d.ts.map +1 -1
  578. package/dist/search/reverse-index.js +4 -255
  579. package/dist/search/reverse-index.js.map +1 -1
  580. package/dist/sources/unihan-readings.d.ts +58 -0
  581. package/dist/sources/unihan-readings.d.ts.map +1 -0
  582. package/dist/sources/unihan-readings.js +95 -0
  583. package/dist/sources/unihan-readings.js.map +1 -0
  584. package/dist/sources/unihan.d.ts +6 -9
  585. package/dist/sources/unihan.d.ts.map +1 -1
  586. package/dist/sources/unihan.js +2 -85
  587. package/dist/sources/unihan.js.map +1 -1
  588. package/dist/syllable/final-tables.d.ts +23 -0
  589. package/dist/syllable/final-tables.d.ts.map +1 -0
  590. package/dist/syllable/final-tables.js +50 -0
  591. package/dist/syllable/final-tables.js.map +1 -0
  592. package/dist/syllable/inventory.d.ts +8 -42
  593. package/dist/syllable/inventory.d.ts.map +1 -1
  594. package/dist/syllable/inventory.js +9 -918
  595. package/dist/syllable/inventory.js.map +1 -1
  596. package/dist/syllable/spellings.d.ts +40 -0
  597. package/dist/syllable/spellings.d.ts.map +1 -0
  598. package/dist/syllable/spellings.js +469 -0
  599. package/dist/syllable/spellings.js.map +1 -0
  600. package/dist/syllable/syllable-parts.d.ts +31 -0
  601. package/dist/syllable/syllable-parts.d.ts.map +1 -0
  602. package/dist/syllable/syllable-parts.js +105 -0
  603. package/dist/syllable/syllable-parts.js.map +1 -0
  604. package/dist/syllable/syllable.d.ts +1 -14
  605. package/dist/syllable/syllable.d.ts.map +1 -1
  606. package/dist/syllable/syllable.js +3 -144
  607. package/dist/syllable/syllable.js.map +1 -1
  608. package/dist/syllable/written-tones.d.ts +6 -0
  609. package/dist/syllable/written-tones.d.ts.map +1 -0
  610. package/dist/syllable/written-tones.js +453 -0
  611. package/dist/syllable/written-tones.js.map +1 -0
  612. package/dist/transcription/bopomofo-parse.d.ts +42 -0
  613. package/dist/transcription/bopomofo-parse.d.ts.map +1 -0
  614. package/dist/transcription/bopomofo-parse.js +92 -0
  615. package/dist/transcription/bopomofo-parse.js.map +1 -0
  616. package/dist/transcription/bopomofo-reverse.d.ts +31 -0
  617. package/dist/transcription/bopomofo-reverse.d.ts.map +1 -0
  618. package/dist/transcription/bopomofo-reverse.js +48 -0
  619. package/dist/transcription/bopomofo-reverse.js.map +1 -0
  620. package/dist/transcription/bopomofo-symbols.d.ts +36 -0
  621. package/dist/transcription/bopomofo-symbols.d.ts.map +1 -0
  622. package/dist/transcription/bopomofo-symbols.js +41 -0
  623. package/dist/transcription/bopomofo-symbols.js.map +1 -0
  624. package/dist/transcription/bopomofo-tables.d.ts +87 -0
  625. package/dist/transcription/bopomofo-tables.d.ts.map +1 -0
  626. package/dist/transcription/bopomofo-tables.js +180 -0
  627. package/dist/transcription/bopomofo-tables.js.map +1 -0
  628. package/dist/transcription/bopomofo.d.ts +14 -32
  629. package/dist/transcription/bopomofo.d.ts.map +1 -1
  630. package/dist/transcription/bopomofo.js +5 -343
  631. package/dist/transcription/bopomofo.js.map +1 -1
  632. package/dist/transcription/gwoyeu-first-second.d.ts +36 -0
  633. package/dist/transcription/gwoyeu-first-second.d.ts.map +1 -0
  634. package/dist/transcription/gwoyeu-first-second.js +75 -0
  635. package/dist/transcription/gwoyeu-first-second.js.map +1 -0
  636. package/dist/transcription/gwoyeu-spelling.d.ts +38 -0
  637. package/dist/transcription/gwoyeu-spelling.d.ts.map +1 -0
  638. package/dist/transcription/gwoyeu-spelling.js +124 -0
  639. package/dist/transcription/gwoyeu-spelling.js.map +1 -0
  640. package/dist/transcription/gwoyeu-tables.d.ts +93 -0
  641. package/dist/transcription/gwoyeu-tables.d.ts.map +1 -0
  642. package/dist/transcription/gwoyeu-tables.js +205 -0
  643. package/dist/transcription/gwoyeu-tables.js.map +1 -0
  644. package/dist/transcription/gwoyeu-tonal-forms.d.ts +49 -0
  645. package/dist/transcription/gwoyeu-tonal-forms.d.ts.map +1 -0
  646. package/dist/transcription/gwoyeu-tonal-forms.js +89 -0
  647. package/dist/transcription/gwoyeu-tonal-forms.js.map +1 -0
  648. package/dist/transcription/gwoyeu-vowels.d.ts +51 -0
  649. package/dist/transcription/gwoyeu-vowels.d.ts.map +1 -0
  650. package/dist/transcription/gwoyeu-vowels.js +58 -0
  651. package/dist/transcription/gwoyeu-vowels.js.map +1 -0
  652. package/dist/transcription/gwoyeu.d.ts +1 -26
  653. package/dist/transcription/gwoyeu.d.ts.map +1 -1
  654. package/dist/transcription/gwoyeu.js +2 -540
  655. package/dist/transcription/gwoyeu.js.map +1 -1
  656. package/dist/transcription/ipa-symbols.d.ts +67 -0
  657. package/dist/transcription/ipa-symbols.d.ts.map +1 -0
  658. package/dist/transcription/ipa-symbols.js +135 -0
  659. package/dist/transcription/ipa-symbols.js.map +1 -0
  660. package/dist/transcription/ipa.d.ts +2 -10
  661. package/dist/transcription/ipa.d.ts.map +1 -1
  662. package/dist/transcription/ipa.js +2 -134
  663. package/dist/transcription/ipa.js.map +1 -1
  664. package/dist/transcription/wade-giles-index.d.ts +35 -0
  665. package/dist/transcription/wade-giles-index.d.ts.map +1 -0
  666. package/dist/transcription/wade-giles-index.js +110 -0
  667. package/dist/transcription/wade-giles-index.js.map +1 -0
  668. package/dist/transcription/wade-giles-parse.d.ts +36 -0
  669. package/dist/transcription/wade-giles-parse.d.ts.map +1 -0
  670. package/dist/transcription/wade-giles-parse.js +84 -0
  671. package/dist/transcription/wade-giles-parse.js.map +1 -0
  672. package/dist/transcription/wade-giles-spelling.d.ts +61 -0
  673. package/dist/transcription/wade-giles-spelling.d.ts.map +1 -0
  674. package/dist/transcription/wade-giles-spelling.js +107 -0
  675. package/dist/transcription/wade-giles-spelling.js.map +1 -0
  676. package/dist/transcription/wade-giles-syllable.d.ts +29 -0
  677. package/dist/transcription/wade-giles-syllable.d.ts.map +1 -0
  678. package/dist/transcription/wade-giles-syllable.js +90 -0
  679. package/dist/transcription/wade-giles-syllable.js.map +1 -0
  680. package/dist/transcription/wade-giles-tables.d.ts +80 -0
  681. package/dist/transcription/wade-giles-tables.d.ts.map +1 -0
  682. package/dist/transcription/wade-giles-tables.js +178 -0
  683. package/dist/transcription/wade-giles-tables.js.map +1 -0
  684. package/dist/transcription/wade-giles.d.ts +9 -60
  685. package/dist/transcription/wade-giles.d.ts.map +1 -1
  686. package/dist/transcription/wade-giles.js +6 -543
  687. package/dist/transcription/wade-giles.js.map +1 -1
  688. package/dist/transcription/yale-tables.d.ts +54 -0
  689. package/dist/transcription/yale-tables.d.ts.map +1 -0
  690. package/dist/transcription/yale-tables.js +125 -0
  691. package/dist/transcription/yale-tables.js.map +1 -0
  692. package/dist/transcription/yale.d.ts.map +1 -1
  693. package/dist/transcription/yale.js +1 -124
  694. package/dist/transcription/yale.js.map +1 -1
  695. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ import { readSyllable } from "../syllable/syllable.js";
2
+ /**
3
+ * Unihan's reading lists, ranked against a syllable.
4
+ */
5
+ export class VariantRanking {
6
+ #unihanReadings;
7
+ #parsed = new Map();
8
+ constructor(unihanReadings) {
9
+ this.#unihanReadings = unihanReadings;
10
+ }
11
+ /**
12
+ * Parse a Unihan reading string, remembering the result.
13
+ *
14
+ * Worth caching: the fallback path reads the same few thousand strings once
15
+ * per candidate per word.
16
+ */
17
+ #syllableOf(reading) {
18
+ if (this.#parsed.has(reading)) {
19
+ return this.#parsed.get(reading);
20
+ }
21
+ const syllable = readSyllable(reading);
22
+ this.#parsed.set(reading, syllable);
23
+ return syllable;
24
+ }
25
+ /**
26
+ * How well a candidate character's readings match the one we want.
27
+ *
28
+ * Lower is better. A candidate whose most likely reading is the one we want
29
+ * beats one that merely lists it among its rarer readings, which is exactly
30
+ * what separates 髮 (`fà` alone) from 發 (`fā` first, `fà` third).
31
+ */
32
+ #rank(candidate, syllable) {
33
+ const readings = this.#unihanReadings.get(candidate)?.readings ?? [];
34
+ if (syllable === undefined) {
35
+ return readings.length === 0 ? Infinity : 0;
36
+ }
37
+ let tonelessMatch = Infinity;
38
+ for (const [at, reading] of readings.entries()) {
39
+ const parsed = this.#syllableOf(reading);
40
+ if (parsed === undefined) {
41
+ continue;
42
+ }
43
+ if (parsed.initial !== syllable.initial ||
44
+ parsed.final !== syllable.final) {
45
+ continue;
46
+ }
47
+ if (parsed.tone === syllable.tone) {
48
+ return at;
49
+ }
50
+ // A match on the syllable but not the tone still beats no match at all,
51
+ // since sources disagree about tone far more often than about spelling.
52
+ tonelessMatch = Math.min(tonelessMatch, readings.length + at);
53
+ }
54
+ return tonelessMatch;
55
+ }
56
+ /**
57
+ * The best-ranked candidate, or the character itself where there are none.
58
+ */
59
+ best(candidates, hans, syllable) {
60
+ let best = hans;
61
+ let bestRank = Infinity;
62
+ for (const candidate of candidates) {
63
+ const rank = this.#rank(candidate, syllable);
64
+ // Ties prefer a form other than the character itself, for the same reason
65
+ // mostFrequent does.
66
+ if (rank < bestRank || (rank === bestRank && best === hans)) {
67
+ best = candidate;
68
+ bestRank = rank;
69
+ }
70
+ }
71
+ return best;
72
+ }
73
+ }
74
+ //# sourceMappingURL=traditional-ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-ranking.js","sourceRoot":"","sources":["../../src/dictionary/traditional-ranking.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAiB,MAAM,yBAAyB,CAAC;AAEtE;;GAEG;AACH,MAAM,OAAO,cAAc;IAChB,eAAe,CAAsC;IACrD,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE3D,YAAY,cAAmD;QAC7D,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAiB,EAAE,QAA8B;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;QACrE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,aAAa,GAAG,QAAQ,CAAC;QAC7B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IACE,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBACnC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAC/B,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,wEAAwE;YACxE,wEAAwE;YACxE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,CACF,UAA6B,EAC7B,IAAY,EACZ,QAA8B;QAE9B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7C,0EAA0E;YAC1E,qBAAqB;YACrB,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC5D,IAAI,GAAG,SAAS,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ import type { UnihanReadings, UnihanVariants } from "../sources/unihan.js";
2
+ import type { Syllable } from "../syllable/syllable.js";
3
+ import type { ReadCharacters } from "./reading.js";
4
+ import { type ScriptPairing } from "./variant-counts.js";
5
+ /**
6
+ * Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
7
+ *
8
+ * 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
9
+ * conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
10
+ * dictionary already knows the reading, and the reading settles it — 头发 is
11
+ * `tóu fà`, so its 发 is 髮 and the word is 頭髮.
12
+ *
13
+ * Two sources of evidence, in order:
14
+ *
15
+ * 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
16
+ * written out, which is a large observed sample of how each character is
17
+ * converted at each reading. This is preferred because it is evidence rather
18
+ * than inference, and because it settles cases the reading cannot: 干扰 is
19
+ * `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
20
+ * 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
21
+ * appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
22
+ * reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
23
+ *
24
+ * Characters no source knows a variant for are left alone, which is the right
25
+ * answer for the overwhelming majority: simplification changed a minority of
26
+ * characters.
27
+ */
28
+ export declare class TraditionalTable {
29
+ #private;
30
+ /**
31
+ * Build the table from observed script pairings and Unihan's variant lists.
32
+ *
33
+ * Pairings should include the cases where the character is *unchanged*, since
34
+ * that is what stops a character with a rare traditional variant from always
35
+ * being converted to it.
36
+ */
37
+ static build(pairings: Iterable<ScriptPairing>, variants: UnihanVariants, unihanReadings: ReadonlyMap<string, UnihanReadings>): TraditionalTable;
38
+ /**
39
+ * Wrap prepared tables. Use {@link TraditionalTable.build}.
40
+ */
41
+ private constructor();
42
+ /**
43
+ * The 繁體 form of one character, given the syllable it is read as.
44
+ */
45
+ convertCharacter(hans: string, syllable: Syllable | undefined): string;
46
+ /**
47
+ * The 繁體 form of a whole word, read as the given syllables.
48
+ */
49
+ convert(aligned: readonly ReadCharacters[]): string;
50
+ }
51
+ //# sourceMappingURL=traditional-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-table.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional-table.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAgB;;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CACV,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EACjC,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAClD,gBAAgB,CAalB;IAMD;;OAEG;IACH,OAAO,eAQN;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAerE;IAED;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAelD;CACF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The 繁體 pairing table.
3
+ *
4
+ * Built from CC-CEDICT's own pairings and asked, character by character,
5
+ * which 繁體 form a 简体 one takes for a given reading.
6
+ */
7
+ import { toCharacters } from "../script/characters.js";
8
+ import { VariantRanking } from "./traditional-ranking.js";
9
+ import { ANY_READING, mostFrequent, readingKey, } from "./variant-counts.js";
10
+ /**
11
+ * Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
12
+ *
13
+ * 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
14
+ * conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
15
+ * dictionary already knows the reading, and the reading settles it — 头发 is
16
+ * `tóu fà`, so its 发 is 髮 and the word is 頭髮.
17
+ *
18
+ * Two sources of evidence, in order:
19
+ *
20
+ * 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
21
+ * written out, which is a large observed sample of how each character is
22
+ * converted at each reading. This is preferred because it is evidence rather
23
+ * than inference, and because it settles cases the reading cannot: 干扰 is
24
+ * `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
25
+ * 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
26
+ * appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
27
+ * reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
28
+ *
29
+ * Characters no source knows a variant for are left alone, which is the right
30
+ * answer for the overwhelming majority: simplification changed a minority of
31
+ * characters.
32
+ */
33
+ export class TraditionalTable {
34
+ /**
35
+ * Build the table from observed script pairings and Unihan's variant lists.
36
+ *
37
+ * Pairings should include the cases where the character is *unchanged*, since
38
+ * that is what stops a character with a rare traditional variant from always
39
+ * being converted to it.
40
+ */
41
+ static build(pairings, variants, unihanReadings) {
42
+ const observed = new Map();
43
+ for (const { hans, hant, syllable } of pairings) {
44
+ const byReading = observed.get(hans) ?? new Map();
45
+ const keys = new Set([ANY_READING, readingKey(syllable)]);
46
+ for (const key of keys) {
47
+ const counts = byReading.get(key) ?? new Map();
48
+ counts.set(hant, (counts.get(hant) ?? 0) + 1);
49
+ byReading.set(key, counts);
50
+ }
51
+ observed.set(hans, byReading);
52
+ }
53
+ return new TraditionalTable(observed, variants, unihanReadings);
54
+ }
55
+ #observed;
56
+ #variants;
57
+ #ranking;
58
+ /**
59
+ * Wrap prepared tables. Use {@link TraditionalTable.build}.
60
+ */
61
+ constructor(observed, variants, unihanReadings) {
62
+ this.#observed = observed;
63
+ this.#variants = variants;
64
+ this.#ranking = new VariantRanking(unihanReadings);
65
+ }
66
+ /**
67
+ * The 繁體 form of one character, given the syllable it is read as.
68
+ */
69
+ convertCharacter(hans, syllable) {
70
+ const byReading = this.#observed.get(hans);
71
+ // Evidence at this exact reading first, then evidence at any reading.
72
+ const observed = mostFrequent(byReading?.get(readingKey(syllable)), hans) ??
73
+ mostFrequent(byReading?.get(ANY_READING), hans);
74
+ if (observed !== undefined) {
75
+ return observed;
76
+ }
77
+ return this.#ranking.best(this.#variants.traditional.get(hans) ?? [], hans, syllable);
78
+ }
79
+ /**
80
+ * The 繁體 form of a whole word, read as the given syllables.
81
+ */
82
+ convert(aligned) {
83
+ let converted = "";
84
+ for (const read of aligned) {
85
+ const group = toCharacters(read.characters);
86
+ for (const character of group) {
87
+ // A syllable covering two characters — 儿化 — is not evidence about the
88
+ // second of them, so only the first is disambiguated by it.
89
+ const syllable = group.length === 1 || character === group[0]
90
+ ? read.syllable
91
+ : undefined;
92
+ converted += this.convertCharacter(character, syllable);
93
+ }
94
+ }
95
+ return converted;
96
+ }
97
+ }
98
+ //# sourceMappingURL=traditional-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-table.js","sourceRoot":"","sources":["../../src/dictionary/traditional-table.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,GAGX,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CACV,QAAiC,EACjC,QAAwB,EACxB,cAAmD;QAEnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAyB,CAAC;YACzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;gBAC/D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC;IAEQ,SAAS,CAA0D;IACnE,SAAS,CAAiB;IAC1B,QAAQ,CAAiB;IAElC;;OAEG;IACH,YACE,QAAiE,EACjE,QAAwB,EACxB,cAAmD;QAEnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAY,EAAE,QAA8B;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,sEAAsE;QACtE,MAAM,QAAQ,GACZ,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;YACxD,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAC1C,IAAI,EACJ,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAkC;QACxC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,sEAAsE;gBACtE,4DAA4D;gBAC5D,MAAM,QAAQ,GACZ,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC;oBAC1C,CAAC,CAAC,IAAI,CAAC,QAAQ;oBACf,CAAC,CAAC,SAAS,CAAC;gBAChB,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -1,60 +1,7 @@
1
- import type { UnihanReadings, UnihanVariants } from "../sources/unihan.js";
2
- import { type Syllable } from "../syllable/syllable.js";
3
1
  import type { ReadCharacters } from "./reading.js";
4
- /**
5
- * One 简体 → 繁體 pairing observed in a source, at one reading.
6
- */
7
- export interface ScriptPairing {
8
- readonly hans: string;
9
- readonly hant: string;
10
- readonly syllable: Syllable | undefined;
11
- }
12
- /**
13
- * Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
14
- *
15
- * 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
16
- * conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
17
- * dictionary already knows the reading, and the reading settles it — 头发 is
18
- * `tóu fà`, so its 发 is 髮 and the word is 頭髮.
19
- *
20
- * Two sources of evidence, in order:
21
- *
22
- * 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
23
- * written out, which is a large observed sample of how each character is
24
- * converted at each reading. This is preferred because it is evidence rather
25
- * than inference, and because it settles cases the reading cannot: 干扰 is
26
- * `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
27
- * 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
28
- * appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
29
- * reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
30
- *
31
- * Characters no source knows a variant for are left alone, which is the right
32
- * answer for the overwhelming majority: simplification changed a minority of
33
- * characters.
34
- */
35
- export declare class TraditionalTable {
36
- #private;
37
- /**
38
- * Build the table from observed script pairings and Unihan's variant lists.
39
- *
40
- * Pairings should include the cases where the character is *unchanged*, since
41
- * that is what stops a character with a rare traditional variant from always
42
- * being converted to it.
43
- */
44
- static build(pairings: Iterable<ScriptPairing>, variants: UnihanVariants, unihanReadings: ReadonlyMap<string, UnihanReadings>): TraditionalTable;
45
- /**
46
- * Wrap prepared tables. Use {@link TraditionalTable.build}.
47
- */
48
- private constructor();
49
- /**
50
- * The 繁體 form of one character, given the syllable it is read as.
51
- */
52
- convertCharacter(hans: string, syllable: Syllable | undefined): string;
53
- /**
54
- * The 繁體 form of a whole word, read as the given syllables.
55
- */
56
- convert(aligned: readonly ReadCharacters[]): string;
57
- }
2
+ import type { ScriptPairing } from "./variant-counts.js";
3
+ export type { ScriptPairing } from "./variant-counts.js";
4
+ export { TraditionalTable } from "./traditional-table.js";
58
5
  /**
59
6
  * Pair a CC-CEDICT entry's two scripts up character by character.
60
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"traditional.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuBnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AA8BD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAgB;;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CACV,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EACjC,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAClD,gBAAgB,CAalB;IAOD;;OAEG;IACH,OAAO,eAQN;IAmDD;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CA2BrE;IAED;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAelD;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GAC7C,SAAS,aAAa,EAAE,CA8C1B"}
1
+ {"version":3,"file":"traditional.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GAC7C,SAAS,aAAa,EAAE,CA8C1B"}
@@ -1,191 +1,8 @@
1
- import { toCharacters } from "../script/characters.js";
2
- import { readSyllable } from "../syllable/syllable.js";
3
- /**
4
- * The key standing for "whatever the reading", used when the reading is unknown
5
- * or when no reading-specific evidence exists.
6
- */
7
- const ANY_READING = "*";
8
- /**
9
- * A reading key that ignores 儿化, which never bears on which variant is meant.
10
- */
11
- function readingKey(syllable) {
12
- if (syllable === undefined) {
13
- return ANY_READING;
14
- }
15
- return `${syllable.initial}|${syllable.final}|${String(syllable.tone)}`;
16
- }
17
- /**
18
- * Pick the most frequent variant, breaking ties by preferring the 繁體 form.
19
- *
20
- * The tie-break matters for a character that is its own traditional form in one
21
- * sense and has a distinct one in another. Where the counts cannot separate
22
- * them, the traditional form is the better guess in a traditional-form table,
23
- * and a wrong guess costs only whether a 繁體 text matches this key — never the
24
- * reading it is given.
25
- */
26
- function mostFrequent(counts, hans) {
27
- let best;
28
- let bestCount = 0;
29
- const tally = counts ?? new Map();
30
- for (const [variant, count] of tally) {
31
- const isBetter = count > bestCount ||
32
- (count === bestCount && best === hans && variant !== hans);
33
- if (isBetter) {
34
- best = variant;
35
- bestCount = count;
36
- }
37
- }
38
- return best;
39
- }
40
1
  /**
41
- * Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
42
- *
43
- * 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
44
- * conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
45
- * dictionary already knows the reading, and the reading settles it — 头发 is
46
- * `tóu fà`, so its 发 is 髮 and the word is 頭髮.
47
- *
48
- * Two sources of evidence, in order:
49
- *
50
- * 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
51
- * written out, which is a large observed sample of how each character is
52
- * converted at each reading. This is preferred because it is evidence rather
53
- * than inference, and because it settles cases the reading cannot: 干扰 is
54
- * `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
55
- * 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
56
- * appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
57
- * reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
58
- *
59
- * Characters no source knows a variant for are left alone, which is the right
60
- * answer for the overwhelming majority: simplification changed a minority of
61
- * characters.
2
+ * Pairing a CC-CEDICT entry's two scripts up, character by character.
62
3
  */
63
- export class TraditionalTable {
64
- /**
65
- * Build the table from observed script pairings and Unihan's variant lists.
66
- *
67
- * Pairings should include the cases where the character is *unchanged*, since
68
- * that is what stops a character with a rare traditional variant from always
69
- * being converted to it.
70
- */
71
- static build(pairings, variants, unihanReadings) {
72
- const observed = new Map();
73
- for (const { hans, hant, syllable } of pairings) {
74
- const byReading = observed.get(hans) ?? new Map();
75
- const keys = new Set([ANY_READING, readingKey(syllable)]);
76
- for (const key of keys) {
77
- const counts = byReading.get(key) ?? new Map();
78
- counts.set(hant, (counts.get(hant) ?? 0) + 1);
79
- byReading.set(key, counts);
80
- }
81
- observed.set(hans, byReading);
82
- }
83
- return new TraditionalTable(observed, variants, unihanReadings);
84
- }
85
- #observed;
86
- #variants;
87
- #unihanReadings;
88
- #parsed = new Map();
89
- /**
90
- * Wrap prepared tables. Use {@link TraditionalTable.build}.
91
- */
92
- constructor(observed, variants, unihanReadings) {
93
- this.#observed = observed;
94
- this.#variants = variants;
95
- this.#unihanReadings = unihanReadings;
96
- }
97
- /**
98
- * Parse a Unihan reading string, remembering the result.
99
- *
100
- * Worth caching: the fallback path reads the same few thousand strings once
101
- * per candidate per word.
102
- */
103
- #syllableOf(reading) {
104
- if (this.#parsed.has(reading)) {
105
- return this.#parsed.get(reading);
106
- }
107
- const syllable = readSyllable(reading);
108
- this.#parsed.set(reading, syllable);
109
- return syllable;
110
- }
111
- /**
112
- * How well a candidate character's readings match the one we want.
113
- *
114
- * Lower is better. A candidate whose most likely reading is the one we want
115
- * beats one that merely lists it among its rarer readings, which is exactly
116
- * what separates 髮 (`fà` alone) from 發 (`fā` first, `fà` third).
117
- */
118
- #rank(candidate, syllable) {
119
- const readings = this.#unihanReadings.get(candidate)?.readings ?? [];
120
- if (syllable === undefined) {
121
- return readings.length === 0 ? Infinity : 0;
122
- }
123
- let tonelessMatch = Infinity;
124
- for (const [at, reading] of readings.entries()) {
125
- const parsed = this.#syllableOf(reading);
126
- if (parsed === undefined) {
127
- continue;
128
- }
129
- if (parsed.initial !== syllable.initial ||
130
- parsed.final !== syllable.final) {
131
- continue;
132
- }
133
- if (parsed.tone === syllable.tone) {
134
- return at;
135
- }
136
- // A match on the syllable but not the tone still beats no match at all,
137
- // since sources disagree about tone far more often than about spelling.
138
- tonelessMatch = Math.min(tonelessMatch, readings.length + at);
139
- }
140
- return tonelessMatch;
141
- }
142
- /**
143
- * The 繁體 form of one character, given the syllable it is read as.
144
- */
145
- convertCharacter(hans, syllable) {
146
- const byReading = this.#observed.get(hans);
147
- // Evidence at this exact reading first, then evidence at any reading.
148
- const observed = mostFrequent(byReading?.get(readingKey(syllable)), hans) ??
149
- mostFrequent(byReading?.get(ANY_READING), hans);
150
- if (observed !== undefined) {
151
- return observed;
152
- }
153
- const candidates = this.#variants.traditional.get(hans) ?? [];
154
- if (candidates.length === 0) {
155
- return hans;
156
- }
157
- let best = hans;
158
- let bestRank = Infinity;
159
- for (const candidate of candidates) {
160
- const rank = this.#rank(candidate, syllable);
161
- // Ties prefer a form other than the character itself, for the same reason
162
- // mostFrequent does.
163
- if (rank < bestRank || (rank === bestRank && best === hans)) {
164
- best = candidate;
165
- bestRank = rank;
166
- }
167
- }
168
- return best;
169
- }
170
- /**
171
- * The 繁體 form of a whole word, read as the given syllables.
172
- */
173
- convert(aligned) {
174
- let converted = "";
175
- for (const read of aligned) {
176
- const group = toCharacters(read.characters);
177
- for (const character of group) {
178
- // A syllable covering two characters — 儿化 — is not evidence about the
179
- // second of them, so only the first is disambiguated by it.
180
- const syllable = group.length === 1 || character === group[0]
181
- ? read.syllable
182
- : undefined;
183
- converted += this.convertCharacter(character, syllable);
184
- }
185
- }
186
- return converted;
187
- }
188
- }
4
+ import { toCharacters } from "../script/characters.js";
5
+ export { TraditionalTable } from "./traditional-table.js";
189
6
  /**
190
7
  * Pair a CC-CEDICT entry's two scripts up character by character.
191
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"traditional.js","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"traditional.js","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,IAAY,EACZ,OAA8C;IAE9C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,IACE,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM;QAC/C,cAAc,CAAC,MAAM,KAAK,CAAC,EAC3B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,cAAc,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;YAClD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,aAAa;gBACnB,uEAAuE;gBACvE,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aACzD,CAAC,CAAC;QACL,CAAC;QACD,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,2EAA2E;IAC3E,gEAAgE;IAChE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,uEAAuE;gBACvE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,SAAS;gBACzC,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Counting which 繁體 form a 简体 character is paired with.
3
+ *
4
+ * The tally the pairing table is built from, and the rule for reading a
5
+ * winner out of it.
6
+ */
7
+ import type { Syllable } from "../syllable/syllable.js";
8
+ /**
9
+ * How often one 简体 character was written as a given 繁體 one.
10
+ */
11
+ export type VariantCounts = Map<string, number>;
12
+ /**
13
+ * The key standing for "whatever the reading", used when the reading is unknown
14
+ * or when no reading-specific evidence exists.
15
+ */
16
+ export declare const ANY_READING = "*";
17
+ /**
18
+ * A reading key that ignores 儿化, which never bears on which variant is meant.
19
+ */
20
+ export declare function readingKey(syllable: Syllable | undefined): string;
21
+ /**
22
+ * One 简体 → 繁體 pairing observed in a source, at one reading.
23
+ */
24
+ export interface ScriptPairing {
25
+ readonly hans: string;
26
+ readonly hant: string;
27
+ readonly syllable: Syllable | undefined;
28
+ }
29
+ /**
30
+ * Pick the most frequent variant, breaking ties by preferring the 繁體 form.
31
+ *
32
+ * The tie-break matters for a character that is its own traditional form in one
33
+ * sense and has a distinct one in another. Where the counts cannot separate
34
+ * them, the traditional form is the better guess in a traditional-form table,
35
+ * and a wrong guess costs only whether a 繁體 text matches this key — never the
36
+ * reading it is given.
37
+ */
38
+ export declare function mostFrequent(counts: VariantCounts | undefined, hans: string): string | undefined;
39
+ //# sourceMappingURL=variant-counts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-counts.d.ts","sourceRoot":"","sources":["../../src/dictionary/variant-counts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAcpB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The key standing for "whatever the reading", used when the reading is unknown
3
+ * or when no reading-specific evidence exists.
4
+ */
5
+ export const ANY_READING = "*";
6
+ /**
7
+ * A reading key that ignores 儿化, which never bears on which variant is meant.
8
+ */
9
+ export function readingKey(syllable) {
10
+ if (syllable === undefined) {
11
+ return ANY_READING;
12
+ }
13
+ return `${syllable.initial}|${syllable.final}|${String(syllable.tone)}`;
14
+ }
15
+ /**
16
+ * Pick the most frequent variant, breaking ties by preferring the 繁體 form.
17
+ *
18
+ * The tie-break matters for a character that is its own traditional form in one
19
+ * sense and has a distinct one in another. Where the counts cannot separate
20
+ * them, the traditional form is the better guess in a traditional-form table,
21
+ * and a wrong guess costs only whether a 繁體 text matches this key — never the
22
+ * reading it is given.
23
+ */
24
+ export function mostFrequent(counts, hans) {
25
+ let best;
26
+ let bestCount = 0;
27
+ const tally = counts ?? new Map();
28
+ for (const [variant, count] of tally) {
29
+ const isBetter = count > bestCount ||
30
+ (count === bestCount && best === hans && variant !== hans);
31
+ if (isBetter) {
32
+ best = variant;
33
+ bestCount = count;
34
+ }
35
+ }
36
+ return best;
37
+ }
38
+ //# sourceMappingURL=variant-counts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-counts.js","sourceRoot":"","sources":["../../src/dictionary/variant-counts.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAA8B;IACvD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAiC,EACjC,IAAY;IAEZ,IAAI,IAAwB,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,MAAM,IAAI,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,MAAM,QAAQ,GACZ,KAAK,GAAG,SAAS;YACjB,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,OAAO,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Settling which reading a word takes.
3
+ *
4
+ * The phrase corpus leads because it has three times CC-CEDICT's coverage;
5
+ * CC-CEDICT corrects it on the neutral tone, which is what the two of them
6
+ * actually disagree about; 儿化 is repaired before anything compares two
7
+ * readings; and the override table has the last word.
8
+ */
9
+ import type { CedictEntry } from "../sources/cedict.js";
10
+ import type { Syllable } from "../syllable/syllable.js";
11
+ import type { ReadCharacters } from "./reading.js";
12
+ /**
13
+ * A word's settled reading, and what settling it cost the counts.
14
+ */
15
+ export interface SettledReading {
16
+ /** Undefined where no source gave a usable reading. */
17
+ readonly reading: readonly Syllable[] | undefined;
18
+ readonly aligned: readonly ReadCharacters[] | undefined;
19
+ readonly neutralToneCorrections: number;
20
+ readonly erhuaRepairs: number;
21
+ }
22
+ /**
23
+ * Settle it.
24
+ */
25
+ export declare function settleReading(word: string, defaults: ReadonlyMap<string, readonly Syllable[]>, cedictEntries: readonly CedictEntry[], cedictReadings: readonly (readonly Syllable[])[], phraseAligned: readonly ReadCharacters[] | undefined): SettledReading;
26
+ //# sourceMappingURL=word-reading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-reading.d.ts","sourceRoot":"","sources":["../../src/dictionary/word-reading.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAYxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC,EAClD,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,cAAc,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,EAChD,aAAa,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GACnD,cAAc,CAkFhB"}