@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,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a 弹 is plucked or is a bullet.
|
|
3
|
+
*
|
|
4
|
+
* The two readings are a verb and a noun, so what settles it is what the word
|
|
5
|
+
* beside it is doing rather than what the character is.
|
|
6
|
+
*/
|
|
7
|
+
import { toCharacters } from "../script/characters.js";
|
|
8
|
+
import { ASPECT, PARTICLE_TAG, tagOf, wordEndingAt, wordStartingAt, } from "./edge-context.js";
|
|
9
|
+
/**
|
|
10
|
+
* Whether a syllable is `tán`, the verbal reading of 弹.
|
|
11
|
+
*/
|
|
12
|
+
export function isTan(syllable) {
|
|
13
|
+
return (syllable?.initial === "t" && syllable.final === "an" && syllable.tone === 2);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The character in both scripts, since 彈 is not the shape 弹 is.
|
|
17
|
+
*
|
|
18
|
+
* 得, 教 and 儿 are the same character in either script and need say it once.
|
|
19
|
+
* This one is not, and neither is the 长 above, which is silent on 長 as a
|
|
20
|
+
* result. {@link ASPECT} carries 過 and 著 for the same reason this carries 彈.
|
|
21
|
+
*/
|
|
22
|
+
export const PLUCKED = new Set(["弹", "彈"]);
|
|
23
|
+
/**
|
|
24
|
+
* Whether the character at a position is 弹, in either script.
|
|
25
|
+
*/
|
|
26
|
+
export function isPluckedAt(context, at) {
|
|
27
|
+
return PLUCKED.has(context.characters[at] ?? "");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* What a 弹 that is playing governs: the instrument, the piece or its composer.
|
|
31
|
+
*
|
|
32
|
+
* 弹吉他, 弹竖琴, 弹肖邦, 弹一曲, 给我们弹一手. The name tags are in because
|
|
33
|
+
* jieba calls 吉他 `ns` and 管风琴, 班卓琴 and 古琴 `nr` — instruments read as
|
|
34
|
+
* places and people — and `m` because a piece is as often counted as named.
|
|
35
|
+
*/
|
|
36
|
+
export const PLAYED_TAGS = new Set(["n", "nz", "nr", "ns", "nt", "ng", "m"]);
|
|
37
|
+
/**
|
|
38
|
+
* Whether a word is an object rather than the far half of a compound.
|
|
39
|
+
*
|
|
40
|
+
* The one place this rule departs from {@link isTeachingAt}, and it is what
|
|
41
|
+
* makes it usable on technical prose. 弹 joins bound morphemes into nouns far
|
|
42
|
+
* more readily than 教 does — 着弹点, 掷弹兵, 供弹爪, 底排弹时, 弹洞 — and every
|
|
43
|
+
* one of those puts a single tagged character after the 弹 where an object
|
|
44
|
+
* would go. What the verb actually governs is a word: 吉他, 竖琴, 管风琴, 电子琴,
|
|
45
|
+
* 一曲, 肖邦. Requiring two characters keeps the compounds out at the cost of
|
|
46
|
+
* 反手持法去弹班卓琴, where the decode reaches 班 rather than 班卓琴 anyway.
|
|
47
|
+
*
|
|
48
|
+
* 教 could not take the same guard, since 教我 and 教你 are the commonest shape
|
|
49
|
+
* it has. Nobody plays a pronoun, so `r` is out of {@link PLAYED_TAGS} too.
|
|
50
|
+
*/
|
|
51
|
+
function isPlayedObject(word) {
|
|
52
|
+
return word !== undefined && toCharacters(word).length > 1;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Whether the 弹 at a position is playing something.
|
|
56
|
+
*
|
|
57
|
+
* Much the same shape as {@link isTeachingAt}, and for the same reason: the
|
|
58
|
+
* object is what says so. A 弹 with an instrument, a tune or a name after it is
|
|
59
|
+
* governing it, and a 弹 with 了, 过, 着 or 得 after it is a verb whatever
|
|
60
|
+
* follows that. A particle in front of it rules it out, since a verb does not
|
|
61
|
+
* follow one.
|
|
62
|
+
*/
|
|
63
|
+
function isPlayingAt(context, at) {
|
|
64
|
+
if (tagOf(context, wordEndingAt(context, at)).startsWith(PARTICLE_TAG)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (ASPECT.has(context.characters[at + 1] ?? "")) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const played = wordStartingAt(context, at + 1);
|
|
71
|
+
return isPlayedObject(played) && PLAYED_TAGS.has(tagOf(context, played));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 弹 read as `tán` where it is playing rather than a projectile.
|
|
75
|
+
*
|
|
76
|
+
* The character is stored `dàn` with `tán` as an alternate, and the sources are
|
|
77
|
+
* agreed about it: Unihan's `kHanyuPinlu` counts `dàn(313)` against `tán(50)`
|
|
78
|
+
* and `kMandarin` names `dàn`. That is a fact about a corpus in which nearly
|
|
79
|
+
* every 弹 is ammunition — 子弹, 炮弹, 导弹, 原子弹, 手榴弹 — and every one of
|
|
80
|
+
* those is a word that carries its own reading. What the default is left
|
|
81
|
+
* deciding is the 弹 that stands as a word of its own, and in running text that
|
|
82
|
+
* one is the verb: 他会弹一点儿古筝 came out `dàn`, and 弹吉他, 弹竖琴, 我在弹肖邦
|
|
83
|
+
* and 他钢琴弹得很好 with it.
|
|
84
|
+
*
|
|
85
|
+
* See {@link isPlayingAt} for what decides it. Forcing the single-character
|
|
86
|
+
* edge is not enough on its own, for the reason {@link TEACHING_JIAO} gives: a
|
|
87
|
+
* reading spanning two characters carries its own 弹 into the position, and
|
|
88
|
+
* 我的爱好是开车和弹吉他 read `dàn` off 和弹, a pair the dictionary holds with
|
|
89
|
+
* no part of speech and at the cost of a reading nobody counted. A *tagged*
|
|
90
|
+
* word ending in 弹 is left alone, which is every one that matters — 子弹, 炸弹,
|
|
91
|
+
* 导弹, 反弹, 手榴弹. Nothing has to be done about the other side, since the
|
|
92
|
+
* nominal compounds starting with 弹 are all listed: 弹匣, 弹坑, 弹壳, 弹片,
|
|
93
|
+
* 弹药, 弹道 and 弹头 reach their reading through the word, so a bare 弹 with a
|
|
94
|
+
* noun after it is not the front of one that got away.
|
|
95
|
+
*
|
|
96
|
+
* The 88,866 lines of Tatoeba and zh.wikipedia the other rules were sized
|
|
97
|
+
* against are the wrong corpus for this one on their own: 38 弹 decode as a
|
|
98
|
+
* word of their own in them, and 31 are somebody playing something. So CPP's
|
|
99
|
+
* 20,147 sentences are measured with them as plain text — the benchmark is
|
|
100
|
+
* drawn from zh.wikipedia's military articles, which is precisely where the
|
|
101
|
+
* shapes this rule can break live. Over the 109,013 lines together, 60 弹
|
|
102
|
+
* decode as a word of their own, every one read `dàn`, and 34 of the 60 are
|
|
103
|
+
* wrong.
|
|
104
|
+
*
|
|
105
|
+
* This moves 30 of them, of which 29 are right: the whole of 弹吉他, 弹一曲肖邦
|
|
106
|
+
* and 钢琴弹得很好, and none of 南部弹, 毛瑟弹, 掷弹兵, 供弹爪, 着弹点, 弹洞 or
|
|
107
|
+
* 底排弹时. The one it breaks is 拆弹专家, where a compound has an object's
|
|
108
|
+
* shape on both sides. Five it leaves alone: 开始弹, 四手联弹 and 弹起三次, which
|
|
109
|
+
* have no object to see, 用那种指法弹不会觉得费力, and 反手持法去弹班卓琴, where
|
|
110
|
+
* the decode reaches 班 rather than 班卓琴. On CPP's 40 labelled 弹 nothing
|
|
111
|
+
* moves at all, every one of them having been right through a word.
|
|
112
|
+
*/
|
|
113
|
+
export const PLAYING_TAN = {
|
|
114
|
+
name: "playing-tan",
|
|
115
|
+
verdictFor: (context) => {
|
|
116
|
+
const { edge } = context;
|
|
117
|
+
if (PLUCKED.has(edge.text)) {
|
|
118
|
+
return isTan(edge.reading[0]) && isPlayingAt(context, edge.from)
|
|
119
|
+
? "force"
|
|
120
|
+
: "keep";
|
|
121
|
+
}
|
|
122
|
+
return edge.partOfSpeech === "" &&
|
|
123
|
+
isPluckedAt(context, edge.to - 1) &&
|
|
124
|
+
edge.reading.length === edge.to - edge.from &&
|
|
125
|
+
!isTan(edge.reading.at(-1)) &&
|
|
126
|
+
isPlayingAt(context, edge.to - 1)
|
|
127
|
+
? "forbid"
|
|
128
|
+
: "keep";
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=tan-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tan-rule.js","sourceRoot":"","sources":["../../src/decode/tan-rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writing one decoded Han run out as pieces.
|
|
3
|
+
*
|
|
4
|
+
* Sandhi runs across the whole run rather than within a word, and 分词连写
|
|
5
|
+
* rewrites the word boundaries without touching the readings, so both happen
|
|
6
|
+
* here rather than per word.
|
|
7
|
+
*/
|
|
8
|
+
import type { Dictionary } from "../dictionary/dictionary.js";
|
|
9
|
+
import type { Locale } from "../script/script.js";
|
|
10
|
+
import { type SandhiOptions } from "./sandhi.js";
|
|
11
|
+
import type { ScoredWord } from "./word.js";
|
|
12
|
+
import { type ConvertedPiece, type Written } from "./pieces.js";
|
|
13
|
+
/**
|
|
14
|
+
* Write one Han run's worth of decoded words.
|
|
15
|
+
*/
|
|
16
|
+
export declare function writeRun(dictionary: Dictionary, words: readonly ScoredWord[], locale: Locale, written: Written, sandhi: SandhiOptions | undefined): readonly ConvertedPiece[];
|
|
17
|
+
/**
|
|
18
|
+
* Rewrite every piece's text with a pass that reads across all of them.
|
|
19
|
+
*/
|
|
20
|
+
export declare function rewrite(pieces: readonly ConvertedPiece[], pass: (parts: readonly string[]) => readonly string[]): readonly ConvertedPiece[];
|
|
21
|
+
//# sourceMappingURL=write-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-run.d.ts","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,KAAK,cAAc,EAInB,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,GAAG,SAAS,GAChC,SAAS,cAAc,EAAE,CAqC3B;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,GACpD,SAAS,cAAc,EAAE,CAO3B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { charactersPerSyllable, groupingOf } from "./sandhi-input.js";
|
|
2
|
+
import { applySandhi } from "./sandhi.js";
|
|
3
|
+
import { plainPiece, readingFor, writeWord, } from "./pieces.js";
|
|
4
|
+
/**
|
|
5
|
+
* Write one Han run's worth of decoded words.
|
|
6
|
+
*/
|
|
7
|
+
export function writeRun(dictionary, words, locale, written, sandhi) {
|
|
8
|
+
// Sandhi runs across the whole run rather than within a word, since 不 in one
|
|
9
|
+
// word assimilates to the tone starting the next, and what it needs beyond
|
|
10
|
+
// the syllables is in `sandhi-input.ts`.
|
|
11
|
+
const readings = words.map((scored) => readingFor(dictionary, scored.word, locale));
|
|
12
|
+
const flattened = applySandhi(readings.flat(), sandhi, groupingOf(dictionary, words, readings, sandhi?.thirdTone === true), charactersPerSyllable(words, readings));
|
|
13
|
+
let at = 0;
|
|
14
|
+
const pieces = [];
|
|
15
|
+
for (const [index, scored] of words.entries()) {
|
|
16
|
+
/* c8 ignore next -- readings is built by mapping over these same words */
|
|
17
|
+
const length = readings[index]?.length ?? 0;
|
|
18
|
+
if (index > 0) {
|
|
19
|
+
// A space, unless 分词连写 wrote a hyphen: 干干净净 is one orthographic
|
|
20
|
+
// word, `gāngān-jìngjìng`, cut into two decoded ones.
|
|
21
|
+
pieces.push(plainPiece(scored.word.separator ?? " "));
|
|
22
|
+
}
|
|
23
|
+
pieces.push(...writeWord(flattened.slice(at, at + length),
|
|
24
|
+
// A locale reading of a different length cannot be lined up with the
|
|
25
|
+
// confidence reported for the reading it replaced.
|
|
26
|
+
scored.confidence.length === length ? scored.confidence : [], scored.word, written));
|
|
27
|
+
at += length;
|
|
28
|
+
}
|
|
29
|
+
return pieces;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Rewrite every piece's text with a pass that reads across all of them.
|
|
33
|
+
*/
|
|
34
|
+
export function rewrite(pieces, pass) {
|
|
35
|
+
const rewritten = pass(pieces.map((piece) => piece.text));
|
|
36
|
+
return pieces.map((piece, at) => {
|
|
37
|
+
/* c8 ignore next -- one part comes back for each part handed over */
|
|
38
|
+
const text = rewritten[at] ?? piece.text;
|
|
39
|
+
return text === piece.text ? piece : { ...piece, text };
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=write-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-run.js","sourceRoot":"","sources":["../../src/decode/write-run.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D,OAAO,EAEL,UAAU,EACV,UAAU,EACV,SAAS,GAEV,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAsB,EACtB,KAA4B,EAC5B,MAAc,EACd,OAAgB,EAChB,MAAiC;IAEjC,6EAA6E;IAC7E,2EAA2E;IAC3E,yCAAyC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAC5C,CAAC;IACF,MAAM,SAAS,GAAG,WAAW,CAC3B,QAAQ,CAAC,IAAI,EAAE,EACf,MAAM,EACN,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,EACnE,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,CACvC,CAAC;IAEF,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,0EAA0E;QAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,gEAAgE;YAChE,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,IAAI,CACT,GAAG,SAAS,CACV,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAChC,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAC5D,MAAM,CAAC,IAAI,EACX,OAAO,CACR,CACF,CAAC;QACF,EAAE,IAAI,MAAM,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,MAAiC,EACjC,IAAqD;IAErD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC9B,qEAAqE;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;QACzC,OAAO,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which entry owns each key, since an entry claims both its scripts.
|
|
3
|
+
*
|
|
4
|
+
* Settled before a single line is written, and separately from writing them,
|
|
5
|
+
* because it is the one place the artifact resolves a disagreement rather than
|
|
6
|
+
* recording one: 发 and 髮 both claim 发 and read it differently, and something
|
|
7
|
+
* has to say which of them the key means.
|
|
8
|
+
*/
|
|
9
|
+
import type { DictionaryEntry } from "./entry.js";
|
|
10
|
+
/**
|
|
11
|
+
* Decide which entry owns each key, since an entry claims both its scripts.
|
|
12
|
+
*
|
|
13
|
+
* Entries overlap: 头 claims 頭 as its 繁體 key, and 頭 is also a character
|
|
14
|
+
* entry of its own. They agree, so the conflict is harmless there — but 发 and
|
|
15
|
+
* 髮 both claim 发, and they emphatically do not agree, one reading `fā` and the
|
|
16
|
+
* other `fà`. The entry whose own headword *is* the key wins, which is what
|
|
17
|
+
* keeps 发 on its own reading rather than the one that reached it sideways.
|
|
18
|
+
*
|
|
19
|
+
* An entry claims every 繁體 spelling a source attests for it, not only the one
|
|
20
|
+
* it stores as {@link DictionaryEntry.hant}: 重复 claims 重複 and 重覆 alike,
|
|
21
|
+
* since a reader typing either expects `chóngfù` rather than the character by
|
|
22
|
+
* character reading a missing key falls back to.
|
|
23
|
+
*/
|
|
24
|
+
export declare function claimKeys(entries: readonly DictionaryEntry[]): ReadonlyMap<string, DictionaryEntry>;
|
|
25
|
+
//# sourceMappingURL=artifact-claims.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-claims.d.ts","sourceRoot":"","sources":["../../src/dictionary/artifact-claims.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAuBlD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAiBtC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { traditionalForms } from "./artifact-format.js";
|
|
2
|
+
/**
|
|
3
|
+
* Let one entry claim each of its 繁體 spellings, where nothing outranks it.
|
|
4
|
+
*
|
|
5
|
+
* A spelling equal to the 简体 headword is already claimed, and a spelling that
|
|
6
|
+
* is some entry's own headword belongs to that entry — 发 and 髮 disagree about
|
|
7
|
+
* the reading, and the one the key names has to win.
|
|
8
|
+
*/
|
|
9
|
+
function claimTraditional(claimed, entry) {
|
|
10
|
+
for (const form of traditionalForms(entry)) {
|
|
11
|
+
const held = claimed.get(form);
|
|
12
|
+
const isTaken = form === entry.hans || held?.hans === form;
|
|
13
|
+
if (!isTaken && (held === undefined || entry.frequency > held.frequency)) {
|
|
14
|
+
claimed.set(form, entry);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Decide which entry owns each key, since an entry claims both its scripts.
|
|
20
|
+
*
|
|
21
|
+
* Entries overlap: 头 claims 頭 as its 繁體 key, and 頭 is also a character
|
|
22
|
+
* entry of its own. They agree, so the conflict is harmless there — but 发 and
|
|
23
|
+
* 髮 both claim 发, and they emphatically do not agree, one reading `fā` and the
|
|
24
|
+
* other `fà`. The entry whose own headword *is* the key wins, which is what
|
|
25
|
+
* keeps 发 on its own reading rather than the one that reached it sideways.
|
|
26
|
+
*
|
|
27
|
+
* An entry claims every 繁體 spelling a source attests for it, not only the one
|
|
28
|
+
* it stores as {@link DictionaryEntry.hant}: 重复 claims 重複 and 重覆 alike,
|
|
29
|
+
* since a reader typing either expects `chóngfù` rather than the character by
|
|
30
|
+
* character reading a missing key falls back to.
|
|
31
|
+
*/
|
|
32
|
+
export function claimKeys(entries) {
|
|
33
|
+
const claimed = new Map();
|
|
34
|
+
// Headwords first, so that the second pass can never displace one: a 繁體
|
|
35
|
+
// alias reaching a key sideways must not outrank the entry that key names.
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const held = claimed.get(entry.hans);
|
|
38
|
+
if (held === undefined || entry.frequency > held.frequency) {
|
|
39
|
+
claimed.set(entry.hans, entry);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
claimTraditional(claimed, entry);
|
|
44
|
+
}
|
|
45
|
+
return claimed;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=artifact-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-claims.js","sourceRoot":"","sources":["../../src/dictionary/artifact-claims.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;GAMG;AACH,SAAS,gBAAgB,CACvB,OAAqC,EACrC,KAAsB;IAEtB,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CACvB,OAAmC;IAEnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,wEAAwE;IACxE,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The artifact's on-disk format: its separators, its flags, and how a reading
|
|
3
|
+
* is written as one field.
|
|
4
|
+
*
|
|
5
|
+
* Both halves of `artifact.ts` — writing the file and reading it back — are
|
|
6
|
+
* held to the same answers here, which is what stops the two drifting apart.
|
|
7
|
+
*/
|
|
8
|
+
import { type Syllable } from "../syllable/syllable.js";
|
|
9
|
+
import type { DictionaryEntry } from "./entry.js";
|
|
10
|
+
/**
|
|
11
|
+
* Separator between a line's columns.
|
|
12
|
+
*/
|
|
13
|
+
export declare const COLUMN = "\t";
|
|
14
|
+
/**
|
|
15
|
+
* Separator between lines, matching the key index's own separator.
|
|
16
|
+
*/
|
|
17
|
+
export declare const LINE = "\n";
|
|
18
|
+
/**
|
|
19
|
+
* Separator between the alternate readings of a character.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ALTERNATE = ",";
|
|
22
|
+
/**
|
|
23
|
+
* The flag marking a proper noun.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PROPER_NOUN_FLAG = "p";
|
|
26
|
+
/**
|
|
27
|
+
* Where a proper name divides, written after the proper-noun flag.
|
|
28
|
+
*
|
|
29
|
+
* `p` alone is a proper noun whose parts CC-CEDICT does not divide; `p1` is one
|
|
30
|
+
* that divides after the first character, `p2.4` after the second and fourth.
|
|
31
|
+
* The positions are decimal and dot-separated rather than one digit each,
|
|
32
|
+
* because the longest word carrying any is 19 characters.
|
|
33
|
+
*
|
|
34
|
+
* It rides in the flags column rather than taking a column of its own because
|
|
35
|
+
* it is only ever present on a proper noun, and only 8,205 of 723,139 keys
|
|
36
|
+
* carry one — a sixth column would cost a separator on every line to say
|
|
37
|
+
* nothing on almost all of them. *
|
|
38
|
+
* `security/detect-unsafe-regex` flags the nested quantifier, and there is no
|
|
39
|
+
* ambiguity behind it: a literal `.` separates `\d+` from `(?:\.\d+)*`, so no
|
|
40
|
+
* input can be split between them two ways. Timed on a string of digits and
|
|
41
|
+
* dots that cannot match, it is linear — 8k to 128k characters doubles the time
|
|
42
|
+
* for each doubling of the input, 39µs to 607µs.
|
|
43
|
+
*/
|
|
44
|
+
export declare const NAME_BOUNDARIES: RegExp;
|
|
45
|
+
export declare const BOUNDARY_SEPARATOR = ".";
|
|
46
|
+
/**
|
|
47
|
+
* The boundaries a flags column states, empty where it states none.
|
|
48
|
+
*/
|
|
49
|
+
export declare function nameBoundariesIn(flags: string): readonly number[];
|
|
50
|
+
/**
|
|
51
|
+
* A compiled dictionary, in the form it is written to disk and read back.
|
|
52
|
+
*
|
|
53
|
+
* Three parallel pieces, all indexed by the same position: search `keys` for a
|
|
54
|
+
* word, and the line at that position in `entries` describes it. Nothing is
|
|
55
|
+
* parsed on load beyond scanning for separators — see BROWSER.md, where the
|
|
56
|
+
* measurement behind that choice is recorded.
|
|
57
|
+
*/
|
|
58
|
+
export interface DictionaryArtifact {
|
|
59
|
+
/** Sorted keys, newline-joined: the {@link KeyIndex} blob. */
|
|
60
|
+
readonly keys: string;
|
|
61
|
+
/** One line per key, in key order. */
|
|
62
|
+
readonly entries: string;
|
|
63
|
+
/** Quantised frequencies, packed two per byte. */
|
|
64
|
+
readonly frequencies: Uint8Array;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Write a reading in tone-numbered notation.
|
|
68
|
+
*
|
|
69
|
+
* Numbered rather than tone-marked because it is ASCII, so it survives any
|
|
70
|
+
* encoding, and because the tone is then a character rather than a combining
|
|
71
|
+
* mark that normalisation could move.
|
|
72
|
+
*/
|
|
73
|
+
export declare function encodeReading(syllables: readonly Syllable[]): string;
|
|
74
|
+
/**
|
|
75
|
+
* Read a reading back, or return undefined if any syllable is malformed.
|
|
76
|
+
*/
|
|
77
|
+
export declare function decodeReading(text: string): readonly Syllable[] | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Order two keys the way {@link KeyIndex} requires them: by UTF-16 code unit.
|
|
80
|
+
*/
|
|
81
|
+
export declare function byCodeUnit(left: string, right: string): number;
|
|
82
|
+
/**
|
|
83
|
+
* Every 繁體 spelling an entry claims a key for.
|
|
84
|
+
*/
|
|
85
|
+
export declare function traditionalForms(entry: DictionaryEntry): readonly string[];
|
|
86
|
+
//# sourceMappingURL=artifact-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-format.d.ts","sourceRoot":"","sources":["../../src/dictionary/artifact-format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,MAAM,OAAO,CAAC;AAE3B;;GAEG;AACH,eAAO,MAAM,IAAI,OAAO,CAAC;AAEzB;;GAEG;AACH,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B;;GAEG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,QAA6B,CAAC;AAE1D,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGjE;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAIpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE,GAAG,SAAS,CAQ3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,MAAM,EAAE,CAE1E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The artifact's on-disk format: its separators, its flags, and how a reading
|
|
3
|
+
* is written as one field.
|
|
4
|
+
*
|
|
5
|
+
* Both halves of `artifact.ts` — writing the file and reading it back — are
|
|
6
|
+
* held to the same answers here, which is what stops the two drifting apart.
|
|
7
|
+
*/
|
|
8
|
+
import { readSyllable, writeSyllable, } from "../syllable/syllable.js";
|
|
9
|
+
/**
|
|
10
|
+
* Separator between a line's columns.
|
|
11
|
+
*/
|
|
12
|
+
export const COLUMN = "\t";
|
|
13
|
+
/**
|
|
14
|
+
* Separator between lines, matching the key index's own separator.
|
|
15
|
+
*/
|
|
16
|
+
export const LINE = "\n";
|
|
17
|
+
/**
|
|
18
|
+
* Separator between the alternate readings of a character.
|
|
19
|
+
*/
|
|
20
|
+
export const ALTERNATE = ",";
|
|
21
|
+
/**
|
|
22
|
+
* The flag marking a proper noun.
|
|
23
|
+
*/
|
|
24
|
+
export const PROPER_NOUN_FLAG = "p";
|
|
25
|
+
/**
|
|
26
|
+
* Where a proper name divides, written after the proper-noun flag.
|
|
27
|
+
*
|
|
28
|
+
* `p` alone is a proper noun whose parts CC-CEDICT does not divide; `p1` is one
|
|
29
|
+
* that divides after the first character, `p2.4` after the second and fourth.
|
|
30
|
+
* The positions are decimal and dot-separated rather than one digit each,
|
|
31
|
+
* because the longest word carrying any is 19 characters.
|
|
32
|
+
*
|
|
33
|
+
* It rides in the flags column rather than taking a column of its own because
|
|
34
|
+
* it is only ever present on a proper noun, and only 8,205 of 723,139 keys
|
|
35
|
+
* carry one — a sixth column would cost a separator on every line to say
|
|
36
|
+
* nothing on almost all of them. *
|
|
37
|
+
* `security/detect-unsafe-regex` flags the nested quantifier, and there is no
|
|
38
|
+
* ambiguity behind it: a literal `.` separates `\d+` from `(?:\.\d+)*`, so no
|
|
39
|
+
* input can be split between them two ways. Timed on a string of digits and
|
|
40
|
+
* dots that cannot match, it is linear — 8k to 128k characters doubles the time
|
|
41
|
+
* for each doubling of the input, 39µs to 607µs.
|
|
42
|
+
*/
|
|
43
|
+
export const NAME_BOUNDARIES = /^p(?<at>\d+(?:\.\d+)*)$/u;
|
|
44
|
+
export const BOUNDARY_SEPARATOR = ".";
|
|
45
|
+
/**
|
|
46
|
+
* The boundaries a flags column states, empty where it states none.
|
|
47
|
+
*/
|
|
48
|
+
export function nameBoundariesIn(flags) {
|
|
49
|
+
const at = NAME_BOUNDARIES.exec(flags)?.groups?.["at"];
|
|
50
|
+
return at === undefined ? [] : at.split(BOUNDARY_SEPARATOR).map(Number);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Write a reading in tone-numbered notation.
|
|
54
|
+
*
|
|
55
|
+
* Numbered rather than tone-marked because it is ASCII, so it survives any
|
|
56
|
+
* encoding, and because the tone is then a character rather than a combining
|
|
57
|
+
* mark that normalisation could move.
|
|
58
|
+
*/
|
|
59
|
+
export function encodeReading(syllables) {
|
|
60
|
+
return syllables
|
|
61
|
+
.map((syllable) => writeSyllable(syllable, "numbers"))
|
|
62
|
+
.join(" ");
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read a reading back, or return undefined if any syllable is malformed.
|
|
66
|
+
*/
|
|
67
|
+
export function decodeReading(text) {
|
|
68
|
+
if (text === "") {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const syllables = text.split(" ").map((token) => readSyllable(token));
|
|
72
|
+
return syllables.includes(undefined)
|
|
73
|
+
? undefined
|
|
74
|
+
: syllables;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Order two keys the way {@link KeyIndex} requires them: by UTF-16 code unit.
|
|
78
|
+
*/
|
|
79
|
+
export function byCodeUnit(left, right) {
|
|
80
|
+
if (left < right) {
|
|
81
|
+
return -1;
|
|
82
|
+
}
|
|
83
|
+
return left > right ? 1 : 0;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Every 繁體 spelling an entry claims a key for.
|
|
87
|
+
*/
|
|
88
|
+
export function traditionalForms(entry) {
|
|
89
|
+
return [entry.hant, ...(entry.hantVariants ?? [])];
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=artifact-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-format.js","sourceRoot":"","sources":["../../src/dictionary/artifact-format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,YAAY,EAEZ,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;AAE3B;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAmBD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,SAA8B;IAC1D,OAAO,SAAS;SACb,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;SACrD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClC,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,SAAiC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DictionaryEntry } from "./entry.js";
|
|
2
|
+
import { type DictionaryArtifact } from "./artifact-format.js";
|
|
3
|
+
export { decodeReading, type DictionaryArtifact, encodeReading, traditionalForms, } from "./artifact-format.js";
|
|
4
|
+
/**
|
|
5
|
+
* Read an artifact back into entries, for tests and for the loader.
|
|
6
|
+
*
|
|
7
|
+
* The reverse of {@link buildArtifact} but for the two things it does not
|
|
8
|
+
* store: frequency comes back as a bucket rather than a count, since it is
|
|
9
|
+
* quantised on the way out, and 简体/繁體 pairing is absent, so every entry
|
|
10
|
+
* reports its key as both. Entries are returned in key order.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readArtifact(artifact: DictionaryArtifact): readonly DictionaryEntry[];
|
|
13
|
+
/**
|
|
14
|
+
* The reading every key in an artifact resolves to, in tone-numbered notation.
|
|
15
|
+
*
|
|
16
|
+
* Resolved rather than read off the line, since 87.8% of multi-character lines
|
|
17
|
+
* store no reading at all and mean "the characters' defaults, in order" — and
|
|
18
|
+
* those defaults are whatever *this* artifact holds. That is exactly what makes
|
|
19
|
+
* the comparison between tiers worth doing: a tier missing a character does not
|
|
20
|
+
* only lose that character, it changes every derived reading that stands on it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readingsByKey(artifact: DictionaryArtifact): ReadonlyMap<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* The first key an artifact does not read back the same, or undefined.
|
|
25
|
+
*
|
|
26
|
+
* Only the fields the artifact stores are compared: frequency is quantised on
|
|
27
|
+
* the way out, and the 简体/繁體 labelling of a pair is not recoverable from a
|
|
28
|
+
* key alone, so neither is checked here.
|
|
29
|
+
*
|
|
30
|
+
* Returns the offending key rather than a bare false so that a build failure
|
|
31
|
+
* names the word to go and look at.
|
|
32
|
+
*/
|
|
33
|
+
export declare function findRoundTripFailure(entries: readonly DictionaryEntry[], artifact: DictionaryArtifact): string | undefined;
|
|
34
|
+
//# sourceMappingURL=artifact-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-read.d.ts","sourceRoot":"","sources":["../../src/dictionary/artifact-read.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,OAAO,EAIL,KAAK,kBAAkB,EAKxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,aAAa,EACb,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,kBAAkB,GAC3B,SAAS,eAAe,EAAE,CA2D5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,GAC3B,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAO7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,GAAG,SAAS,CAkBpB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading the dictionary artifact back.
|
|
3
|
+
*
|
|
4
|
+
* The mirror of buildArtifact, and held to it by the round-trip check at the
|
|
5
|
+
* end of the build.
|
|
6
|
+
*/
|
|
7
|
+
import { claimKeys } from "./artifact.js";
|
|
8
|
+
import { toCharacters } from "../script/characters.js";
|
|
9
|
+
import { isSameReading } from "./entry.js";
|
|
10
|
+
import { FrequencyTable } from "./frequency-table.js";
|
|
11
|
+
import { KeyIndex } from "./key-index.js";
|
|
12
|
+
import { ALTERNATE, COLUMN, decodeReading, encodeReading, LINE, nameBoundariesIn, PROPER_NOUN_FLAG, } from "./artifact-format.js";
|
|
13
|
+
export { decodeReading, encodeReading, traditionalForms, } from "./artifact-format.js";
|
|
14
|
+
/**
|
|
15
|
+
* Read an artifact back into entries, for tests and for the loader.
|
|
16
|
+
*
|
|
17
|
+
* The reverse of {@link buildArtifact} but for the two things it does not
|
|
18
|
+
* store: frequency comes back as a bucket rather than a count, since it is
|
|
19
|
+
* quantised on the way out, and 简体/繁體 pairing is absent, so every entry
|
|
20
|
+
* reports its key as both. Entries are returned in key order.
|
|
21
|
+
*/
|
|
22
|
+
export function readArtifact(artifact) {
|
|
23
|
+
const index = KeyIndex.from(artifact.keys);
|
|
24
|
+
const lines = artifact.entries === "" ? [] : artifact.entries.split(LINE);
|
|
25
|
+
const frequencies = FrequencyTable.from(artifact.frequencies, index.size);
|
|
26
|
+
// Two passes: a derivable reading needs its characters' readings, which are
|
|
27
|
+
// themselves entries in the same artifact.
|
|
28
|
+
const defaults = new Map();
|
|
29
|
+
for (let at = 0; at < index.size; at++) {
|
|
30
|
+
const key = index.keyAt(at);
|
|
31
|
+
const reading = (lines[at] ?? "").split(COLUMN)[0] ?? "";
|
|
32
|
+
if (toCharacters(key).length === 1 && reading !== "") {
|
|
33
|
+
defaults.set(key, reading);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const entries = [];
|
|
37
|
+
for (let at = 0; at < index.size; at++) {
|
|
38
|
+
const key = index.keyAt(at);
|
|
39
|
+
const [reading = "", taiwan = "", partOfSpeech = "", flags = "", alternates = "",] = (lines[at] ?? "").split(COLUMN);
|
|
40
|
+
const nameBoundaries = nameBoundariesIn(flags);
|
|
41
|
+
const stored = reading === ""
|
|
42
|
+
? toCharacters(key)
|
|
43
|
+
.map((character) => defaults.get(character) ?? "")
|
|
44
|
+
.join(" ")
|
|
45
|
+
: reading;
|
|
46
|
+
const cn = decodeReading(stored);
|
|
47
|
+
if (cn === undefined) {
|
|
48
|
+
throw new Error(`artifact entry for ${key} has no readable reading`);
|
|
49
|
+
}
|
|
50
|
+
const tw = decodeReading(taiwan);
|
|
51
|
+
// The artifact stores keys, not pairs, so a key read back is both scripts
|
|
52
|
+
// as far as it knows. See buildArtifact for what that leaves out and why.
|
|
53
|
+
entries.push({
|
|
54
|
+
hans: key,
|
|
55
|
+
hant: key,
|
|
56
|
+
readings: { cn, ...(tw !== undefined && { tw }) },
|
|
57
|
+
frequency: frequencies.bucketOf(at),
|
|
58
|
+
partOfSpeech,
|
|
59
|
+
isProperNoun: flags.includes(PROPER_NOUN_FLAG),
|
|
60
|
+
...(nameBoundaries.length > 0 && { nameBoundaries }),
|
|
61
|
+
...(alternates !== "" && {
|
|
62
|
+
alternates: alternates
|
|
63
|
+
.split(ALTERNATE)
|
|
64
|
+
.map((text) => decodeReading(text))
|
|
65
|
+
.filter((decoded) => decoded !== undefined),
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return entries;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The reading every key in an artifact resolves to, in tone-numbered notation.
|
|
73
|
+
*
|
|
74
|
+
* Resolved rather than read off the line, since 87.8% of multi-character lines
|
|
75
|
+
* store no reading at all and mean "the characters' defaults, in order" — and
|
|
76
|
+
* those defaults are whatever *this* artifact holds. That is exactly what makes
|
|
77
|
+
* the comparison between tiers worth doing: a tier missing a character does not
|
|
78
|
+
* only lose that character, it changes every derived reading that stands on it.
|
|
79
|
+
*/
|
|
80
|
+
export function readingsByKey(artifact) {
|
|
81
|
+
const index = KeyIndex.from(artifact.keys);
|
|
82
|
+
const readings = new Map();
|
|
83
|
+
for (const [at, entry] of readArtifact(artifact).entries()) {
|
|
84
|
+
readings.set(index.keyAt(at), encodeReading(entry.readings.cn));
|
|
85
|
+
}
|
|
86
|
+
return readings;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The first key an artifact does not read back the same, or undefined.
|
|
90
|
+
*
|
|
91
|
+
* Only the fields the artifact stores are compared: frequency is quantised on
|
|
92
|
+
* the way out, and the 简体/繁體 labelling of a pair is not recoverable from a
|
|
93
|
+
* key alone, so neither is checked here.
|
|
94
|
+
*
|
|
95
|
+
* Returns the offending key rather than a bare false so that a build failure
|
|
96
|
+
* names the word to go and look at.
|
|
97
|
+
*/
|
|
98
|
+
export function findRoundTripFailure(entries, artifact) {
|
|
99
|
+
const index = KeyIndex.from(artifact.keys);
|
|
100
|
+
const read = readArtifact(artifact);
|
|
101
|
+
const byKey = new Map();
|
|
102
|
+
for (const [at, entry] of read.entries()) {
|
|
103
|
+
byKey.set(index.keyAt(at), entry);
|
|
104
|
+
}
|
|
105
|
+
for (const [key, entry] of claimKeys(entries)) {
|
|
106
|
+
const other = byKey.get(key);
|
|
107
|
+
if (other === undefined ||
|
|
108
|
+
!isSameReading(entry.readings.cn, other.readings.cn)) {
|
|
109
|
+
return key;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=artifact-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-read.js","sourceRoot":"","sources":["../../src/dictionary/artifact-read.ts"],"names":[],"mappings":"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"}
|