@kensio/pinyinjs 1.7.3 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/confidence.d.ts.map +1 -1
- package/dist/decode/confidence.js +3 -118
- 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 +66 -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/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 +140 -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 +58 -0
- package/dist/decode/jiao-rule.d.ts.map +1 -0
- package/dist/decode/jiao-rule.js +76 -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 +82 -0
- package/dist/decode/lattice-types.d.ts.map +1 -0
- package/dist/decode/lattice-types.js +44 -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 +31 -0
- package/dist/decode/polyphone-rules.d.ts.map +1 -0
- package/dist/decode/polyphone-rules.js +159 -0
- package/dist/decode/polyphone-rules.js.map +1 -0
- package/dist/decode/reading-rules.d.ts +2 -97
- package/dist/decode/reading-rules.d.ts.map +1 -1
- package/dist/decode/reading-rules.js +4 -365
- 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/sandhi-tones.d.ts +69 -0
- package/dist/decode/sandhi-tones.d.ts.map +1 -0
- package/dist/decode/sandhi-tones.js +88 -0
- package/dist/decode/sandhi-tones.js.map +1 -0
- package/dist/decode/sandhi.d.ts +1 -1
- package/dist/decode/sandhi.d.ts.map +1 -1
- package/dist/decode/sandhi.js +1 -81
- 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 +28 -0
- package/dist/decode/write-run.d.ts.map +1 -0
- package/dist/decode/write-run.js +77 -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 +80 -0
- package/dist/dictionary/cedict-senses.d.ts.map +1 -0
- package/dist/dictionary/cedict-senses.js +114 -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/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 +121 -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-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 +30 -713
- 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 +38 -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/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,74 @@
|
|
|
1
|
+
import { readSyllable } from "../syllable/syllable.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unihan's reading lists, ranked against a syllable.
|
|
4
|
+
*/
|
|
5
|
+
export class VariantRanking {
|
|
6
|
+
#unihanReadings;
|
|
7
|
+
#parsed = new Map();
|
|
8
|
+
constructor(unihanReadings) {
|
|
9
|
+
this.#unihanReadings = unihanReadings;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse a Unihan reading string, remembering the result.
|
|
13
|
+
*
|
|
14
|
+
* Worth caching: the fallback path reads the same few thousand strings once
|
|
15
|
+
* per candidate per word.
|
|
16
|
+
*/
|
|
17
|
+
#syllableOf(reading) {
|
|
18
|
+
if (this.#parsed.has(reading)) {
|
|
19
|
+
return this.#parsed.get(reading);
|
|
20
|
+
}
|
|
21
|
+
const syllable = readSyllable(reading);
|
|
22
|
+
this.#parsed.set(reading, syllable);
|
|
23
|
+
return syllable;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* How well a candidate character's readings match the one we want.
|
|
27
|
+
*
|
|
28
|
+
* Lower is better. A candidate whose most likely reading is the one we want
|
|
29
|
+
* beats one that merely lists it among its rarer readings, which is exactly
|
|
30
|
+
* what separates 髮 (`fà` alone) from 發 (`fā` first, `fà` third).
|
|
31
|
+
*/
|
|
32
|
+
#rank(candidate, syllable) {
|
|
33
|
+
const readings = this.#unihanReadings.get(candidate)?.readings ?? [];
|
|
34
|
+
if (syllable === undefined) {
|
|
35
|
+
return readings.length === 0 ? Infinity : 0;
|
|
36
|
+
}
|
|
37
|
+
let tonelessMatch = Infinity;
|
|
38
|
+
for (const [at, reading] of readings.entries()) {
|
|
39
|
+
const parsed = this.#syllableOf(reading);
|
|
40
|
+
if (parsed === undefined) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (parsed.initial !== syllable.initial ||
|
|
44
|
+
parsed.final !== syllable.final) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (parsed.tone === syllable.tone) {
|
|
48
|
+
return at;
|
|
49
|
+
}
|
|
50
|
+
// A match on the syllable but not the tone still beats no match at all,
|
|
51
|
+
// since sources disagree about tone far more often than about spelling.
|
|
52
|
+
tonelessMatch = Math.min(tonelessMatch, readings.length + at);
|
|
53
|
+
}
|
|
54
|
+
return tonelessMatch;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The best-ranked candidate, or the character itself where there are none.
|
|
58
|
+
*/
|
|
59
|
+
best(candidates, hans, syllable) {
|
|
60
|
+
let best = hans;
|
|
61
|
+
let bestRank = Infinity;
|
|
62
|
+
for (const candidate of candidates) {
|
|
63
|
+
const rank = this.#rank(candidate, syllable);
|
|
64
|
+
// Ties prefer a form other than the character itself, for the same reason
|
|
65
|
+
// mostFrequent does.
|
|
66
|
+
if (rank < bestRank || (rank === bestRank && best === hans)) {
|
|
67
|
+
best = candidate;
|
|
68
|
+
bestRank = rank;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return best;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=traditional-ranking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traditional-ranking.js","sourceRoot":"","sources":["../../src/dictionary/traditional-ranking.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAiB,MAAM,yBAAyB,CAAC;AAEtE;;GAEG;AACH,MAAM,OAAO,cAAc;IAChB,eAAe,CAAsC;IACrD,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE3D,YAAY,cAAmD;QAC7D,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAiB,EAAE,QAA8B;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;QACrE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,aAAa,GAAG,QAAQ,CAAC;QAC7B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YACD,IACE,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBACnC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAC/B,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,wEAAwE;YACxE,wEAAwE;YACxE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,CACF,UAA6B,EAC7B,IAAY,EACZ,QAA8B;QAE9B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,QAAQ,GAAG,QAAQ,CAAC;QACxB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC7C,0EAA0E;YAC1E,qBAAqB;YACrB,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC5D,IAAI,GAAG,SAAS,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { UnihanReadings, UnihanVariants } from "../sources/unihan.js";
|
|
2
|
+
import type { Syllable } from "../syllable/syllable.js";
|
|
3
|
+
import type { ReadCharacters } from "./reading.js";
|
|
4
|
+
import { type ScriptPairing } from "./variant-counts.js";
|
|
5
|
+
/**
|
|
6
|
+
* Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
|
|
7
|
+
*
|
|
8
|
+
* 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
|
|
9
|
+
* conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
|
|
10
|
+
* dictionary already knows the reading, and the reading settles it — 头发 is
|
|
11
|
+
* `tóu fà`, so its 发 is 髮 and the word is 頭髮.
|
|
12
|
+
*
|
|
13
|
+
* Two sources of evidence, in order:
|
|
14
|
+
*
|
|
15
|
+
* 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
|
|
16
|
+
* written out, which is a large observed sample of how each character is
|
|
17
|
+
* converted at each reading. This is preferred because it is evidence rather
|
|
18
|
+
* than inference, and because it settles cases the reading cannot: 干扰 is
|
|
19
|
+
* `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
|
|
20
|
+
* 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
|
|
21
|
+
* appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
|
|
22
|
+
* reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
|
|
23
|
+
*
|
|
24
|
+
* Characters no source knows a variant for are left alone, which is the right
|
|
25
|
+
* answer for the overwhelming majority: simplification changed a minority of
|
|
26
|
+
* characters.
|
|
27
|
+
*/
|
|
28
|
+
export declare class TraditionalTable {
|
|
29
|
+
#private;
|
|
30
|
+
/**
|
|
31
|
+
* Build the table from observed script pairings and Unihan's variant lists.
|
|
32
|
+
*
|
|
33
|
+
* Pairings should include the cases where the character is *unchanged*, since
|
|
34
|
+
* that is what stops a character with a rare traditional variant from always
|
|
35
|
+
* being converted to it.
|
|
36
|
+
*/
|
|
37
|
+
static build(pairings: Iterable<ScriptPairing>, variants: UnihanVariants, unihanReadings: ReadonlyMap<string, UnihanReadings>): TraditionalTable;
|
|
38
|
+
/**
|
|
39
|
+
* Wrap prepared tables. Use {@link TraditionalTable.build}.
|
|
40
|
+
*/
|
|
41
|
+
private constructor();
|
|
42
|
+
/**
|
|
43
|
+
* The 繁體 form of one character, given the syllable it is read as.
|
|
44
|
+
*/
|
|
45
|
+
convertCharacter(hans: string, syllable: Syllable | undefined): string;
|
|
46
|
+
/**
|
|
47
|
+
* The 繁體 form of a whole word, read as the given syllables.
|
|
48
|
+
*/
|
|
49
|
+
convert(aligned: readonly ReadCharacters[]): string;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=traditional-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traditional-table.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional-table.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAgB;;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CACV,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,EACjC,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAClD,gBAAgB,CAalB;IAMD;;OAEG;IACH,OAAO,eAQN;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAerE;IAED;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAelD;CACF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The 繁體 pairing table.
|
|
3
|
+
*
|
|
4
|
+
* Built from CC-CEDICT's own pairings and asked, character by character,
|
|
5
|
+
* which 繁體 form a 简体 one takes for a given reading.
|
|
6
|
+
*/
|
|
7
|
+
import { toCharacters } from "../script/characters.js";
|
|
8
|
+
import { VariantRanking } from "./traditional-ranking.js";
|
|
9
|
+
import { ANY_READING, mostFrequent, readingKey, } from "./variant-counts.js";
|
|
10
|
+
/**
|
|
11
|
+
* Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
|
|
12
|
+
*
|
|
13
|
+
* 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
|
|
14
|
+
* conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
|
|
15
|
+
* dictionary already knows the reading, and the reading settles it — 头发 is
|
|
16
|
+
* `tóu fà`, so its 发 is 髮 and the word is 頭髮.
|
|
17
|
+
*
|
|
18
|
+
* Two sources of evidence, in order:
|
|
19
|
+
*
|
|
20
|
+
* 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
|
|
21
|
+
* written out, which is a large observed sample of how each character is
|
|
22
|
+
* converted at each reading. This is preferred because it is evidence rather
|
|
23
|
+
* than inference, and because it settles cases the reading cannot: 干扰 is
|
|
24
|
+
* `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
|
|
25
|
+
* 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
|
|
26
|
+
* appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
|
|
27
|
+
* reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
|
|
28
|
+
*
|
|
29
|
+
* Characters no source knows a variant for are left alone, which is the right
|
|
30
|
+
* answer for the overwhelming majority: simplification changed a minority of
|
|
31
|
+
* characters.
|
|
32
|
+
*/
|
|
33
|
+
export class TraditionalTable {
|
|
34
|
+
/**
|
|
35
|
+
* Build the table from observed script pairings and Unihan's variant lists.
|
|
36
|
+
*
|
|
37
|
+
* Pairings should include the cases where the character is *unchanged*, since
|
|
38
|
+
* that is what stops a character with a rare traditional variant from always
|
|
39
|
+
* being converted to it.
|
|
40
|
+
*/
|
|
41
|
+
static build(pairings, variants, unihanReadings) {
|
|
42
|
+
const observed = new Map();
|
|
43
|
+
for (const { hans, hant, syllable } of pairings) {
|
|
44
|
+
const byReading = observed.get(hans) ?? new Map();
|
|
45
|
+
const keys = new Set([ANY_READING, readingKey(syllable)]);
|
|
46
|
+
for (const key of keys) {
|
|
47
|
+
const counts = byReading.get(key) ?? new Map();
|
|
48
|
+
counts.set(hant, (counts.get(hant) ?? 0) + 1);
|
|
49
|
+
byReading.set(key, counts);
|
|
50
|
+
}
|
|
51
|
+
observed.set(hans, byReading);
|
|
52
|
+
}
|
|
53
|
+
return new TraditionalTable(observed, variants, unihanReadings);
|
|
54
|
+
}
|
|
55
|
+
#observed;
|
|
56
|
+
#variants;
|
|
57
|
+
#ranking;
|
|
58
|
+
/**
|
|
59
|
+
* Wrap prepared tables. Use {@link TraditionalTable.build}.
|
|
60
|
+
*/
|
|
61
|
+
constructor(observed, variants, unihanReadings) {
|
|
62
|
+
this.#observed = observed;
|
|
63
|
+
this.#variants = variants;
|
|
64
|
+
this.#ranking = new VariantRanking(unihanReadings);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The 繁體 form of one character, given the syllable it is read as.
|
|
68
|
+
*/
|
|
69
|
+
convertCharacter(hans, syllable) {
|
|
70
|
+
const byReading = this.#observed.get(hans);
|
|
71
|
+
// Evidence at this exact reading first, then evidence at any reading.
|
|
72
|
+
const observed = mostFrequent(byReading?.get(readingKey(syllable)), hans) ??
|
|
73
|
+
mostFrequent(byReading?.get(ANY_READING), hans);
|
|
74
|
+
if (observed !== undefined) {
|
|
75
|
+
return observed;
|
|
76
|
+
}
|
|
77
|
+
return this.#ranking.best(this.#variants.traditional.get(hans) ?? [], hans, syllable);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The 繁體 form of a whole word, read as the given syllables.
|
|
81
|
+
*/
|
|
82
|
+
convert(aligned) {
|
|
83
|
+
let converted = "";
|
|
84
|
+
for (const read of aligned) {
|
|
85
|
+
const group = toCharacters(read.characters);
|
|
86
|
+
for (const character of group) {
|
|
87
|
+
// A syllable covering two characters — 儿化 — is not evidence about the
|
|
88
|
+
// second of them, so only the first is disambiguated by it.
|
|
89
|
+
const syllable = group.length === 1 || character === group[0]
|
|
90
|
+
? read.syllable
|
|
91
|
+
: undefined;
|
|
92
|
+
converted += this.convertCharacter(character, syllable);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return converted;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=traditional-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traditional-table.js","sourceRoot":"","sources":["../../src/dictionary/traditional-table.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,GAGX,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CACV,QAAiC,EACjC,QAAwB,EACxB,cAAmD;QAEnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAyB,CAAC;YACzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;gBAC/D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAClE,CAAC;IAEQ,SAAS,CAA0D;IACnE,SAAS,CAAiB;IAC1B,QAAQ,CAAiB;IAElC;;OAEG;IACH,YACE,QAAiE,EACjE,QAAwB,EACxB,cAAmD;QAEnD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,IAAY,EAAE,QAA8B;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,sEAAsE;QACtE,MAAM,QAAQ,GACZ,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;YACxD,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAC1C,IAAI,EACJ,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAkC;QACxC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,sEAAsE;gBACtE,4DAA4D;gBAC5D,MAAM,QAAQ,GACZ,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC;oBAC1C,CAAC,CAAC,IAAI,CAAC,QAAQ;oBACf,CAAC,CAAC,SAAS,CAAC;gBAChB,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -1,60 +1,7 @@
|
|
|
1
|
-
import type { UnihanReadings, UnihanVariants } from "../sources/unihan.js";
|
|
2
|
-
import { type Syllable } from "../syllable/syllable.js";
|
|
3
1
|
import type { ReadCharacters } from "./reading.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export interface ScriptPairing {
|
|
8
|
-
readonly hans: string;
|
|
9
|
-
readonly hant: string;
|
|
10
|
-
readonly syllable: Syllable | undefined;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Derives the 繁體 form of a 简体 word, using the reading to disambiguate.
|
|
14
|
-
*
|
|
15
|
-
* 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
|
|
16
|
-
* conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
|
|
17
|
-
* dictionary already knows the reading, and the reading settles it — 头发 is
|
|
18
|
-
* `tóu fà`, so its 发 is 髮 and the word is 頭髮.
|
|
19
|
-
*
|
|
20
|
-
* Two sources of evidence, in order:
|
|
21
|
-
*
|
|
22
|
-
* 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
|
|
23
|
-
* written out, which is a large observed sample of how each character is
|
|
24
|
-
* converted at each reading. This is preferred because it is evidence rather
|
|
25
|
-
* than inference, and because it settles cases the reading cannot: 干扰 is
|
|
26
|
-
* `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
|
|
27
|
-
* 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
|
|
28
|
-
* appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
|
|
29
|
-
* reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
|
|
30
|
-
*
|
|
31
|
-
* Characters no source knows a variant for are left alone, which is the right
|
|
32
|
-
* answer for the overwhelming majority: simplification changed a minority of
|
|
33
|
-
* characters.
|
|
34
|
-
*/
|
|
35
|
-
export declare class TraditionalTable {
|
|
36
|
-
#private;
|
|
37
|
-
/**
|
|
38
|
-
* Build the table from observed script pairings and Unihan's variant lists.
|
|
39
|
-
*
|
|
40
|
-
* Pairings should include the cases where the character is *unchanged*, since
|
|
41
|
-
* that is what stops a character with a rare traditional variant from always
|
|
42
|
-
* being converted to it.
|
|
43
|
-
*/
|
|
44
|
-
static build(pairings: Iterable<ScriptPairing>, variants: UnihanVariants, unihanReadings: ReadonlyMap<string, UnihanReadings>): TraditionalTable;
|
|
45
|
-
/**
|
|
46
|
-
* Wrap prepared tables. Use {@link TraditionalTable.build}.
|
|
47
|
-
*/
|
|
48
|
-
private constructor();
|
|
49
|
-
/**
|
|
50
|
-
* The 繁體 form of one character, given the syllable it is read as.
|
|
51
|
-
*/
|
|
52
|
-
convertCharacter(hans: string, syllable: Syllable | undefined): string;
|
|
53
|
-
/**
|
|
54
|
-
* The 繁體 form of a whole word, read as the given syllables.
|
|
55
|
-
*/
|
|
56
|
-
convert(aligned: readonly ReadCharacters[]): string;
|
|
57
|
-
}
|
|
2
|
+
import type { ScriptPairing } from "./variant-counts.js";
|
|
3
|
+
export type { ScriptPairing } from "./variant-counts.js";
|
|
4
|
+
export { TraditionalTable } from "./traditional-table.js";
|
|
58
5
|
/**
|
|
59
6
|
* Pair a CC-CEDICT entry's two scripts up character by character.
|
|
60
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traditional.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traditional.d.ts","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GAC7C,SAAS,aAAa,EAAE,CA8C1B"}
|
|
@@ -1,191 +1,8 @@
|
|
|
1
|
-
import { toCharacters } from "../script/characters.js";
|
|
2
|
-
import { readSyllable } from "../syllable/syllable.js";
|
|
3
|
-
/**
|
|
4
|
-
* The key standing for "whatever the reading", used when the reading is unknown
|
|
5
|
-
* or when no reading-specific evidence exists.
|
|
6
|
-
*/
|
|
7
|
-
const ANY_READING = "*";
|
|
8
|
-
/**
|
|
9
|
-
* A reading key that ignores 儿化, which never bears on which variant is meant.
|
|
10
|
-
*/
|
|
11
|
-
function readingKey(syllable) {
|
|
12
|
-
if (syllable === undefined) {
|
|
13
|
-
return ANY_READING;
|
|
14
|
-
}
|
|
15
|
-
return `${syllable.initial}|${syllable.final}|${String(syllable.tone)}`;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Pick the most frequent variant, breaking ties by preferring the 繁體 form.
|
|
19
|
-
*
|
|
20
|
-
* The tie-break matters for a character that is its own traditional form in one
|
|
21
|
-
* sense and has a distinct one in another. Where the counts cannot separate
|
|
22
|
-
* them, the traditional form is the better guess in a traditional-form table,
|
|
23
|
-
* and a wrong guess costs only whether a 繁體 text matches this key — never the
|
|
24
|
-
* reading it is given.
|
|
25
|
-
*/
|
|
26
|
-
function mostFrequent(counts, hans) {
|
|
27
|
-
let best;
|
|
28
|
-
let bestCount = 0;
|
|
29
|
-
const tally = counts ?? new Map();
|
|
30
|
-
for (const [variant, count] of tally) {
|
|
31
|
-
const isBetter = count > bestCount ||
|
|
32
|
-
(count === bestCount && best === hans && variant !== hans);
|
|
33
|
-
if (isBetter) {
|
|
34
|
-
best = variant;
|
|
35
|
-
bestCount = count;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return best;
|
|
39
|
-
}
|
|
40
1
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* 简体 → 繁體 is the ambiguous direction, which is what normally makes automatic
|
|
44
|
-
* conversion unreliable: 发 is either 發 (fā, to send) or 髮 (fà, hair). But the
|
|
45
|
-
* dictionary already knows the reading, and the reading settles it — 头发 is
|
|
46
|
-
* `tóu fà`, so its 发 is 髮 and the word is 頭髮.
|
|
47
|
-
*
|
|
48
|
-
* Two sources of evidence, in order:
|
|
49
|
-
*
|
|
50
|
-
* 1. **CC-CEDICT's own pairings.** It carries 124,754 entries with both scripts
|
|
51
|
-
* written out, which is a large observed sample of how each character is
|
|
52
|
-
* converted at each reading. This is preferred because it is evidence rather
|
|
53
|
-
* than inference, and because it settles cases the reading cannot: 干扰 is
|
|
54
|
-
* `gān rǎo` and stays 干擾, while 干燥 is also `gān` and becomes 乾燥.
|
|
55
|
-
* 2. **Unihan's `kTraditionalVariant`,** ranked by where the word's reading
|
|
56
|
-
* appears in each candidate's reading list. 髮 reads only `fà`, whereas 發
|
|
57
|
-
* reads `fā` first and `fà` only as a minor variant, so `fà` picks 髮.
|
|
58
|
-
*
|
|
59
|
-
* Characters no source knows a variant for are left alone, which is the right
|
|
60
|
-
* answer for the overwhelming majority: simplification changed a minority of
|
|
61
|
-
* characters.
|
|
2
|
+
* Pairing a CC-CEDICT entry's two scripts up, character by character.
|
|
62
3
|
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
* Build the table from observed script pairings and Unihan's variant lists.
|
|
66
|
-
*
|
|
67
|
-
* Pairings should include the cases where the character is *unchanged*, since
|
|
68
|
-
* that is what stops a character with a rare traditional variant from always
|
|
69
|
-
* being converted to it.
|
|
70
|
-
*/
|
|
71
|
-
static build(pairings, variants, unihanReadings) {
|
|
72
|
-
const observed = new Map();
|
|
73
|
-
for (const { hans, hant, syllable } of pairings) {
|
|
74
|
-
const byReading = observed.get(hans) ?? new Map();
|
|
75
|
-
const keys = new Set([ANY_READING, readingKey(syllable)]);
|
|
76
|
-
for (const key of keys) {
|
|
77
|
-
const counts = byReading.get(key) ?? new Map();
|
|
78
|
-
counts.set(hant, (counts.get(hant) ?? 0) + 1);
|
|
79
|
-
byReading.set(key, counts);
|
|
80
|
-
}
|
|
81
|
-
observed.set(hans, byReading);
|
|
82
|
-
}
|
|
83
|
-
return new TraditionalTable(observed, variants, unihanReadings);
|
|
84
|
-
}
|
|
85
|
-
#observed;
|
|
86
|
-
#variants;
|
|
87
|
-
#unihanReadings;
|
|
88
|
-
#parsed = new Map();
|
|
89
|
-
/**
|
|
90
|
-
* Wrap prepared tables. Use {@link TraditionalTable.build}.
|
|
91
|
-
*/
|
|
92
|
-
constructor(observed, variants, unihanReadings) {
|
|
93
|
-
this.#observed = observed;
|
|
94
|
-
this.#variants = variants;
|
|
95
|
-
this.#unihanReadings = unihanReadings;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Parse a Unihan reading string, remembering the result.
|
|
99
|
-
*
|
|
100
|
-
* Worth caching: the fallback path reads the same few thousand strings once
|
|
101
|
-
* per candidate per word.
|
|
102
|
-
*/
|
|
103
|
-
#syllableOf(reading) {
|
|
104
|
-
if (this.#parsed.has(reading)) {
|
|
105
|
-
return this.#parsed.get(reading);
|
|
106
|
-
}
|
|
107
|
-
const syllable = readSyllable(reading);
|
|
108
|
-
this.#parsed.set(reading, syllable);
|
|
109
|
-
return syllable;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* How well a candidate character's readings match the one we want.
|
|
113
|
-
*
|
|
114
|
-
* Lower is better. A candidate whose most likely reading is the one we want
|
|
115
|
-
* beats one that merely lists it among its rarer readings, which is exactly
|
|
116
|
-
* what separates 髮 (`fà` alone) from 發 (`fā` first, `fà` third).
|
|
117
|
-
*/
|
|
118
|
-
#rank(candidate, syllable) {
|
|
119
|
-
const readings = this.#unihanReadings.get(candidate)?.readings ?? [];
|
|
120
|
-
if (syllable === undefined) {
|
|
121
|
-
return readings.length === 0 ? Infinity : 0;
|
|
122
|
-
}
|
|
123
|
-
let tonelessMatch = Infinity;
|
|
124
|
-
for (const [at, reading] of readings.entries()) {
|
|
125
|
-
const parsed = this.#syllableOf(reading);
|
|
126
|
-
if (parsed === undefined) {
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (parsed.initial !== syllable.initial ||
|
|
130
|
-
parsed.final !== syllable.final) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (parsed.tone === syllable.tone) {
|
|
134
|
-
return at;
|
|
135
|
-
}
|
|
136
|
-
// A match on the syllable but not the tone still beats no match at all,
|
|
137
|
-
// since sources disagree about tone far more often than about spelling.
|
|
138
|
-
tonelessMatch = Math.min(tonelessMatch, readings.length + at);
|
|
139
|
-
}
|
|
140
|
-
return tonelessMatch;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* The 繁體 form of one character, given the syllable it is read as.
|
|
144
|
-
*/
|
|
145
|
-
convertCharacter(hans, syllable) {
|
|
146
|
-
const byReading = this.#observed.get(hans);
|
|
147
|
-
// Evidence at this exact reading first, then evidence at any reading.
|
|
148
|
-
const observed = mostFrequent(byReading?.get(readingKey(syllable)), hans) ??
|
|
149
|
-
mostFrequent(byReading?.get(ANY_READING), hans);
|
|
150
|
-
if (observed !== undefined) {
|
|
151
|
-
return observed;
|
|
152
|
-
}
|
|
153
|
-
const candidates = this.#variants.traditional.get(hans) ?? [];
|
|
154
|
-
if (candidates.length === 0) {
|
|
155
|
-
return hans;
|
|
156
|
-
}
|
|
157
|
-
let best = hans;
|
|
158
|
-
let bestRank = Infinity;
|
|
159
|
-
for (const candidate of candidates) {
|
|
160
|
-
const rank = this.#rank(candidate, syllable);
|
|
161
|
-
// Ties prefer a form other than the character itself, for the same reason
|
|
162
|
-
// mostFrequent does.
|
|
163
|
-
if (rank < bestRank || (rank === bestRank && best === hans)) {
|
|
164
|
-
best = candidate;
|
|
165
|
-
bestRank = rank;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return best;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* The 繁體 form of a whole word, read as the given syllables.
|
|
172
|
-
*/
|
|
173
|
-
convert(aligned) {
|
|
174
|
-
let converted = "";
|
|
175
|
-
for (const read of aligned) {
|
|
176
|
-
const group = toCharacters(read.characters);
|
|
177
|
-
for (const character of group) {
|
|
178
|
-
// A syllable covering two characters — 儿化 — is not evidence about the
|
|
179
|
-
// second of them, so only the first is disambiguated by it.
|
|
180
|
-
const syllable = group.length === 1 || character === group[0]
|
|
181
|
-
? read.syllable
|
|
182
|
-
: undefined;
|
|
183
|
-
converted += this.convertCharacter(character, syllable);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return converted;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
4
|
+
import { toCharacters } from "../script/characters.js";
|
|
5
|
+
export { TraditionalTable } from "./traditional-table.js";
|
|
189
6
|
/**
|
|
190
7
|
* Pair a CC-CEDICT entry's two scripts up character by character.
|
|
191
8
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traditional.js","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"traditional.js","sourceRoot":"","sources":["../../src/dictionary/traditional.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,IAAY,EACZ,OAA8C;IAE9C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,IACE,cAAc,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM;QAC/C,cAAc,CAAC,MAAM,KAAK,CAAC,EAC3B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,cAAc,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;YAClD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,aAAa;gBACnB,uEAAuE;gBACvE,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aACzD,CAAC,CAAC;QACL,CAAC;QACD,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,2EAA2E;IAC3E,gEAAgE;IAChE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,uEAAuE;gBACvE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,SAAS;gBACzC,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counting which 繁體 form a 简体 character is paired with.
|
|
3
|
+
*
|
|
4
|
+
* The tally the pairing table is built from, and the rule for reading a
|
|
5
|
+
* winner out of it.
|
|
6
|
+
*/
|
|
7
|
+
import type { Syllable } from "../syllable/syllable.js";
|
|
8
|
+
/**
|
|
9
|
+
* How often one 简体 character was written as a given 繁體 one.
|
|
10
|
+
*/
|
|
11
|
+
export type VariantCounts = Map<string, number>;
|
|
12
|
+
/**
|
|
13
|
+
* The key standing for "whatever the reading", used when the reading is unknown
|
|
14
|
+
* or when no reading-specific evidence exists.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ANY_READING = "*";
|
|
17
|
+
/**
|
|
18
|
+
* A reading key that ignores 儿化, which never bears on which variant is meant.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readingKey(syllable: Syllable | undefined): string;
|
|
21
|
+
/**
|
|
22
|
+
* One 简体 → 繁體 pairing observed in a source, at one reading.
|
|
23
|
+
*/
|
|
24
|
+
export interface ScriptPairing {
|
|
25
|
+
readonly hans: string;
|
|
26
|
+
readonly hant: string;
|
|
27
|
+
readonly syllable: Syllable | undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pick the most frequent variant, breaking ties by preferring the 繁體 form.
|
|
31
|
+
*
|
|
32
|
+
* The tie-break matters for a character that is its own traditional form in one
|
|
33
|
+
* sense and has a distinct one in another. Where the counts cannot separate
|
|
34
|
+
* them, the traditional form is the better guess in a traditional-form table,
|
|
35
|
+
* and a wrong guess costs only whether a 繁體 text matches this key — never the
|
|
36
|
+
* reading it is given.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mostFrequent(counts: VariantCounts | undefined, hans: string): string | undefined;
|
|
39
|
+
//# sourceMappingURL=variant-counts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant-counts.d.ts","sourceRoot":"","sources":["../../src/dictionary/variant-counts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAcpB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The key standing for "whatever the reading", used when the reading is unknown
|
|
3
|
+
* or when no reading-specific evidence exists.
|
|
4
|
+
*/
|
|
5
|
+
export const ANY_READING = "*";
|
|
6
|
+
/**
|
|
7
|
+
* A reading key that ignores 儿化, which never bears on which variant is meant.
|
|
8
|
+
*/
|
|
9
|
+
export function readingKey(syllable) {
|
|
10
|
+
if (syllable === undefined) {
|
|
11
|
+
return ANY_READING;
|
|
12
|
+
}
|
|
13
|
+
return `${syllable.initial}|${syllable.final}|${String(syllable.tone)}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pick the most frequent variant, breaking ties by preferring the 繁體 form.
|
|
17
|
+
*
|
|
18
|
+
* The tie-break matters for a character that is its own traditional form in one
|
|
19
|
+
* sense and has a distinct one in another. Where the counts cannot separate
|
|
20
|
+
* them, the traditional form is the better guess in a traditional-form table,
|
|
21
|
+
* and a wrong guess costs only whether a 繁體 text matches this key — never the
|
|
22
|
+
* reading it is given.
|
|
23
|
+
*/
|
|
24
|
+
export function mostFrequent(counts, hans) {
|
|
25
|
+
let best;
|
|
26
|
+
let bestCount = 0;
|
|
27
|
+
const tally = counts ?? new Map();
|
|
28
|
+
for (const [variant, count] of tally) {
|
|
29
|
+
const isBetter = count > bestCount ||
|
|
30
|
+
(count === bestCount && best === hans && variant !== hans);
|
|
31
|
+
if (isBetter) {
|
|
32
|
+
best = variant;
|
|
33
|
+
bestCount = count;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return best;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=variant-counts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant-counts.js","sourceRoot":"","sources":["../../src/dictionary/variant-counts.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAA8B;IACvD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAiC,EACjC,IAAY;IAEZ,IAAI,IAAwB,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,MAAM,IAAI,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,MAAM,QAAQ,GACZ,KAAK,GAAG,SAAS;YACjB,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,OAAO,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Settling which reading a word takes.
|
|
3
|
+
*
|
|
4
|
+
* The phrase corpus leads because it has three times CC-CEDICT's coverage;
|
|
5
|
+
* CC-CEDICT corrects it on the neutral tone, which is what the two of them
|
|
6
|
+
* actually disagree about; 儿化 is repaired before anything compares two
|
|
7
|
+
* readings; and the override table has the last word.
|
|
8
|
+
*/
|
|
9
|
+
import type { CedictEntry } from "../sources/cedict.js";
|
|
10
|
+
import type { Syllable } from "../syllable/syllable.js";
|
|
11
|
+
import type { ReadCharacters } from "./reading.js";
|
|
12
|
+
/**
|
|
13
|
+
* A word's settled reading, and what settling it cost the counts.
|
|
14
|
+
*/
|
|
15
|
+
export interface SettledReading {
|
|
16
|
+
/** Undefined where no source gave a usable reading. */
|
|
17
|
+
readonly reading: readonly Syllable[] | undefined;
|
|
18
|
+
readonly aligned: readonly ReadCharacters[] | undefined;
|
|
19
|
+
readonly neutralToneCorrections: number;
|
|
20
|
+
readonly erhuaRepairs: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Settle it.
|
|
24
|
+
*/
|
|
25
|
+
export declare function settleReading(word: string, defaults: ReadonlyMap<string, readonly Syllable[]>, cedictEntries: readonly CedictEntry[], cedictReadings: readonly (readonly Syllable[])[], phraseAligned: readonly ReadCharacters[] | undefined): SettledReading;
|
|
26
|
+
//# sourceMappingURL=word-reading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"word-reading.d.ts","sourceRoot":"","sources":["../../src/dictionary/word-reading.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAYxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC,EAClD,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,cAAc,EAAE,SAAS,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,EAChD,aAAa,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GACnD,cAAc,CAkFhB"}
|