@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,154 @@
1
+ import { READING_CHARGE } from "./lattice.js";
2
+ /**
3
+ * What an edge a hint brought with it costs, in both decodes.
4
+ *
5
+ * Zero, because a caller naming a reading is the strongest evidence the decode
6
+ * has. The other branch of {@link applyHints} says so already by overwriting a
7
+ * dictionary entry's reading where a hint names the same stretch, and an edge
8
+ * with no entry behind it has to say the same thing through its cost.
9
+ *
10
+ * It was {@link import("./lattice-types.js").UNKNOWN_COST} until
11
+ * {@link READING_CHARGE} came down, which worked only while one edge beat two
12
+ * whatever they cost: 玩儿 hinted as `wánr` went back to `wán ér` the moment
13
+ * frequency could speak.
14
+ */
15
+ const HINT_COST = 0;
16
+ /**
17
+ * The same hints with every position moved along by an offset.
18
+ *
19
+ * Word hints match on what is written and so are carried over untouched; only
20
+ * the positional ones are counted from somewhere. Used where a run is decoded
21
+ * with context in front of it, which moves the run's own characters up the
22
+ * lattice by the length of that context.
23
+ */
24
+ export function shiftHints(hints, by) {
25
+ return {
26
+ words: hints.words,
27
+ at: new Map([...hints.at].map(([at, syllable]) => [at + by, syllable])),
28
+ };
29
+ }
30
+ /**
31
+ * The hints that fall inside a run, with their positions made relative to it.
32
+ *
33
+ * A caller counts positions from the start of the whole text, while a run is
34
+ * decoded on its own, so the positions have to be moved to where the run put
35
+ * them — and the ones naming a character in some other run dropped, rather than
36
+ * landing on whatever happens to sit at that index here.
37
+ */
38
+ export function hintsWithin(hints, from, length) {
39
+ const at = new Map();
40
+ for (const [position, syllable] of hints.at) {
41
+ if (position >= from && position < from + length) {
42
+ at.set(position - from, syllable);
43
+ }
44
+ }
45
+ return { words: hints.words, at };
46
+ }
47
+ /**
48
+ * Whether a hint's characters are what stands at a position.
49
+ */
50
+ function matchesAt(hint, characters, at) {
51
+ return hint.characters.every((character, index) => characters[at + index] === character);
52
+ }
53
+ /**
54
+ * A caller's readings, put into a lattice that was built without them.
55
+ *
56
+ * Two kinds of hint with deliberately different reach, which is the whole of
57
+ * the semantics:
58
+ *
59
+ * A **word** hint is an assertion about the text it names, so it rewrites the
60
+ * edge spanning exactly those characters and supplies the single-character
61
+ * edges underneath it. It says nothing about a *longer* word that happens to
62
+ * contain it — a bare 长 hint leaves 校长 as `xiàozhǎng`, because the dictionary
63
+ * knowing 校长 is better evidence about that stretch than a caller's remark
64
+ * about one of its characters. That is what makes a corrections table safe to
65
+ * accumulate: entries do not reach into words nobody was thinking about.
66
+ *
67
+ * A **positional** hint is an assertion about one character of one text, and it
68
+ * is the escape hatch precisely because nothing outranks it: it rewrites every
69
+ * edge covering that position, the enclosing word included. Only a reading of
70
+ * one syllable per character can be rewritten this way; a 儿化 edge is a single
71
+ * claim about its whole span and there is no one syllable in it to replace.
72
+ *
73
+ * Nothing is invented that a caller did not write, and nothing is dropped: an
74
+ * edge whose reading no hint touches comes through as it was.
75
+ */
76
+ export function applyHints(lattice, hints) {
77
+ const { characters } = lattice;
78
+ /** The word hint covering a position, and how far into it that position is. */
79
+ const wordAt = (at) => {
80
+ for (const hint of hints.words) {
81
+ if (hint.reading.length !== hint.characters.length) {
82
+ continue;
83
+ }
84
+ for (let held = 0; held < hint.characters.length; held++) {
85
+ if (at - held >= 0 && matchesAt(hint, characters, at - held)) {
86
+ return { hint, held };
87
+ }
88
+ }
89
+ }
90
+ return undefined;
91
+ };
92
+ const rewrite = (edge) => {
93
+ const span = edge.to - edge.from;
94
+ // A word hint naming exactly this stretch replaces its reading outright,
95
+ // which is the only way a hint can reach a word the dictionary already has
96
+ // an opinion about: 银行 asserted as `yín xíng` has to beat `yínháng`.
97
+ const exact = hints.words.find((hint) => hint.characters.length === span &&
98
+ matchesAt(hint, characters, edge.from));
99
+ let reading = exact === undefined ? edge.reading : exact.reading;
100
+ // Everything below needs one syllable per character to have a syllable to
101
+ // put anywhere.
102
+ if (reading.length === span) {
103
+ reading = reading.map((syllable, index) => {
104
+ const at = edge.from + index;
105
+ const positional = hints.at.get(at);
106
+ if (positional !== undefined) {
107
+ return positional;
108
+ }
109
+ if (span > 1) {
110
+ return syllable;
111
+ }
112
+ // Single-character edges also take what a longer word hint says about
113
+ // this position, so that the split path reads the same as the whole.
114
+ const found = wordAt(at);
115
+ return found?.hint.reading[found.held] ?? syllable;
116
+ });
117
+ }
118
+ return reading === edge.reading ? edge : { ...edge, reading };
119
+ };
120
+ return {
121
+ characters,
122
+ edges: lattice.edges.map((edges, at) => {
123
+ const rewritten = edges.map((edge) => rewrite(edge));
124
+ // A hint spanning characters no edge covers has nowhere to be written, so
125
+ // it brings its own edge: 玩儿 as `wánr` where the dictionary lacks it.
126
+ const spanning = hints.words.find((hint) => hint.reading.length !== hint.characters.length &&
127
+ matchesAt(hint, characters, at) &&
128
+ !rewritten.some((edge) => edge.to === at + hint.characters.length));
129
+ if (spanning === undefined) {
130
+ return rewritten;
131
+ }
132
+ const to = at + spanning.characters.length;
133
+ return [
134
+ ...rewritten,
135
+ {
136
+ from: at,
137
+ to,
138
+ text: spanning.characters.join(""),
139
+ reading: spanning.reading,
140
+ cost: HINT_COST,
141
+ readingCost: HINT_COST + READING_CHARGE,
142
+ isProperNoun: false,
143
+ partOfSpeech: "",
144
+ // No dictionary entry backs this one — that is the whole reason it
145
+ // had to be brought along — so it reports itself as the fallback it
146
+ // is. A hint written over an edge that *was* backed keeps that edge's
147
+ // own answer, since the entry still covers those characters.
148
+ isKnown: false,
149
+ },
150
+ ];
151
+ }),
152
+ };
153
+ }
154
+ //# sourceMappingURL=hint-lattice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hint-lattice.js","sourceRoot":"","sources":["../../src/decode/hint-lattice.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { type Syllable } from "../syllable/syllable.js";
2
- import { type Lattice } from "./lattice.js";
3
2
  /**
4
3
  * A reading a caller asserts for a word, wherever that word occurs.
5
4
  *
@@ -68,7 +67,7 @@ export interface ResolvedHints {
68
67
  /**
69
68
  * One word hint, with its characters and reading already taken apart.
70
69
  */
71
- interface WordHint {
70
+ export interface WordHint {
72
71
  readonly characters: readonly string[];
73
72
  readonly reading: readonly Syllable[];
74
73
  }
@@ -92,47 +91,5 @@ export declare function readHintReading(reading: string, subject: string): reado
92
91
  * longest-wins rule the dictionary itself is read by.
93
92
  */
94
93
  export declare function resolveHints(hints: ReadingHints): ResolvedHints;
95
- /**
96
- * The same hints with every position moved along by an offset.
97
- *
98
- * Word hints match on what is written and so are carried over untouched; only
99
- * the positional ones are counted from somewhere. Used where a run is decoded
100
- * with context in front of it, which moves the run's own characters up the
101
- * lattice by the length of that context.
102
- */
103
- export declare function shiftHints(hints: ResolvedHints, by: number): ResolvedHints;
104
- /**
105
- * The hints that fall inside a run, with their positions made relative to it.
106
- *
107
- * A caller counts positions from the start of the whole text, while a run is
108
- * decoded on its own, so the positions have to be moved to where the run put
109
- * them — and the ones naming a character in some other run dropped, rather than
110
- * landing on whatever happens to sit at that index here.
111
- */
112
- export declare function hintsWithin(hints: ResolvedHints, from: number, length: number): ResolvedHints;
113
- /**
114
- * A caller's readings, put into a lattice that was built without them.
115
- *
116
- * Two kinds of hint with deliberately different reach, which is the whole of
117
- * the semantics:
118
- *
119
- * A **word** hint is an assertion about the text it names, so it rewrites the
120
- * edge spanning exactly those characters and supplies the single-character
121
- * edges underneath it. It says nothing about a *longer* word that happens to
122
- * contain it — a bare 长 hint leaves 校长 as `xiàozhǎng`, because the dictionary
123
- * knowing 校长 is better evidence about that stretch than a caller's remark
124
- * about one of its characters. That is what makes a corrections table safe to
125
- * accumulate: entries do not reach into words nobody was thinking about.
126
- *
127
- * A **positional** hint is an assertion about one character of one text, and it
128
- * is the escape hatch precisely because nothing outranks it: it rewrites every
129
- * edge covering that position, the enclosing word included. Only a reading of
130
- * one syllable per character can be rewritten this way; a 儿化 edge is a single
131
- * claim about its whole span and there is no one syllable in it to replace.
132
- *
133
- * Nothing is invented that a caller did not write, and nothing is dropped: an
134
- * edge whose reading no hint touches comes through as it was.
135
- */
136
- export declare function applyHints(lattice: Lattice, hints: ResolvedHints): Lattice;
137
- export {};
94
+ export { applyHints, hintsWithin, shiftHints } from "./hint-lattice.js";
138
95
  //# sourceMappingURL=hints.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/decode/hints.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EACL,KAAK,OAAO,EAIb,MAAM,cAAc,CAAC;AAEtB;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChC,SAAS,WAAW,EAAE,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,UAAU,QAAQ;IAChB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;CACvC;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,SAAS,QAAQ,EAAE,CAYrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAwC/D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CAK1E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,aAAa,CAQf;AAeD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAyF1E"}
1
+ {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/decode/hints.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGtE;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChC,SAAS,WAAW,EAAE,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;CACvC;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,SAAS,QAAQ,EAAE,CAYrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAwC/D;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { toCharacters } from "../script/characters.js";
2
2
  import { readSyllable } from "../syllable/syllable.js";
3
3
  import { NEUTRAL_TONE } from "../tone/tone.js";
4
- import { READING_CHARGE, UNKNOWN_COST, } from "./lattice.js";
5
4
  /**
6
5
  * Whether a hint names a position rather than a word.
7
6
  */
@@ -73,142 +72,5 @@ export function resolveHints(hints) {
73
72
  words.sort((left, right) => right.characters.length - left.characters.length);
74
73
  return { words, at };
75
74
  }
76
- /**
77
- * The same hints with every position moved along by an offset.
78
- *
79
- * Word hints match on what is written and so are carried over untouched; only
80
- * the positional ones are counted from somewhere. Used where a run is decoded
81
- * with context in front of it, which moves the run's own characters up the
82
- * lattice by the length of that context.
83
- */
84
- export function shiftHints(hints, by) {
85
- return {
86
- words: hints.words,
87
- at: new Map([...hints.at].map(([at, syllable]) => [at + by, syllable])),
88
- };
89
- }
90
- /**
91
- * The hints that fall inside a run, with their positions made relative to it.
92
- *
93
- * A caller counts positions from the start of the whole text, while a run is
94
- * decoded on its own, so the positions have to be moved to where the run put
95
- * them — and the ones naming a character in some other run dropped, rather than
96
- * landing on whatever happens to sit at that index here.
97
- */
98
- export function hintsWithin(hints, from, length) {
99
- const at = new Map();
100
- for (const [position, syllable] of hints.at) {
101
- if (position >= from && position < from + length) {
102
- at.set(position - from, syllable);
103
- }
104
- }
105
- return { words: hints.words, at };
106
- }
107
- /**
108
- * Whether a hint's characters are what stands at a position.
109
- */
110
- function matchesAt(hint, characters, at) {
111
- return hint.characters.every((character, index) => characters[at + index] === character);
112
- }
113
- /**
114
- * A caller's readings, put into a lattice that was built without them.
115
- *
116
- * Two kinds of hint with deliberately different reach, which is the whole of
117
- * the semantics:
118
- *
119
- * A **word** hint is an assertion about the text it names, so it rewrites the
120
- * edge spanning exactly those characters and supplies the single-character
121
- * edges underneath it. It says nothing about a *longer* word that happens to
122
- * contain it — a bare 长 hint leaves 校长 as `xiàozhǎng`, because the dictionary
123
- * knowing 校长 is better evidence about that stretch than a caller's remark
124
- * about one of its characters. That is what makes a corrections table safe to
125
- * accumulate: entries do not reach into words nobody was thinking about.
126
- *
127
- * A **positional** hint is an assertion about one character of one text, and it
128
- * is the escape hatch precisely because nothing outranks it: it rewrites every
129
- * edge covering that position, the enclosing word included. Only a reading of
130
- * one syllable per character can be rewritten this way; a 儿化 edge is a single
131
- * claim about its whole span and there is no one syllable in it to replace.
132
- *
133
- * Nothing is invented that a caller did not write, and nothing is dropped: an
134
- * edge whose reading no hint touches comes through as it was.
135
- */
136
- export function applyHints(lattice, hints) {
137
- const { characters } = lattice;
138
- /** The word hint covering a position, and how far into it that position is. */
139
- const wordAt = (at) => {
140
- for (const hint of hints.words) {
141
- if (hint.reading.length !== hint.characters.length) {
142
- continue;
143
- }
144
- for (let held = 0; held < hint.characters.length; held++) {
145
- if (at - held >= 0 && matchesAt(hint, characters, at - held)) {
146
- return { hint, held };
147
- }
148
- }
149
- }
150
- return undefined;
151
- };
152
- const rewrite = (edge) => {
153
- const span = edge.to - edge.from;
154
- // A word hint naming exactly this stretch replaces its reading outright,
155
- // which is the only way a hint can reach a word the dictionary already has
156
- // an opinion about: 银行 asserted as `yín xíng` has to beat `yínháng`.
157
- const exact = hints.words.find((hint) => hint.characters.length === span &&
158
- matchesAt(hint, characters, edge.from));
159
- let reading = exact === undefined ? edge.reading : exact.reading;
160
- // Everything below needs one syllable per character to have a syllable to
161
- // put anywhere.
162
- if (reading.length === span) {
163
- reading = reading.map((syllable, index) => {
164
- const at = edge.from + index;
165
- const positional = hints.at.get(at);
166
- if (positional !== undefined) {
167
- return positional;
168
- }
169
- if (span > 1) {
170
- return syllable;
171
- }
172
- // Single-character edges also take what a longer word hint says about
173
- // this position, so that the split path reads the same as the whole.
174
- const found = wordAt(at);
175
- return found?.hint.reading[found.held] ?? syllable;
176
- });
177
- }
178
- return reading === edge.reading ? edge : { ...edge, reading };
179
- };
180
- return {
181
- characters,
182
- edges: lattice.edges.map((edges, at) => {
183
- const rewritten = edges.map((edge) => rewrite(edge));
184
- // A hint spanning characters no edge covers has nowhere to be written, so
185
- // it brings its own edge: 玩儿 as `wánr` where the dictionary lacks it.
186
- const spanning = hints.words.find((hint) => hint.reading.length !== hint.characters.length &&
187
- matchesAt(hint, characters, at) &&
188
- !rewritten.some((edge) => edge.to === at + hint.characters.length));
189
- if (spanning === undefined) {
190
- return rewritten;
191
- }
192
- const to = at + spanning.characters.length;
193
- return [
194
- ...rewritten,
195
- {
196
- from: at,
197
- to,
198
- text: spanning.characters.join(""),
199
- reading: spanning.reading,
200
- cost: UNKNOWN_COST,
201
- readingCost: UNKNOWN_COST + READING_CHARGE,
202
- isProperNoun: false,
203
- partOfSpeech: "",
204
- // No dictionary entry backs this one — that is the whole reason it
205
- // had to be brought along — so it reports itself as the fallback it
206
- // is. A hint written over an edge that *was* backed keeps that edge's
207
- // own answer, since the entry still covers those characters.
208
- isKnown: false,
209
- },
210
- ];
211
- }),
212
- };
213
- }
75
+ export { applyHints, hintsWithin, shiftHints } from "./hint-lattice.js";
214
76
  //# sourceMappingURL=hints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hints.js","sourceRoot":"","sources":["../../src/decode/hints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hints.js","sourceRoot":"","sources":["../../src/decode/hints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAiB,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAkF/C;;GAEG;AACH,SAAS,YAAY,CAAC,IAAiB;IACrC,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,OAAe;IAEf,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,WAAW,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,mBAAmB,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,IAAI,GAA2B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAA+B,CAAC,CAAC,GAAG,CACjD,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACzC,CAAC;IAEN,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,OAAO,GAAG,YAAY,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,sEAAsE;YACtE,0EAA0E;YAC1E,8DAA8D;YAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,yBAAyB,IAAI,CAAC,OAAO,EAAE,CACnE,CAAC;YACJ,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,UAAU;YACV,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9E,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Whether a 教 is teaching or is the noun 教.
3
+ *
4
+ * Teaching takes an object or is followed by aspect, and only a verb takes
5
+ * either, so the tags around it are the evidence.
6
+ */
7
+ import type { Syllable } from "../syllable/syllable.js";
8
+ import { type EdgeContext, type EdgeRule } from "./rules.js";
9
+ /**
10
+ * Whether a syllable is `jiāo`, the verbal reading of 教.
11
+ */
12
+ export declare function isJiao(syllable: Syllable | undefined): boolean;
13
+ /**
14
+ * What a 教 that is teaching governs: the thing or the person taught.
15
+ *
16
+ * A pronoun, a common noun, a name or one of the tags jieba gives a subject —
17
+ * 教我, 教英语, 教历史, 教孩子, 教玛丽. `ns` is deliberately absent, since the
18
+ * only 教 with a place tag after it over the corpus is 教青局, an office.
19
+ */
20
+ export declare const TAUGHT_TAGS: Set<string>;
21
+ /**
22
+ * Whether the 教 at a position is teaching something to somebody.
23
+ *
24
+ * The object is what says so, which is the same shape the modal 得 rule takes:
25
+ * a 教 with a pronoun, a noun or a name after it is governing it, and a 教 with
26
+ * 了, 过, 着 or 得 after it is a verb whatever follows that. A particle in front
27
+ * of it rules it out, since a verb does not follow one.
28
+ *
29
+ * {@link GOVERNING} is the case where nothing follows to look at.
30
+ */
31
+ export declare function isTeachingAt(context: EdgeContext, at: number): boolean;
32
+ /**
33
+ * 教 read as `jiāo` where it is teaching rather than a religion.
34
+ *
35
+ * The dictionary stores 教 as `jiào` with `jiāo` as an alternate, and `jiào` is
36
+ * right for the compounds — 教育, 教师, 宗教, 主教 — which are words and reach
37
+ * their reading through the word. What is left is the 教 that stands as a word
38
+ * of its own, and that one is the verb: 他在北京大学教了三年书 came out
39
+ * `jiàole sān nián shū`, and 我教英语, 谁教你法语 and 她教我如何游泳 with it.
40
+ * 教书 is a word and was always `jiāo shū`; nothing carried that across a 了.
41
+ *
42
+ * See {@link isTeachingAt} for what decides it. Forcing the single-character
43
+ * edge is not enough on its own, because a reading spanning two characters
44
+ * carries its own 教 into the position: 王老师教我们汉语 read `jiào` off 师教,
45
+ * and 来教我 off 来教. Those are pairs the dictionary holds with no part of
46
+ * speech and at the cost of a word nothing has ever counted — a reading rather
47
+ * than a word — so a *tagged* word ending in 教 is left alone, which is every
48
+ * one that matters: 任教, 宗教, 主教, 佛教, 传教, 执教, 请教, 家教.
49
+ *
50
+ * Measured over 88,866 lines of Tatoeba and zh.wikipedia, 181 教 decode as a
51
+ * word of their own and every one of them read `jiào`. This moves 162 to
52
+ * `jiāo` and is wrong on three: 统一教创始人, 方法教深思 and 做到了教政分离,
53
+ * where a nominal compound takes an object's shape, the last of them because
54
+ * 做到了 is a word and so the 了 in front is not a particle to look at. Of the
55
+ * 17 it leaves, 8 are right — 诸教中, 教外别传, 董教总, 风教, 教青局 twice, a
56
+ * 教室 reached through a bad split, and a 教 used as a bare noun — and 9 are
57
+ * misses, where jieba tags the object something this does not name.
58
+ *
59
+ * {@link GOVERNING} is four of that 162 and was added later: 能教教我,
60
+ * 要教一節課, 也會教像拉丁語, 這在學校是不教的. 有 is pointedly outside it,
61
+ * since 有教无类 is `yǒujiào wúlèi`.
62
+ */
63
+ export declare const TEACHING_JIAO: EdgeRule;
64
+ //# sourceMappingURL=jiao-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiao-rule.d.ts","sourceRoot":"","sources":["../../src/decode/jiao-rule.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAId,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAI9D;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,aAA8C,CAAC;AAkCvE;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAUtE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,aAAa,EAAE,QAiB3B,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { ASPECT, PARTICLE_TAG, tagOf, wordEndingAt, wordStartingAt, } from "./rules.js";
2
+ /**
3
+ * Whether a syllable is `jiāo`, the verbal reading of 教.
4
+ */
5
+ export function isJiao(syllable) {
6
+ return (syllable?.initial === "j" && syllable.final === "iao" && syllable.tone === 1);
7
+ }
8
+ /**
9
+ * What a 教 that is teaching governs: the thing or the person taught.
10
+ *
11
+ * A pronoun, a common noun, a name or one of the tags jieba gives a subject —
12
+ * 教我, 教英语, 教历史, 教孩子, 教玛丽. `ns` is deliberately absent, since the
13
+ * only 教 with a place tag after it over the corpus is 教青局, an office.
14
+ */
15
+ export const TAUGHT_TAGS = new Set(["r", "n", "nz", "nr", "nt", "ng"]);
16
+ /**
17
+ * The words that can only be governing a verb, whatever comes after them.
18
+ *
19
+ * The far side of the context, for the 教 that teaches nothing named:
20
+ * 他怎么教,我都学不会, 你没能力教, 这在学校是不教的, 有时也会教. A modal or a
21
+ * negator has to be followed by a verb, so the 教 after one is the verb even
22
+ * where nothing at all follows it.
23
+ *
24
+ * Written out rather than taken from a tag, for the reason the 长 rule gives:
25
+ * jieba calls 会 `v` along with every other verb and 怎么 `r` along with every
26
+ * pronoun, so neither tag names this set.
27
+ */
28
+ const GOVERNING = new Set([
29
+ "不",
30
+ "能",
31
+ "会",
32
+ "會",
33
+ "要",
34
+ "想",
35
+ "该",
36
+ "該",
37
+ "也",
38
+ "别",
39
+ "別",
40
+ "没",
41
+ "沒",
42
+ "怎么",
43
+ "怎麼",
44
+ "怎样",
45
+ "怎樣",
46
+ ]);
47
+ /**
48
+ * Whether the 教 at a position is teaching something to somebody.
49
+ *
50
+ * The object is what says so, which is the same shape the modal 得 rule takes:
51
+ * a 教 with a pronoun, a noun or a name after it is governing it, and a 教 with
52
+ * 了, 过, 着 or 得 after it is a verb whatever follows that. A particle in front
53
+ * of it rules it out, since a verb does not follow one.
54
+ *
55
+ * {@link GOVERNING} is the case where nothing follows to look at.
56
+ */
57
+ export function isTeachingAt(context, at) {
58
+ const before = wordEndingAt(context, at);
59
+ if (tagOf(context, before).startsWith(PARTICLE_TAG)) {
60
+ return false;
61
+ }
62
+ return (GOVERNING.has(before ?? "") ||
63
+ ASPECT.has(context.characters[at + 1] ?? "") ||
64
+ TAUGHT_TAGS.has(tagOf(context, wordStartingAt(context, at + 1))));
65
+ }
66
+ /**
67
+ * 教 read as `jiāo` where it is teaching rather than a religion.
68
+ *
69
+ * The dictionary stores 教 as `jiào` with `jiāo` as an alternate, and `jiào` is
70
+ * right for the compounds — 教育, 教师, 宗教, 主教 — which are words and reach
71
+ * their reading through the word. What is left is the 教 that stands as a word
72
+ * of its own, and that one is the verb: 他在北京大学教了三年书 came out
73
+ * `jiàole sān nián shū`, and 我教英语, 谁教你法语 and 她教我如何游泳 with it.
74
+ * 教书 is a word and was always `jiāo shū`; nothing carried that across a 了.
75
+ *
76
+ * See {@link isTeachingAt} for what decides it. Forcing the single-character
77
+ * edge is not enough on its own, because a reading spanning two characters
78
+ * carries its own 教 into the position: 王老师教我们汉语 read `jiào` off 师教,
79
+ * and 来教我 off 来教. Those are pairs the dictionary holds with no part of
80
+ * speech and at the cost of a word nothing has ever counted — a reading rather
81
+ * than a word — so a *tagged* word ending in 教 is left alone, which is every
82
+ * one that matters: 任教, 宗教, 主教, 佛教, 传教, 执教, 请教, 家教.
83
+ *
84
+ * Measured over 88,866 lines of Tatoeba and zh.wikipedia, 181 教 decode as a
85
+ * word of their own and every one of them read `jiào`. This moves 162 to
86
+ * `jiāo` and is wrong on three: 统一教创始人, 方法教深思 and 做到了教政分离,
87
+ * where a nominal compound takes an object's shape, the last of them because
88
+ * 做到了 is a word and so the 了 in front is not a particle to look at. Of the
89
+ * 17 it leaves, 8 are right — 诸教中, 教外别传, 董教总, 风教, 教青局 twice, a
90
+ * 教室 reached through a bad split, and a 教 used as a bare noun — and 9 are
91
+ * misses, where jieba tags the object something this does not name.
92
+ *
93
+ * {@link GOVERNING} is four of that 162 and was added later: 能教教我,
94
+ * 要教一節課, 也會教像拉丁語, 這在學校是不教的. 有 is pointedly outside it,
95
+ * since 有教无类 is `yǒujiào wúlèi`.
96
+ */
97
+ export const TEACHING_JIAO = {
98
+ name: "teaching-jiao",
99
+ verdictFor: (context) => {
100
+ const { edge } = context;
101
+ if (edge.text === "教") {
102
+ return isJiao(edge.reading[0]) && isTeachingAt(context, edge.from)
103
+ ? "force"
104
+ : "keep";
105
+ }
106
+ return edge.partOfSpeech === "" &&
107
+ edge.text.endsWith("教") &&
108
+ edge.reading.length === edge.to - edge.from &&
109
+ !isJiao(edge.reading.at(-1)) &&
110
+ isTeachingAt(context, edge.to - 1)
111
+ ? "forbid"
112
+ : "keep";
113
+ },
114
+ };
115
+ //# sourceMappingURL=jiao-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiao-rule.js","sourceRoot":"","sources":["../../src/decode/jiao-rule.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,MAAM,EACN,YAAY,EAGZ,KAAK,EACL,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,QAA8B;IACnD,OAAO,CACL,QAAQ,EAAE,OAAO,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;CACL,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,OAAoB,EAAE,EAAU;IAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CACjE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,IAAI,EAAE,eAAe;IACrB,UAAU,EAAE,CAAC,OAAoB,EAAE,EAAE;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;gBAChE,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,MAAM,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,KAAK,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI;YAC3C,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,CAAC;IACb,CAAC;CACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * What the lattice cost, forwards and backwards.
3
+ *
4
+ * The two sweeps a confidence score is read off: the cheapest way into every
5
+ * position and the cheapest way out of it. An edge is uncertain exactly where
6
+ * some rival edge over the same characters costs nearly as little.
7
+ */
8
+ import type { ReadingUnit } from "./locking.js";
9
+ import type { Lattice, LatticeEdge } from "./lattice.js";
10
+ import type { CostOf } from "./viterbi.js";
11
+ /**
12
+ * One distinct reading claimed in a stretch, and what claiming it costs.
13
+ */
14
+ export interface ScoredClaim {
15
+ readonly unit: ReadingUnit;
16
+ readonly cost: number;
17
+ }
18
+ /**
19
+ * Every distinct reading claimed in a stretch, and the stretch's own best cost.
20
+ */
21
+ export interface ScoredStretch {
22
+ readonly claims: ReadonlyMap<string, ScoredClaim>;
23
+ readonly best: number;
24
+ }
25
+ /**
26
+ * The edges leaving one position.
27
+ */
28
+ export declare function edgesAt(lattice: Lattice, at: number): readonly LatticeEdge[];
29
+ /**
30
+ * Every edge lying wholly inside a stretch.
31
+ */
32
+ export declare function edgesInside(lattice: Lattice, from: number, to: number): readonly LatticeEdge[];
33
+ /**
34
+ * Cheapest cost of reaching each position in a stretch from its start.
35
+ */
36
+ export declare function forwardCosts(lattice: Lattice, from: number, to: number, costOf: CostOf): readonly number[];
37
+ /**
38
+ * Cheapest cost of reaching the end of a stretch from each position in it.
39
+ */
40
+ export declare function backwardCosts(lattice: Lattice, from: number, to: number, costOf: CostOf): readonly number[];
41
+ /**
42
+ * Price every distinct reading a stretch offers.
43
+ *
44
+ * A claim is priced by the cheapest path through the whole stretch that makes
45
+ * it, which is what makes the figures comparable: a reading can be expensive
46
+ * because it forces expensive readings around it as much as because it is
47
+ * itself unlikely. One forward sweep and one backward sweep give that for every
48
+ * edge at once, which is the same work the decode already does in one
49
+ * direction.
50
+ */
51
+ export declare function scoreClaims(lattice: Lattice, from: number, to: number, costOf: CostOf): ScoredStretch;
52
+ /**
53
+ * What a unit beat: the claims overlapping its span, other than its own.
54
+ */
55
+ //# sourceMappingURL=lattice-costs.d.ts.map