@kensio/pinyinjs 1.7.4 → 1.7.6

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 (732) hide show
  1. package/README.md +128 -123
  2. package/data/full.entries +2595 -2595
  3. package/data/manifest.json +5 -5
  4. package/data/script.map +66 -3
  5. package/dist/accuracy/score-case.d.ts +23 -0
  6. package/dist/accuracy/score-case.d.ts.map +1 -0
  7. package/dist/accuracy/score-case.js +63 -0
  8. package/dist/accuracy/score-case.js.map +1 -0
  9. package/dist/accuracy/score.d.ts +1 -8
  10. package/dist/accuracy/score.d.ts.map +1 -1
  11. package/dist/accuracy/score.js +1 -55
  12. package/dist/accuracy/score.js.map +1 -1
  13. package/dist/cli/arguments.d.ts +4 -290
  14. package/dist/cli/arguments.d.ts.map +1 -1
  15. package/dist/cli/arguments.js +5 -357
  16. package/dist/cli/arguments.js.map +1 -1
  17. package/dist/cli/check-command.d.ts +9 -0
  18. package/dist/cli/check-command.d.ts.map +1 -0
  19. package/dist/cli/check-command.js +95 -0
  20. package/dist/cli/check-command.js.map +1 -0
  21. package/dist/cli/cli-input.d.ts +49 -0
  22. package/dist/cli/cli-input.d.ts.map +1 -0
  23. package/dist/cli/cli-input.js +31 -0
  24. package/dist/cli/cli-input.js.map +1 -0
  25. package/dist/cli/command.d.ts +97 -0
  26. package/dist/cli/command.d.ts.map +1 -0
  27. package/dist/cli/command.js +40 -0
  28. package/dist/cli/command.js.map +1 -0
  29. package/dist/cli/commands.d.ts +7 -110
  30. package/dist/cli/commands.d.ts.map +1 -1
  31. package/dist/cli/commands.js +14 -991
  32. package/dist/cli/commands.js.map +1 -1
  33. package/dist/cli/convert-command.d.ts +6 -0
  34. package/dist/cli/convert-command.d.ts.map +1 -0
  35. package/dist/cli/convert-command.js +52 -0
  36. package/dist/cli/convert-command.js.map +1 -0
  37. package/dist/cli/environment.d.ts +1 -1
  38. package/dist/cli/environment.d.ts.map +1 -1
  39. package/dist/cli/explain-command.d.ts +6 -0
  40. package/dist/cli/explain-command.d.ts.map +1 -0
  41. package/dist/cli/explain-command.js +40 -0
  42. package/dist/cli/explain-command.js.map +1 -0
  43. package/dist/cli/explain-syllable.d.ts +10 -0
  44. package/dist/cli/explain-syllable.d.ts.map +1 -0
  45. package/dist/cli/explain-syllable.js +70 -0
  46. package/dist/cli/explain-syllable.js.map +1 -0
  47. package/dist/cli/flag-help.d.ts +18 -0
  48. package/dist/cli/flag-help.d.ts.map +1 -0
  49. package/dist/cli/flag-help.js +78 -0
  50. package/dist/cli/flag-help.js.map +1 -0
  51. package/dist/cli/flag-lists.d.ts +49 -0
  52. package/dist/cli/flag-lists.d.ts.map +1 -0
  53. package/dist/cli/flag-lists.js +58 -0
  54. package/dist/cli/flag-lists.js.map +1 -0
  55. package/dist/cli/flag-values.d.ts +44 -0
  56. package/dist/cli/flag-values.d.ts.map +1 -0
  57. package/dist/cli/flag-values.js +56 -0
  58. package/dist/cli/flag-values.js.map +1 -0
  59. package/dist/cli/flags.d.ts +193 -0
  60. package/dist/cli/flags.d.ts.map +1 -0
  61. package/dist/cli/flags.js +133 -0
  62. package/dist/cli/flags.js.map +1 -0
  63. package/dist/cli/format-options.d.ts +29 -0
  64. package/dist/cli/format-options.d.ts.map +1 -0
  65. package/dist/cli/format-options.js +72 -0
  66. package/dist/cli/format-options.js.map +1 -0
  67. package/dist/cli/global-help.d.ts +23 -0
  68. package/dist/cli/global-help.d.ts.map +1 -0
  69. package/dist/cli/global-help.js +40 -0
  70. package/dist/cli/global-help.js.map +1 -0
  71. package/dist/cli/help.d.ts +1 -1
  72. package/dist/cli/help.d.ts.map +1 -1
  73. package/dist/cli/help.js +5 -99
  74. package/dist/cli/help.js.map +1 -1
  75. package/dist/cli/html-commands.d.ts +13 -0
  76. package/dist/cli/html-commands.d.ts.map +1 -0
  77. package/dist/cli/html-commands.js +49 -0
  78. package/dist/cli/html-commands.js.map +1 -0
  79. package/dist/cli/info-command.d.ts +7 -0
  80. package/dist/cli/info-command.d.ts.map +1 -0
  81. package/dist/cli/info-command.js +39 -0
  82. package/dist/cli/info-command.js.map +1 -0
  83. package/dist/cli/lookup-commands.d.ts +10 -0
  84. package/dist/cli/lookup-commands.d.ts.map +1 -0
  85. package/dist/cli/lookup-commands.js +101 -0
  86. package/dist/cli/lookup-commands.js.map +1 -0
  87. package/dist/cli/match-command.d.ts +11 -0
  88. package/dist/cli/match-command.d.ts.map +1 -0
  89. package/dist/cli/match-command.js +76 -0
  90. package/dist/cli/match-command.js.map +1 -0
  91. package/dist/cli/number-command.d.ts +12 -0
  92. package/dist/cli/number-command.d.ts.map +1 -0
  93. package/dist/cli/number-command.js +89 -0
  94. package/dist/cli/number-command.js.map +1 -0
  95. package/dist/cli/options.d.ts +30 -0
  96. package/dist/cli/options.d.ts.map +1 -0
  97. package/dist/cli/options.js +54 -0
  98. package/dist/cli/options.js.map +1 -0
  99. package/dist/cli/run-command.d.ts +24 -0
  100. package/dist/cli/run-command.d.ts.map +1 -0
  101. package/dist/cli/run-command.js +40 -0
  102. package/dist/cli/run-command.js.map +1 -0
  103. package/dist/cli/run.d.ts +4 -42
  104. package/dist/cli/run.d.ts.map +1 -1
  105. package/dist/cli/run.js +6 -61
  106. package/dist/cli/run.js.map +1 -1
  107. package/dist/cli/script-command.d.ts +10 -0
  108. package/dist/cli/script-command.d.ts.map +1 -0
  109. package/dist/cli/script-command.js +58 -0
  110. package/dist/cli/script-command.js.map +1 -0
  111. package/dist/cli/segment-command.d.ts +11 -0
  112. package/dist/cli/segment-command.d.ts.map +1 -0
  113. package/dist/cli/segment-command.js +53 -0
  114. package/dist/cli/segment-command.js.map +1 -0
  115. package/dist/cli/slug-command.d.ts +10 -0
  116. package/dist/cli/slug-command.d.ts.map +1 -0
  117. package/dist/cli/slug-command.js +28 -0
  118. package/dist/cli/slug-command.js.map +1 -0
  119. package/dist/cli/syllable-command.d.ts +14 -0
  120. package/dist/cli/syllable-command.d.ts.map +1 -0
  121. package/dist/cli/syllable-command.js +82 -0
  122. package/dist/cli/syllable-command.js.map +1 -0
  123. package/dist/cli/system-table.d.ts +12 -0
  124. package/dist/cli/system-table.d.ts.map +1 -0
  125. package/dist/cli/system-table.js +48 -0
  126. package/dist/cli/system-table.js.map +1 -0
  127. package/dist/cli/systems.d.ts +57 -0
  128. package/dist/cli/systems.d.ts.map +1 -0
  129. package/dist/cli/systems.js +27 -0
  130. package/dist/cli/systems.js.map +1 -0
  131. package/dist/cli/transcribe-command.d.ts +18 -0
  132. package/dist/cli/transcribe-command.d.ts.map +1 -0
  133. package/dist/cli/transcribe-command.js +86 -0
  134. package/dist/cli/transcribe-command.js.map +1 -0
  135. package/dist/cli/transcribe-reading.d.ts +15 -0
  136. package/dist/cli/transcribe-reading.d.ts.map +1 -0
  137. package/dist/cli/transcribe-reading.js +90 -0
  138. package/dist/cli/transcribe-reading.js.map +1 -0
  139. package/dist/cli/transcribe-rows.d.ts +26 -0
  140. package/dist/cli/transcribe-rows.d.ts.map +1 -0
  141. package/dist/cli/transcribe-rows.js +30 -0
  142. package/dist/cli/transcribe-rows.js.map +1 -0
  143. package/dist/cli/usage-error.d.ts +9 -0
  144. package/dist/cli/usage-error.d.ts.map +1 -0
  145. package/dist/cli/usage-error.js +9 -0
  146. package/dist/cli/usage-error.js.map +1 -0
  147. package/dist/decode/alternatives.d.ts +16 -0
  148. package/dist/decode/alternatives.d.ts.map +1 -0
  149. package/dist/decode/alternatives.js +31 -0
  150. package/dist/decode/alternatives.js.map +1 -0
  151. package/dist/decode/chang-context.d.ts +27 -0
  152. package/dist/decode/chang-context.d.ts.map +1 -0
  153. package/dist/decode/chang-context.js +66 -0
  154. package/dist/decode/chang-context.js.map +1 -0
  155. package/dist/decode/chang-rule.d.ts +37 -0
  156. package/dist/decode/chang-rule.d.ts.map +1 -0
  157. package/dist/decode/chang-rule.js +169 -0
  158. package/dist/decode/chang-rule.js.map +1 -0
  159. package/dist/decode/confidence.d.ts +11 -3
  160. package/dist/decode/confidence.d.ts.map +1 -1
  161. package/dist/decode/confidence.js +14 -121
  162. package/dist/decode/confidence.js.map +1 -1
  163. package/dist/decode/convert-options.d.ts +116 -0
  164. package/dist/decode/convert-options.d.ts.map +1 -0
  165. package/dist/decode/convert-options.js +2 -0
  166. package/dist/decode/convert-options.js.map +1 -0
  167. package/dist/decode/convert-pipeline.d.ts +18 -0
  168. package/dist/decode/convert-pipeline.d.ts.map +1 -0
  169. package/dist/decode/convert-pipeline.js +67 -0
  170. package/dist/decode/convert-pipeline.js.map +1 -0
  171. package/dist/decode/convert.d.ts +9 -118
  172. package/dist/decode/convert.d.ts.map +1 -1
  173. package/dist/decode/convert.js +5 -453
  174. package/dist/decode/convert.js.map +1 -1
  175. package/dist/decode/de-rule.d.ts +54 -0
  176. package/dist/decode/de-rule.d.ts.map +1 -0
  177. package/dist/decode/de-rule.js +113 -0
  178. package/dist/decode/de-rule.js.map +1 -0
  179. package/dist/decode/decode.d.ts +2 -15
  180. package/dist/decode/decode.d.ts.map +1 -1
  181. package/dist/decode/decode.js +2 -121
  182. package/dist/decode/decode.js.map +1 -1
  183. package/dist/decode/decoders.d.ts +32 -0
  184. package/dist/decode/decoders.d.ts.map +1 -0
  185. package/dist/decode/decoders.js +29 -0
  186. package/dist/decode/decoders.js.map +1 -0
  187. package/dist/decode/edge-context.d.ts +38 -0
  188. package/dist/decode/edge-context.d.ts.map +1 -0
  189. package/dist/decode/edge-context.js +57 -0
  190. package/dist/decode/edge-context.js.map +1 -0
  191. package/dist/decode/hint-lattice.d.ts +45 -0
  192. package/dist/decode/hint-lattice.d.ts.map +1 -0
  193. package/dist/decode/hint-lattice.js +154 -0
  194. package/dist/decode/hint-lattice.js.map +1 -0
  195. package/dist/decode/hints.d.ts +2 -45
  196. package/dist/decode/hints.d.ts.map +1 -1
  197. package/dist/decode/hints.js +1 -139
  198. package/dist/decode/hints.js.map +1 -1
  199. package/dist/decode/jiao-rule.d.ts +64 -0
  200. package/dist/decode/jiao-rule.d.ts.map +1 -0
  201. package/dist/decode/jiao-rule.js +115 -0
  202. package/dist/decode/jiao-rule.js.map +1 -0
  203. package/dist/decode/lattice-costs.d.ts +55 -0
  204. package/dist/decode/lattice-costs.d.ts.map +1 -0
  205. package/dist/decode/lattice-costs.js +90 -0
  206. package/dist/decode/lattice-costs.js.map +1 -0
  207. package/dist/decode/lattice-edges.d.ts +29 -0
  208. package/dist/decode/lattice-edges.d.ts.map +1 -0
  209. package/dist/decode/lattice-edges.js +78 -0
  210. package/dist/decode/lattice-edges.js.map +1 -0
  211. package/dist/decode/lattice-slice.d.ts +37 -0
  212. package/dist/decode/lattice-slice.d.ts.map +1 -0
  213. package/dist/decode/lattice-slice.js +43 -0
  214. package/dist/decode/lattice-slice.js.map +1 -0
  215. package/dist/decode/lattice-types.d.ts +101 -0
  216. package/dist/decode/lattice-types.d.ts.map +1 -0
  217. package/dist/decode/lattice-types.js +63 -0
  218. package/dist/decode/lattice-types.js.map +1 -0
  219. package/dist/decode/lattice.d.ts +2 -59
  220. package/dist/decode/lattice.d.ts.map +1 -1
  221. package/dist/decode/lattice.js +2 -118
  222. package/dist/decode/lattice.js.map +1 -1
  223. package/dist/decode/number-pieces.d.ts +62 -0
  224. package/dist/decode/number-pieces.d.ts.map +1 -0
  225. package/dist/decode/number-pieces.js +106 -0
  226. package/dist/decode/number-pieces.js.map +1 -0
  227. package/dist/decode/numbers.d.ts +53 -0
  228. package/dist/decode/numbers.d.ts.map +1 -0
  229. package/dist/decode/numbers.js +69 -0
  230. package/dist/decode/numbers.js.map +1 -0
  231. package/dist/decode/pieces.d.ts +78 -0
  232. package/dist/decode/pieces.d.ts.map +1 -0
  233. package/dist/decode/pieces.js +136 -0
  234. package/dist/decode/pieces.js.map +1 -0
  235. package/dist/decode/polyphone-rules.d.ts +11 -0
  236. package/dist/decode/polyphone-rules.d.ts.map +1 -0
  237. package/dist/decode/polyphone-rules.js +11 -0
  238. package/dist/decode/polyphone-rules.js.map +1 -0
  239. package/dist/decode/reading-rules.d.ts +3 -126
  240. package/dist/decode/reading-rules.d.ts.map +1 -1
  241. package/dist/decode/reading-rules.js +8 -434
  242. package/dist/decode/reading-rules.js.map +1 -1
  243. package/dist/decode/rules.d.ts +1 -17
  244. package/dist/decode/rules.d.ts.map +1 -1
  245. package/dist/decode/rules.js +1 -43
  246. package/dist/decode/rules.js.map +1 -1
  247. package/dist/decode/run-lattice.d.ts +52 -0
  248. package/dist/decode/run-lattice.d.ts.map +1 -0
  249. package/dist/decode/run-lattice.js +91 -0
  250. package/dist/decode/run-lattice.js.map +1 -0
  251. package/dist/decode/run-words.d.ts +17 -0
  252. package/dist/decode/run-words.d.ts.map +1 -0
  253. package/dist/decode/run-words.js +29 -0
  254. package/dist/decode/run-words.js.map +1 -0
  255. package/dist/decode/sandhi-input.d.ts +30 -0
  256. package/dist/decode/sandhi-input.d.ts.map +1 -0
  257. package/dist/decode/sandhi-input.js +35 -0
  258. package/dist/decode/sandhi-input.js.map +1 -0
  259. package/dist/decode/sandhi-tones.d.ts +97 -0
  260. package/dist/decode/sandhi-tones.d.ts.map +1 -0
  261. package/dist/decode/sandhi-tones.js +139 -0
  262. package/dist/decode/sandhi-tones.js.map +1 -0
  263. package/dist/decode/sandhi.d.ts +10 -7
  264. package/dist/decode/sandhi.d.ts.map +1 -1
  265. package/dist/decode/sandhi.js +11 -88
  266. package/dist/decode/sandhi.js.map +1 -1
  267. package/dist/decode/script-types.d.ts +76 -0
  268. package/dist/decode/script-types.d.ts.map +1 -0
  269. package/dist/decode/script-types.js +35 -0
  270. package/dist/decode/script-types.js.map +1 -0
  271. package/dist/decode/script-words.d.ts +32 -0
  272. package/dist/decode/script-words.d.ts.map +1 -0
  273. package/dist/decode/script-words.js +77 -0
  274. package/dist/decode/script-words.js.map +1 -0
  275. package/dist/decode/script.d.ts +3 -73
  276. package/dist/decode/script.d.ts.map +1 -1
  277. package/dist/decode/script.js +3 -109
  278. package/dist/decode/script.js.map +1 -1
  279. package/dist/decode/tan-rule.d.ts +68 -0
  280. package/dist/decode/tan-rule.d.ts.map +1 -0
  281. package/dist/decode/tan-rule.js +131 -0
  282. package/dist/decode/tan-rule.js.map +1 -0
  283. package/dist/decode/write-run.d.ts +21 -0
  284. package/dist/decode/write-run.d.ts.map +1 -0
  285. package/dist/decode/write-run.js +42 -0
  286. package/dist/decode/write-run.js.map +1 -0
  287. package/dist/dictionary/artifact-claims.d.ts +25 -0
  288. package/dist/dictionary/artifact-claims.d.ts.map +1 -0
  289. package/dist/dictionary/artifact-claims.js +47 -0
  290. package/dist/dictionary/artifact-claims.js.map +1 -0
  291. package/dist/dictionary/artifact-format.d.ts +86 -0
  292. package/dist/dictionary/artifact-format.d.ts.map +1 -0
  293. package/dist/dictionary/artifact-format.js +91 -0
  294. package/dist/dictionary/artifact-format.js.map +1 -0
  295. package/dist/dictionary/artifact-read.d.ts +34 -0
  296. package/dist/dictionary/artifact-read.d.ts.map +1 -0
  297. package/dist/dictionary/artifact-read.js +114 -0
  298. package/dist/dictionary/artifact-read.js.map +1 -0
  299. package/dist/dictionary/artifact.d.ts +4 -63
  300. package/dist/dictionary/artifact.d.ts.map +1 -1
  301. package/dist/dictionary/artifact.js +12 -229
  302. package/dist/dictionary/artifact.js.map +1 -1
  303. package/dist/dictionary/assertions.d.ts +5 -57
  304. package/dist/dictionary/assertions.d.ts.map +1 -1
  305. package/dist/dictionary/assertions.js +4 -317
  306. package/dist/dictionary/assertions.js.map +1 -1
  307. package/dist/dictionary/build-assertions.d.ts +12 -0
  308. package/dist/dictionary/build-assertions.d.ts.map +1 -0
  309. package/dist/dictionary/build-assertions.js +13 -0
  310. package/dist/dictionary/build-assertions.js.map +1 -0
  311. package/dist/dictionary/built-dictionary.d.ts +46 -0
  312. package/dist/dictionary/built-dictionary.d.ts.map +1 -0
  313. package/dist/dictionary/built-dictionary.js +97 -0
  314. package/dist/dictionary/built-dictionary.js.map +1 -0
  315. package/dist/dictionary/cedict-senses.d.ts +87 -0
  316. package/dist/dictionary/cedict-senses.d.ts.map +1 -0
  317. package/dist/dictionary/cedict-senses.js +126 -0
  318. package/dist/dictionary/cedict-senses.js.map +1 -0
  319. package/dist/dictionary/character-defaults.d.ts +26 -0
  320. package/dist/dictionary/character-defaults.d.ts.map +1 -0
  321. package/dist/dictionary/character-defaults.js +67 -0
  322. package/dist/dictionary/character-defaults.js.map +1 -0
  323. package/dist/dictionary/character-readings.d.ts +10 -0
  324. package/dist/dictionary/character-readings.d.ts.map +1 -0
  325. package/dist/dictionary/character-readings.js +25 -0
  326. package/dist/dictionary/character-readings.js.map +1 -0
  327. package/dist/dictionary/constituent-repair.d.ts +36 -0
  328. package/dist/dictionary/constituent-repair.d.ts.map +1 -0
  329. package/dist/dictionary/constituent-repair.js +117 -0
  330. package/dist/dictionary/constituent-repair.js.map +1 -0
  331. package/dist/dictionary/dictionary-entry.d.ts +37 -0
  332. package/dist/dictionary/dictionary-entry.d.ts.map +1 -0
  333. package/dist/dictionary/dictionary-entry.js +41 -0
  334. package/dist/dictionary/dictionary-entry.js.map +1 -0
  335. package/dist/dictionary/dictionary-readings.d.ts +56 -0
  336. package/dist/dictionary/dictionary-readings.d.ts.map +1 -0
  337. package/dist/dictionary/dictionary-readings.js +93 -0
  338. package/dist/dictionary/dictionary-readings.js.map +1 -0
  339. package/dist/dictionary/dictionary.d.ts +6 -60
  340. package/dist/dictionary/dictionary.d.ts.map +1 -1
  341. package/dist/dictionary/dictionary.js +9 -169
  342. package/dist/dictionary/dictionary.js.map +1 -1
  343. package/dist/dictionary/entry-invariants.d.ts +3 -0
  344. package/dist/dictionary/entry-invariants.d.ts.map +1 -0
  345. package/dist/dictionary/entry-invariants.js +67 -0
  346. package/dist/dictionary/entry-invariants.js.map +1 -0
  347. package/dist/dictionary/entry-lines.d.ts +35 -0
  348. package/dist/dictionary/entry-lines.d.ts.map +1 -0
  349. package/dist/dictionary/entry-lines.js +70 -0
  350. package/dist/dictionary/entry-lines.js.map +1 -0
  351. package/dist/dictionary/erhua-repair.d.ts +26 -0
  352. package/dist/dictionary/erhua-repair.d.ts.map +1 -0
  353. package/dist/dictionary/erhua-repair.js +49 -0
  354. package/dist/dictionary/erhua-repair.js.map +1 -0
  355. package/dist/dictionary/frequency-tones.d.ts +74 -0
  356. package/dist/dictionary/frequency-tones.d.ts.map +1 -0
  357. package/dist/dictionary/frequency-tones.js +128 -0
  358. package/dist/dictionary/frequency-tones.js.map +1 -0
  359. package/dist/dictionary/inventory-invariants.d.ts +3 -0
  360. package/dist/dictionary/inventory-invariants.d.ts.map +1 -0
  361. package/dist/dictionary/inventory-invariants.js +54 -0
  362. package/dist/dictionary/inventory-invariants.js.map +1 -0
  363. package/dist/dictionary/locale-candidates.d.ts +40 -0
  364. package/dist/dictionary/locale-candidates.d.ts.map +1 -0
  365. package/dist/dictionary/locale-candidates.js +77 -0
  366. package/dist/dictionary/locale-candidates.js.map +1 -0
  367. package/dist/dictionary/locale-segments.d.ts +47 -0
  368. package/dist/dictionary/locale-segments.d.ts.map +1 -0
  369. package/dist/dictionary/locale-segments.js +141 -0
  370. package/dist/dictionary/locale-segments.js.map +1 -0
  371. package/dist/dictionary/locale.d.ts +1 -21
  372. package/dist/dictionary/locale.d.ts.map +1 -1
  373. package/dist/dictionary/locale.js +9 -198
  374. package/dist/dictionary/locale.js.map +1 -1
  375. package/dist/dictionary/merge-types.d.ts +127 -0
  376. package/dist/dictionary/merge-types.d.ts.map +1 -0
  377. package/dist/dictionary/merge-types.js +35 -0
  378. package/dist/dictionary/merge-types.js.map +1 -0
  379. package/dist/dictionary/merge-walk.d.ts +27 -0
  380. package/dist/dictionary/merge-walk.d.ts.map +1 -0
  381. package/dist/dictionary/merge-walk.js +49 -0
  382. package/dist/dictionary/merge-walk.js.map +1 -0
  383. package/dist/dictionary/merge-word.d.ts +7 -0
  384. package/dist/dictionary/merge-word.d.ts.map +1 -0
  385. package/dist/dictionary/merge-word.js +91 -0
  386. package/dist/dictionary/merge-word.js.map +1 -0
  387. package/dist/dictionary/merge.d.ts +5 -62
  388. package/dist/dictionary/merge.d.ts.map +1 -1
  389. package/dist/dictionary/merge.js +32 -725
  390. package/dist/dictionary/merge.js.map +1 -1
  391. package/dist/dictionary/proper-noun.d.ts +28 -0
  392. package/dist/dictionary/proper-noun.d.ts.map +1 -0
  393. package/dist/dictionary/proper-noun.js +43 -0
  394. package/dist/dictionary/proper-noun.js.map +1 -0
  395. package/dist/dictionary/reading-agreement.d.ts +71 -0
  396. package/dist/dictionary/reading-agreement.d.ts.map +1 -0
  397. package/dist/dictionary/reading-agreement.js +156 -0
  398. package/dist/dictionary/reading-agreement.js.map +1 -0
  399. package/dist/dictionary/script-conversion.d.ts +28 -0
  400. package/dist/dictionary/script-conversion.d.ts.map +1 -0
  401. package/dist/dictionary/script-conversion.js +58 -0
  402. package/dist/dictionary/script-conversion.js.map +1 -0
  403. package/dist/dictionary/script-pairings.d.ts +74 -0
  404. package/dist/dictionary/script-pairings.d.ts.map +1 -0
  405. package/dist/dictionary/script-pairings.js +120 -0
  406. package/dist/dictionary/script-pairings.js.map +1 -0
  407. package/dist/dictionary/script-tables.d.ts.map +1 -1
  408. package/dist/dictionary/script-tables.js +2 -165
  409. package/dist/dictionary/script-tables.js.map +1 -1
  410. package/dist/dictionary/taiwan-reading.d.ts +8 -0
  411. package/dist/dictionary/taiwan-reading.d.ts.map +1 -0
  412. package/dist/dictionary/taiwan-reading.js +38 -0
  413. package/dist/dictionary/taiwan-reading.js.map +1 -0
  414. package/dist/dictionary/tone-invariants.d.ts +3 -0
  415. package/dist/dictionary/tone-invariants.d.ts.map +1 -0
  416. package/dist/dictionary/tone-invariants.js +64 -0
  417. package/dist/dictionary/tone-invariants.js.map +1 -0
  418. package/dist/dictionary/traditional-form.d.ts +21 -0
  419. package/dist/dictionary/traditional-form.d.ts.map +1 -0
  420. package/dist/dictionary/traditional-form.js +59 -0
  421. package/dist/dictionary/traditional-form.js.map +1 -0
  422. package/dist/dictionary/traditional-ranking.d.ts +22 -0
  423. package/dist/dictionary/traditional-ranking.d.ts.map +1 -0
  424. package/dist/dictionary/traditional-ranking.js +74 -0
  425. package/dist/dictionary/traditional-ranking.js.map +1 -0
  426. package/dist/dictionary/traditional-table.d.ts +51 -0
  427. package/dist/dictionary/traditional-table.d.ts.map +1 -0
  428. package/dist/dictionary/traditional-table.js +98 -0
  429. package/dist/dictionary/traditional-table.js.map +1 -0
  430. package/dist/dictionary/traditional.d.ts +3 -56
  431. package/dist/dictionary/traditional.d.ts.map +1 -1
  432. package/dist/dictionary/traditional.js +3 -186
  433. package/dist/dictionary/traditional.js.map +1 -1
  434. package/dist/dictionary/variant-counts.d.ts +39 -0
  435. package/dist/dictionary/variant-counts.d.ts.map +1 -0
  436. package/dist/dictionary/variant-counts.js +38 -0
  437. package/dist/dictionary/variant-counts.js.map +1 -0
  438. package/dist/dictionary/word-reading.d.ts +26 -0
  439. package/dist/dictionary/word-reading.d.ts.map +1 -0
  440. package/dist/dictionary/word-reading.js +76 -0
  441. package/dist/dictionary/word-reading.js.map +1 -0
  442. package/dist/dictionary/word-readings.d.ts +15 -0
  443. package/dist/dictionary/word-readings.d.ts.map +1 -0
  444. package/dist/dictionary/word-readings.js +41 -0
  445. package/dist/dictionary/word-readings.js.map +1 -0
  446. package/dist/format/annotate.d.ts +90 -0
  447. package/dist/format/annotate.d.ts.map +1 -0
  448. package/dist/format/annotate.js +168 -0
  449. package/dist/format/annotate.js.map +1 -0
  450. package/dist/format/html.d.ts +15 -46
  451. package/dist/format/html.d.ts.map +1 -1
  452. package/dist/format/html.js +3 -162
  453. package/dist/format/html.js.map +1 -1
  454. package/dist/format/slug-hash.d.ts +51 -0
  455. package/dist/format/slug-hash.d.ts.map +1 -0
  456. package/dist/format/slug-hash.js +74 -0
  457. package/dist/format/slug-hash.js.map +1 -0
  458. package/dist/format/slug-options.d.ts +98 -0
  459. package/dist/format/slug-options.d.ts.map +1 -0
  460. package/dist/format/slug-options.js +2 -0
  461. package/dist/format/slug-options.js.map +1 -0
  462. package/dist/format/slug-words.d.ts +27 -0
  463. package/dist/format/slug-words.d.ts.map +1 -0
  464. package/dist/format/slug-words.js +0 -0
  465. package/dist/format/slug-words.js.map +1 -0
  466. package/dist/format/slug.d.ts +3 -128
  467. package/dist/format/slug.d.ts.map +1 -1
  468. package/dist/format/slug.js +0 -0
  469. package/dist/format/slug.js.map +1 -1
  470. package/dist/grade/check-readings.d.ts +41 -0
  471. package/dist/grade/check-readings.d.ts.map +1 -0
  472. package/dist/grade/check-readings.js +36 -0
  473. package/dist/grade/check-readings.js.map +1 -0
  474. package/dist/grade/check.d.ts +4 -4
  475. package/dist/grade/check.d.ts.map +1 -1
  476. package/dist/grade/check.js +5 -270
  477. package/dist/grade/check.js.map +1 -1
  478. package/dist/grade/pair-syllables.d.ts +48 -0
  479. package/dist/grade/pair-syllables.d.ts.map +1 -0
  480. package/dist/grade/pair-syllables.js +71 -0
  481. package/dist/grade/pair-syllables.js.map +1 -0
  482. package/dist/grade/reading-syllables.d.ts +62 -0
  483. package/dist/grade/reading-syllables.d.ts.map +1 -0
  484. package/dist/grade/reading-syllables.js +58 -0
  485. package/dist/grade/reading-syllables.js.map +1 -0
  486. package/dist/grade/reading-tolerance.d.ts +72 -0
  487. package/dist/grade/reading-tolerance.d.ts.map +1 -0
  488. package/dist/grade/reading-tolerance.js +107 -0
  489. package/dist/grade/reading-tolerance.js.map +1 -0
  490. package/dist/grade/typed-reading.d.ts +28 -0
  491. package/dist/grade/typed-reading.d.ts.map +1 -0
  492. package/dist/grade/typed-reading.js +36 -0
  493. package/dist/grade/typed-reading.js.map +1 -0
  494. package/dist/index.d.ts +1 -1
  495. package/dist/index.d.ts.map +1 -1
  496. package/dist/index.js +1 -1
  497. package/dist/index.js.map +1 -1
  498. package/dist/numerals/numeral-parse.d.ts +32 -0
  499. package/dist/numerals/numeral-parse.d.ts.map +1 -0
  500. package/dist/numerals/numeral-parse.js +44 -0
  501. package/dist/numerals/numeral-parse.js.map +1 -0
  502. package/dist/numerals/numeral-shapes.d.ts +89 -0
  503. package/dist/numerals/numeral-shapes.d.ts.map +1 -0
  504. package/dist/numerals/numeral-shapes.js +99 -0
  505. package/dist/numerals/numeral-shapes.js.map +1 -0
  506. package/dist/numerals/numerals.d.ts.map +1 -1
  507. package/dist/numerals/numerals.js +2 -36
  508. package/dist/numerals/numerals.js.map +1 -1
  509. package/dist/numerals/read-numeral.d.ts +76 -0
  510. package/dist/numerals/read-numeral.d.ts.map +1 -0
  511. package/dist/numerals/read-numeral.js +88 -0
  512. package/dist/numerals/read-numeral.js.map +1 -0
  513. package/dist/numerals/text.d.ts +3 -37
  514. package/dist/numerals/text.d.ts.map +1 -1
  515. package/dist/numerals/text.js +3 -254
  516. package/dist/numerals/text.js.map +1 -1
  517. package/dist/numerals/time.d.ts +34 -0
  518. package/dist/numerals/time.d.ts.map +1 -0
  519. package/dist/numerals/time.js +93 -0
  520. package/dist/numerals/time.js.map +1 -0
  521. package/dist/orthography/address-grouping.d.ts +34 -0
  522. package/dist/orthography/address-grouping.d.ts.map +1 -0
  523. package/dist/orthography/address-grouping.js +52 -0
  524. package/dist/orthography/address-grouping.js.map +1 -0
  525. package/dist/orthography/grouping.d.ts +3 -87
  526. package/dist/orthography/grouping.d.ts.map +1 -1
  527. package/dist/orthography/grouping.js +4 -270
  528. package/dist/orthography/grouping.js.map +1 -1
  529. package/dist/orthography/place-grouping.d.ts +39 -0
  530. package/dist/orthography/place-grouping.d.ts.map +1 -0
  531. package/dist/orthography/place-grouping.js +83 -0
  532. package/dist/orthography/place-grouping.js.map +1 -0
  533. package/dist/orthography/word-grouping.d.ts +48 -0
  534. package/dist/orthography/word-grouping.d.ts.map +1 -0
  535. package/dist/orthography/word-grouping.js +147 -0
  536. package/dist/orthography/word-grouping.js.map +1 -0
  537. package/dist/script/conversion-format.d.ts +22 -0
  538. package/dist/script/conversion-format.d.ts.map +1 -0
  539. package/dist/script/conversion-format.js +22 -0
  540. package/dist/script/conversion-format.js.map +1 -0
  541. package/dist/script/conversion-read.d.ts +9 -0
  542. package/dist/script/conversion-read.d.ts.map +1 -0
  543. package/dist/script/conversion-read.js +69 -0
  544. package/dist/script/conversion-read.js.map +1 -0
  545. package/dist/script/conversion-write.d.ts +14 -0
  546. package/dist/script/conversion-write.d.ts.map +1 -0
  547. package/dist/script/conversion-write.js +34 -0
  548. package/dist/script/conversion-write.js.map +1 -0
  549. package/dist/script/conversion.d.ts +10 -16
  550. package/dist/script/conversion.d.ts.map +1 -1
  551. package/dist/script/conversion.js +2 -115
  552. package/dist/script/conversion.js.map +1 -1
  553. package/dist/search/candidate-narrowing.d.ts +56 -0
  554. package/dist/search/candidate-narrowing.d.ts.map +1 -0
  555. package/dist/search/candidate-narrowing.js +55 -0
  556. package/dist/search/candidate-narrowing.js.map +1 -0
  557. package/dist/search/candidate-query.d.ts +25 -0
  558. package/dist/search/candidate-query.d.ts.map +1 -0
  559. package/dist/search/candidate-query.js +28 -0
  560. package/dist/search/candidate-query.js.map +1 -0
  561. package/dist/search/candidate-writings.d.ts +24 -0
  562. package/dist/search/candidate-writings.d.ts.map +1 -0
  563. package/dist/search/candidate-writings.js +114 -0
  564. package/dist/search/candidate-writings.js.map +1 -0
  565. package/dist/search/candidates.d.ts +7 -41
  566. package/dist/search/candidates.d.ts.map +1 -1
  567. package/dist/search/candidates.js +10 -164
  568. package/dist/search/candidates.js.map +1 -1
  569. package/dist/search/match-chunks.d.ts +19 -0
  570. package/dist/search/match-chunks.d.ts.map +1 -0
  571. package/dist/search/match-chunks.js +30 -0
  572. package/dist/search/match-chunks.js.map +1 -0
  573. package/dist/search/match-ranking.d.ts +39 -0
  574. package/dist/search/match-ranking.d.ts.map +1 -0
  575. package/dist/search/match-ranking.js +51 -0
  576. package/dist/search/match-ranking.js.map +1 -0
  577. package/dist/search/match-readings.d.ts +43 -0
  578. package/dist/search/match-readings.d.ts.map +1 -0
  579. package/dist/search/match-readings.js +83 -0
  580. package/dist/search/match-readings.js.map +1 -0
  581. package/dist/search/match-scoring.d.ts +146 -0
  582. package/dist/search/match-scoring.d.ts.map +1 -0
  583. package/dist/search/match-scoring.js +114 -0
  584. package/dist/search/match-scoring.js.map +1 -0
  585. package/dist/search/match-search.d.ts +28 -0
  586. package/dist/search/match-search.d.ts.map +1 -0
  587. package/dist/search/match-search.js +128 -0
  588. package/dist/search/match-search.js.map +1 -0
  589. package/dist/search/match.d.ts +5 -36
  590. package/dist/search/match.d.ts.map +1 -1
  591. package/dist/search/match.js +2 -379
  592. package/dist/search/match.js.map +1 -1
  593. package/dist/search/reverse-index-build.d.ts +30 -0
  594. package/dist/search/reverse-index-build.d.ts.map +1 -0
  595. package/dist/search/reverse-index-build.js +72 -0
  596. package/dist/search/reverse-index-build.js.map +1 -0
  597. package/dist/search/reverse-index-format.d.ts +60 -0
  598. package/dist/search/reverse-index-format.d.ts.map +1 -0
  599. package/dist/search/reverse-index-format.js +54 -0
  600. package/dist/search/reverse-index-format.js.map +1 -0
  601. package/dist/search/reverse-index-groups.d.ts +37 -0
  602. package/dist/search/reverse-index-groups.d.ts.map +1 -0
  603. package/dist/search/reverse-index-groups.js +71 -0
  604. package/dist/search/reverse-index-groups.js.map +1 -0
  605. package/dist/search/reverse-index-passes.d.ts +78 -0
  606. package/dist/search/reverse-index-passes.d.ts.map +1 -0
  607. package/dist/search/reverse-index-passes.js +59 -0
  608. package/dist/search/reverse-index-passes.js.map +1 -0
  609. package/dist/search/reverse-index-state.d.ts +36 -0
  610. package/dist/search/reverse-index-state.d.ts.map +1 -0
  611. package/dist/search/reverse-index-state.js +95 -0
  612. package/dist/search/reverse-index-state.js.map +1 -0
  613. package/dist/search/reverse-index.d.ts +8 -67
  614. package/dist/search/reverse-index.d.ts.map +1 -1
  615. package/dist/search/reverse-index.js +4 -255
  616. package/dist/search/reverse-index.js.map +1 -1
  617. package/dist/sources/unihan-readings.d.ts +58 -0
  618. package/dist/sources/unihan-readings.d.ts.map +1 -0
  619. package/dist/sources/unihan-readings.js +95 -0
  620. package/dist/sources/unihan-readings.js.map +1 -0
  621. package/dist/sources/unihan.d.ts +6 -9
  622. package/dist/sources/unihan.d.ts.map +1 -1
  623. package/dist/sources/unihan.js +2 -85
  624. package/dist/sources/unihan.js.map +1 -1
  625. package/dist/syllable/final-tables.d.ts +23 -0
  626. package/dist/syllable/final-tables.d.ts.map +1 -0
  627. package/dist/syllable/final-tables.js +50 -0
  628. package/dist/syllable/final-tables.js.map +1 -0
  629. package/dist/syllable/inventory.d.ts +8 -42
  630. package/dist/syllable/inventory.d.ts.map +1 -1
  631. package/dist/syllable/inventory.js +9 -918
  632. package/dist/syllable/inventory.js.map +1 -1
  633. package/dist/syllable/spellings.d.ts +40 -0
  634. package/dist/syllable/spellings.d.ts.map +1 -0
  635. package/dist/syllable/spellings.js +469 -0
  636. package/dist/syllable/spellings.js.map +1 -0
  637. package/dist/syllable/syllable-parts.d.ts +31 -0
  638. package/dist/syllable/syllable-parts.d.ts.map +1 -0
  639. package/dist/syllable/syllable-parts.js +105 -0
  640. package/dist/syllable/syllable-parts.js.map +1 -0
  641. package/dist/syllable/syllable.d.ts +1 -14
  642. package/dist/syllable/syllable.d.ts.map +1 -1
  643. package/dist/syllable/syllable.js +3 -144
  644. package/dist/syllable/syllable.js.map +1 -1
  645. package/dist/syllable/written-tones.d.ts +6 -0
  646. package/dist/syllable/written-tones.d.ts.map +1 -0
  647. package/dist/syllable/written-tones.js +453 -0
  648. package/dist/syllable/written-tones.js.map +1 -0
  649. package/dist/transcription/bopomofo-parse.d.ts +42 -0
  650. package/dist/transcription/bopomofo-parse.d.ts.map +1 -0
  651. package/dist/transcription/bopomofo-parse.js +92 -0
  652. package/dist/transcription/bopomofo-parse.js.map +1 -0
  653. package/dist/transcription/bopomofo-reverse.d.ts +31 -0
  654. package/dist/transcription/bopomofo-reverse.d.ts.map +1 -0
  655. package/dist/transcription/bopomofo-reverse.js +48 -0
  656. package/dist/transcription/bopomofo-reverse.js.map +1 -0
  657. package/dist/transcription/bopomofo-symbols.d.ts +36 -0
  658. package/dist/transcription/bopomofo-symbols.d.ts.map +1 -0
  659. package/dist/transcription/bopomofo-symbols.js +41 -0
  660. package/dist/transcription/bopomofo-symbols.js.map +1 -0
  661. package/dist/transcription/bopomofo-tables.d.ts +87 -0
  662. package/dist/transcription/bopomofo-tables.d.ts.map +1 -0
  663. package/dist/transcription/bopomofo-tables.js +180 -0
  664. package/dist/transcription/bopomofo-tables.js.map +1 -0
  665. package/dist/transcription/bopomofo.d.ts +14 -32
  666. package/dist/transcription/bopomofo.d.ts.map +1 -1
  667. package/dist/transcription/bopomofo.js +5 -343
  668. package/dist/transcription/bopomofo.js.map +1 -1
  669. package/dist/transcription/gwoyeu-first-second.d.ts +36 -0
  670. package/dist/transcription/gwoyeu-first-second.d.ts.map +1 -0
  671. package/dist/transcription/gwoyeu-first-second.js +75 -0
  672. package/dist/transcription/gwoyeu-first-second.js.map +1 -0
  673. package/dist/transcription/gwoyeu-spelling.d.ts +38 -0
  674. package/dist/transcription/gwoyeu-spelling.d.ts.map +1 -0
  675. package/dist/transcription/gwoyeu-spelling.js +124 -0
  676. package/dist/transcription/gwoyeu-spelling.js.map +1 -0
  677. package/dist/transcription/gwoyeu-tables.d.ts +93 -0
  678. package/dist/transcription/gwoyeu-tables.d.ts.map +1 -0
  679. package/dist/transcription/gwoyeu-tables.js +205 -0
  680. package/dist/transcription/gwoyeu-tables.js.map +1 -0
  681. package/dist/transcription/gwoyeu-tonal-forms.d.ts +49 -0
  682. package/dist/transcription/gwoyeu-tonal-forms.d.ts.map +1 -0
  683. package/dist/transcription/gwoyeu-tonal-forms.js +89 -0
  684. package/dist/transcription/gwoyeu-tonal-forms.js.map +1 -0
  685. package/dist/transcription/gwoyeu-vowels.d.ts +51 -0
  686. package/dist/transcription/gwoyeu-vowels.d.ts.map +1 -0
  687. package/dist/transcription/gwoyeu-vowels.js +58 -0
  688. package/dist/transcription/gwoyeu-vowels.js.map +1 -0
  689. package/dist/transcription/gwoyeu.d.ts +1 -26
  690. package/dist/transcription/gwoyeu.d.ts.map +1 -1
  691. package/dist/transcription/gwoyeu.js +2 -540
  692. package/dist/transcription/gwoyeu.js.map +1 -1
  693. package/dist/transcription/ipa-symbols.d.ts +67 -0
  694. package/dist/transcription/ipa-symbols.d.ts.map +1 -0
  695. package/dist/transcription/ipa-symbols.js +135 -0
  696. package/dist/transcription/ipa-symbols.js.map +1 -0
  697. package/dist/transcription/ipa.d.ts +2 -10
  698. package/dist/transcription/ipa.d.ts.map +1 -1
  699. package/dist/transcription/ipa.js +2 -134
  700. package/dist/transcription/ipa.js.map +1 -1
  701. package/dist/transcription/wade-giles-index.d.ts +35 -0
  702. package/dist/transcription/wade-giles-index.d.ts.map +1 -0
  703. package/dist/transcription/wade-giles-index.js +110 -0
  704. package/dist/transcription/wade-giles-index.js.map +1 -0
  705. package/dist/transcription/wade-giles-parse.d.ts +36 -0
  706. package/dist/transcription/wade-giles-parse.d.ts.map +1 -0
  707. package/dist/transcription/wade-giles-parse.js +84 -0
  708. package/dist/transcription/wade-giles-parse.js.map +1 -0
  709. package/dist/transcription/wade-giles-spelling.d.ts +61 -0
  710. package/dist/transcription/wade-giles-spelling.d.ts.map +1 -0
  711. package/dist/transcription/wade-giles-spelling.js +107 -0
  712. package/dist/transcription/wade-giles-spelling.js.map +1 -0
  713. package/dist/transcription/wade-giles-syllable.d.ts +29 -0
  714. package/dist/transcription/wade-giles-syllable.d.ts.map +1 -0
  715. package/dist/transcription/wade-giles-syllable.js +90 -0
  716. package/dist/transcription/wade-giles-syllable.js.map +1 -0
  717. package/dist/transcription/wade-giles-tables.d.ts +80 -0
  718. package/dist/transcription/wade-giles-tables.d.ts.map +1 -0
  719. package/dist/transcription/wade-giles-tables.js +178 -0
  720. package/dist/transcription/wade-giles-tables.js.map +1 -0
  721. package/dist/transcription/wade-giles.d.ts +9 -60
  722. package/dist/transcription/wade-giles.d.ts.map +1 -1
  723. package/dist/transcription/wade-giles.js +6 -543
  724. package/dist/transcription/wade-giles.js.map +1 -1
  725. package/dist/transcription/yale-tables.d.ts +54 -0
  726. package/dist/transcription/yale-tables.d.ts.map +1 -0
  727. package/dist/transcription/yale-tables.js +125 -0
  728. package/dist/transcription/yale-tables.js.map +1 -0
  729. package/dist/transcription/yale.d.ts.map +1 -1
  730. package/dist/transcription/yale.js +1 -124
  731. package/dist/transcription/yale.js.map +1 -1
  732. package/package.json +2 -2
@@ -0,0 +1,91 @@
1
+ import { buildLattice } from "./lattice.js";
2
+ export { runLattice } from "./lattice-slice.js";
3
+ /**
4
+ * Building the lattice one Han run is decoded over.
5
+ *
6
+ * A run is decoded on its own and the pieces are put back together, so this
7
+ * is where a lattice is cut down to a run and the words are read back out of
8
+ * it. `decode.ts` is what asks for one.
9
+ */
10
+ import { decodeSpacing } from "./decode.js";
11
+ import { applyEdgeRules } from "./rules.js";
12
+ /**
13
+ * Gather the reading units into the words the boundaries make of them.
14
+ *
15
+ * Where the two decodes disagree the readings win, which is what "advisory"
16
+ * means for the spacing decode: a boundary falling inside a reading unit is
17
+ * dropped rather than allowed to break the unit up. 玩儿 read as `wánr` is one
18
+ * syllable over two characters, and no spacing can be put between them.
19
+ */
20
+ export function groupUnits(units, boundaries) {
21
+ const starts = new Set(units.map((unit) => unit.from));
22
+ const kept = new Set(boundaries.filter((at) => starts.has(at)));
23
+ const groups = [];
24
+ let held = [];
25
+ for (const unit of units) {
26
+ if (kept.has(unit.from) && held.length > 0) {
27
+ groups.push(held);
28
+ held = [];
29
+ }
30
+ held.push(unit);
31
+ }
32
+ if (held.length > 0) {
33
+ groups.push(held);
34
+ }
35
+ return groups;
36
+ }
37
+ /**
38
+ * Assemble one word from the units the boundaries kept together.
39
+ */
40
+ export function wordFrom(dictionary, lattice, group) {
41
+ const first = group[0];
42
+ const last = group.at(-1);
43
+ /* c8 ignore next 3 -- a group is only made by pushing a unit into it */
44
+ if (first === undefined || last === undefined) {
45
+ throw new Error("a word must cover at least one reading unit");
46
+ }
47
+ const text = lattice.characters.slice(first.from, last.to).join("");
48
+ const entry = dictionary.lookup(text);
49
+ return {
50
+ text,
51
+ reading: group.flatMap((unit) => [...unit.reading]),
52
+ isProperNoun: entry?.isProperNoun ?? false,
53
+ partOfSpeech: entry?.partOfSpeech ?? "",
54
+ isKnown: entry !== undefined,
55
+ };
56
+ }
57
+ /**
58
+ * The lattice a run decodes over: stage 1 built, then stage 4 applied.
59
+ *
60
+ * The rules run between building and decoding rather than over the output,
61
+ * which is the whole point of them — they change what the decode gets to choose
62
+ * between, so everything downstream sees one lattice rather than a decode and
63
+ * a list of corrections to it.
64
+ */
65
+ export function ruledLattice(dictionary, run, rules, hints) {
66
+ return applyEdgeRules(buildLattice(dictionary, run, hints), dictionary, rules);
67
+ }
68
+ /**
69
+ * Cut a decode of the whole lattice down to the run at the end of it.
70
+ *
71
+ * Everything before `at` was context rather than run — 汉字 a caller put in
72
+ * front so that the decode could see them — and is dropped once it has done its
73
+ * work.
74
+ */
75
+ export function runGroups({ lattice, at }, units) {
76
+ return groupUnits(units.filter((unit) => unit.from >= at), decodeSpacing(lattice).filter((from) => from >= at));
77
+ }
78
+ /**
79
+ * Decode a Han run with the lattice: the recommended path.
80
+ *
81
+ * Stages 1 to 3 of ALGORITHM.md end to end — build every candidate reading,
82
+ * lock the positions that cannot vary, score the rest — where the greedy
83
+ * baseline commits to the longest match at each position and never revisits it.
84
+ *
85
+ * `before` is 汉字 standing in front of the run that the decode should see and
86
+ * not report: the 汉字 a number written in digits would have been written with.
87
+ * A run is decoded on its own without it, and a run reached that way has no idea
88
+ * what preceded it — 个人 alone is the word `gèrén`, while the 两 of 2个人 makes
89
+ * 两个 the word and leaves 人 to itself.
90
+ */
91
+ //# sourceMappingURL=run-lattice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-lattice.js","sourceRoot":"","sources":["../../src/decode/run-lattice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Recutting a run's words for 分词连写.
3
+ *
4
+ * Grouping rewrites word boundaries and never the readings behind them, so the
5
+ * syllables — and the confidence beside them — survive it in order, and are
6
+ * simply cut in different places.
7
+ */
8
+ import type { Dictionary } from "../dictionary/dictionary.js";
9
+ import type { ScoredWord } from "./word.js";
10
+ /**
11
+ * The words a Han run decodes to, with 分词连写 applied.
12
+ *
13
+ * Grouping rewrites word boundaries and never the readings behind them, so the
14
+ * syllables — and the confidence beside them — survive it in order.
15
+ */
16
+ export declare function wordsOf(decoded: readonly ScoredWord[], dictionary: Dictionary, isGrouped: boolean): readonly ScoredWord[];
17
+ //# sourceMappingURL=run-words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-words.d.ts","sourceRoot":"","sources":["../../src/decode/run-words.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,WAAW,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,OAAO,GACjB,SAAS,UAAU,EAAE,CAUvB"}
@@ -0,0 +1,29 @@
1
+ import { applyGrouping } from "../orthography/grouping.js";
2
+ /**
3
+ * The words a Han run decodes to, with 分词连写 applied.
4
+ *
5
+ * Grouping rewrites word boundaries and never the readings behind them, so the
6
+ * syllables — and the confidence beside them — survive it in order.
7
+ */
8
+ export function wordsOf(decoded, dictionary, isGrouped) {
9
+ return isGrouped
10
+ ? regroup(decoded, applyGrouping(decoded.map((scored) => scored.word), dictionary))
11
+ : decoded;
12
+ }
13
+ /**
14
+ * Redistribute the decode's per-syllable confidence over regrouped words.
15
+ *
16
+ * 分词连写 moves word boundaries — 看 and 了 become 看了 — without touching a
17
+ * reading, so the run's syllables are the same syllables in the same order and
18
+ * are simply cut in different places.
19
+ */
20
+ function regroup(decoded, grouped) {
21
+ const confidence = decoded.flatMap((scored) => [...scored.confidence]);
22
+ let at = 0;
23
+ return grouped.map((word) => {
24
+ const held = confidence.slice(at, at + word.reading.length);
25
+ at += word.reading.length;
26
+ return { word, confidence: held };
27
+ });
28
+ }
29
+ //# sourceMappingURL=run-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-words.js","sourceRoot":"","sources":["../../src/decode/run-words.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,OAA8B,EAC9B,UAAsB,EACtB,SAAkB;IAElB,OAAO,SAAS;QACd,CAAC,CAAC,OAAO,CACL,OAAO,EACP,aAAa,CACX,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EACpC,UAAU,CACX,CACF;QACH,CAAC,CAAC,OAAO,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CACd,OAA8B,EAC9B,OAA+B;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * What the sandhi pass needs from a decoded run, beyond the syllables.
3
+ *
4
+ * Two questions sandhi cannot answer from a reading alone. Third-tone sandhi
5
+ * applies inside a prosodic foot, so it has to be told where the words and
6
+ * their parts are. 一 sandhi asks what stands in front of the 一, and the answer
7
+ * is a character rather than a spelling. Both are things the decode knows and
8
+ * the syllable array does not.
9
+ */
10
+ import type { Dictionary } from "../dictionary/dictionary.js";
11
+ import type { Syllable } from "../syllable/syllable.js";
12
+ import type { SandhiGrouping } from "./sandhi.js";
13
+ import type { ScoredWord } from "./word.js";
14
+ /**
15
+ * Where the words and their constituents fall, for third-tone sandhi.
16
+ *
17
+ * Undefined unless third-tone sandhi was asked for, since dividing a word costs
18
+ * dictionary lookups and nothing else reads the answer.
19
+ */
20
+ export declare function groupingOf(dictionary: Dictionary, words: readonly ScoredWord[], readings: readonly (readonly Syllable[])[], isThirdTone: boolean): SandhiGrouping | undefined;
21
+ /**
22
+ * One 汉字 per syllable, where a word offers one.
23
+ *
24
+ * A word whose reading is a different length from its text — 玩儿 as `wánr` —
25
+ * has no character to give any one of its syllables, so its syllables get none
26
+ * and the pass falls back to their spellings. See
27
+ * {@link import("./sandhi-tones.js").isCounting}.
28
+ */
29
+ export declare function charactersPerSyllable(words: readonly ScoredWord[], readings: readonly (readonly Syllable[])[]): readonly (string | undefined)[];
30
+ //# sourceMappingURL=sandhi-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandhi-input.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,QAAQ,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,EAC1C,WAAW,EAAE,OAAO,GACnB,cAAc,GAAG,SAAS,CAQ5B;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,QAAQ,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,GACzC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAQjC"}
@@ -0,0 +1,35 @@
1
+ import { toCharacters } from "../script/characters.js";
2
+ import { divisionOf } from "./constituents.js";
3
+ /**
4
+ * Where the words and their constituents fall, for third-tone sandhi.
5
+ *
6
+ * Undefined unless third-tone sandhi was asked for, since dividing a word costs
7
+ * dictionary lookups and nothing else reads the answer.
8
+ */
9
+ export function groupingOf(dictionary, words, readings, isThirdTone) {
10
+ if (!isThirdTone) {
11
+ return undefined;
12
+ }
13
+ return words.map((scored, index) => {
14
+ const reading = readings[index] ?? [];
15
+ return divisionOf(dictionary, scored.word.text, reading) ?? reading.length;
16
+ });
17
+ }
18
+ /**
19
+ * One 汉字 per syllable, where a word offers one.
20
+ *
21
+ * A word whose reading is a different length from its text — 玩儿 as `wánr` —
22
+ * has no character to give any one of its syllables, so its syllables get none
23
+ * and the pass falls back to their spellings. See
24
+ * {@link import("./sandhi-tones.js").isCounting}.
25
+ */
26
+ export function charactersPerSyllable(words, readings) {
27
+ return words.flatMap((scored, index) => {
28
+ const reading = readings[index] ?? [];
29
+ const held = toCharacters(scored.word.text);
30
+ return held.length === reading.length
31
+ ? held
32
+ : Array.from({ length: reading.length });
33
+ });
34
+ }
35
+ //# sourceMappingURL=sandhi-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandhi-input.js","sourceRoot":"","sources":["../../src/decode/sandhi-input.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,UAAsB,EACtB,KAA4B,EAC5B,QAA0C,EAC1C,WAAoB;IAEpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAA4B,EAC5B,QAA0C;IAE1C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAmC,EAAE;QACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YACnC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,IAAI,CAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Which tone 一 and 不 take, and when a 一 is being counted rather than said.
3
+ *
4
+ * Both characters change tone by what follows them, and 一 additionally does
5
+ * not change at all when it is a number being counted off.
6
+ */
7
+ import { type Syllable } from "../syllable/syllable.js";
8
+ import { type Tone } from "../tone/tone.js";
9
+ /**
10
+ * Whether a syllable is 一, which is the only thing spelled `yi` that sandhis.
11
+ */
12
+ export declare function isYi(syllable: Syllable): boolean;
13
+ /**
14
+ * Whether a syllable is 不.
15
+ */
16
+ export declare function isBu(syllable: Syllable): boolean;
17
+ /**
18
+ * The tone 一 takes before a given following tone.
19
+ *
20
+ * Fourth tone flattens it to second; anything else raises it to fourth. Before
21
+ * a neutral tone or at the end of a phrase it keeps its citation first tone,
22
+ * since there is nothing to assimilate to.
23
+ */
24
+ export declare function yiToneBefore(following: Tone | undefined): Tone;
25
+ /**
26
+ * The numeral words a 一 can be the last digit of.
27
+ *
28
+ * Toneless, because what is being asked is which word it is rather than what
29
+ * tone it is carrying, and 十 is `shí` in every context it appears in here.
30
+ *
31
+ * **亿 is deliberately absent**, and that is measured rather than assumed: no
32
+ * 一 in 88,866 lines of Tatoeba and zh.wikipedia ends a number in 亿, while 意,
33
+ * 议, 义 and 議 all read `yì`, all precede a 一 that really is counting, and
34
+ * would all lose their sandhi for it — 11 conversions against nothing gained.
35
+ * The other three stay, because a number can end 百一 or 千一 even though this
36
+ * corpus has none, and the one thing they cost is 擺一個.
37
+ */
38
+ export declare const NUMERAL_WORDS: Set<string>;
39
+ /**
40
+ * The words that carry a number on past a 一, so that it is still counting.
41
+ *
42
+ * 一百一十's second 一 counts the ten it is followed by and takes the sandhi;
43
+ * 二十一's does not, because nothing numeric comes after it.
44
+ */
45
+ export declare const CONTINUES_NUMBER: Set<string>;
46
+ /**
47
+ * The ordinal prefix 第.
48
+ */
49
+ export declare const ORDINAL_PREFIX = "di";
50
+ /**
51
+ * The 汉字 {@link NUMERAL_WORDS} names, for a caller that has them.
52
+ *
53
+ * The spellings are ambiguous and the characters are not, which is the whole
54
+ * point of carrying both. 是 is spelt `shi` and stands in front of a 一 in
55
+ * 那是一条狗, 这是一个好主意 and several hundred sentences like them, and every
56
+ * one of them lost its sandhi to a 十 that was never there. 时, 事, 使 and 试 do
57
+ * the same.
58
+ *
59
+ * The 繁體 forms are here because a 繁體 text reaches this pass with 繁體
60
+ * characters. 拾, 佰 and 仟 are the 大写 banking forms, which appear on cheques
61
+ * and in contracts and count exactly as their everyday spellings do.
62
+ */
63
+ export declare const NUMERAL_CHARACTERS: Set<string>;
64
+ /**
65
+ * The 汉字 {@link CONTINUES_NUMBER} names.
66
+ */
67
+ export declare const CONTINUES_NUMBER_CHARACTERS: Set<string>;
68
+ /**
69
+ * The ordinal prefix as it is written.
70
+ */
71
+ export declare const ORDINAL_CHARACTER = "\u7B2C";
72
+ /**
73
+ * Whether a 一 is counting something, which is the only time it takes sandhi.
74
+ *
75
+ * The rule 一 sandhi is usually stated with — fourth tone flattens it, anything
76
+ * else raises it — is about the 一 that *counts*. Two shapes of 一 are not
77
+ * counting and keep the citation tone, and both are standard:
78
+ *
79
+ * - **The last digit of a larger number.** 十一月 is `shíyīyuè` and 二十一岁 is
80
+ * `èrshíyī suì`. The signal is a numeral word before it with nothing numeric
81
+ * after, which is what leaves 一百一十's middle 一 alone: 十 follows it, so it
82
+ * is counting the ten.
83
+ * - **An ordinal.** 第一个 is `dìyī gè`.
84
+ *
85
+ * **Answered from the characters wherever the caller has them**, and from the
86
+ * spellings where it does not. `pinyinjs sandhi shíyī gè` is handed nothing but
87
+ * pinyin, so there the pass still cannot tell 十 from 时 or 第 from 地 and
88
+ * `docs/sandhi/` carries what that costs. A conversion knows which 汉字 it read,
89
+ * and passing them along is what stops 那是一条狗 losing its sandhi to the 是 in
90
+ * front of the 一.
91
+ *
92
+ * The two sides are decided separately, because a run can know one and not the
93
+ * other: a word whose reading has a different syllable count from its character
94
+ * count has no character to offer for any one syllable.
95
+ */
96
+ export declare function isCounting(syllables: readonly Syllable[], at: number, characters?: readonly (string | undefined)[]): boolean;
97
+ //# sourceMappingURL=sandhi-tones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandhi-tones.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi-tones.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,QAAQ,EAAyB,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAK9D;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,aAAyC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,aAAsC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,aAS7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,aAItC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,WAAM,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,EAAE,EAAE,MAAM,EACV,UAAU,GAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAO,GAC/C,OAAO,CAwBT"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Which tone 一 and 不 take, and when a 一 is being counted rather than said.
3
+ *
4
+ * Both characters change tone by what follows them, and 一 additionally does
5
+ * not change at all when it is a number being counted off.
6
+ */
7
+ import { writeSyllableSpelling } from "../syllable/syllable.js";
8
+ import { NEUTRAL_TONE } from "../tone/tone.js";
9
+ /**
10
+ * Whether a syllable is 一, which is the only thing spelled `yi` that sandhis.
11
+ */
12
+ export function isYi(syllable) {
13
+ return syllable.initial === "" && syllable.final === "i";
14
+ }
15
+ /**
16
+ * Whether a syllable is 不.
17
+ */
18
+ export function isBu(syllable) {
19
+ return syllable.initial === "b" && syllable.final === "u";
20
+ }
21
+ /**
22
+ * The tone 一 takes before a given following tone.
23
+ *
24
+ * Fourth tone flattens it to second; anything else raises it to fourth. Before
25
+ * a neutral tone or at the end of a phrase it keeps its citation first tone,
26
+ * since there is nothing to assimilate to.
27
+ */
28
+ export function yiToneBefore(following) {
29
+ if (following === undefined || following === NEUTRAL_TONE) {
30
+ return 1;
31
+ }
32
+ return following === 4 ? 2 : 4;
33
+ }
34
+ /**
35
+ * The numeral words a 一 can be the last digit of.
36
+ *
37
+ * Toneless, because what is being asked is which word it is rather than what
38
+ * tone it is carrying, and 十 is `shí` in every context it appears in here.
39
+ *
40
+ * **亿 is deliberately absent**, and that is measured rather than assumed: no
41
+ * 一 in 88,866 lines of Tatoeba and zh.wikipedia ends a number in 亿, while 意,
42
+ * 议, 义 and 議 all read `yì`, all precede a 一 that really is counting, and
43
+ * would all lose their sandhi for it — 11 conversions against nothing gained.
44
+ * The other three stay, because a number can end 百一 or 千一 even though this
45
+ * corpus has none, and the one thing they cost is 擺一個.
46
+ */
47
+ export const NUMERAL_WORDS = new Set(["shi", "bai", "qian", "wan"]);
48
+ /**
49
+ * The words that carry a number on past a 一, so that it is still counting.
50
+ *
51
+ * 一百一十's second 一 counts the ten it is followed by and takes the sandhi;
52
+ * 二十一's does not, because nothing numeric comes after it.
53
+ */
54
+ export const CONTINUES_NUMBER = new Set([...NUMERAL_WORDS, "ling"]);
55
+ /**
56
+ * The ordinal prefix 第.
57
+ */
58
+ export const ORDINAL_PREFIX = "di";
59
+ /**
60
+ * The 汉字 {@link NUMERAL_WORDS} names, for a caller that has them.
61
+ *
62
+ * The spellings are ambiguous and the characters are not, which is the whole
63
+ * point of carrying both. 是 is spelt `shi` and stands in front of a 一 in
64
+ * 那是一条狗, 这是一个好主意 and several hundred sentences like them, and every
65
+ * one of them lost its sandhi to a 十 that was never there. 时, 事, 使 and 试 do
66
+ * the same.
67
+ *
68
+ * The 繁體 forms are here because a 繁體 text reaches this pass with 繁體
69
+ * characters. 拾, 佰 and 仟 are the 大写 banking forms, which appear on cheques
70
+ * and in contracts and count exactly as their everyday spellings do.
71
+ */
72
+ export const NUMERAL_CHARACTERS = new Set([
73
+ "十",
74
+ "百",
75
+ "千",
76
+ "万",
77
+ "萬",
78
+ "拾",
79
+ "佰",
80
+ "仟",
81
+ ]);
82
+ /**
83
+ * The 汉字 {@link CONTINUES_NUMBER} names.
84
+ */
85
+ export const CONTINUES_NUMBER_CHARACTERS = new Set([
86
+ ...NUMERAL_CHARACTERS,
87
+ "零",
88
+ "〇",
89
+ ]);
90
+ /**
91
+ * The ordinal prefix as it is written.
92
+ */
93
+ export const ORDINAL_CHARACTER = "第";
94
+ /**
95
+ * Whether a 一 is counting something, which is the only time it takes sandhi.
96
+ *
97
+ * The rule 一 sandhi is usually stated with — fourth tone flattens it, anything
98
+ * else raises it — is about the 一 that *counts*. Two shapes of 一 are not
99
+ * counting and keep the citation tone, and both are standard:
100
+ *
101
+ * - **The last digit of a larger number.** 十一月 is `shíyīyuè` and 二十一岁 is
102
+ * `èrshíyī suì`. The signal is a numeral word before it with nothing numeric
103
+ * after, which is what leaves 一百一十's middle 一 alone: 十 follows it, so it
104
+ * is counting the ten.
105
+ * - **An ordinal.** 第一个 is `dìyī gè`.
106
+ *
107
+ * **Answered from the characters wherever the caller has them**, and from the
108
+ * spellings where it does not. `pinyinjs sandhi shíyī gè` is handed nothing but
109
+ * pinyin, so there the pass still cannot tell 十 from 时 or 第 from 地 and
110
+ * `docs/sandhi/` carries what that costs. A conversion knows which 汉字 it read,
111
+ * and passing them along is what stops 那是一条狗 losing its sandhi to the 是 in
112
+ * front of the 一.
113
+ *
114
+ * The two sides are decided separately, because a run can know one and not the
115
+ * other: a word whose reading has a different syllable count from its character
116
+ * count has no character to offer for any one syllable.
117
+ */
118
+ export function isCounting(syllables, at, characters = []) {
119
+ const spelt = (index) => {
120
+ const syllable = syllables[index];
121
+ return syllable === undefined ? "" : writeSyllableSpelling(syllable);
122
+ };
123
+ const before = characters[at - 1];
124
+ if (before === undefined
125
+ ? spelt(at - 1) === ORDINAL_PREFIX
126
+ : before === ORDINAL_CHARACTER) {
127
+ return false;
128
+ }
129
+ if (before === undefined
130
+ ? !NUMERAL_WORDS.has(spelt(at - 1))
131
+ : !NUMERAL_CHARACTERS.has(before)) {
132
+ return true;
133
+ }
134
+ const after = characters[at + 1];
135
+ return after === undefined
136
+ ? CONTINUES_NUMBER.has(spelt(at + 1))
137
+ : CONTINUES_NUMBER_CHARACTERS.has(after);
138
+ }
139
+ //# sourceMappingURL=sandhi-tones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandhi-tones.js","sourceRoot":"","sources":["../../src/decode/sandhi-tones.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type Syllable } from "../syllable/syllable.js";
1
+ import type { Syllable } from "../syllable/syllable.js";
2
2
  /**
3
3
  * How much of the sandhi to apply.
4
4
  */
@@ -39,14 +39,17 @@ export type SandhiGrouping = readonly (number | readonly number[])[];
39
39
  * contextual tone is put back, over the whole syllable array rather than within
40
40
  * a word, which is what lets 不 in one word assimilate to a tone in the next.
41
41
  *
42
- * 一 and 不 assimilate to whatever follows them and need nothing but the
43
- * syllables. Third-tone sandhi is not like that — its domain is the foot rather
44
- * than the syllable string — so `grouping` says where the words and their parts
45
- * are. Without one the whole array is taken for a single word, which is what a
46
- * caller holding nothing but a reading has.
42
+ * 不 assimilates to whatever follows it and needs nothing but the syllables.
43
+ * Third-tone sandhi is not like that — its domain is the foot rather than the
44
+ * syllable string — so `grouping` says where the words and their parts are.
45
+ * Without one the whole array is taken for a single word, which is what a
46
+ * caller holding nothing but a reading has. 一 sits between the two: the tone it
47
+ * takes is settled by the syllables, and whether it takes one at all is a
48
+ * question about the 汉字, so `characters` carries them where the caller has
49
+ * them. See {@link isCounting}.
47
50
  *
48
51
  * Never operates on a string. The old project patched output text with regexes,
49
52
  * which is what made its rules order-dependent and untestable.
50
53
  */
51
- export declare function applySandhi(syllables: readonly Syllable[], options?: SandhiOptions, grouping?: SandhiGrouping): readonly Syllable[];
54
+ export declare function applySandhi(syllables: readonly Syllable[], options?: SandhiOptions, grouping?: SandhiGrouping, characters?: readonly (string | undefined)[]): readonly Syllable[];
52
55
  //# sourceMappingURL=sandhi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sandhi.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAyB,MAAM,yBAAyB,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;AAmNrE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,GAAE,aAAkB,EAC3B,QAAQ,CAAC,EAAE,cAAc,GACxB,SAAS,QAAQ,EAAE,CA6BrB"}
1
+ {"version":3,"file":"sandhi.d.ts","sourceRoot":"","sources":["../../src/decode/sandhi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;AA6HrE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,OAAO,GAAE,aAAkB,EAC3B,QAAQ,CAAC,EAAE,cAAc,EACzB,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAC3C,SAAS,QAAQ,EAAE,CA6BrB"}
@@ -1,84 +1,4 @@
1
- import { writeSyllableSpelling } from "../syllable/syllable.js";
2
- import { NEUTRAL_TONE } from "../tone/tone.js";
3
- /**
4
- * Whether a syllable is 一, which is the only thing spelled `yi` that sandhis.
5
- */
6
- function isYi(syllable) {
7
- return syllable.initial === "" && syllable.final === "i";
8
- }
9
- /**
10
- * Whether a syllable is 不.
11
- */
12
- function isBu(syllable) {
13
- return syllable.initial === "b" && syllable.final === "u";
14
- }
15
- /**
16
- * The tone 一 takes before a given following tone.
17
- *
18
- * Fourth tone flattens it to second; anything else raises it to fourth. Before
19
- * a neutral tone or at the end of a phrase it keeps its citation first tone,
20
- * since there is nothing to assimilate to.
21
- */
22
- function yiToneBefore(following) {
23
- if (following === undefined || following === NEUTRAL_TONE) {
24
- return 1;
25
- }
26
- return following === 4 ? 2 : 4;
27
- }
28
- /**
29
- * The numeral words a 一 can be the last digit of.
30
- *
31
- * Toneless, because what is being asked is which word it is rather than what
32
- * tone it is carrying, and 十 is `shí` in every context it appears in here.
33
- *
34
- * **亿 is deliberately absent**, and that is measured rather than assumed: no
35
- * 一 in 88,866 lines of Tatoeba and zh.wikipedia ends a number in 亿, while 意,
36
- * 议, 义 and 議 all read `yì`, all precede a 一 that really is counting, and
37
- * would all lose their sandhi for it — 11 conversions against nothing gained.
38
- * The other three stay, because a number can end 百一 or 千一 even though this
39
- * corpus has none, and the one thing they cost is 擺一個.
40
- */
41
- const NUMERAL_WORDS = new Set(["shi", "bai", "qian", "wan"]);
42
- /**
43
- * The words that carry a number on past a 一, so that it is still counting.
44
- *
45
- * 一百一十's second 一 counts the ten it is followed by and takes the sandhi;
46
- * 二十一's does not, because nothing numeric comes after it.
47
- */
48
- const CONTINUES_NUMBER = new Set([...NUMERAL_WORDS, "ling"]);
49
- /**
50
- * The ordinal prefix 第.
51
- */
52
- const ORDINAL_PREFIX = "di";
53
- /**
54
- * Whether a 一 is counting something, which is the only time it takes sandhi.
55
- *
56
- * The rule 一 sandhi is usually stated with — fourth tone flattens it, anything
57
- * else raises it — is about the 一 that *counts*. Two shapes of 一 are not
58
- * counting and keep the citation tone, and both are standard:
59
- *
60
- * - **The last digit of a larger number.** 十一月 is `shíyīyuè` and 二十一岁 is
61
- * `èrshíyī suì`. The signal is a numeral word before it with nothing numeric
62
- * after, which is what leaves 一百一十's middle 一 alone: 十 follows it, so it
63
- * is counting the ten.
64
- * - **An ordinal.** 第一个 is `dìyī gè`.
65
- *
66
- * **Read off the syllables rather than the characters**, because that is all
67
- * this pass has: `pinyinjs sandhi shíyī gè` never sees a hanzi. So it cannot
68
- * tell 十 from 时 or 第 from 地, and `docs/sandhi/` carries what that costs —
69
- * measured, not estimated.
70
- */
71
- function isCounting(syllables, at) {
72
- const spelt = (index) => {
73
- const syllable = syllables[index];
74
- return syllable === undefined ? "" : writeSyllableSpelling(syllable);
75
- };
76
- const before = spelt(at - 1);
77
- if (before === ORDINAL_PREFIX) {
78
- return false;
79
- }
80
- return !NUMERAL_WORDS.has(before) || CONTINUES_NUMBER.has(spelt(at + 1));
81
- }
1
+ import { isBu, isCounting, isYi, yiToneBefore } from "./sandhi-tones.js";
82
2
  /**
83
3
  * Read a grouping as the junctions it puts in the syllable array.
84
4
  *
@@ -183,16 +103,19 @@ function applyThirdTone(syllables, grouping) {
183
103
  * contextual tone is put back, over the whole syllable array rather than within
184
104
  * a word, which is what lets 不 in one word assimilate to a tone in the next.
185
105
  *
186
- * 一 and 不 assimilate to whatever follows them and need nothing but the
187
- * syllables. Third-tone sandhi is not like that — its domain is the foot rather
188
- * than the syllable string — so `grouping` says where the words and their parts
189
- * are. Without one the whole array is taken for a single word, which is what a
190
- * caller holding nothing but a reading has.
106
+ * 不 assimilates to whatever follows it and needs nothing but the syllables.
107
+ * Third-tone sandhi is not like that — its domain is the foot rather than the
108
+ * syllable string — so `grouping` says where the words and their parts are.
109
+ * Without one the whole array is taken for a single word, which is what a
110
+ * caller holding nothing but a reading has. 一 sits between the two: the tone it
111
+ * takes is settled by the syllables, and whether it takes one at all is a
112
+ * question about the 汉字, so `characters` carries them where the caller has
113
+ * them. See {@link isCounting}.
191
114
  *
192
115
  * Never operates on a string. The old project patched output text with regexes,
193
116
  * which is what made its rules order-dependent and untestable.
194
117
  */
195
- export function applySandhi(syllables, options = {}, grouping) {
118
+ export function applySandhi(syllables, options = {}, grouping, characters) {
196
119
  const { yiBu = true, thirdTone = false } = options;
197
120
  const applied = thirdTone
198
121
  ? applyThirdTone(syllables, grouping)
@@ -202,7 +125,7 @@ export function applySandhi(syllables, options = {}, grouping) {
202
125
  if (yiBu && isYi(syllable) && syllable.tone === 1) {
203
126
  // A 一 that is not counting keeps its citation tone, so it is left
204
127
  // exactly as the dictionary stored it.
205
- if (isCounting(applied, at)) {
128
+ if (isCounting(applied, at, characters)) {
206
129
  applied[at] = { ...syllable, tone: yiToneBefore(following?.tone) };
207
130
  }
208
131
  continue;