@kensio/pinyinjs 1.7.3 → 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 +2 -2
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Counting how the two scripts pair up, character by character.
3
+ *
4
+ * Every entry the dictionary holds is one vote for a 简体 character reading a
5
+ * given way being written a given 繁體 way. This is the tally, and the rules
6
+ * for reading a conversion out of it.
7
+ */
8
+ import { toCharacters } from "../script/characters.js";
9
+ import { conversionOf } from "./script-conversion.js";
10
+ export { conversionOf, rivalsOf } from "./script-conversion.js";
11
+ import { conversionKey, } from "../script/conversion.js";
12
+ /**
13
+ * The key standing for "at any reading".
14
+ */
15
+ export const ANY = "";
16
+ /**
17
+ * How much of a reading's evidence must agree before it overrides the default.
18
+ *
19
+ * A reading that disagrees with the default only earns a line in the table if
20
+ * the sources are reasonably united about it. Below this it is noise — one
21
+ * mis-aligned entry, or a spelling nobody else uses — and storing it would
22
+ * make the conversion worse at the cost of bytes.
23
+ */
24
+ export const READING_AGREEMENT = 0.8;
25
+ /**
26
+ * How much of a character's evidence a rival form needs to be worth reporting.
27
+ *
28
+ * This decides honesty rather than output: a form listed here makes the
29
+ * character *ambiguous*, so every conversion of it is reported as a guess
30
+ * unless a word or a reading settled it. Set too low and 和 is doubtful because
31
+ * Unihan knows 咊; set too high and 面 looks certain when only the word tells
32
+ * 面 from 麵. A twentieth of the evidence is enough to be a real spelling and
33
+ * far more than the one-off variants clear.
34
+ */
35
+ export const RIVAL_SHARE = 0.05;
36
+ /**
37
+ * The pairings an entry attests, character by character.
38
+ *
39
+ * Entries whose two scripts are written with a different number of characters
40
+ * are skipped rather than aligned by guesswork, for the same reason
41
+ * `pairScripts` skips them: an invented alignment is evidence for a pairing
42
+ * nobody wrote.
43
+ */
44
+ export function pairingsOf(entry) {
45
+ const hans = toCharacters(entry.hans);
46
+ const hant = toCharacters(entry.hant);
47
+ if (hans.length !== hant.length) {
48
+ return [];
49
+ }
50
+ const reading = entry.readings.cn;
51
+ // Only a reading with one syllable per character lines up; anything else
52
+ // (儿化 covering two, or a source disagreeing about length) is used as
53
+ // evidence for the pairing but not for any particular reading.
54
+ const isAligned = reading.length === hans.length;
55
+ return hans.map((character, at) => ({
56
+ hans: character,
57
+ /* c8 ignore next -- the two forms are known to be the same length */
58
+ hant: hant[at] ?? character,
59
+ key: isAligned ? conversionKey(reading[at]) : ANY,
60
+ }));
61
+ }
62
+ /**
63
+ * Tally one pairing under both its own reading and the any-reading key.
64
+ */
65
+ export function tally(observed, from, to, key, weight) {
66
+ const byReading = observed.get(from) ?? new Map();
67
+ const keys = new Set([ANY, key]);
68
+ for (const at of keys) {
69
+ const counts = byReading.get(at) ?? new Map();
70
+ counts.set(to, (counts.get(to) ?? 0) + weight);
71
+ byReading.set(at, counts);
72
+ }
73
+ observed.set(from, byReading);
74
+ }
75
+ /**
76
+ * The commonest form in a tally, and what share of the evidence it holds.
77
+ *
78
+ * A tie prefers a form other than the character itself, and that matters more
79
+ * than it looks. Every character has an entry of its own where both scripts are
80
+ * the same string, so a character attested in exactly one cross-script word
81
+ * arrives here tied one-all against its own identity — 儁 against 㑺. The real
82
+ * pairing is the one somebody wrote down; the identity is an artefact of how
83
+ * the dictionary is keyed. `TraditionalTable` breaks the same tie the same way.
84
+ */
85
+ export function commonest(from, counts) {
86
+ if (counts === undefined || counts.size === 0) {
87
+ return undefined;
88
+ }
89
+ let form = "";
90
+ let best = 0;
91
+ let total = 0;
92
+ for (const [candidate, count] of counts) {
93
+ total += count;
94
+ if (count > best ||
95
+ (count === best && form === from && candidate !== from)) {
96
+ form = candidate;
97
+ best = count;
98
+ }
99
+ }
100
+ return { form, share: best / total };
101
+ }
102
+ export function tableOf(observed) {
103
+ const table = new Map();
104
+ for (const [from, byReading] of observed) {
105
+ const conversion = conversionOf(from, byReading);
106
+ if (conversion !== undefined) {
107
+ table.set(from, conversion);
108
+ }
109
+ }
110
+ return table;
111
+ }
112
+ /**
113
+ * The readings a word is converted with, where they line up character by
114
+ * character.
115
+ */
116
+ export function alignedReadings(entry) {
117
+ const characters = toCharacters(entry.hans).length;
118
+ return entry.readings.cn.length === characters ? entry.readings.cn : [];
119
+ }
120
+ //# sourceMappingURL=script-pairings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-pairings.js","sourceRoot":"","sources":["../../src/dictionary/script-pairings.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"script-tables.d.ts","sourceRoot":"","sources":["../../src/dictionary/script-tables.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAyNlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,YAAY,CA6Cd"}
1
+ {"version":3,"file":"script-tables.d.ts","sourceRoot":"","sources":["../../src/dictionary/script-tables.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,YAAY,CA6Cd"}
@@ -1,170 +1,7 @@
1
1
  import { toCharacters } from "../script/characters.js";
2
2
  import { toCanonicalGlyphs } from "../script/glyphs.js";
3
- import { conversionKey, convertCharacters, } from "../script/conversion.js";
4
- /**
5
- * The key standing for "at any reading".
6
- */
7
- const ANY = "";
8
- /**
9
- * How much of a reading's evidence must agree before it overrides the default.
10
- *
11
- * A reading that disagrees with the default only earns a line in the table if
12
- * the sources are reasonably united about it. Below this it is noise — one
13
- * mis-aligned entry, or a spelling nobody else uses — and storing it would
14
- * make the conversion worse at the cost of bytes.
15
- */
16
- const READING_AGREEMENT = 0.8;
17
- /**
18
- * How much of a character's evidence a rival form needs to be worth reporting.
19
- *
20
- * This decides honesty rather than output: a form listed here makes the
21
- * character *ambiguous*, so every conversion of it is reported as a guess
22
- * unless a word or a reading settled it. Set too low and 和 is doubtful because
23
- * Unihan knows 咊; set too high and 面 looks certain when only the word tells
24
- * 面 from 麵. A twentieth of the evidence is enough to be a real spelling and
25
- * far more than the one-off variants clear.
26
- */
27
- const RIVAL_SHARE = 0.05;
28
- /**
29
- * The pairings an entry attests, character by character.
30
- *
31
- * Entries whose two scripts are written with a different number of characters
32
- * are skipped rather than aligned by guesswork, for the same reason
33
- * `pairScripts` skips them: an invented alignment is evidence for a pairing
34
- * nobody wrote.
35
- */
36
- function pairingsOf(entry) {
37
- const hans = toCharacters(entry.hans);
38
- const hant = toCharacters(entry.hant);
39
- if (hans.length !== hant.length) {
40
- return [];
41
- }
42
- const reading = entry.readings.cn;
43
- // Only a reading with one syllable per character lines up; anything else
44
- // (儿化 covering two, or a source disagreeing about length) is used as
45
- // evidence for the pairing but not for any particular reading.
46
- const isAligned = reading.length === hans.length;
47
- return hans.map((character, at) => ({
48
- hans: character,
49
- /* c8 ignore next -- the two forms are known to be the same length */
50
- hant: hant[at] ?? character,
51
- key: isAligned ? conversionKey(reading[at]) : ANY,
52
- }));
53
- }
54
- /**
55
- * Tally one pairing under both its own reading and the any-reading key.
56
- */
57
- function tally(observed, from, to, key, weight) {
58
- const byReading = observed.get(from) ?? new Map();
59
- const keys = new Set([ANY, key]);
60
- for (const at of keys) {
61
- const counts = byReading.get(at) ?? new Map();
62
- counts.set(to, (counts.get(to) ?? 0) + weight);
63
- byReading.set(at, counts);
64
- }
65
- observed.set(from, byReading);
66
- }
67
- /**
68
- * The commonest form in a tally, and what share of the evidence it holds.
69
- *
70
- * A tie prefers a form other than the character itself, and that matters more
71
- * than it looks. Every character has an entry of its own where both scripts are
72
- * the same string, so a character attested in exactly one cross-script word
73
- * arrives here tied one-all against its own identity — 儁 against 㑺. The real
74
- * pairing is the one somebody wrote down; the identity is an artefact of how
75
- * the dictionary is keyed. `TraditionalTable` breaks the same tie the same way.
76
- */
77
- function commonest(from, counts) {
78
- if (counts === undefined || counts.size === 0) {
79
- return undefined;
80
- }
81
- let form = "";
82
- let best = 0;
83
- let total = 0;
84
- for (const [candidate, count] of counts) {
85
- total += count;
86
- if (count > best ||
87
- (count === best && form === from && candidate !== from)) {
88
- form = candidate;
89
- best = count;
90
- }
91
- }
92
- return { form, share: best / total };
93
- }
94
- /**
95
- * Reduce one character's observations to a default and its exceptions.
96
- *
97
- * A character with only one observed form needs no entry at all when that form
98
- * is itself — simplification changed a minority of characters, and storing the
99
- * other 40,000 as identities would be most of the file.
100
- */
101
- function conversionOf(from, byReading) {
102
- const overall = commonest(from, byReading.get(ANY));
103
- if (overall === undefined) {
104
- return undefined;
105
- }
106
- const exceptions = new Map();
107
- for (const [key, counts] of byReading) {
108
- const at = commonest(from, counts);
109
- if (key !== ANY &&
110
- at !== undefined &&
111
- at.form !== overall.form &&
112
- at.share >= READING_AGREEMENT) {
113
- exceptions.set(key, at.form);
114
- }
115
- }
116
- const also = rivalsOf(byReading.get(ANY), overall.form, exceptions);
117
- if (overall.form === from && exceptions.size === 0 && also.length === 0) {
118
- return undefined;
119
- }
120
- return {
121
- to: overall.form,
122
- ...(exceptions.size > 0 && { byReading: exceptions }),
123
- ...(also.length > 0 && { also }),
124
- };
125
- }
126
- /**
127
- * The forms a character takes often enough to make it genuinely ambiguous.
128
- *
129
- * Forms a reading already accounts for are left out: those are settled evidence
130
- * rather than open questions, and repeating them here would report 发 as a
131
- * guess in 头发 when the reading decided it.
132
- */
133
- function rivalsOf(counts, chosen, exceptions) {
134
- if (counts === undefined) {
135
- return [];
136
- }
137
- let total = 0;
138
- for (const count of counts.values()) {
139
- total += count;
140
- }
141
- const settled = new Set([chosen, ...exceptions.values()]);
142
- return [...counts]
143
- .filter(([form, count]) => !settled.has(form) && count / total >= RIVAL_SHARE)
144
- .toSorted(([, left], [, right]) => right - left)
145
- .map(([form]) => form);
146
- }
147
- /**
148
- * Reduce every character's observations into a table.
149
- */
150
- function tableOf(observed) {
151
- const table = new Map();
152
- for (const [from, byReading] of observed) {
153
- const conversion = conversionOf(from, byReading);
154
- if (conversion !== undefined) {
155
- table.set(from, conversion);
156
- }
157
- }
158
- return table;
159
- }
160
- /**
161
- * The readings a word is converted with, where they line up character by
162
- * character.
163
- */
164
- function alignedReadings(entry) {
165
- const characters = toCharacters(entry.hans).length;
166
- return entry.readings.cn.length === characters ? entry.readings.cn : [];
167
- }
3
+ import { convertCharacters } from "../script/conversion.js";
4
+ import { alignedReadings, pairingsOf, tableOf, tally, } from "./script-pairings.js";
168
5
  /**
169
6
  * Build the script conversion tables from the merged dictionary.
170
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"script-tables.js","sourceRoot":"","sources":["../../src/dictionary/script-tables.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"script-tables.js","sourceRoot":"","sources":["../../src/dictionary/script-tables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CedictEntry } from "../sources/cedict.js";
2
+ import type { UnihanReadings } from "../sources/unihan.js";
3
+ import type { Syllable } from "../syllable/syllable.js";
4
+ /**
5
+ * Settle it for one word, or undefined where no source states one.
6
+ */
7
+ export declare function taiwanReadingOf(word: string, senses: readonly CedictEntry[], senseReadings: readonly (readonly Syllable[])[], reading: readonly Syllable[], unihan: UnihanReadings | undefined): readonly Syllable[] | undefined;
8
+ //# sourceMappingURL=taiwan-reading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taiwan-reading.d.ts","sourceRoot":"","sources":["../../src/dictionary/taiwan-reading.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAMxD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,aAAa,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,EAC/C,OAAO,EAAE,SAAS,QAAQ,EAAE,EAC5B,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,SAAS,QAAQ,EAAE,GAAG,SAAS,CAsBjC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The 國語 reading an entry carries, where a source states one.
3
+ *
4
+ * Both sources hedge it. CC-CEDICT hangs `Taiwan pr.` on one sense of a
5
+ * headword and the others know nothing about it, and a note can sit on the
6
+ * right sense and still be about that sense rather than the character. What
7
+ * survives both tests, and is not simply another 普通话 sense of the word, is
8
+ * the delta.
9
+ */
10
+ import { isSingleCharacter } from "../script/characters.js";
11
+ import { isOwnSense, isSenseScopedNote } from "./cedict-senses.js";
12
+ import { characterSyllable } from "./character-defaults.js";
13
+ import { isSameReading } from "./entry.js";
14
+ import { readDictionaryReading } from "./reading.js";
15
+ /**
16
+ * Settle it for one word, or undefined where no source states one.
17
+ */
18
+ export function taiwanReadingOf(word, senses, senseReadings, reading, unihan) {
19
+ const taiwanSense = senses.find((entry) => entry.taiwanReadings !== undefined);
20
+ const taiwanTokens = isSenseScopedNote(word, taiwanSense)
21
+ ? undefined
22
+ : taiwanSense?.taiwanReadings;
23
+ const unihanTaiwan = unihan?.taiwanReading;
24
+ let taiwan;
25
+ if (taiwanTokens !== undefined) {
26
+ taiwan = readDictionaryReading(word, taiwanTokens);
27
+ }
28
+ else if (isSingleCharacter(word) && unihanTaiwan !== undefined) {
29
+ const syllable = characterSyllable(word, unihanTaiwan);
30
+ taiwan = syllable === undefined ? undefined : [syllable];
31
+ }
32
+ if (taiwan !== undefined &&
33
+ (isSameReading(taiwan, reading) || isOwnSense(taiwan, senseReadings))) {
34
+ return undefined;
35
+ }
36
+ return taiwan;
37
+ }
38
+ //# sourceMappingURL=taiwan-reading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taiwan-reading.js","sourceRoot":"","sources":["../../src/dictionary/taiwan-reading.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,MAA8B,EAC9B,aAA+C,EAC/C,OAA4B,EAC5B,MAAkC;IAElC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAC9C,CAAC;IACF,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC;QACvD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,EAAE,aAAa,CAAC;IAC3C,IAAI,MAAuC,CAAC;IAC5C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,IACE,MAAM,KAAK,SAAS;QACpB,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EACrE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BuildAssertion } from "./built-dictionary.js";
2
+ export declare const TONE_INVARIANTS: readonly BuildAssertion[];
3
+ //# sourceMappingURL=tone-invariants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tone-invariants.d.ts","sourceRoot":"","sources":["../../src/dictionary/tone-invariants.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAkB7E,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAsDpD,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * What must hold of the neutral tone across the dictionary.
3
+ *
4
+ * The 轻声 list and the 语气词 are the two places a source refresh could take a
5
+ * neutral tone away without any single word looking wrong.
6
+ */
7
+ import { characterCount } from "../script/characters.js";
8
+ import { NEUTRAL_TONE } from "../tone/tone.js";
9
+ import { NEUTRAL_SENSE_WORDS } from "./neutral-senses.js";
10
+ /**
11
+ * jieba's tag for a 语气词, which is what 吧, 呢 and 吗 are.
12
+ */
13
+ const PARTICLE_TAG = "y";
14
+ /**
15
+ * The 语气词 the sources themselves do not lead with a 轻声 for.
16
+ *
17
+ * The rule below is that the words a character appears in must not take the
18
+ * default away from its 轻声, not that a 语气词 is always neutral. For these
19
+ * three the reading that leads was never the neutral one and no word put it
20
+ * there: `kMandarin` names 呃 `è` and 哩 `lī`, and `kHanyuPinlu` ranks 呵 as
21
+ * `ā(392)` over `hē(64)`, all of them counting the bare character.
22
+ */
23
+ const FULL_TONE_PARTICLES = new Set(["呃", "呵", "哩"]);
24
+ export const TONE_INVARIANTS = [
25
+ // kHanyuPinlu writes 西 as `xi(902) xī(738)`, and the 902 are 东西: a 轻声 the
26
+ // field counted only inside words is not the bare character's reading. 吗 is
27
+ // the control — CC-CEDICT calls it a question particle in its own right, and
28
+ // a particle's whole use *is* the bare character.
29
+ {
30
+ // The table names words and lets CC-CEDICT supply the reading, so the way
31
+ // it can fail silently is a source refresh dropping or retoning the 轻声
32
+ // sense — after which the word would quietly go back to the full-tone
33
+ // homograph the list exists to get away from.
34
+ description: "every word on the 轻声 sense list reads with one",
35
+ check: (dictionary) => {
36
+ const wrong = NEUTRAL_SENSE_WORDS.filter((listed) => !(dictionary.get(listed.word)?.readings.cn ?? []).some((syllable) => syllable.tone === NEUTRAL_TONE)).map((listed) => `${listed.word} ${dictionary.reading(listed.word) ?? "(missing)"}`);
37
+ return wrong.length === 0
38
+ ? undefined
39
+ : `listed for their 轻声 sense and not reading one: ${wrong.join(", ")}`;
40
+ },
41
+ },
42
+ {
43
+ // The corpus mass ranking the character defaults counts a character only
44
+ // inside the words the dictionary holds, and a 语气词 is never inside one:
45
+ // every 吧 it can reach is 酒吧, 网吧 or 吧台, and the only 呗 is 梵呗.
46
+ // Left to it the particle takes the reading of the noun, which is what 吧
47
+ // `bā` and 呗 `bài` were. A 语气词 is the one part of speech whose whole
48
+ // use is the bare character, so its 轻声 is what words cannot vote on.
49
+ description: "no 语气词 ranks a full tone above its own 轻声",
50
+ check: (dictionary) => {
51
+ const wrong = dictionary.entries
52
+ .filter((entry) => entry.partOfSpeech === PARTICLE_TAG &&
53
+ characterCount(entry.hans) === 1 &&
54
+ !FULL_TONE_PARTICLES.has(entry.hans) &&
55
+ entry.readings.cn[0]?.tone !== NEUTRAL_TONE &&
56
+ (entry.alternates ?? []).some((reading) => reading[0]?.tone === NEUTRAL_TONE))
57
+ .map((entry) => `${entry.hans} ${dictionary.reading(entry.hans) ?? ""}`);
58
+ return wrong.length === 0
59
+ ? undefined
60
+ : `语气词 reading a full tone over a 轻声 they also have: ${wrong.join(", ")}`;
61
+ },
62
+ },
63
+ ];
64
+ //# sourceMappingURL=tone-invariants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tone-invariants.js","sourceRoot":"","sources":["../../src/dictionary/tone-invariants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;GAEG;AACH,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,eAAe,GAA8B;IACxD,0EAA0E;IAC1E,4EAA4E;IAC5E,6EAA6E;IAC7E,kDAAkD;IAClD;QACE,0EAA0E;QAC1E,uEAAuE;QACvE,sEAAsE;QACtE,8CAA8C;QAC9C,WAAW,EAAE,gDAAgD;QAC7D,KAAK,EAAE,CAAC,UAA2B,EAAsB,EAAE;YACzD,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CACtC,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACpD,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,CAC7C,CACJ,CAAC,GAAG,CACH,CAAC,MAAM,EAAE,EAAE,CACT,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CACrE,CAAC;YACF,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;gBACvB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,kDAAkD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,CAAC;KACF;IACD;QACE,yEAAyE;QACzE,wEAAwE;QACxE,8DAA8D;QAC9D,yEAAyE;QACzE,qEAAqE;QACrE,qEAAqE;QACrE,WAAW,EAAE,2CAA2C;QACxD,KAAK,EAAE,CAAC,UAA2B,EAAsB,EAAE;YACzD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO;iBAC7B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,YAAY,KAAK,YAAY;gBACnC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBACpC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY;gBAC3C,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAC3B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY,CAC/C,CACJ;iBACA,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CACnE,CAAC;YACJ,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;gBACvB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,qDAAqD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,CAAC;KACF;CACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { CedictEntry } from "../sources/cedict.js";
2
+ import type { Syllable } from "../syllable/syllable.js";
3
+ import type { ReadCharacters } from "./reading.js";
4
+ import type { TraditionalTable } from "./traditional.js";
5
+ /**
6
+ * The 繁體 form of one entry, and what the merge counts about it.
7
+ */
8
+ export interface TraditionalForm {
9
+ /** The CC-CEDICT senses matching the reading, most useful first. */
10
+ readonly senses: readonly CedictEntry[];
11
+ readonly hant: string;
12
+ /** Other 繁體 spellings a source writes of the same word. */
13
+ readonly hantVariants: readonly string[];
14
+ /** Whether `hant` was derived rather than taken from CC-CEDICT. */
15
+ readonly isDerived: boolean;
16
+ }
17
+ /**
18
+ * Settle all of it for one word.
19
+ */
20
+ export declare function traditionalFormOf(word: string, cedictEntries: readonly CedictEntry[], reading: readonly Syllable[], aligned: readonly ReadCharacters[] | undefined, traditional: TraditionalTable): TraditionalForm;
21
+ //# sourceMappingURL=traditional-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-form.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional-form.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,mEAAmE;IACnE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAC5B,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,EAC9C,WAAW,EAAE,gBAAgB,GAC5B,eAAe,CA6CjB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Which 繁體 spelling an entry takes, and which others reach it.
3
+ *
4
+ * CC-CEDICT decides wherever it has the word, since it pairs the two scripts
5
+ * itself; the derivation only answers where it is silent. Both are settled
6
+ * against the sense matching the reading, because a word read two ways can be
7
+ * written two ways — 万 is 萬 when read wàn and stays 万 when read mò.
8
+ */
9
+ import { toCanonicalGlyphs } from "../script/glyphs.js";
10
+ import { sensesForReading } from "./reading-agreement.js";
11
+ /**
12
+ * Settle all of it for one word.
13
+ */
14
+ export function traditionalFormOf(word, cedictEntries, reading, aligned, traditional) {
15
+ let isDerived = false;
16
+ // Which sense matters: 万 is 萬 when read wàn but stays 万 when read mò, and
17
+ // CC-CEDICT carries both as separate entries. Taking whichever came first
18
+ // in the file would pair the chosen reading with another sense's script.
19
+ const senses = sensesForReading(word, cedictEntries, reading);
20
+ const sense = senses[0];
21
+ let hant;
22
+ if (sense === undefined) {
23
+ // Canonicalised because the derivation settles each word against Unihan's
24
+ // variant lists with no single standard behind it, so 里 derives as 裏
25
+ // where the corpus overwhelmingly writes 裡. Both are the same character
26
+ // with the same reading, and a key written in the form the lookup path
27
+ // normalises *away from* can never be found — see the note below.
28
+ hant = toCanonicalGlyphs(traditional.convert(aligned ?? []));
29
+ isDerived = hant !== word;
30
+ }
31
+ else {
32
+ hant = toCanonicalGlyphs(sense.traditional);
33
+ }
34
+ // Other spellings of the same word, so that a 繁體 reader of either finds
35
+ // it. Only what a source writes out: composing spellings from per-character
36
+ // variants instead would add 229,482 keys to the full tier, almost all of
37
+ // them forms nobody writes — 方麵 for 方面, 公裡 for 公里 — because the
38
+ // reading that picks the right variant for one word does not generalise to
39
+ // every word the character appears in.
40
+ //
41
+ // Canonicalised for the same reason `hant` is, and deduplicated after:
42
+ // 裏面 and 裡面 are one spelling once the glyph forms are folded, and
43
+ // keying both would claim a variant that does not exist.
44
+ //
45
+ // The 简体 headword's own canonical spelling joins them where it differs,
46
+ // and that is not a nicety: the lookup path normalises 繁體 glyph forms
47
+ // before it searches, so a key written in a form it normalises *away from*
48
+ // can never be found. The phrase corpus carries a few hundred headwords
49
+ // spelled with 峯, 藴 or 枱 — 鹫峯寺, 义藴, 写字枱 — and without this they
50
+ // are entries nothing can reach.
51
+ const hantVariants = [
52
+ ...new Set([
53
+ ...senses.map((other) => toCanonicalGlyphs(other.traditional)),
54
+ toCanonicalGlyphs(word),
55
+ ]),
56
+ ].filter((form) => form !== hant && form !== word);
57
+ return { senses, hant, hantVariants, isDerived };
58
+ }
59
+ //# sourceMappingURL=traditional-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-form.js","sourceRoot":"","sources":["../../src/dictionary/traditional-form.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAiB1D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,aAAqC,EACrC,OAA4B,EAC5B,OAA8C,EAC9C,WAA6B;IAE7B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,IAAY,CAAC;IACjB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,0EAA0E;QAC1E,qEAAqE;QACrE,wEAAwE;QACxE,uEAAuE;QACvE,kEAAkE;QAClE,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,wEAAwE;IACxE,4EAA4E;IAC5E,0EAA0E;IAC1E,gEAAgE;IAChE,2EAA2E;IAC3E,uCAAuC;IACvC,EAAE;IACF,uEAAuE;IACvE,kEAAkE;IAClE,yDAAyD;IACzD,EAAE;IACF,wEAAwE;IACxE,sEAAsE;IACtE,2EAA2E;IAC3E,wEAAwE;IACxE,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,YAAY,GAAG;QACnB,GAAG,IAAI,GAAG,CAAC;YACT,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC9D,iBAAiB,CAAC,IAAI,CAAC;SACxB,CAAC;KACH,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IAEnD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Choosing between the 繁體 variants Unihan lists, by how a character is read.
3
+ *
4
+ * The second of the two sources of evidence `TraditionalTable` weighs, and the
5
+ * only one that is inference rather than observation. Kept apart because it is
6
+ * a different question from the pairings above it: not "how has this character
7
+ * been converted before" but "which of these candidates is read this way".
8
+ */
9
+ import type { UnihanReadings } from "../sources/unihan.js";
10
+ import { type Syllable } from "../syllable/syllable.js";
11
+ /**
12
+ * Unihan's reading lists, ranked against a syllable.
13
+ */
14
+ export declare class VariantRanking {
15
+ #private;
16
+ constructor(unihanReadings: ReadonlyMap<string, UnihanReadings>);
17
+ /**
18
+ * The best-ranked candidate, or the character itself where there are none.
19
+ */
20
+ best(candidates: readonly string[], hans: string, syllable: Syllable | undefined): string;
21
+ }
22
+ //# sourceMappingURL=traditional-ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traditional-ranking.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional-ranking.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;GAEG;AACH,qBAAa,cAAc;;IAIzB,YAAY,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAE9D;IAmDD;;OAEG;IACH,IAAI,CACF,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,MAAM,CAaR;CACF"}