@kensio/pinyinjs 1.2.1 → 1.3.0
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/CHANGELOG.md +93 -24
- package/README.md +40 -35
- package/dist/cli/arguments.d.ts +45 -0
- package/dist/cli/arguments.d.ts.map +1 -1
- package/dist/cli/arguments.js +83 -0
- package/dist/cli/arguments.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +24 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +17 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/decode/convert.d.ts +10 -0
- package/dist/decode/convert.d.ts.map +1 -1
- package/dist/decode/convert.js +72 -28
- package/dist/decode/convert.js.map +1 -1
- package/dist/decode/decode.d.ts +12 -2
- package/dist/decode/decode.d.ts.map +1 -1
- package/dist/decode/decode.js +64 -7
- package/dist/decode/decode.js.map +1 -1
- package/dist/decode/reading-rules.d.ts +57 -0
- package/dist/decode/reading-rules.d.ts.map +1 -1
- package/dist/decode/reading-rules.js +178 -1
- package/dist/decode/reading-rules.js.map +1 -1
- package/dist/format/slug.d.ts +156 -0
- package/dist/format/slug.d.ts.map +1 -0
- package/dist/format/slug.js +0 -0
- package/dist/format/slug.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/numerals/cardinal.d.ts +15 -1
- package/dist/numerals/cardinal.d.ts.map +1 -1
- package/dist/numerals/cardinal.js +8 -1
- package/dist/numerals/cardinal.js.map +1 -1
- package/dist/numerals/characters.d.ts +9 -0
- package/dist/numerals/characters.d.ts.map +1 -1
- package/dist/numerals/characters.js +18 -0
- package/dist/numerals/characters.js.map +1 -1
- package/dist/numerals/numerals.d.ts.map +1 -1
- package/dist/numerals/numerals.js +12 -4
- package/dist/numerals/numerals.js.map +1 -1
- package/dist/numerals/text.d.ts +18 -5
- package/dist/numerals/text.d.ts.map +1 -1
- package/dist/numerals/text.js +67 -8
- package/dist/numerals/text.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,26 @@ which a dictionary rebuild can change, and the artifact format under `data/`.
|
|
|
11
11
|
|
|
12
12
|
### Added
|
|
13
13
|
|
|
14
|
+
- **`slug`,** hanzi to a URL-safe slug: 我想学中文。 is
|
|
15
|
+
`wo3-xiang3-xue2-zhong1wen2`. Built on the decode rather than on a finished
|
|
16
|
+
string, which is the whole point of it — 银行 is `yin2hang2` and not
|
|
17
|
+
`yin2xing2`, the separators fall on the word boundaries 分词连写 found, and
|
|
18
|
+
西安 keeps its 隔音符号 as a break so a toneless slug is `xi-an` rather than
|
|
19
|
+
`xian`, which is a different word. Tones are written by default because
|
|
20
|
+
dropping them collides, and `hash` puts a short hash of the _hanzi_ on the end
|
|
21
|
+
for the homophones tones cannot separate: 权利 and 权力 are both `quan2li4`.
|
|
22
|
+
The options generalise it past URLs to search keys and identifiers, which the
|
|
23
|
+
[slug page](docs/slug/) tabulates. `pinyinjs slug` at the command line.
|
|
24
|
+
|
|
25
|
+
- **`TEACHING_JIAO` and `COUNTED_MEASURE`,** two more lattice rules, and
|
|
26
|
+
`QUANTITY_CHARACTERS`, the 汉字 a quantity is written with that the second of
|
|
27
|
+
them asks about. See the fixes below for what they do and what they measure.
|
|
28
|
+
- **`counts` on the numeral options.** Whether the number stands immediately in
|
|
29
|
+
front of something it counts, which is what makes a lone 2 两:
|
|
30
|
+
`numeralHanzi(2, { counts: true })` is `两` and `numeralHanzi(2)` is `二`.
|
|
31
|
+
Unlike `liang` it is not a variable choice — 二个 is simply wrong — but
|
|
32
|
+
nothing about the number says whether it is counting, so the caller says.
|
|
33
|
+
`convert` sets it from the character after the digits.
|
|
14
34
|
- **`SYLLABLE_TONES` and `isAttestedTone`.** Which tones each of the 424
|
|
15
35
|
syllables is actually written in, extracted from the merged dictionary and
|
|
16
36
|
held to it by a build assertion. 424 syllables in five tones would be 2,120
|
|
@@ -24,14 +44,63 @@ which a dictionary rebuild can change, and the artifact format under `data/`.
|
|
|
24
44
|
en.wiktionary's Mandarin pronunciation blocks, in bopomofo, Wade-Giles, Yale
|
|
25
45
|
and GR with their tones, and all 50 rows of Wikipedia's _Help:IPA/Mandarin_
|
|
26
46
|
key. The 417-row syllabary already checked was toneless, so it could say
|
|
27
|
-
nothing about tone marks, the neutral tone, 儿化 or how a word is joined
|
|
47
|
+
nothing about tone marks, the neutral tone, 儿化 or how a word is joined,
|
|
28
48
|
which is where the four fixes below were found.
|
|
29
49
|
|
|
30
50
|
### Fixed
|
|
31
51
|
|
|
52
|
+
- **教 was `jiào` even where it was teaching.** 他在北京大学教了三年书 came out
|
|
53
|
+
`jiàole sān nián shū`, and 我教英语, 谁教你法语 and 她教我如何游泳 with it.
|
|
54
|
+
The dictionary stores 教 as `jiào` with `jiāo` as an alternate, and `jiào` is
|
|
55
|
+
right for the compounds — 教育, 教师, 宗教, 主教 — which are words and reach
|
|
56
|
+
their reading through the word; what is left is the 教 standing as a word of
|
|
57
|
+
its own, and that one is the verb. The object is what says so: a pronoun, a
|
|
58
|
+
noun or a name after it, or an aspect particle, since only a verb takes 了,
|
|
59
|
+
过 or 得. Forcing the character's own reading was not enough on its own,
|
|
60
|
+
because a two-character reading carries its 教 into the position from
|
|
61
|
+
outside — 王老师教我们汉语 read `jiào` off 师教 and 来教我 off 来教 — so an
|
|
62
|
+
untagged pair ending in 教 goes too, while every tagged word keeps its
|
|
63
|
+
reading: 任教, 宗教, 主教, 佛教, 传教, 执教, 请教, 家教. Over 88,866 lines
|
|
64
|
+
181 教 decode as a word of their own and every one read `jiào`; 158 are now
|
|
65
|
+
`jiāo`, three of them wrongly — 统一教创始人, 方法教深思 and 做到了教政分离,
|
|
66
|
+
where a nominal compound takes an object's shape. CPP's polyphone score is
|
|
67
|
+
89.05%, up from 89.04%.
|
|
68
|
+
- **A 量词 was swallowed by the word behind it.** 三个人 was `sān gèrén`, three
|
|
69
|
+
_personals_, because 个人 is a common noun and nothing weighed it against the
|
|
70
|
+
个 belonging to the 三 in front of it. It is now `sān gè rén`, and so are
|
|
71
|
+
两家人, 三杯水, 四匹马, 十八层楼 and 一段长时间. What makes it decidable is
|
|
72
|
+
that the dictionary tags the 量词: 个, 次, 天 and 杯 are `q`, while the
|
|
73
|
+
characters that only look like measure words in this position are not — 分 is
|
|
74
|
+
a verb, 部 and 成 are nouns, 年 and 点 are numerals — so 五分钟, 三部分,
|
|
75
|
+
五成分, 五年级 and 三点钟 are untouched, and those are exactly the words a
|
|
76
|
+
blanket rule would break. Nor does an ordinal count anything (第三集团军), nor
|
|
77
|
+
a numeral inside a longer word (唯一道路), and a number and its measure
|
|
78
|
+
written solid survive whole where the dictionary has them: 一辈子, 一会儿,
|
|
79
|
+
一口气 and 两口子 are unchanged. Over 88,866 lines the rule forbids 561 edges
|
|
80
|
+
and moves 53 decodes, three of them wrongly — 一批评, 这一名词 and 六七股灾,
|
|
81
|
+
where the 一 and the 六七 count nothing. Exactly one reading changes in the
|
|
82
|
+
whole corpus and it is a fix: 已经下了两天雨了 read 天雨 as `tiān yù`.
|
|
83
|
+
- **The Han after a number was decoded without it.** 2个人 was `liǎng gèrén`
|
|
84
|
+
while 两个人 written out was already `liǎng gè rén`, because a Han run was
|
|
85
|
+
decoded on its own and had no idea a number preceded it. A run is now decoded
|
|
86
|
+
with the 汉字 the digits stand for in front of it, and reported without them,
|
|
87
|
+
so digits and 汉字 reach the same decode. `decodeRun` and `decodeRunScored`
|
|
88
|
+
take that context as a fourth argument; where a reading would straddle the
|
|
89
|
+
join — 1点儿事, whose 一点儿 is one `yìdiǎnr` over both sides of it — the run
|
|
90
|
+
is decoded alone, as before.
|
|
91
|
+
- **A lone 2 in front of a 量词 was read 二.** 我们买了2个西瓜 came out as
|
|
92
|
+
`wǒmen mǎile èr gè xīguā`, and a 2 standing immediately in front of what it
|
|
93
|
+
counts is 两: it is now `liǎng gè`, and 2岁 is `liǎng suì`, 2点 `liǎng diǎn`
|
|
94
|
+
and 2万人 `liǎng wàn rén`, the same 两 that 2,000 and 2:00 already got. The
|
|
95
|
+
measure words a 2 can count with are an open list, so 两 is the default and
|
|
96
|
+
the exceptions are named — 月, 日, 号, 楼, 路, 班 and 期, where the digit
|
|
97
|
+
labels a position rather than counting (2月 is `èr yuè`), an ordinal, which
|
|
98
|
+
the 第 in front of it marks (第2次 is `dì èr cì`), and 十 and 百, which follow
|
|
99
|
+
二 as 20 and 200 already do. A 2 inside a larger number is untouched: 12个 is
|
|
100
|
+
still `shí'èr gè`.
|
|
32
101
|
- **A decimal lost the grouping of its counted part.** 一共75.5元 was
|
|
33
102
|
`yígòng qī shí wǔ diǎn wǔ yuán`, with the 75 in loose syllables, and is now
|
|
34
|
-
`yígòng qīshíwǔ diǎn wǔ yuán
|
|
103
|
+
`yígòng qīshíwǔ diǎn wǔ yuán`, the same word 一共75元 already got. Only what
|
|
35
104
|
follows the 点 is read a digit at a time, and that part is unchanged: 3.14 is
|
|
36
105
|
still `sān diǎn yī sì`, and sandhi still stops at the point.
|
|
37
106
|
- **A decimal point was read as a full stop.** 一共75.5元 came back as
|
|
@@ -42,14 +111,14 @@ which a dictionary rebuild can change, and the artifact format under `data/`.
|
|
|
42
111
|
is now `ㄋㄚˇㄦ`: the mark belongs to the nucleus and the suffix is not part of
|
|
43
112
|
what it marks. A mark written after the ㄦ is still read.
|
|
44
113
|
- **Wade-Giles put the tone digit on the 儿化 suffix,** so 花儿 huār was
|
|
45
|
-
`hua-êrh
|
|
114
|
+
`hua-êrh¹`, a first-tone 兒. It is now `hua¹-'rh`, with the digit on the
|
|
46
115
|
syllable the tone belongs to and the suffix written as the reduced `'rh` that
|
|
47
116
|
keeps it apart from 女儿 nǚ'ér's `nü³-êrh²`.
|
|
48
117
|
- **Gwoyeu Romatzyh wrote 儿化 as a plain `-l` suffix.** GR fuses it into the
|
|
49
118
|
rime instead, and the rules are now implemented as _Spelling in Gwoyeu
|
|
50
119
|
Romatzyh_ gives them: 玩儿 wánr is `wal` rather than `wanl`, 事儿 shìr is
|
|
51
120
|
`shell`, 今儿 jīnr is `jiel`. The fusion is many-to-one, so `jiel` is 今儿 and
|
|
52
|
-
鸡儿 both and 128 forms no longer round-trip
|
|
121
|
+
鸡儿 both and 128 forms no longer round-trip, every one of them a form the
|
|
53
122
|
language does not write.
|
|
54
123
|
- **Gwoyeu Romatzyh wrote `.mhe` for a neutral 么.** The `-h-` is the first tone
|
|
55
124
|
of a sonorant initial, and a neutral syllable is in no tone at all; the basic
|
|
@@ -58,23 +127,23 @@ which a dictionary rebuild can change, and the artifact format under `data/`.
|
|
|
58
127
|
follows the broader IPA column of _Comparison of Standard Chinese
|
|
59
128
|
transcription systems_, which is where its ground truth comes from; the two
|
|
60
129
|
pages differ at the medials, -ang, the empty rhyme and the diphthongs. No
|
|
61
|
-
output changed
|
|
130
|
+
output changed, only the claim.
|
|
62
131
|
- **`--system ipa` capitalised the IPA.** 我去银行。他姓王。 came out as
|
|
63
132
|
`Uo˨˩˦ ... Tʰa˥ ɕiŋ˥˩ Uaŋ˧˥`, with the sentence capital and the proper noun
|
|
64
133
|
carried over from the pinyin as though a transcription spelled words. IPA
|
|
65
|
-
letters are symbols rather than an alphabet
|
|
66
|
-
size but a symbol the IPA does not have
|
|
134
|
+
letters are symbols rather than an alphabet, since `[T]` is not `[t]` in a
|
|
135
|
+
larger size but a symbol the IPA does not have, so the capitals are now dropped for
|
|
67
136
|
IPA and bopomofo and kept for the three romanisations. `toTranscription`
|
|
68
137
|
takes `{ capitals: false }` for callers writing their own.
|
|
69
138
|
- **A compound lost the zh-TW reading its own parts carry.** 垃圾分類 read
|
|
70
139
|
`lājīfēnlèi` under `zh-TW`, because CC-CEDICT marks `Taiwan pr.` on 垃圾 and
|
|
71
|
-
垃圾桶 and on no other compound, and the decoder prefers the longer word
|
|
140
|
+
垃圾桶 and on no other compound, and the decoder prefers the longer word, so
|
|
72
141
|
the entry that had the delta was never consulted. 101 compounds now compose
|
|
73
142
|
one from their constituents, 垃圾 accounting for 14 of them and 比肩, 玳瑁,
|
|
74
143
|
从容, 骨头, 蜗牛 and 说服 for most of the rest. Three guards keep it honest:
|
|
75
144
|
the constituent has to survive segmentation (運行狀況 contains 行狀 but reads
|
|
76
145
|
運行 + 狀況), it has to be read in the compound exactly as its own entry reads
|
|
77
|
-
it, and it has to be a whole word
|
|
146
|
+
it, and it has to be a whole word rather than a bare character, since 會's `huǐ`
|
|
78
147
|
would rewrite 三合會 as `sānhéhuǐ` and 3,743 entries would compose that way
|
|
79
148
|
against the 101 that whole words compose.
|
|
80
149
|
- **A character's zh-TW delta was often a choice between its 普通话 senses.**
|
|
@@ -83,25 +152,25 @@ which a dictionary rebuild can change, and the artifact format under `data/`.
|
|
|
83
152
|
is a locale shift: CC-CEDICT lists 地[de5] and 地[di4] as separate entries, so
|
|
84
153
|
`dì` is what 地 reads in 普通话 when it means the ground, and the adverbial
|
|
85
154
|
particle is `de` in Taipei too. A delta the word already has as a 普通话 sense
|
|
86
|
-
is now refused
|
|
87
|
-
舍, 薄 and 万 among them
|
|
155
|
+
is now refused, so 71 characters and 3 words lose one, 都, 着, 应, 差, 称, 斗,
|
|
156
|
+
舍, 薄 and 万 among them, while 和 `hàn`, 期 `qí`, 垃 `lè` and 髮 `fǎ` stay,
|
|
88
157
|
no 普通话 sense reading any of those that way. A `Taiwan pr.` note is also
|
|
89
158
|
only read off a sense matching the reading the entry settled on, which drops
|
|
90
159
|
16 more: the note on 著's chess-move sense, which reads `zhāo`, had been
|
|
91
160
|
giving the aspect particle 着 a 國語 reading of `zhuó`.
|
|
92
161
|
- **A locale delta overwrote a reading it was not measured against.** The delta
|
|
93
162
|
describes the entry's own 普通话 reading, so a polyphone the decode read some
|
|
94
|
-
other way
|
|
95
|
-
entry stores
|
|
96
|
-
from the entry.
|
|
163
|
+
other way, such as 得 forced to the modal `děi` rather than the particle `de`
|
|
164
|
+
its entry stores, now keeps what the decode worked out instead of being
|
|
165
|
+
rewritten from the entry.
|
|
97
166
|
|
|
98
167
|
### Changed
|
|
99
168
|
|
|
100
169
|
- **Reading a romanisation narrows on the tone that was written.**
|
|
101
170
|
`readWadeGiles("lo²")` was `[luó, ló]` and is now `[luó]`: 咯 is a
|
|
102
171
|
sentence-final particle and is only ever neutral, so ló is not a syllable
|
|
103
|
-
Mandarin has. The same goes for `readWadeGilesLoosely
|
|
104
|
-
|
|
172
|
+
Mandarin has. The same goes for `readWadeGilesLoosely`, where `pan²` is pán
|
|
173
|
+
alone, and for `readYale`, `readIpa` and `readGwoyeu`, where it settles the 儿化
|
|
105
174
|
collisions the same way (`ell` is 二 èr, there being no first-tone 兒).
|
|
106
175
|
Narrowing never empties a list: a tone no candidate is written in leaves the
|
|
107
176
|
candidates alone, since that says the tone is wrong rather than the spelling.
|
|
@@ -123,7 +192,7 @@ decoder internals and the build pipeline.
|
|
|
123
192
|
- **Transcription systems, all five, in both directions.** Bopomofo, Wade-Giles,
|
|
124
193
|
Yale, Gwoyeu Romatzyh and IPA at the syllable level, plus hanzi → any of them
|
|
125
194
|
end to end via `convert --system` and `convertToWadeGiles`. Checked against
|
|
126
|
-
417 rows of an outside syllabary in every system
|
|
195
|
+
417 rows of an outside syllabary in every system, which is 3,336 cells.
|
|
127
196
|
- **Reading ambiguous Wade-Giles.** `readWadeGilesLoosely` allows for the
|
|
128
197
|
apostrophes and diacritics real texts drop, and `splitWadeGiles` puts back the
|
|
129
198
|
hyphens they lose. Measured: 52.07% of written syllables lose their identity
|
|
@@ -134,7 +203,7 @@ decoder internals and the build pipeline.
|
|
|
134
203
|
follows them.
|
|
135
204
|
- **Orthography rules.** The 重叠 hyphen for AABB and repeated words, the 成语
|
|
136
205
|
hyphen from a curated list of 117, 老王 → `Lǎo Wáng`, and GB/T 16159 5.1 in
|
|
137
|
-
full
|
|
206
|
+
full, so 毛泽东 is `Máo Zédōng` and 北京大学 is `Běijīng Dàxué`, on boundaries
|
|
138
207
|
CC-CEDICT's own capitalisation states.
|
|
139
208
|
- **Typed rule overrides on the lattice** (`READING_RULES`), with the modal 得
|
|
140
209
|
and attested 儿化 as the first two.
|
|
@@ -167,17 +236,17 @@ decoder internals and the build pipeline.
|
|
|
167
236
|
|
|
168
237
|
### Accuracy at 1.0.0
|
|
169
238
|
|
|
170
|
-
Over the
|
|
171
|
-
the published package
|
|
239
|
+
Over the 118-case gold corpus, which is committed to the repository rather than
|
|
240
|
+
to the published package, and scored by `pnpm accuracy`:
|
|
172
241
|
|
|
173
242
|
| | lattice | greedy baseline |
|
|
174
243
|
| ---------------- | --------: | --------------: |
|
|
175
|
-
| exact match | **97.
|
|
176
|
-
| reading accuracy | 99.7% | 98.
|
|
177
|
-
| spacing (F1) | **99.
|
|
244
|
+
| exact match | **97.5%** | 88.1% |
|
|
245
|
+
| reading accuracy | 99.7% | 98.3% |
|
|
246
|
+
| spacing (F1) | **99.8%** | 96.3% |
|
|
178
247
|
|
|
179
248
|
Every figure in that table is asserted against the scorer by
|
|
180
|
-
`src/changelog.test.ts`, because a number nothing executes goes stale
|
|
249
|
+
`src/changelog.test.ts`, because a number nothing executes goes stale, which is
|
|
181
250
|
what happened to this project's README table across three releases.
|
|
182
251
|
|
|
183
252
|
`pnpm polyphones` reports 89.04% for the lattice against greedy's 88.82% over
|
package/README.md
CHANGED
|
@@ -29,6 +29,9 @@ Wǒ yào qù Běijīng.
|
|
|
29
29
|
$ pinyinjs convert --notation numbers 银行
|
|
30
30
|
yin2hang2
|
|
31
31
|
|
|
32
|
+
$ pinyinjs slug 我想学中文。
|
|
33
|
+
wo3-xiang3-xue2-zhong1wen2
|
|
34
|
+
|
|
32
35
|
$ pinyinjs explain 银行
|
|
33
36
|
银行 yínháng
|
|
34
37
|
yín locked
|
|
@@ -53,6 +56,7 @@ běijīng běijīng ㄅㄟˇ ㄐㄧㄥ pei³-ching¹ běijīng beeij
|
|
|
53
56
|
| ------------ | --------------------------------------------------- |
|
|
54
57
|
| `convert` | hanzi to pinyin |
|
|
55
58
|
| `html` | the same, as HTML |
|
|
59
|
+
| `slug` | hanzi to a URL-safe slug |
|
|
56
60
|
| `explain` | each syllable, how settled it was, and what it beat |
|
|
57
61
|
| `lookup` | what the dictionary holds for a word |
|
|
58
62
|
| `syllable` | take written pinyin apart |
|
|
@@ -70,7 +74,7 @@ A command given no arguments reads standard input, one text per line, so
|
|
|
70
74
|
dictionary at all and start without loading one.
|
|
71
75
|
|
|
72
76
|
At a terminal each syllable is written in its tone's colour, in
|
|
73
|
-
[MDBG](https://www.mdbg.net)'s palette
|
|
77
|
+
[MDBG](https://www.mdbg.net)'s palette of red, yellow, green, blue, and the
|
|
74
78
|
terminal's own colour for the neutral tone. It is off for a pipe, `NO_COLOR` is
|
|
75
79
|
honoured, `--colour` and `--no-colour` force it either way, and `--json` is
|
|
76
80
|
never coloured. See [the command line](docs/cli/#colour).
|
|
@@ -85,9 +89,8 @@ $ pinyinjs convert 银行
|
|
|
85
89
|
yínháng
|
|
86
90
|
```
|
|
87
91
|
|
|
88
|
-
Everything else has columns for a person to read. Add `--json`
|
|
89
|
-
|
|
90
|
-
`jq` wants:
|
|
92
|
+
Everything else has columns for a person to read. Add `--json` to any command
|
|
93
|
+
and it writes one JSON document per answer instead, which is what `jq` wants:
|
|
91
94
|
|
|
92
95
|
```console
|
|
93
96
|
$ pinyinjs explain 长江大桥 --json | jq -c '.syllables[] | select(.state != "locked")'
|
|
@@ -149,16 +152,16 @@ first, convert with it, and reload as `full` arrives.
|
|
|
149
152
|
convert(dictionary, "银行"); // "yínháng"
|
|
150
153
|
convert(dictionary, "行长"); // "hángzhǎng"
|
|
151
154
|
convert(dictionary, "我要去北京。"); // "Wǒ yào qù Běijīng."
|
|
152
|
-
convert(dictionary, "3D银行"); // "sān D yínháng"
|
|
155
|
+
convert(dictionary, "3D银行"); // "sān D yínháng", the digit is read, the letter is not
|
|
153
156
|
```
|
|
154
157
|
|
|
155
158
|
A reading the dictionary cannot settle on its own is settled by context, with
|
|
156
159
|
typed rules over the lattice rather than tweaks to the output:
|
|
157
160
|
|
|
158
161
|
```ts
|
|
159
|
-
convert(dictionary, "我得走了"); // "wǒ děi zǒule"
|
|
160
|
-
convert(dictionary, "他跑得很快"); // "tā pǎo de hěn kuài"
|
|
161
|
-
convert(dictionary, "那边儿"); // "nà biānr"
|
|
162
|
+
convert(dictionary, "我得走了"); // "wǒ děi zǒule", modal 得
|
|
163
|
+
convert(dictionary, "他跑得很快"); // "tā pǎo de hěn kuài", the particle
|
|
164
|
+
convert(dictionary, "那边儿"); // "nà biānr", 儿 does not stand on its own
|
|
162
165
|
```
|
|
163
166
|
|
|
164
167
|
See [converting](docs/converting/#rules-where-the-cost-model-cannot-reach).
|
|
@@ -226,7 +229,7 @@ writes in a way no rule reaches.
|
|
|
226
229
|
|
|
227
230
|
```ts
|
|
228
231
|
convert(dictionary, "他看了"); // "tā kànle"
|
|
229
|
-
convert(dictionary, "我还给你了。"); // "Wǒ huán gěi nǐ le."
|
|
232
|
+
convert(dictionary, "我还给你了。"); // "Wǒ huán gěi nǐ le.", sentence-final 了
|
|
230
233
|
convert(dictionary, "作者"); // "zuòzhě"
|
|
231
234
|
convert(dictionary, "南京市"); // "Nánjīng Shì"
|
|
232
235
|
convert(dictionary, "南京市", { grouping: false }); // "Nánjīngshì"
|
|
@@ -246,7 +249,7 @@ a boundary inside it.
|
|
|
246
249
|
```ts
|
|
247
250
|
convert(dictionary, "干干净净"); // "gāngān-jìngjìng"
|
|
248
251
|
convert(dictionary, "研究研究"); // "yánjiū-yánjiū"
|
|
249
|
-
convert(dictionary, "爸爸妈妈"); // "bàba māma"
|
|
252
|
+
convert(dictionary, "爸爸妈妈"); // "bàba māma", that shape, but two words
|
|
250
253
|
```
|
|
251
254
|
|
|
252
255
|
**A 成语 that can be read as two disyllables** takes the same hyphen, from a
|
|
@@ -254,7 +257,7 @@ curated list of 117; the rest are written solid, as the standard writes them.
|
|
|
254
257
|
|
|
255
258
|
```ts
|
|
256
259
|
convert(dictionary, "风平浪静"); // "fēngpíng-làngjìng"
|
|
257
|
-
convert(dictionary, "不亦乐乎"); // "búyìlèhū"
|
|
260
|
+
convert(dictionary, "不亦乐乎"); // "búyìlèhū", cannot be halved
|
|
258
261
|
```
|
|
259
262
|
|
|
260
263
|
**Digits are read**, and the rest of a non-Han run passes through exactly as
|
|
@@ -266,7 +269,7 @@ convert(dictionary, "1988年之后"); // "yī jiǔ bā bā nián zhīhòu"
|
|
|
266
269
|
convert(dictionary, "95%的人"); // "bǎifēnzhījiǔshíwǔ de rén"
|
|
267
270
|
convert(dictionary, "3D打印"); // "sān D dǎyìn"
|
|
268
271
|
convert(dictionary, "6:30起床"); // "liù diǎn sānshí fēn qǐchuáng"
|
|
269
|
-
convert(dictionary, "16:9的"); // "16:9de"
|
|
272
|
+
convert(dictionary, "16:9的"); // "16:9de", a ratio is not a quantity
|
|
270
273
|
```
|
|
271
274
|
|
|
272
275
|
`numbers: "keep"` leaves every digit alone. See [numbers](docs/numerals/).
|
|
@@ -282,13 +285,13 @@ import { convertPieces, isUncertain, writeSyllable } from "@kensio/pinyinjs";
|
|
|
282
285
|
const pieces = convertPieces(dictionary, "银行");
|
|
283
286
|
pieces.map((piece) => piece.text); // ["yín", "háng"]
|
|
284
287
|
pieces[1]?.syllable; // { initial: "h", final: "ang", tone: 2 }
|
|
285
|
-
pieces[0]?.confidence?.isLocked; // true
|
|
288
|
+
pieces[0]?.confidence?.isLocked; // true, nothing else can be read here
|
|
286
289
|
pieces[1]?.confidence?.alternatives.map((found) =>
|
|
287
290
|
found.reading.map((syllable) => writeSyllable(syllable)).join(""),
|
|
288
291
|
); // ["xíng", "héng", "hàng"]
|
|
289
292
|
```
|
|
290
293
|
|
|
291
|
-
A piece with no `syllable` is the text between two of them
|
|
294
|
+
A piece with no `syllable` is the text between two of them: a space, or a run
|
|
292
295
|
that was never Han. `joinPieces(pieces)` gives back exactly what `convert`
|
|
293
296
|
returns.
|
|
294
297
|
|
|
@@ -306,8 +309,8 @@ const guesses = (text: string) =>
|
|
|
306
309
|
(piece) => piece.confidence !== undefined && isUncertain(piece.confidence),
|
|
307
310
|
);
|
|
308
311
|
|
|
309
|
-
guesses("行").map((piece) => piece.text); // ["xíng"]
|
|
310
|
-
guesses("银行").map((piece) => piece.text); // []
|
|
312
|
+
guesses("行").map((piece) => piece.text); // ["xíng"], nothing but a prior chose it
|
|
313
|
+
guesses("银行").map((piece) => piece.text); // [], the word settles both syllables
|
|
311
314
|
```
|
|
312
315
|
|
|
313
316
|
An alternative's `cost` says how much more the cheapest conversion taking it
|
|
@@ -327,7 +330,7 @@ convertToHtml(dictionary, "行");
|
|
|
327
330
|
One element per syllable, with `py-tone-1` to `py-tone-5` (5 is the neutral
|
|
328
331
|
tone), and `py-uncertain` plus the rejected readings where the decoder was
|
|
329
332
|
guessing. Text that is not Han is escaped, not marked up. No styles are
|
|
330
|
-
included
|
|
333
|
+
included, so write your own:
|
|
331
334
|
|
|
332
335
|
```css
|
|
333
336
|
.py-tone-1 {
|
|
@@ -348,12 +351,12 @@ have.
|
|
|
348
351
|
const entry = dictionary.lookup("头发");
|
|
349
352
|
entry?.reading; // [{ initial: "t", final: "ou", tone: 2 }, { initial: "f", final: "a", tone: 5 }]
|
|
350
353
|
entry?.isProperNoun; // false
|
|
351
|
-
entry?.partOfSpeech; // "n"
|
|
354
|
+
entry?.partOfSpeech; // "n", jieba's tag
|
|
352
355
|
|
|
353
356
|
dictionary.lookup("頭髮")?.reading; // the same reading, found under 繁體
|
|
354
357
|
dictionary.lookup("重複")?.reading; // 重複 and 重覆 are both keys for 重复
|
|
355
|
-
dictionary.hasPrefix("银"); // true
|
|
356
|
-
dictionary.readingsOf("行"); // xíng, háng, héng, hàng
|
|
358
|
+
dictionary.hasPrefix("银"); // true, does any word start with this?
|
|
359
|
+
dictionary.readingsOf("行"); // xíng, háng, héng, hàng, likeliest first
|
|
357
360
|
```
|
|
358
361
|
|
|
359
362
|
Both scripts are keys in the same dictionary, so nothing is converted before a
|
|
@@ -367,12 +370,12 @@ The syllable layer needs no dictionary and no network.
|
|
|
367
370
|
import { isSyllable, readSyllable, writeSyllable } from "@kensio/pinyinjs";
|
|
368
371
|
|
|
369
372
|
readSyllable("jiù"); // { initial: "j", final: "iou", tone: 4 }
|
|
370
|
-
readSyllable("jiu4"); // the same
|
|
373
|
+
readSyllable("jiu4"); // the same, both notations parse
|
|
371
374
|
readSyllable("lv4"); // { initial: "l", final: "ü", tone: 4 }
|
|
372
375
|
readSyllable("hello"); // undefined
|
|
373
|
-
readSyllable("běi3"); // undefined
|
|
376
|
+
readSyllable("běi3"); // undefined, one notation at a time
|
|
374
377
|
|
|
375
|
-
isSyllable("wánr"); // true
|
|
378
|
+
isSyllable("wánr"); // true, 儿化 is a suffix, not a syllable of its own
|
|
376
379
|
```
|
|
377
380
|
|
|
378
381
|
Initials and finals are the _underlying_ forms rather than the spelling, so 就 is
|
|
@@ -390,7 +393,7 @@ Input takes either notation, the `v` and `u:` conventions for ü, and raised ton
|
|
|
390
393
|
digits. Output is standard diacritics unless asked otherwise.
|
|
391
394
|
|
|
392
395
|
Parsing answers whether a spelling is _well formed_, not whether Mandarin uses
|
|
393
|
-
it
|
|
396
|
+
it: `shong` parses and is not a real syllable. The attested inventory is
|
|
394
397
|
separate:
|
|
395
398
|
|
|
396
399
|
```ts
|
|
@@ -410,7 +413,7 @@ splitSyllables("nǐhǎo"); // ["nǐ", "hǎo"]
|
|
|
410
413
|
splitSyllables("Xī'ān"); // ["Xī", "ān"]
|
|
411
414
|
splitSyllables("yinhang"); // ["yin", "hang"]
|
|
412
415
|
splitSyllables("guórén"); // ["guó", "rén"], not ["guór", "én"]
|
|
413
|
-
splitSyllables("hǎiōu"); // ["hǎi", "ōu"]
|
|
416
|
+
splitSyllables("hǎiōu"); // ["hǎi", "ōu"], missing apostrophe, read anyway
|
|
414
417
|
readWord("yínháng"); // the same, parsed into Syllable objects
|
|
415
418
|
```
|
|
416
419
|
|
|
@@ -436,20 +439,21 @@ written at all.
|
|
|
436
439
|
|
|
437
440
|
## Numbers
|
|
438
441
|
|
|
439
|
-
Reading a number needs no dictionary
|
|
440
|
-
so this works with nothing loaded.
|
|
442
|
+
Reading a number needs no dictionary, just arithmetic and about twenty
|
|
443
|
+
readings, so this works with nothing loaded.
|
|
441
444
|
|
|
442
445
|
```ts
|
|
443
446
|
import { numeralHanzi, percentHanzi, readNumeral } from "@kensio/pinyinjs";
|
|
444
447
|
|
|
445
448
|
numeralHanzi(12345); // "一万两千三百四十五"
|
|
446
|
-
numeralHanzi(1005); // "一千零五"
|
|
447
|
-
numeralHanzi(2000); // "两千"
|
|
448
|
-
|
|
449
|
+
numeralHanzi(1005); // "一千零五", a skipped place is spoken
|
|
450
|
+
numeralHanzi(2000); // "两千", a leading lone 2 before a big unit
|
|
451
|
+
numeralHanzi(2, { counts: true }); // "两", as in 两个西瓜, never 二个
|
|
452
|
+
percentHanzi(95); // "百分之九十五", the order reverses
|
|
449
453
|
```
|
|
450
454
|
|
|
451
|
-
The same digits are read two ways and nothing in the number says which
|
|
452
|
-
is spelled out and 2026个 is counted
|
|
455
|
+
The same digits are read two ways and nothing in the number says which, since
|
|
456
|
+
2026年 is spelled out and 2026个 is counted, so the style is the caller's:
|
|
453
457
|
|
|
454
458
|
```ts
|
|
455
459
|
numeralHanzi(2026); // "两千零二十六"
|
|
@@ -484,7 +488,7 @@ writeIpa(jiu); // "tɕiou˥˩"
|
|
|
484
488
|
```
|
|
485
489
|
|
|
486
490
|
Gwoyeu Romatzyh is the odd one, and it needs no tone mark because the tone is
|
|
487
|
-
spelled into the syllable
|
|
491
|
+
spelled into the syllable, which is why 陝西 is Shaanxi in English and 山西 is
|
|
488
492
|
Shanxi:
|
|
489
493
|
|
|
490
494
|
```ts
|
|
@@ -496,7 +500,7 @@ Reading Wade-Giles back gives an **array**, because real text drops the
|
|
|
496
500
|
apostrophes and diacritics that carry the distinctions:
|
|
497
501
|
|
|
498
502
|
```ts
|
|
499
|
-
readWadeGilesLoosely("chi¹"); // [jī, qī]
|
|
503
|
+
readWadeGilesLoosely("chi¹"); // [jī, qī]: chi is jī, ch'i is qī
|
|
500
504
|
readWadeGilesLoosely("chu¹"); // [zhū, chū, jū, qū]
|
|
501
505
|
```
|
|
502
506
|
|
|
@@ -514,7 +518,7 @@ array, so it can be switched off and works across word boundaries.
|
|
|
514
518
|
import { applySandhi, readWord } from "@kensio/pinyinjs";
|
|
515
519
|
|
|
516
520
|
const buShi = readWord("bùshì") ?? [];
|
|
517
|
-
applySandhi(buShi); // bú
|
|
521
|
+
applySandhi(buShi); // bú shì, 不 flattens before a fourth tone
|
|
518
522
|
applySandhi(buShi, { yiBu: false }); // unchanged
|
|
519
523
|
|
|
520
524
|
const niHao = readWord("nǐhǎo") ?? [];
|
|
@@ -546,6 +550,7 @@ Both scripts are dictionary keys, so only the locale is an option to pass.
|
|
|
546
550
|
| `convert(dictionary, text, options?)` | hanzi → pinyin |
|
|
547
551
|
| `convertPieces(dictionary, text, ...)` | the same, per syllable, with confidence |
|
|
548
552
|
| `convertToHtml(dictionary, text, ...)` | the same, as HTML |
|
|
553
|
+
| `slug(dictionary, text, options?)` | hanzi → a URL-safe slug |
|
|
549
554
|
| `joinPieces(pieces)` / `toHtml(pieces)` | render pieces |
|
|
550
555
|
| `isUncertain(confidence)` | was this syllable a guess? |
|
|
551
556
|
| `dictionary.lookup / hasPrefix / readingsOf` | query the dictionary |
|
package/dist/cli/arguments.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ConvertOptions } from "../decode/convert.js";
|
|
|
2
2
|
import type { ColourDepth } from "./colour.js";
|
|
3
3
|
import type { Tier } from "../dictionary/tiers.js";
|
|
4
4
|
import type { HtmlOptions } from "../format/html.js";
|
|
5
|
+
import type { SlugOptions } from "../format/slug.js";
|
|
5
6
|
/**
|
|
6
7
|
* Every flag the CLI accepts.
|
|
7
8
|
*
|
|
@@ -40,12 +41,39 @@ declare const FLAGS: {
|
|
|
40
41
|
readonly "keep-numbers": {
|
|
41
42
|
readonly type: "boolean";
|
|
42
43
|
};
|
|
44
|
+
readonly "read-numbers": {
|
|
45
|
+
readonly type: "boolean";
|
|
46
|
+
};
|
|
43
47
|
readonly "third-tone": {
|
|
44
48
|
readonly type: "boolean";
|
|
45
49
|
};
|
|
46
50
|
readonly "no-sandhi": {
|
|
47
51
|
readonly type: "boolean";
|
|
48
52
|
};
|
|
53
|
+
readonly tones: {
|
|
54
|
+
readonly type: "string";
|
|
55
|
+
};
|
|
56
|
+
readonly separator: {
|
|
57
|
+
readonly type: "string";
|
|
58
|
+
};
|
|
59
|
+
readonly syllables: {
|
|
60
|
+
readonly type: "string";
|
|
61
|
+
};
|
|
62
|
+
readonly umlaut: {
|
|
63
|
+
readonly type: "string";
|
|
64
|
+
};
|
|
65
|
+
readonly hash: {
|
|
66
|
+
readonly type: "boolean";
|
|
67
|
+
};
|
|
68
|
+
readonly "hash-length": {
|
|
69
|
+
readonly type: "string";
|
|
70
|
+
};
|
|
71
|
+
readonly "max-length": {
|
|
72
|
+
readonly type: "string";
|
|
73
|
+
};
|
|
74
|
+
readonly fallback: {
|
|
75
|
+
readonly type: "string";
|
|
76
|
+
};
|
|
49
77
|
readonly greedy: {
|
|
50
78
|
readonly type: "boolean";
|
|
51
79
|
};
|
|
@@ -110,6 +138,16 @@ export declare const GLOBAL_FLAGS: readonly FlagName[];
|
|
|
110
138
|
* converts anything.
|
|
111
139
|
*/
|
|
112
140
|
export declare const CONVERT_FLAGS: readonly FlagName[];
|
|
141
|
+
/**
|
|
142
|
+
* The flags `slug` takes, beyond the global ones.
|
|
143
|
+
*
|
|
144
|
+
* It shares the reading flags with the conversion commands and none of the
|
|
145
|
+
* writing ones: a slug settles its own notation, capitals, apostrophes and
|
|
146
|
+
* spacing, and a `--capitals` that changed nothing would be worse than an
|
|
147
|
+
* error. `--read-numbers` rather than `--keep-numbers` because a slug keeps
|
|
148
|
+
* digits by default, which is the one place it departs from `convert`.
|
|
149
|
+
*/
|
|
150
|
+
export declare const SLUG_FLAGS: readonly FlagName[];
|
|
113
151
|
/**
|
|
114
152
|
* The flags a parse produced, before any command has looked at them.
|
|
115
153
|
*/
|
|
@@ -195,6 +233,13 @@ export declare function dictionaryChoice(flags: Flags): DictionaryChoice;
|
|
|
195
233
|
* stay the CLI's defaults and there is one place they are written down.
|
|
196
234
|
*/
|
|
197
235
|
export declare function convertOptions(flags: Flags): ConvertOptions;
|
|
236
|
+
/**
|
|
237
|
+
* Turn the slug flags into the options the library takes.
|
|
238
|
+
*
|
|
239
|
+
* `--hash-length` implies `--hash`, because asking how long the hash should be
|
|
240
|
+
* and not getting one is not a reading anybody intends.
|
|
241
|
+
*/
|
|
242
|
+
export declare function slugOptions(flags: Flags): SlugOptions;
|
|
198
243
|
/**
|
|
199
244
|
* The same, plus the two flags that only mean anything in HTML.
|
|
200
245
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../src/cli/arguments.ts"],"names":[],"mappings":"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"}
|