@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.
- package/README.md +128 -123
- package/data/full.entries +2595 -2595
- package/data/manifest.json +5 -5
- package/data/script.map +66 -3
- package/dist/accuracy/score-case.d.ts +23 -0
- package/dist/accuracy/score-case.d.ts.map +1 -0
- package/dist/accuracy/score-case.js +63 -0
- package/dist/accuracy/score-case.js.map +1 -0
- package/dist/accuracy/score.d.ts +1 -8
- package/dist/accuracy/score.d.ts.map +1 -1
- package/dist/accuracy/score.js +1 -55
- package/dist/accuracy/score.js.map +1 -1
- package/dist/cli/arguments.d.ts +4 -290
- package/dist/cli/arguments.d.ts.map +1 -1
- package/dist/cli/arguments.js +5 -357
- package/dist/cli/arguments.js.map +1 -1
- package/dist/cli/check-command.d.ts +9 -0
- package/dist/cli/check-command.d.ts.map +1 -0
- package/dist/cli/check-command.js +95 -0
- package/dist/cli/check-command.js.map +1 -0
- package/dist/cli/cli-input.d.ts +49 -0
- package/dist/cli/cli-input.d.ts.map +1 -0
- package/dist/cli/cli-input.js +31 -0
- package/dist/cli/cli-input.js.map +1 -0
- package/dist/cli/command.d.ts +97 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +40 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands.d.ts +7 -110
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +14 -991
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/convert-command.d.ts +6 -0
- package/dist/cli/convert-command.d.ts.map +1 -0
- package/dist/cli/convert-command.js +52 -0
- package/dist/cli/convert-command.js.map +1 -0
- package/dist/cli/environment.d.ts +1 -1
- package/dist/cli/environment.d.ts.map +1 -1
- package/dist/cli/explain-command.d.ts +6 -0
- package/dist/cli/explain-command.d.ts.map +1 -0
- package/dist/cli/explain-command.js +40 -0
- package/dist/cli/explain-command.js.map +1 -0
- package/dist/cli/explain-syllable.d.ts +10 -0
- package/dist/cli/explain-syllable.d.ts.map +1 -0
- package/dist/cli/explain-syllable.js +70 -0
- package/dist/cli/explain-syllable.js.map +1 -0
- package/dist/cli/flag-help.d.ts +18 -0
- package/dist/cli/flag-help.d.ts.map +1 -0
- package/dist/cli/flag-help.js +78 -0
- package/dist/cli/flag-help.js.map +1 -0
- package/dist/cli/flag-lists.d.ts +49 -0
- package/dist/cli/flag-lists.d.ts.map +1 -0
- package/dist/cli/flag-lists.js +58 -0
- package/dist/cli/flag-lists.js.map +1 -0
- package/dist/cli/flag-values.d.ts +44 -0
- package/dist/cli/flag-values.d.ts.map +1 -0
- package/dist/cli/flag-values.js +56 -0
- package/dist/cli/flag-values.js.map +1 -0
- package/dist/cli/flags.d.ts +193 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +133 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/format-options.d.ts +29 -0
- package/dist/cli/format-options.d.ts.map +1 -0
- package/dist/cli/format-options.js +72 -0
- package/dist/cli/format-options.js.map +1 -0
- package/dist/cli/global-help.d.ts +23 -0
- package/dist/cli/global-help.d.ts.map +1 -0
- package/dist/cli/global-help.js +40 -0
- package/dist/cli/global-help.js.map +1 -0
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -99
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/html-commands.d.ts +13 -0
- package/dist/cli/html-commands.d.ts.map +1 -0
- package/dist/cli/html-commands.js +49 -0
- package/dist/cli/html-commands.js.map +1 -0
- package/dist/cli/info-command.d.ts +7 -0
- package/dist/cli/info-command.d.ts.map +1 -0
- package/dist/cli/info-command.js +39 -0
- package/dist/cli/info-command.js.map +1 -0
- package/dist/cli/lookup-commands.d.ts +10 -0
- package/dist/cli/lookup-commands.d.ts.map +1 -0
- package/dist/cli/lookup-commands.js +101 -0
- package/dist/cli/lookup-commands.js.map +1 -0
- package/dist/cli/match-command.d.ts +11 -0
- package/dist/cli/match-command.d.ts.map +1 -0
- package/dist/cli/match-command.js +76 -0
- package/dist/cli/match-command.js.map +1 -0
- package/dist/cli/number-command.d.ts +12 -0
- package/dist/cli/number-command.d.ts.map +1 -0
- package/dist/cli/number-command.js +89 -0
- package/dist/cli/number-command.js.map +1 -0
- package/dist/cli/options.d.ts +30 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +54 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/run-command.d.ts +24 -0
- package/dist/cli/run-command.d.ts.map +1 -0
- package/dist/cli/run-command.js +40 -0
- package/dist/cli/run-command.js.map +1 -0
- package/dist/cli/run.d.ts +4 -42
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +6 -61
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/script-command.d.ts +10 -0
- package/dist/cli/script-command.d.ts.map +1 -0
- package/dist/cli/script-command.js +58 -0
- package/dist/cli/script-command.js.map +1 -0
- package/dist/cli/segment-command.d.ts +11 -0
- package/dist/cli/segment-command.d.ts.map +1 -0
- package/dist/cli/segment-command.js +53 -0
- package/dist/cli/segment-command.js.map +1 -0
- package/dist/cli/slug-command.d.ts +10 -0
- package/dist/cli/slug-command.d.ts.map +1 -0
- package/dist/cli/slug-command.js +28 -0
- package/dist/cli/slug-command.js.map +1 -0
- package/dist/cli/syllable-command.d.ts +14 -0
- package/dist/cli/syllable-command.d.ts.map +1 -0
- package/dist/cli/syllable-command.js +82 -0
- package/dist/cli/syllable-command.js.map +1 -0
- package/dist/cli/system-table.d.ts +12 -0
- package/dist/cli/system-table.d.ts.map +1 -0
- package/dist/cli/system-table.js +48 -0
- package/dist/cli/system-table.js.map +1 -0
- package/dist/cli/systems.d.ts +57 -0
- package/dist/cli/systems.d.ts.map +1 -0
- package/dist/cli/systems.js +27 -0
- package/dist/cli/systems.js.map +1 -0
- package/dist/cli/transcribe-command.d.ts +18 -0
- package/dist/cli/transcribe-command.d.ts.map +1 -0
- package/dist/cli/transcribe-command.js +86 -0
- package/dist/cli/transcribe-command.js.map +1 -0
- package/dist/cli/transcribe-reading.d.ts +15 -0
- package/dist/cli/transcribe-reading.d.ts.map +1 -0
- package/dist/cli/transcribe-reading.js +90 -0
- package/dist/cli/transcribe-reading.js.map +1 -0
- package/dist/cli/transcribe-rows.d.ts +26 -0
- package/dist/cli/transcribe-rows.d.ts.map +1 -0
- package/dist/cli/transcribe-rows.js +30 -0
- package/dist/cli/transcribe-rows.js.map +1 -0
- package/dist/cli/usage-error.d.ts +9 -0
- package/dist/cli/usage-error.d.ts.map +1 -0
- package/dist/cli/usage-error.js +9 -0
- package/dist/cli/usage-error.js.map +1 -0
- package/dist/decode/alternatives.d.ts +16 -0
- package/dist/decode/alternatives.d.ts.map +1 -0
- package/dist/decode/alternatives.js +31 -0
- package/dist/decode/alternatives.js.map +1 -0
- package/dist/decode/chang-context.d.ts +27 -0
- package/dist/decode/chang-context.d.ts.map +1 -0
- package/dist/decode/chang-context.js +66 -0
- package/dist/decode/chang-context.js.map +1 -0
- package/dist/decode/chang-rule.d.ts +37 -0
- package/dist/decode/chang-rule.d.ts.map +1 -0
- package/dist/decode/chang-rule.js +169 -0
- package/dist/decode/chang-rule.js.map +1 -0
- package/dist/decode/confidence.d.ts +11 -3
- package/dist/decode/confidence.d.ts.map +1 -1
- package/dist/decode/confidence.js +14 -121
- package/dist/decode/confidence.js.map +1 -1
- package/dist/decode/convert-options.d.ts +116 -0
- package/dist/decode/convert-options.d.ts.map +1 -0
- package/dist/decode/convert-options.js +2 -0
- package/dist/decode/convert-options.js.map +1 -0
- package/dist/decode/convert-pipeline.d.ts +18 -0
- package/dist/decode/convert-pipeline.d.ts.map +1 -0
- package/dist/decode/convert-pipeline.js +67 -0
- package/dist/decode/convert-pipeline.js.map +1 -0
- package/dist/decode/convert.d.ts +9 -118
- package/dist/decode/convert.d.ts.map +1 -1
- package/dist/decode/convert.js +5 -453
- package/dist/decode/convert.js.map +1 -1
- package/dist/decode/de-rule.d.ts +54 -0
- package/dist/decode/de-rule.d.ts.map +1 -0
- package/dist/decode/de-rule.js +113 -0
- package/dist/decode/de-rule.js.map +1 -0
- package/dist/decode/decode.d.ts +2 -15
- package/dist/decode/decode.d.ts.map +1 -1
- package/dist/decode/decode.js +2 -121
- package/dist/decode/decode.js.map +1 -1
- package/dist/decode/decoders.d.ts +32 -0
- package/dist/decode/decoders.d.ts.map +1 -0
- package/dist/decode/decoders.js +29 -0
- package/dist/decode/decoders.js.map +1 -0
- package/dist/decode/edge-context.d.ts +38 -0
- package/dist/decode/edge-context.d.ts.map +1 -0
- package/dist/decode/edge-context.js +57 -0
- package/dist/decode/edge-context.js.map +1 -0
- package/dist/decode/hint-lattice.d.ts +45 -0
- package/dist/decode/hint-lattice.d.ts.map +1 -0
- package/dist/decode/hint-lattice.js +154 -0
- package/dist/decode/hint-lattice.js.map +1 -0
- package/dist/decode/hints.d.ts +2 -45
- package/dist/decode/hints.d.ts.map +1 -1
- package/dist/decode/hints.js +1 -139
- package/dist/decode/hints.js.map +1 -1
- package/dist/decode/jiao-rule.d.ts +64 -0
- package/dist/decode/jiao-rule.d.ts.map +1 -0
- package/dist/decode/jiao-rule.js +115 -0
- package/dist/decode/jiao-rule.js.map +1 -0
- package/dist/decode/lattice-costs.d.ts +55 -0
- package/dist/decode/lattice-costs.d.ts.map +1 -0
- package/dist/decode/lattice-costs.js +90 -0
- package/dist/decode/lattice-costs.js.map +1 -0
- package/dist/decode/lattice-edges.d.ts +29 -0
- package/dist/decode/lattice-edges.d.ts.map +1 -0
- package/dist/decode/lattice-edges.js +78 -0
- package/dist/decode/lattice-edges.js.map +1 -0
- package/dist/decode/lattice-slice.d.ts +37 -0
- package/dist/decode/lattice-slice.d.ts.map +1 -0
- package/dist/decode/lattice-slice.js +43 -0
- package/dist/decode/lattice-slice.js.map +1 -0
- package/dist/decode/lattice-types.d.ts +101 -0
- package/dist/decode/lattice-types.d.ts.map +1 -0
- package/dist/decode/lattice-types.js +63 -0
- package/dist/decode/lattice-types.js.map +1 -0
- package/dist/decode/lattice.d.ts +2 -59
- package/dist/decode/lattice.d.ts.map +1 -1
- package/dist/decode/lattice.js +2 -118
- package/dist/decode/lattice.js.map +1 -1
- package/dist/decode/number-pieces.d.ts +62 -0
- package/dist/decode/number-pieces.d.ts.map +1 -0
- package/dist/decode/number-pieces.js +106 -0
- package/dist/decode/number-pieces.js.map +1 -0
- package/dist/decode/numbers.d.ts +53 -0
- package/dist/decode/numbers.d.ts.map +1 -0
- package/dist/decode/numbers.js +69 -0
- package/dist/decode/numbers.js.map +1 -0
- package/dist/decode/pieces.d.ts +78 -0
- package/dist/decode/pieces.d.ts.map +1 -0
- package/dist/decode/pieces.js +136 -0
- package/dist/decode/pieces.js.map +1 -0
- package/dist/decode/polyphone-rules.d.ts +11 -0
- package/dist/decode/polyphone-rules.d.ts.map +1 -0
- package/dist/decode/polyphone-rules.js +11 -0
- package/dist/decode/polyphone-rules.js.map +1 -0
- package/dist/decode/reading-rules.d.ts +3 -126
- package/dist/decode/reading-rules.d.ts.map +1 -1
- package/dist/decode/reading-rules.js +8 -434
- package/dist/decode/reading-rules.js.map +1 -1
- package/dist/decode/rules.d.ts +1 -17
- package/dist/decode/rules.d.ts.map +1 -1
- package/dist/decode/rules.js +1 -43
- package/dist/decode/rules.js.map +1 -1
- package/dist/decode/run-lattice.d.ts +52 -0
- package/dist/decode/run-lattice.d.ts.map +1 -0
- package/dist/decode/run-lattice.js +91 -0
- package/dist/decode/run-lattice.js.map +1 -0
- package/dist/decode/run-words.d.ts +17 -0
- package/dist/decode/run-words.d.ts.map +1 -0
- package/dist/decode/run-words.js +29 -0
- package/dist/decode/run-words.js.map +1 -0
- package/dist/decode/sandhi-input.d.ts +30 -0
- package/dist/decode/sandhi-input.d.ts.map +1 -0
- package/dist/decode/sandhi-input.js +35 -0
- package/dist/decode/sandhi-input.js.map +1 -0
- package/dist/decode/sandhi-tones.d.ts +97 -0
- package/dist/decode/sandhi-tones.d.ts.map +1 -0
- package/dist/decode/sandhi-tones.js +139 -0
- package/dist/decode/sandhi-tones.js.map +1 -0
- package/dist/decode/sandhi.d.ts +10 -7
- package/dist/decode/sandhi.d.ts.map +1 -1
- package/dist/decode/sandhi.js +11 -88
- package/dist/decode/sandhi.js.map +1 -1
- package/dist/decode/script-types.d.ts +76 -0
- package/dist/decode/script-types.d.ts.map +1 -0
- package/dist/decode/script-types.js +35 -0
- package/dist/decode/script-types.js.map +1 -0
- package/dist/decode/script-words.d.ts +32 -0
- package/dist/decode/script-words.d.ts.map +1 -0
- package/dist/decode/script-words.js +77 -0
- package/dist/decode/script-words.js.map +1 -0
- package/dist/decode/script.d.ts +3 -73
- package/dist/decode/script.d.ts.map +1 -1
- package/dist/decode/script.js +3 -109
- package/dist/decode/script.js.map +1 -1
- package/dist/decode/tan-rule.d.ts +68 -0
- package/dist/decode/tan-rule.d.ts.map +1 -0
- package/dist/decode/tan-rule.js +131 -0
- package/dist/decode/tan-rule.js.map +1 -0
- package/dist/decode/write-run.d.ts +21 -0
- package/dist/decode/write-run.d.ts.map +1 -0
- package/dist/decode/write-run.js +42 -0
- package/dist/decode/write-run.js.map +1 -0
- package/dist/dictionary/artifact-claims.d.ts +25 -0
- package/dist/dictionary/artifact-claims.d.ts.map +1 -0
- package/dist/dictionary/artifact-claims.js +47 -0
- package/dist/dictionary/artifact-claims.js.map +1 -0
- package/dist/dictionary/artifact-format.d.ts +86 -0
- package/dist/dictionary/artifact-format.d.ts.map +1 -0
- package/dist/dictionary/artifact-format.js +91 -0
- package/dist/dictionary/artifact-format.js.map +1 -0
- package/dist/dictionary/artifact-read.d.ts +34 -0
- package/dist/dictionary/artifact-read.d.ts.map +1 -0
- package/dist/dictionary/artifact-read.js +114 -0
- package/dist/dictionary/artifact-read.js.map +1 -0
- package/dist/dictionary/artifact.d.ts +4 -63
- package/dist/dictionary/artifact.d.ts.map +1 -1
- package/dist/dictionary/artifact.js +12 -229
- package/dist/dictionary/artifact.js.map +1 -1
- package/dist/dictionary/assertions.d.ts +5 -57
- package/dist/dictionary/assertions.d.ts.map +1 -1
- package/dist/dictionary/assertions.js +4 -317
- package/dist/dictionary/assertions.js.map +1 -1
- package/dist/dictionary/build-assertions.d.ts +12 -0
- package/dist/dictionary/build-assertions.d.ts.map +1 -0
- package/dist/dictionary/build-assertions.js +13 -0
- package/dist/dictionary/build-assertions.js.map +1 -0
- package/dist/dictionary/built-dictionary.d.ts +46 -0
- package/dist/dictionary/built-dictionary.d.ts.map +1 -0
- package/dist/dictionary/built-dictionary.js +97 -0
- package/dist/dictionary/built-dictionary.js.map +1 -0
- package/dist/dictionary/cedict-senses.d.ts +87 -0
- package/dist/dictionary/cedict-senses.d.ts.map +1 -0
- package/dist/dictionary/cedict-senses.js +126 -0
- package/dist/dictionary/cedict-senses.js.map +1 -0
- package/dist/dictionary/character-defaults.d.ts +26 -0
- package/dist/dictionary/character-defaults.d.ts.map +1 -0
- package/dist/dictionary/character-defaults.js +67 -0
- package/dist/dictionary/character-defaults.js.map +1 -0
- package/dist/dictionary/character-readings.d.ts +10 -0
- package/dist/dictionary/character-readings.d.ts.map +1 -0
- package/dist/dictionary/character-readings.js +25 -0
- package/dist/dictionary/character-readings.js.map +1 -0
- package/dist/dictionary/constituent-repair.d.ts +36 -0
- package/dist/dictionary/constituent-repair.d.ts.map +1 -0
- package/dist/dictionary/constituent-repair.js +117 -0
- package/dist/dictionary/constituent-repair.js.map +1 -0
- package/dist/dictionary/dictionary-entry.d.ts +37 -0
- package/dist/dictionary/dictionary-entry.d.ts.map +1 -0
- package/dist/dictionary/dictionary-entry.js +41 -0
- package/dist/dictionary/dictionary-entry.js.map +1 -0
- package/dist/dictionary/dictionary-readings.d.ts +56 -0
- package/dist/dictionary/dictionary-readings.d.ts.map +1 -0
- package/dist/dictionary/dictionary-readings.js +93 -0
- package/dist/dictionary/dictionary-readings.js.map +1 -0
- package/dist/dictionary/dictionary.d.ts +6 -60
- package/dist/dictionary/dictionary.d.ts.map +1 -1
- package/dist/dictionary/dictionary.js +9 -169
- package/dist/dictionary/dictionary.js.map +1 -1
- package/dist/dictionary/entry-invariants.d.ts +3 -0
- package/dist/dictionary/entry-invariants.d.ts.map +1 -0
- package/dist/dictionary/entry-invariants.js +67 -0
- package/dist/dictionary/entry-invariants.js.map +1 -0
- package/dist/dictionary/entry-lines.d.ts +35 -0
- package/dist/dictionary/entry-lines.d.ts.map +1 -0
- package/dist/dictionary/entry-lines.js +70 -0
- package/dist/dictionary/entry-lines.js.map +1 -0
- package/dist/dictionary/erhua-repair.d.ts +26 -0
- package/dist/dictionary/erhua-repair.d.ts.map +1 -0
- package/dist/dictionary/erhua-repair.js +49 -0
- package/dist/dictionary/erhua-repair.js.map +1 -0
- package/dist/dictionary/frequency-tones.d.ts +74 -0
- package/dist/dictionary/frequency-tones.d.ts.map +1 -0
- package/dist/dictionary/frequency-tones.js +128 -0
- package/dist/dictionary/frequency-tones.js.map +1 -0
- package/dist/dictionary/inventory-invariants.d.ts +3 -0
- package/dist/dictionary/inventory-invariants.d.ts.map +1 -0
- package/dist/dictionary/inventory-invariants.js +54 -0
- package/dist/dictionary/inventory-invariants.js.map +1 -0
- package/dist/dictionary/locale-candidates.d.ts +40 -0
- package/dist/dictionary/locale-candidates.d.ts.map +1 -0
- package/dist/dictionary/locale-candidates.js +77 -0
- package/dist/dictionary/locale-candidates.js.map +1 -0
- package/dist/dictionary/locale-segments.d.ts +47 -0
- package/dist/dictionary/locale-segments.d.ts.map +1 -0
- package/dist/dictionary/locale-segments.js +141 -0
- package/dist/dictionary/locale-segments.js.map +1 -0
- package/dist/dictionary/locale.d.ts +1 -21
- package/dist/dictionary/locale.d.ts.map +1 -1
- package/dist/dictionary/locale.js +9 -198
- package/dist/dictionary/locale.js.map +1 -1
- package/dist/dictionary/merge-types.d.ts +127 -0
- package/dist/dictionary/merge-types.d.ts.map +1 -0
- package/dist/dictionary/merge-types.js +35 -0
- package/dist/dictionary/merge-types.js.map +1 -0
- package/dist/dictionary/merge-walk.d.ts +27 -0
- package/dist/dictionary/merge-walk.d.ts.map +1 -0
- package/dist/dictionary/merge-walk.js +49 -0
- package/dist/dictionary/merge-walk.js.map +1 -0
- package/dist/dictionary/merge-word.d.ts +7 -0
- package/dist/dictionary/merge-word.d.ts.map +1 -0
- package/dist/dictionary/merge-word.js +91 -0
- package/dist/dictionary/merge-word.js.map +1 -0
- package/dist/dictionary/merge.d.ts +5 -62
- package/dist/dictionary/merge.d.ts.map +1 -1
- package/dist/dictionary/merge.js +32 -725
- package/dist/dictionary/merge.js.map +1 -1
- package/dist/dictionary/proper-noun.d.ts +28 -0
- package/dist/dictionary/proper-noun.d.ts.map +1 -0
- package/dist/dictionary/proper-noun.js +43 -0
- package/dist/dictionary/proper-noun.js.map +1 -0
- package/dist/dictionary/reading-agreement.d.ts +71 -0
- package/dist/dictionary/reading-agreement.d.ts.map +1 -0
- package/dist/dictionary/reading-agreement.js +156 -0
- package/dist/dictionary/reading-agreement.js.map +1 -0
- package/dist/dictionary/script-conversion.d.ts +28 -0
- package/dist/dictionary/script-conversion.d.ts.map +1 -0
- package/dist/dictionary/script-conversion.js +58 -0
- package/dist/dictionary/script-conversion.js.map +1 -0
- package/dist/dictionary/script-pairings.d.ts +74 -0
- package/dist/dictionary/script-pairings.d.ts.map +1 -0
- package/dist/dictionary/script-pairings.js +120 -0
- package/dist/dictionary/script-pairings.js.map +1 -0
- package/dist/dictionary/script-tables.d.ts.map +1 -1
- package/dist/dictionary/script-tables.js +2 -165
- package/dist/dictionary/script-tables.js.map +1 -1
- package/dist/dictionary/taiwan-reading.d.ts +8 -0
- package/dist/dictionary/taiwan-reading.d.ts.map +1 -0
- package/dist/dictionary/taiwan-reading.js +38 -0
- package/dist/dictionary/taiwan-reading.js.map +1 -0
- package/dist/dictionary/tone-invariants.d.ts +3 -0
- package/dist/dictionary/tone-invariants.d.ts.map +1 -0
- package/dist/dictionary/tone-invariants.js +64 -0
- package/dist/dictionary/tone-invariants.js.map +1 -0
- package/dist/dictionary/traditional-form.d.ts +21 -0
- package/dist/dictionary/traditional-form.d.ts.map +1 -0
- package/dist/dictionary/traditional-form.js +59 -0
- package/dist/dictionary/traditional-form.js.map +1 -0
- package/dist/dictionary/traditional-ranking.d.ts +22 -0
- package/dist/dictionary/traditional-ranking.d.ts.map +1 -0
- package/dist/dictionary/traditional-ranking.js +74 -0
- package/dist/dictionary/traditional-ranking.js.map +1 -0
- package/dist/dictionary/traditional-table.d.ts +51 -0
- package/dist/dictionary/traditional-table.d.ts.map +1 -0
- package/dist/dictionary/traditional-table.js +98 -0
- package/dist/dictionary/traditional-table.js.map +1 -0
- package/dist/dictionary/traditional.d.ts +3 -56
- package/dist/dictionary/traditional.d.ts.map +1 -1
- package/dist/dictionary/traditional.js +3 -186
- package/dist/dictionary/traditional.js.map +1 -1
- package/dist/dictionary/variant-counts.d.ts +39 -0
- package/dist/dictionary/variant-counts.d.ts.map +1 -0
- package/dist/dictionary/variant-counts.js +38 -0
- package/dist/dictionary/variant-counts.js.map +1 -0
- package/dist/dictionary/word-reading.d.ts +26 -0
- package/dist/dictionary/word-reading.d.ts.map +1 -0
- package/dist/dictionary/word-reading.js +76 -0
- package/dist/dictionary/word-reading.js.map +1 -0
- package/dist/dictionary/word-readings.d.ts +15 -0
- package/dist/dictionary/word-readings.d.ts.map +1 -0
- package/dist/dictionary/word-readings.js +41 -0
- package/dist/dictionary/word-readings.js.map +1 -0
- package/dist/format/annotate.d.ts +90 -0
- package/dist/format/annotate.d.ts.map +1 -0
- package/dist/format/annotate.js +168 -0
- package/dist/format/annotate.js.map +1 -0
- package/dist/format/html.d.ts +15 -46
- package/dist/format/html.d.ts.map +1 -1
- package/dist/format/html.js +3 -162
- package/dist/format/html.js.map +1 -1
- package/dist/format/slug-hash.d.ts +51 -0
- package/dist/format/slug-hash.d.ts.map +1 -0
- package/dist/format/slug-hash.js +74 -0
- package/dist/format/slug-hash.js.map +1 -0
- package/dist/format/slug-options.d.ts +98 -0
- package/dist/format/slug-options.d.ts.map +1 -0
- package/dist/format/slug-options.js +2 -0
- package/dist/format/slug-options.js.map +1 -0
- package/dist/format/slug-words.d.ts +27 -0
- package/dist/format/slug-words.d.ts.map +1 -0
- package/dist/format/slug-words.js +0 -0
- package/dist/format/slug-words.js.map +1 -0
- package/dist/format/slug.d.ts +3 -128
- package/dist/format/slug.d.ts.map +1 -1
- package/dist/format/slug.js +0 -0
- package/dist/format/slug.js.map +1 -1
- package/dist/grade/check-readings.d.ts +41 -0
- package/dist/grade/check-readings.d.ts.map +1 -0
- package/dist/grade/check-readings.js +36 -0
- package/dist/grade/check-readings.js.map +1 -0
- package/dist/grade/check.d.ts +4 -4
- package/dist/grade/check.d.ts.map +1 -1
- package/dist/grade/check.js +5 -270
- package/dist/grade/check.js.map +1 -1
- package/dist/grade/pair-syllables.d.ts +48 -0
- package/dist/grade/pair-syllables.d.ts.map +1 -0
- package/dist/grade/pair-syllables.js +71 -0
- package/dist/grade/pair-syllables.js.map +1 -0
- package/dist/grade/reading-syllables.d.ts +62 -0
- package/dist/grade/reading-syllables.d.ts.map +1 -0
- package/dist/grade/reading-syllables.js +58 -0
- package/dist/grade/reading-syllables.js.map +1 -0
- package/dist/grade/reading-tolerance.d.ts +72 -0
- package/dist/grade/reading-tolerance.d.ts.map +1 -0
- package/dist/grade/reading-tolerance.js +107 -0
- package/dist/grade/reading-tolerance.js.map +1 -0
- package/dist/grade/typed-reading.d.ts +28 -0
- package/dist/grade/typed-reading.d.ts.map +1 -0
- package/dist/grade/typed-reading.js +36 -0
- package/dist/grade/typed-reading.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/numerals/numeral-parse.d.ts +32 -0
- package/dist/numerals/numeral-parse.d.ts.map +1 -0
- package/dist/numerals/numeral-parse.js +44 -0
- package/dist/numerals/numeral-parse.js.map +1 -0
- package/dist/numerals/numeral-shapes.d.ts +89 -0
- package/dist/numerals/numeral-shapes.d.ts.map +1 -0
- package/dist/numerals/numeral-shapes.js +99 -0
- package/dist/numerals/numeral-shapes.js.map +1 -0
- package/dist/numerals/numerals.d.ts.map +1 -1
- package/dist/numerals/numerals.js +2 -36
- package/dist/numerals/numerals.js.map +1 -1
- package/dist/numerals/read-numeral.d.ts +76 -0
- package/dist/numerals/read-numeral.d.ts.map +1 -0
- package/dist/numerals/read-numeral.js +88 -0
- package/dist/numerals/read-numeral.js.map +1 -0
- package/dist/numerals/text.d.ts +3 -37
- package/dist/numerals/text.d.ts.map +1 -1
- package/dist/numerals/text.js +3 -254
- package/dist/numerals/text.js.map +1 -1
- package/dist/numerals/time.d.ts +34 -0
- package/dist/numerals/time.d.ts.map +1 -0
- package/dist/numerals/time.js +93 -0
- package/dist/numerals/time.js.map +1 -0
- package/dist/orthography/address-grouping.d.ts +34 -0
- package/dist/orthography/address-grouping.d.ts.map +1 -0
- package/dist/orthography/address-grouping.js +52 -0
- package/dist/orthography/address-grouping.js.map +1 -0
- package/dist/orthography/grouping.d.ts +3 -87
- package/dist/orthography/grouping.d.ts.map +1 -1
- package/dist/orthography/grouping.js +4 -270
- package/dist/orthography/grouping.js.map +1 -1
- package/dist/orthography/place-grouping.d.ts +39 -0
- package/dist/orthography/place-grouping.d.ts.map +1 -0
- package/dist/orthography/place-grouping.js +83 -0
- package/dist/orthography/place-grouping.js.map +1 -0
- package/dist/orthography/word-grouping.d.ts +48 -0
- package/dist/orthography/word-grouping.d.ts.map +1 -0
- package/dist/orthography/word-grouping.js +147 -0
- package/dist/orthography/word-grouping.js.map +1 -0
- package/dist/script/conversion-format.d.ts +22 -0
- package/dist/script/conversion-format.d.ts.map +1 -0
- package/dist/script/conversion-format.js +22 -0
- package/dist/script/conversion-format.js.map +1 -0
- package/dist/script/conversion-read.d.ts +9 -0
- package/dist/script/conversion-read.d.ts.map +1 -0
- package/dist/script/conversion-read.js +69 -0
- package/dist/script/conversion-read.js.map +1 -0
- package/dist/script/conversion-write.d.ts +14 -0
- package/dist/script/conversion-write.d.ts.map +1 -0
- package/dist/script/conversion-write.js +34 -0
- package/dist/script/conversion-write.js.map +1 -0
- package/dist/script/conversion.d.ts +10 -16
- package/dist/script/conversion.d.ts.map +1 -1
- package/dist/script/conversion.js +2 -115
- package/dist/script/conversion.js.map +1 -1
- package/dist/search/candidate-narrowing.d.ts +56 -0
- package/dist/search/candidate-narrowing.d.ts.map +1 -0
- package/dist/search/candidate-narrowing.js +55 -0
- package/dist/search/candidate-narrowing.js.map +1 -0
- package/dist/search/candidate-query.d.ts +25 -0
- package/dist/search/candidate-query.d.ts.map +1 -0
- package/dist/search/candidate-query.js +28 -0
- package/dist/search/candidate-query.js.map +1 -0
- package/dist/search/candidate-writings.d.ts +24 -0
- package/dist/search/candidate-writings.d.ts.map +1 -0
- package/dist/search/candidate-writings.js +114 -0
- package/dist/search/candidate-writings.js.map +1 -0
- package/dist/search/candidates.d.ts +7 -41
- package/dist/search/candidates.d.ts.map +1 -1
- package/dist/search/candidates.js +10 -164
- package/dist/search/candidates.js.map +1 -1
- package/dist/search/match-chunks.d.ts +19 -0
- package/dist/search/match-chunks.d.ts.map +1 -0
- package/dist/search/match-chunks.js +30 -0
- package/dist/search/match-chunks.js.map +1 -0
- package/dist/search/match-ranking.d.ts +39 -0
- package/dist/search/match-ranking.d.ts.map +1 -0
- package/dist/search/match-ranking.js +51 -0
- package/dist/search/match-ranking.js.map +1 -0
- package/dist/search/match-readings.d.ts +43 -0
- package/dist/search/match-readings.d.ts.map +1 -0
- package/dist/search/match-readings.js +83 -0
- package/dist/search/match-readings.js.map +1 -0
- package/dist/search/match-scoring.d.ts +146 -0
- package/dist/search/match-scoring.d.ts.map +1 -0
- package/dist/search/match-scoring.js +114 -0
- package/dist/search/match-scoring.js.map +1 -0
- package/dist/search/match-search.d.ts +28 -0
- package/dist/search/match-search.d.ts.map +1 -0
- package/dist/search/match-search.js +128 -0
- package/dist/search/match-search.js.map +1 -0
- package/dist/search/match.d.ts +5 -36
- package/dist/search/match.d.ts.map +1 -1
- package/dist/search/match.js +2 -379
- package/dist/search/match.js.map +1 -1
- package/dist/search/reverse-index-build.d.ts +30 -0
- package/dist/search/reverse-index-build.d.ts.map +1 -0
- package/dist/search/reverse-index-build.js +72 -0
- package/dist/search/reverse-index-build.js.map +1 -0
- package/dist/search/reverse-index-format.d.ts +60 -0
- package/dist/search/reverse-index-format.d.ts.map +1 -0
- package/dist/search/reverse-index-format.js +54 -0
- package/dist/search/reverse-index-format.js.map +1 -0
- package/dist/search/reverse-index-groups.d.ts +37 -0
- package/dist/search/reverse-index-groups.d.ts.map +1 -0
- package/dist/search/reverse-index-groups.js +71 -0
- package/dist/search/reverse-index-groups.js.map +1 -0
- package/dist/search/reverse-index-passes.d.ts +78 -0
- package/dist/search/reverse-index-passes.d.ts.map +1 -0
- package/dist/search/reverse-index-passes.js +59 -0
- package/dist/search/reverse-index-passes.js.map +1 -0
- package/dist/search/reverse-index-state.d.ts +36 -0
- package/dist/search/reverse-index-state.d.ts.map +1 -0
- package/dist/search/reverse-index-state.js +95 -0
- package/dist/search/reverse-index-state.js.map +1 -0
- package/dist/search/reverse-index.d.ts +8 -67
- package/dist/search/reverse-index.d.ts.map +1 -1
- package/dist/search/reverse-index.js +4 -255
- package/dist/search/reverse-index.js.map +1 -1
- package/dist/sources/unihan-readings.d.ts +58 -0
- package/dist/sources/unihan-readings.d.ts.map +1 -0
- package/dist/sources/unihan-readings.js +95 -0
- package/dist/sources/unihan-readings.js.map +1 -0
- package/dist/sources/unihan.d.ts +6 -9
- package/dist/sources/unihan.d.ts.map +1 -1
- package/dist/sources/unihan.js +2 -85
- package/dist/sources/unihan.js.map +1 -1
- package/dist/syllable/final-tables.d.ts +23 -0
- package/dist/syllable/final-tables.d.ts.map +1 -0
- package/dist/syllable/final-tables.js +50 -0
- package/dist/syllable/final-tables.js.map +1 -0
- package/dist/syllable/inventory.d.ts +8 -42
- package/dist/syllable/inventory.d.ts.map +1 -1
- package/dist/syllable/inventory.js +9 -918
- package/dist/syllable/inventory.js.map +1 -1
- package/dist/syllable/spellings.d.ts +40 -0
- package/dist/syllable/spellings.d.ts.map +1 -0
- package/dist/syllable/spellings.js +469 -0
- package/dist/syllable/spellings.js.map +1 -0
- package/dist/syllable/syllable-parts.d.ts +31 -0
- package/dist/syllable/syllable-parts.d.ts.map +1 -0
- package/dist/syllable/syllable-parts.js +105 -0
- package/dist/syllable/syllable-parts.js.map +1 -0
- package/dist/syllable/syllable.d.ts +1 -14
- package/dist/syllable/syllable.d.ts.map +1 -1
- package/dist/syllable/syllable.js +3 -144
- package/dist/syllable/syllable.js.map +1 -1
- package/dist/syllable/written-tones.d.ts +6 -0
- package/dist/syllable/written-tones.d.ts.map +1 -0
- package/dist/syllable/written-tones.js +453 -0
- package/dist/syllable/written-tones.js.map +1 -0
- package/dist/transcription/bopomofo-parse.d.ts +42 -0
- package/dist/transcription/bopomofo-parse.d.ts.map +1 -0
- package/dist/transcription/bopomofo-parse.js +92 -0
- package/dist/transcription/bopomofo-parse.js.map +1 -0
- package/dist/transcription/bopomofo-reverse.d.ts +31 -0
- package/dist/transcription/bopomofo-reverse.d.ts.map +1 -0
- package/dist/transcription/bopomofo-reverse.js +48 -0
- package/dist/transcription/bopomofo-reverse.js.map +1 -0
- package/dist/transcription/bopomofo-symbols.d.ts +36 -0
- package/dist/transcription/bopomofo-symbols.d.ts.map +1 -0
- package/dist/transcription/bopomofo-symbols.js +41 -0
- package/dist/transcription/bopomofo-symbols.js.map +1 -0
- package/dist/transcription/bopomofo-tables.d.ts +87 -0
- package/dist/transcription/bopomofo-tables.d.ts.map +1 -0
- package/dist/transcription/bopomofo-tables.js +180 -0
- package/dist/transcription/bopomofo-tables.js.map +1 -0
- package/dist/transcription/bopomofo.d.ts +14 -32
- package/dist/transcription/bopomofo.d.ts.map +1 -1
- package/dist/transcription/bopomofo.js +5 -343
- package/dist/transcription/bopomofo.js.map +1 -1
- package/dist/transcription/gwoyeu-first-second.d.ts +36 -0
- package/dist/transcription/gwoyeu-first-second.d.ts.map +1 -0
- package/dist/transcription/gwoyeu-first-second.js +75 -0
- package/dist/transcription/gwoyeu-first-second.js.map +1 -0
- package/dist/transcription/gwoyeu-spelling.d.ts +38 -0
- package/dist/transcription/gwoyeu-spelling.d.ts.map +1 -0
- package/dist/transcription/gwoyeu-spelling.js +124 -0
- package/dist/transcription/gwoyeu-spelling.js.map +1 -0
- package/dist/transcription/gwoyeu-tables.d.ts +93 -0
- package/dist/transcription/gwoyeu-tables.d.ts.map +1 -0
- package/dist/transcription/gwoyeu-tables.js +205 -0
- package/dist/transcription/gwoyeu-tables.js.map +1 -0
- package/dist/transcription/gwoyeu-tonal-forms.d.ts +49 -0
- package/dist/transcription/gwoyeu-tonal-forms.d.ts.map +1 -0
- package/dist/transcription/gwoyeu-tonal-forms.js +89 -0
- package/dist/transcription/gwoyeu-tonal-forms.js.map +1 -0
- package/dist/transcription/gwoyeu-vowels.d.ts +51 -0
- package/dist/transcription/gwoyeu-vowels.d.ts.map +1 -0
- package/dist/transcription/gwoyeu-vowels.js +58 -0
- package/dist/transcription/gwoyeu-vowels.js.map +1 -0
- package/dist/transcription/gwoyeu.d.ts +1 -26
- package/dist/transcription/gwoyeu.d.ts.map +1 -1
- package/dist/transcription/gwoyeu.js +2 -540
- package/dist/transcription/gwoyeu.js.map +1 -1
- package/dist/transcription/ipa-symbols.d.ts +67 -0
- package/dist/transcription/ipa-symbols.d.ts.map +1 -0
- package/dist/transcription/ipa-symbols.js +135 -0
- package/dist/transcription/ipa-symbols.js.map +1 -0
- package/dist/transcription/ipa.d.ts +2 -10
- package/dist/transcription/ipa.d.ts.map +1 -1
- package/dist/transcription/ipa.js +2 -134
- package/dist/transcription/ipa.js.map +1 -1
- package/dist/transcription/wade-giles-index.d.ts +35 -0
- package/dist/transcription/wade-giles-index.d.ts.map +1 -0
- package/dist/transcription/wade-giles-index.js +110 -0
- package/dist/transcription/wade-giles-index.js.map +1 -0
- package/dist/transcription/wade-giles-parse.d.ts +36 -0
- package/dist/transcription/wade-giles-parse.d.ts.map +1 -0
- package/dist/transcription/wade-giles-parse.js +84 -0
- package/dist/transcription/wade-giles-parse.js.map +1 -0
- package/dist/transcription/wade-giles-spelling.d.ts +61 -0
- package/dist/transcription/wade-giles-spelling.d.ts.map +1 -0
- package/dist/transcription/wade-giles-spelling.js +107 -0
- package/dist/transcription/wade-giles-spelling.js.map +1 -0
- package/dist/transcription/wade-giles-syllable.d.ts +29 -0
- package/dist/transcription/wade-giles-syllable.d.ts.map +1 -0
- package/dist/transcription/wade-giles-syllable.js +90 -0
- package/dist/transcription/wade-giles-syllable.js.map +1 -0
- package/dist/transcription/wade-giles-tables.d.ts +80 -0
- package/dist/transcription/wade-giles-tables.d.ts.map +1 -0
- package/dist/transcription/wade-giles-tables.js +178 -0
- package/dist/transcription/wade-giles-tables.js.map +1 -0
- package/dist/transcription/wade-giles.d.ts +9 -60
- package/dist/transcription/wade-giles.d.ts.map +1 -1
- package/dist/transcription/wade-giles.js +6 -543
- package/dist/transcription/wade-giles.js.map +1 -1
- package/dist/transcription/yale-tables.d.ts +54 -0
- package/dist/transcription/yale-tables.d.ts.map +1 -0
- package/dist/transcription/yale-tables.js +125 -0
- package/dist/transcription/yale-tables.js.map +1 -0
- package/dist/transcription/yale.d.ts.map +1 -1
- package/dist/transcription/yale.js +1 -124
- package/dist/transcription/yale.js.map +1 -1
- 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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"}
|
package/dist/decode/sandhi.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
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,
|
|
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"}
|
package/dist/decode/sandhi.js
CHANGED
|
@@ -1,84 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
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;
|