yomitan-core 0.1.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.
Files changed (207) hide show
  1. package/README.md +485 -0
  2. package/dist/anki-connect-BQyCGW3O.cjs +513 -0
  3. package/dist/anki-connect-BQyCGW3O.cjs.map +1 -0
  4. package/dist/anki-connect-CPPuhyiQ.js +6 -0
  5. package/dist/anki-connect-DbrQHphS.js +495 -0
  6. package/dist/anki-connect-DbrQHphS.js.map +1 -0
  7. package/dist/anki-connect-DcheJrp-.cjs +6 -0
  8. package/dist/anki.cjs +1758 -0
  9. package/dist/anki.cjs.map +1 -0
  10. package/dist/anki.d.cts +751 -0
  11. package/dist/anki.d.cts.map +1 -0
  12. package/dist/anki.d.ts +751 -0
  13. package/dist/anki.d.ts.map +1 -0
  14. package/dist/anki.js +1751 -0
  15. package/dist/anki.js.map +1 -0
  16. package/dist/audio-D9DvYyB7.d.cts +48 -0
  17. package/dist/audio-D9DvYyB7.d.cts.map +1 -0
  18. package/dist/audio-DQulUkDM.d.ts +48 -0
  19. package/dist/audio-DQulUkDM.d.ts.map +1 -0
  20. package/dist/audio-url-generator-BXvQaqUi.cjs +4 -0
  21. package/dist/audio-url-generator-Dy2hb2Mm.cjs +414 -0
  22. package/dist/audio-url-generator-Dy2hb2Mm.cjs.map +1 -0
  23. package/dist/audio-url-generator-Qi0rfzHz.js +4 -0
  24. package/dist/audio-url-generator-pFQAB5Nb.js +390 -0
  25. package/dist/audio-url-generator-pFQAB5Nb.js.map +1 -0
  26. package/dist/audio.cjs +7 -0
  27. package/dist/audio.d.cts +86 -0
  28. package/dist/audio.d.cts.map +1 -0
  29. package/dist/audio.d.ts +86 -0
  30. package/dist/audio.d.ts.map +1 -0
  31. package/dist/audio.js +4 -0
  32. package/dist/batch-processor-BR-gB3H3.js +84 -0
  33. package/dist/batch-processor-BR-gB3H3.js.map +1 -0
  34. package/dist/batch-processor-CSF1acTw.cjs +3 -0
  35. package/dist/batch-processor-DFqM_L-_.cjs +91 -0
  36. package/dist/batch-processor-DFqM_L-_.cjs.map +1 -0
  37. package/dist/batch-processor-Quo9jUyf.js +3 -0
  38. package/dist/chunk-BCwAaXi7.cjs +31 -0
  39. package/dist/cjk-util-Dp0ZU0sh.cjs +167 -0
  40. package/dist/cjk-util-Dp0ZU0sh.cjs.map +1 -0
  41. package/dist/cjk-util-DubXBGDG.js +94 -0
  42. package/dist/cjk-util-DubXBGDG.js.map +1 -0
  43. package/dist/core-BUpclilG.d.cts +102 -0
  44. package/dist/core-BUpclilG.d.cts.map +1 -0
  45. package/dist/core-DFUj5GtA.d.ts +102 -0
  46. package/dist/core-DFUj5GtA.d.ts.map +1 -0
  47. package/dist/database.cjs +7 -0
  48. package/dist/database.d.cts +4 -0
  49. package/dist/database.d.ts +4 -0
  50. package/dist/database.js +5 -0
  51. package/dist/dictionary-D7l-qFt1.d.cts +316 -0
  52. package/dist/dictionary-D7l-qFt1.d.cts.map +1 -0
  53. package/dist/dictionary-_vzfBLWi.d.ts +316 -0
  54. package/dist/dictionary-_vzfBLWi.d.ts.map +1 -0
  55. package/dist/dictionary-data-util-CHnRdYZ9.cjs +378 -0
  56. package/dist/dictionary-data-util-CHnRdYZ9.cjs.map +1 -0
  57. package/dist/dictionary-data-util-CfOLfEDE.js +323 -0
  58. package/dist/dictionary-data-util-CfOLfEDE.js.map +1 -0
  59. package/dist/dictionary-database-BDC2f9zc.d.ts +58 -0
  60. package/dist/dictionary-database-BDC2f9zc.d.ts.map +1 -0
  61. package/dist/dictionary-database-CU4TsvCC.js +393 -0
  62. package/dist/dictionary-database-CU4TsvCC.js.map +1 -0
  63. package/dist/dictionary-database-DsOi04Sg.d.cts +58 -0
  64. package/dist/dictionary-database-DsOi04Sg.d.cts.map +1 -0
  65. package/dist/dictionary-database-lvFvftnO.cjs +412 -0
  66. package/dist/dictionary-database-lvFvftnO.cjs.map +1 -0
  67. package/dist/dictionary-importer-BkQQSBhm.d.ts +237 -0
  68. package/dist/dictionary-importer-BkQQSBhm.d.ts.map +1 -0
  69. package/dist/dictionary-importer-Cen1z6co.js +1821 -0
  70. package/dist/dictionary-importer-Cen1z6co.js.map +1 -0
  71. package/dist/dictionary-importer-DYmmWmcX.cjs +8 -0
  72. package/dist/dictionary-importer-Da3AuTZw.d.cts +237 -0
  73. package/dist/dictionary-importer-Da3AuTZw.d.cts.map +1 -0
  74. package/dist/dictionary-importer-Dhn75iZ4.cjs +1834 -0
  75. package/dist/dictionary-importer-Dhn75iZ4.cjs.map +1 -0
  76. package/dist/dictionary-importer-xWkel0h-.js +8 -0
  77. package/dist/dictionary-update-checker-BNE4pGTx.js +4 -0
  78. package/dist/dictionary-update-checker-Byjvifd2.cjs +75 -0
  79. package/dist/dictionary-update-checker-Byjvifd2.cjs.map +1 -0
  80. package/dist/dictionary-update-checker-YdpalZ41.cjs +4 -0
  81. package/dist/dictionary-update-checker-kKukiovj.js +69 -0
  82. package/dist/dictionary-update-checker-kKukiovj.js.map +1 -0
  83. package/dist/display-generator-BGVWiI0t.js +746 -0
  84. package/dist/display-generator-BGVWiI0t.js.map +1 -0
  85. package/dist/display-generator-BMQmG5Ov.cjs +9 -0
  86. package/dist/display-generator-BxZ7mBjP.js +9 -0
  87. package/dist/display-generator-DyP-HNzP.cjs +758 -0
  88. package/dist/display-generator-DyP-HNzP.cjs.map +1 -0
  89. package/dist/errors-BSezaJwm.cjs +35 -0
  90. package/dist/errors-BSezaJwm.cjs.map +1 -0
  91. package/dist/errors-DuuDSO5N.js +22 -0
  92. package/dist/errors-DuuDSO5N.js.map +1 -0
  93. package/dist/frequency-ranking-BXjfhhUQ.js +3 -0
  94. package/dist/frequency-ranking-Cx1kkIrw.cjs +3 -0
  95. package/dist/frequency-ranking-DEJMTMdg.js +159 -0
  96. package/dist/frequency-ranking-DEJMTMdg.js.map +1 -0
  97. package/dist/frequency-ranking-DVYxTXN-.cjs +166 -0
  98. package/dist/frequency-ranking-DVYxTXN-.cjs.map +1 -0
  99. package/dist/furigana-5HK97CY8.js +4 -0
  100. package/dist/furigana-9bBI9-qe.d.ts +47 -0
  101. package/dist/furigana-9bBI9-qe.d.ts.map +1 -0
  102. package/dist/furigana-B3-0y231.js +471 -0
  103. package/dist/furigana-B3-0y231.js.map +1 -0
  104. package/dist/furigana-CjOhzvZt.d.cts +47 -0
  105. package/dist/furigana-CjOhzvZt.d.cts.map +1 -0
  106. package/dist/furigana-DpZLcues.cjs +609 -0
  107. package/dist/furigana-DpZLcues.cjs.map +1 -0
  108. package/dist/furigana-h3v2ub4-.cjs +4 -0
  109. package/dist/import.cjs +12 -0
  110. package/dist/import.d.cts +107 -0
  111. package/dist/import.d.cts.map +1 -0
  112. package/dist/import.d.ts +107 -0
  113. package/dist/import.d.ts.map +1 -0
  114. package/dist/import.js +9 -0
  115. package/dist/index.cjs +275 -0
  116. package/dist/index.cjs.map +1 -0
  117. package/dist/index.d.cts +211 -0
  118. package/dist/index.d.cts.map +1 -0
  119. package/dist/index.d.ts +211 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +238 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/json-DGd-cunA.js +17 -0
  124. package/dist/json-DGd-cunA.js.map +1 -0
  125. package/dist/json-DKWp-B7Y.cjs +30 -0
  126. package/dist/json-DKWp-B7Y.cjs.map +1 -0
  127. package/dist/language-KN_u-nTR.d.ts +104 -0
  128. package/dist/language-KN_u-nTR.d.ts.map +1 -0
  129. package/dist/language-xAbQxgXc.d.cts +104 -0
  130. package/dist/language-xAbQxgXc.d.cts.map +1 -0
  131. package/dist/language.cjs +15626 -0
  132. package/dist/language.cjs.map +1 -0
  133. package/dist/language.d.cts +959 -0
  134. package/dist/language.d.cts.map +1 -0
  135. package/dist/language.d.ts +959 -0
  136. package/dist/language.d.ts.map +1 -0
  137. package/dist/language.js +15522 -0
  138. package/dist/language.js.map +1 -0
  139. package/dist/log-D8KtR3aP.cjs +67 -0
  140. package/dist/log-D8KtR3aP.cjs.map +1 -0
  141. package/dist/log-hgSll-dS.js +60 -0
  142. package/dist/log-hgSll-dS.js.map +1 -0
  143. package/dist/lookup.cjs +13 -0
  144. package/dist/lookup.d.cts +161 -0
  145. package/dist/lookup.d.cts.map +1 -0
  146. package/dist/lookup.d.ts +161 -0
  147. package/dist/lookup.d.ts.map +1 -0
  148. package/dist/lookup.js +10 -0
  149. package/dist/media-loader-BABA_E4W.js +3 -0
  150. package/dist/media-loader-Ce9cuANS.cjs +21 -0
  151. package/dist/media-loader-Ce9cuANS.cjs.map +1 -0
  152. package/dist/media-loader-qRti-Q6h.js +14 -0
  153. package/dist/media-loader-qRti-Q6h.js.map +1 -0
  154. package/dist/media-loader-xlUGaJrx.cjs +3 -0
  155. package/dist/multi-language-transformer-AlxOM6b3.js +637 -0
  156. package/dist/multi-language-transformer-AlxOM6b3.js.map +1 -0
  157. package/dist/multi-language-transformer-MdbQBBOt.cjs +685 -0
  158. package/dist/multi-language-transformer-MdbQBBOt.cjs.map +1 -0
  159. package/dist/multi-language-transformer-SEhcJXEB.d.ts +63 -0
  160. package/dist/multi-language-transformer-SEhcJXEB.d.ts.map +1 -0
  161. package/dist/multi-language-transformer-Ul9mbRce.d.cts +63 -0
  162. package/dist/multi-language-transformer-Ul9mbRce.d.cts.map +1 -0
  163. package/dist/pronunciation-generator-BtBc4q_V.js +397 -0
  164. package/dist/pronunciation-generator-BtBc4q_V.js.map +1 -0
  165. package/dist/pronunciation-generator-CBYdXYou.js +4 -0
  166. package/dist/pronunciation-generator-CFbZlf5J.cjs +445 -0
  167. package/dist/pronunciation-generator-CFbZlf5J.cjs.map +1 -0
  168. package/dist/pronunciation-generator-DOz9hEuk.cjs +4 -0
  169. package/dist/render.cjs +2796 -0
  170. package/dist/render.cjs.map +1 -0
  171. package/dist/render.d.cts +424 -0
  172. package/dist/render.d.cts.map +1 -0
  173. package/dist/render.d.ts +424 -0
  174. package/dist/render.d.ts.map +1 -0
  175. package/dist/render.js +2777 -0
  176. package/dist/render.js.map +1 -0
  177. package/dist/sentence-parser-BPAJNzqW.js +126 -0
  178. package/dist/sentence-parser-BPAJNzqW.js.map +1 -0
  179. package/dist/sentence-parser-BVIOI64h.cjs +132 -0
  180. package/dist/sentence-parser-BVIOI64h.cjs.map +1 -0
  181. package/dist/sentence-parser-BoHO3cHn.js +5 -0
  182. package/dist/sentence-parser-DQVLSW0z.cjs +5 -0
  183. package/dist/structured-content-generator-BtOApkTW.cjs +4 -0
  184. package/dist/structured-content-generator-Bx62RYa8.js +4 -0
  185. package/dist/structured-content-generator-CLnybumI.js +276 -0
  186. package/dist/structured-content-generator-CLnybumI.js.map +1 -0
  187. package/dist/structured-content-generator-DrwkB0-k.cjs +282 -0
  188. package/dist/structured-content-generator-DrwkB0-k.cjs.map +1 -0
  189. package/dist/text-utilities-B7PIythe.js +8 -0
  190. package/dist/text-utilities-B7PIythe.js.map +1 -0
  191. package/dist/text-utilities-Del2Ivkg.cjs +15 -0
  192. package/dist/text-utilities-Del2Ivkg.cjs.map +1 -0
  193. package/dist/translator-CRPlPzqi.cjs +1545 -0
  194. package/dist/translator-CRPlPzqi.cjs.map +1 -0
  195. package/dist/translator-CWgG5drA.js +1539 -0
  196. package/dist/translator-CWgG5drA.js.map +1 -0
  197. package/dist/translator-CaGtJvnQ.cjs +6 -0
  198. package/dist/translator-Cc6OGxrW.d.ts +180 -0
  199. package/dist/translator-Cc6OGxrW.d.ts.map +1 -0
  200. package/dist/translator-CcA-s-W4.d.cts +180 -0
  201. package/dist/translator-CcA-s-W4.d.cts.map +1 -0
  202. package/dist/translator-CuJOTK6l.js +6 -0
  203. package/dist/utilities-C-lbZaJE.cjs +52 -0
  204. package/dist/utilities-C-lbZaJE.cjs.map +1 -0
  205. package/dist/utilities-bi3EF-q5.js +33 -0
  206. package/dist/utilities-bi3EF-q5.js.map +1 -0
  207. package/package.json +102 -0
@@ -0,0 +1,609 @@
1
+ "use strict";
2
+ const require_cjk_util = require('./cjk-util-Dp0ZU0sh.cjs');
3
+
4
+ //#region src/language/ja/japanese.ts
5
+ const HIRAGANA_SMALL_TSU_CODE_POINT = 12387;
6
+ const KATAKANA_SMALL_TSU_CODE_POINT = 12483;
7
+ const KATAKANA_SMALL_KA_CODE_POINT = 12533;
8
+ const KATAKANA_SMALL_KE_CODE_POINT = 12534;
9
+ const KANA_PROLONGED_SOUND_MARK_CODE_POINT = 12540;
10
+ const HIRAGANA_RANGE = [12352, 12447];
11
+ const KATAKANA_RANGE = [12448, 12543];
12
+ const HIRAGANA_CONVERSION_RANGE = [12353, 12438];
13
+ const KATAKANA_CONVERSION_RANGE = [12449, 12534];
14
+ const KANA_RANGES = [HIRAGANA_RANGE, KATAKANA_RANGE];
15
+ const JAPANESE_RANGES = [
16
+ HIRAGANA_RANGE,
17
+ KATAKANA_RANGE,
18
+ ...require_cjk_util.CJK_IDEOGRAPH_RANGES,
19
+ [65382, 65439],
20
+ [12539, 12540],
21
+ [65377, 65381],
22
+ require_cjk_util.CJK_PUNCTUATION_RANGE,
23
+ ...require_cjk_util.FULLWIDTH_CHARACTER_RANGES
24
+ ];
25
+ const SMALL_KANA_SET = new Set("ぁぃぅぇぉゃゅょゎァィゥェォャュョヮ");
26
+ const HALFWIDTH_KATAKANA_MAPPING = new Map([
27
+ ["・", "・--"],
28
+ ["ヲ", "ヲヺ-"],
29
+ ["ァ", "ァ--"],
30
+ ["ィ", "ィ--"],
31
+ ["ゥ", "ゥ--"],
32
+ ["ェ", "ェ--"],
33
+ ["ォ", "ォ--"],
34
+ ["ャ", "ャ--"],
35
+ ["ュ", "ュ--"],
36
+ ["ョ", "ョ--"],
37
+ ["ッ", "ッ--"],
38
+ ["ー", "ー--"],
39
+ ["ア", "ア--"],
40
+ ["イ", "イ--"],
41
+ ["ウ", "ウヴ-"],
42
+ ["エ", "エ--"],
43
+ ["オ", "オ--"],
44
+ ["カ", "カガ-"],
45
+ ["キ", "キギ-"],
46
+ ["ク", "クグ-"],
47
+ ["ケ", "ケゲ-"],
48
+ ["コ", "コゴ-"],
49
+ ["サ", "サザ-"],
50
+ ["シ", "シジ-"],
51
+ ["ス", "スズ-"],
52
+ ["セ", "セゼ-"],
53
+ ["ソ", "ソゾ-"],
54
+ ["タ", "タダ-"],
55
+ ["チ", "チヂ-"],
56
+ ["ツ", "ツヅ-"],
57
+ ["テ", "テデ-"],
58
+ ["ト", "トド-"],
59
+ ["ナ", "ナ--"],
60
+ ["ニ", "ニ--"],
61
+ ["ヌ", "ヌ--"],
62
+ ["ネ", "ネ--"],
63
+ ["ノ", "ノ--"],
64
+ ["ハ", "ハバパ"],
65
+ ["ヒ", "ヒビピ"],
66
+ ["フ", "フブプ"],
67
+ ["ヘ", "ヘベペ"],
68
+ ["ホ", "ホボポ"],
69
+ ["マ", "マ--"],
70
+ ["ミ", "ミ--"],
71
+ ["ム", "ム--"],
72
+ ["メ", "メ--"],
73
+ ["モ", "モ--"],
74
+ ["ヤ", "ヤ--"],
75
+ ["ユ", "ユ--"],
76
+ ["ヨ", "ヨ--"],
77
+ ["ラ", "ラ--"],
78
+ ["リ", "リ--"],
79
+ ["ル", "ル--"],
80
+ ["レ", "レ--"],
81
+ ["ロ", "ロ--"],
82
+ ["ワ", "ワ--"],
83
+ ["ン", "ン--"]
84
+ ]);
85
+ const VOWEL_TO_KANA_MAPPING = new Map([
86
+ ["a", "ぁあかがさざただなはばぱまゃやらゎわヵァアカガサザタダナハバパマャヤラヮワヵヷ"],
87
+ ["i", "ぃいきぎしじちぢにひびぴみりゐィイキギシジチヂニヒビピミリヰヸ"],
88
+ ["u", "ぅうくぐすずっつづぬふぶぷむゅゆるゥウクグスズッツヅヌフブプムュユルヴ"],
89
+ ["e", "ぇえけげせぜてでねへべぺめれゑヶェエケゲセゼテデネヘベペメレヱヶヹ"],
90
+ ["o", "ぉおこごそぞとどのほぼぽもょよろをォオコゴソゾトドノホボポモョヨロヲヺ"],
91
+ ["", "のノ"]
92
+ ]);
93
+ const KANA_TO_VOWEL_MAPPING = new Map();
94
+ for (const [vowel, characters] of VOWEL_TO_KANA_MAPPING) for (const character of characters) KANA_TO_VOWEL_MAPPING.set(character, vowel);
95
+ const kana = "うゔ-かが-きぎ-くぐ-けげ-こご-さざ-しじ-すず-せぜ-そぞ-ただ-ちぢ-つづ-てで-とど-はばぱひびぴふぶぷへべぺほぼぽワヷ-ヰヸ-ウヴ-ヱヹ-ヲヺ-カガ-キギ-クグ-ケゲ-コゴ-サザ-シジ-スズ-セゼ-ソゾ-タダ-チヂ-ツヅ-テデ-トド-ハバパヒビピフブプヘベペホボポ";
96
+ const DIACRITIC_MAPPING = new Map();
97
+ for (let i = 0, ii = kana.length; i < ii; i += 3) {
98
+ const character = kana[i];
99
+ const dakuten = kana[i + 1];
100
+ const handakuten = kana[i + 2];
101
+ DIACRITIC_MAPPING.set(dakuten, {
102
+ character,
103
+ type: "dakuten"
104
+ });
105
+ if (handakuten !== "-") DIACRITIC_MAPPING.set(handakuten, {
106
+ character,
107
+ type: "handakuten"
108
+ });
109
+ }
110
+ function getProlongedHiragana(previousCharacter) {
111
+ switch (KANA_TO_VOWEL_MAPPING.get(previousCharacter)) {
112
+ case "a": return "あ";
113
+ case "i": return "い";
114
+ case "u": return "う";
115
+ case "e": return "え";
116
+ case "o": return "う";
117
+ default: return null;
118
+ }
119
+ }
120
+ function createFuriganaSegment(text, reading) {
121
+ return {
122
+ text,
123
+ reading
124
+ };
125
+ }
126
+ function segmentizeFurigana(reading, readingNormalized, groups, groupsStart) {
127
+ const groupCount = groups.length - groupsStart;
128
+ if (groupCount <= 0) return reading.length === 0 ? [] : null;
129
+ const group = groups[groupsStart];
130
+ const { isKana, text } = group;
131
+ const textLength = text.length;
132
+ if (isKana) {
133
+ const { textNormalized } = group;
134
+ if (textNormalized !== null && readingNormalized.startsWith(textNormalized)) {
135
+ const segments = segmentizeFurigana(reading.substring(textLength), readingNormalized.substring(textLength), groups, groupsStart + 1);
136
+ if (segments !== null) {
137
+ if (reading.startsWith(text)) segments.unshift(createFuriganaSegment(text, ""));
138
+ else segments.unshift(...getFuriganaKanaSegments(text, reading));
139
+ return segments;
140
+ }
141
+ }
142
+ return null;
143
+ }
144
+ let result = null;
145
+ for (let i = reading.length; i >= textLength; --i) {
146
+ const segments = segmentizeFurigana(reading.substring(i), readingNormalized.substring(i), groups, groupsStart + 1);
147
+ if (segments !== null) {
148
+ if (result !== null) return null;
149
+ const segmentReading = reading.substring(0, i);
150
+ segments.unshift(createFuriganaSegment(text, segmentReading));
151
+ result = segments;
152
+ }
153
+ if (groupCount === 1) break;
154
+ }
155
+ return result;
156
+ }
157
+ function getFuriganaKanaSegments(text, reading) {
158
+ const textLength = text.length;
159
+ const newSegments = [];
160
+ let start = 0;
161
+ let state = reading[0] === text[0];
162
+ for (let i = 1; i < textLength; ++i) {
163
+ const newState = reading[i] === text[i];
164
+ if (state === newState) continue;
165
+ newSegments.push(createFuriganaSegment(text.substring(start, i), state ? "" : reading.substring(start, i)));
166
+ state = newState;
167
+ start = i;
168
+ }
169
+ newSegments.push(createFuriganaSegment(text.substring(start, textLength), state ? "" : reading.substring(start, textLength)));
170
+ return newSegments;
171
+ }
172
+ function getStemLength(text1, text2) {
173
+ const minLength = Math.min(text1.length, text2.length);
174
+ if (minLength === 0) return 0;
175
+ let i = 0;
176
+ while (true) {
177
+ const char1 = text1.codePointAt(i);
178
+ const char2 = text2.codePointAt(i);
179
+ if (char1 !== char2) break;
180
+ const charLength = String.fromCodePoint(char1).length;
181
+ i += charLength;
182
+ if (i >= minLength) {
183
+ if (i > minLength) i -= charLength;
184
+ break;
185
+ }
186
+ }
187
+ return i;
188
+ }
189
+ function isCodePointKanji(codePoint) {
190
+ return require_cjk_util.isCodePointInRanges(codePoint, require_cjk_util.CJK_IDEOGRAPH_RANGES);
191
+ }
192
+ function isCodePointKana(codePoint) {
193
+ return require_cjk_util.isCodePointInRanges(codePoint, KANA_RANGES);
194
+ }
195
+ function isCodePointJapanese(codePoint) {
196
+ return require_cjk_util.isCodePointInRanges(codePoint, JAPANESE_RANGES);
197
+ }
198
+ function isStringEntirelyKana(str) {
199
+ if (str.length === 0) return false;
200
+ for (const c of str) if (!require_cjk_util.isCodePointInRanges(c.codePointAt(0), KANA_RANGES)) return false;
201
+ return true;
202
+ }
203
+ function isStringPartiallyJapanese(str) {
204
+ if (str.length === 0) return false;
205
+ for (const c of str) if (require_cjk_util.isCodePointInRanges(c.codePointAt(0), JAPANESE_RANGES)) return true;
206
+ return false;
207
+ }
208
+ function isMoraPitchHigh(moraIndex, pitchAccentValue) {
209
+ if (typeof pitchAccentValue === "string") return pitchAccentValue[moraIndex] === "H";
210
+ switch (pitchAccentValue) {
211
+ case 0: return moraIndex > 0;
212
+ case 1: return moraIndex < 1;
213
+ default: return moraIndex > 0 && moraIndex < pitchAccentValue;
214
+ }
215
+ }
216
+ function getPitchCategory(text, pitchAccentValue, isVerbOrAdjective) {
217
+ const pitchAccentDownstepPosition = typeof pitchAccentValue === "string" ? getDownstepPositions(pitchAccentValue)[0] : pitchAccentValue;
218
+ if (pitchAccentDownstepPosition === 0) return "heiban";
219
+ if (isVerbOrAdjective) return pitchAccentDownstepPosition > 0 ? "kifuku" : null;
220
+ if (pitchAccentDownstepPosition === 1) return "atamadaka";
221
+ if (pitchAccentDownstepPosition > 1) return pitchAccentDownstepPosition >= getKanaMoraCount(text) ? "odaka" : "nakadaka";
222
+ return null;
223
+ }
224
+ function getDownstepPositions(pitchString) {
225
+ const downsteps = [];
226
+ const moraCount = pitchString.length;
227
+ for (let i = 0; i < moraCount; i++) if (i > 0 && pitchString[i - 1] === "H" && pitchString[i] === "L") downsteps.push(i);
228
+ if (downsteps.length === 0) downsteps.push(pitchString.startsWith("L") ? 0 : -1);
229
+ return downsteps;
230
+ }
231
+ function getKanaMorae(text) {
232
+ const morae = [];
233
+ let i;
234
+ for (const c of text) if (SMALL_KANA_SET.has(c) && (i = morae.length) > 0) morae[i - 1] += c;
235
+ else morae.push(c);
236
+ return morae;
237
+ }
238
+ function getKanaMoraCount(text) {
239
+ let moraCount = 0;
240
+ for (const c of text) if (!(SMALL_KANA_SET.has(c) && moraCount > 0)) ++moraCount;
241
+ return moraCount;
242
+ }
243
+ function convertKatakanaToHiragana(text, keepProlongedSoundMarks = false) {
244
+ let result = "";
245
+ const offset = HIRAGANA_CONVERSION_RANGE[0] - KATAKANA_CONVERSION_RANGE[0];
246
+ for (let char of text) {
247
+ const codePoint = char.codePointAt(0);
248
+ switch (codePoint) {
249
+ case KATAKANA_SMALL_KA_CODE_POINT:
250
+ case KATAKANA_SMALL_KE_CODE_POINT: break;
251
+ case KANA_PROLONGED_SOUND_MARK_CODE_POINT:
252
+ if (!keepProlongedSoundMarks && result.length > 0) {
253
+ const char2 = getProlongedHiragana(result[result.length - 1]);
254
+ if (char2 !== null) char = char2;
255
+ }
256
+ break;
257
+ default:
258
+ if (require_cjk_util.isCodePointInRange(codePoint, KATAKANA_CONVERSION_RANGE)) char = String.fromCodePoint(codePoint + offset);
259
+ break;
260
+ }
261
+ result += char;
262
+ }
263
+ return result;
264
+ }
265
+ function convertHiraganaToKatakana(text) {
266
+ let result = "";
267
+ const offset = KATAKANA_CONVERSION_RANGE[0] - HIRAGANA_CONVERSION_RANGE[0];
268
+ for (let char of text) {
269
+ const codePoint = char.codePointAt(0);
270
+ if (require_cjk_util.isCodePointInRange(codePoint, HIRAGANA_CONVERSION_RANGE)) char = String.fromCodePoint(codePoint + offset);
271
+ result += char;
272
+ }
273
+ return result;
274
+ }
275
+ function convertAlphanumericToFullWidth(text) {
276
+ let result = "";
277
+ for (const char of text) {
278
+ let c = char.codePointAt(0);
279
+ if (c >= 48 && c <= 57) c += 65248;
280
+ else if (c >= 65 && c <= 90) c += 65248;
281
+ else if (c >= 97 && c <= 122) c += 65248;
282
+ result += String.fromCodePoint(c);
283
+ }
284
+ return result;
285
+ }
286
+ function convertFullWidthAlphanumericToNormal(text) {
287
+ let result = "";
288
+ const length = text.length;
289
+ for (let i = 0; i < length; i++) {
290
+ let c = text[i].codePointAt(0);
291
+ if (c >= 65296 && c <= 65305) c -= 65248;
292
+ else if (c >= 65313 && c <= 65338) c -= 65248;
293
+ else if (c >= 65345 && c <= 65370) c -= 65248;
294
+ result += String.fromCodePoint(c);
295
+ }
296
+ return result;
297
+ }
298
+ function convertHalfWidthKanaToFullWidth(text) {
299
+ let result = "";
300
+ for (let i = 0, ii = text.length; i < ii; ++i) {
301
+ const c = text[i];
302
+ const mapping = HALFWIDTH_KATAKANA_MAPPING.get(c);
303
+ if (typeof mapping !== "string") {
304
+ result += c;
305
+ continue;
306
+ }
307
+ let index = 0;
308
+ switch (text.charCodeAt(i + 1)) {
309
+ case 65438:
310
+ index = 1;
311
+ break;
312
+ case 65439:
313
+ index = 2;
314
+ break;
315
+ }
316
+ let c2 = mapping[index];
317
+ if (index > 0) if (c2 === "-") {
318
+ index = 0;
319
+ c2 = mapping[0];
320
+ } else ++i;
321
+ result += c2;
322
+ }
323
+ return result;
324
+ }
325
+ function getKanaDiacriticInfo(character) {
326
+ const info = DIACRITIC_MAPPING.get(character);
327
+ return typeof info !== "undefined" ? {
328
+ character: info.character,
329
+ type: info.type
330
+ } : null;
331
+ }
332
+ function dakutenAllowed(codePoint) {
333
+ return codePoint >= 12363 && codePoint <= 12392 || codePoint >= 12399 && codePoint <= 12411 || codePoint >= 12459 && codePoint <= 12488 || codePoint >= 12495 && codePoint <= 12507;
334
+ }
335
+ function handakutenAllowed(codePoint) {
336
+ return codePoint >= 12399 && codePoint <= 12411 || codePoint >= 12495 && codePoint <= 12507;
337
+ }
338
+ function normalizeCombiningCharacters(text) {
339
+ let result = "";
340
+ let i = text.length - 1;
341
+ while (i > 0) {
342
+ if (text[i] === "゙") {
343
+ const dakutenCombinee = text[i - 1].codePointAt(0);
344
+ if (dakutenCombinee && dakutenAllowed(dakutenCombinee)) {
345
+ result = String.fromCodePoint(dakutenCombinee + 1) + result;
346
+ i -= 2;
347
+ continue;
348
+ }
349
+ } else if (text[i] === "゚") {
350
+ const handakutenCombinee = text[i - 1].codePointAt(0);
351
+ if (handakutenCombinee && handakutenAllowed(handakutenCombinee)) {
352
+ result = String.fromCodePoint(handakutenCombinee + 2) + result;
353
+ i -= 2;
354
+ continue;
355
+ }
356
+ }
357
+ result = text[i] + result;
358
+ i--;
359
+ }
360
+ if (i === 0) result = text[0] + result;
361
+ return result;
362
+ }
363
+ function normalizeCJKCompatibilityCharacters(text) {
364
+ let result = "";
365
+ for (let i = 0; i < text.length; i++) {
366
+ const codePoint = text[i].codePointAt(0);
367
+ result += codePoint && require_cjk_util.isCodePointInRange(codePoint, require_cjk_util.CJK_COMPATIBILITY) ? text[i].normalize("NFKD") : text[i];
368
+ }
369
+ return result;
370
+ }
371
+ function distributeFurigana(term, reading) {
372
+ if (reading === term) return [createFuriganaSegment(term, "")];
373
+ const groups = [];
374
+ let groupPre = null;
375
+ let isKanaPre = null;
376
+ for (const c of term) {
377
+ const codePoint = c.codePointAt(0);
378
+ const isKana = isCodePointKana(codePoint);
379
+ if (isKana === isKanaPre) groupPre.text += c;
380
+ else {
381
+ groupPre = {
382
+ isKana,
383
+ text: c,
384
+ textNormalized: null
385
+ };
386
+ groups.push(groupPre);
387
+ isKanaPre = isKana;
388
+ }
389
+ }
390
+ for (const group of groups) if (group.isKana) group.textNormalized = convertKatakanaToHiragana(group.text);
391
+ const readingNormalized = convertKatakanaToHiragana(reading);
392
+ const segments = segmentizeFurigana(reading, readingNormalized, groups, 0);
393
+ if (segments !== null) return segments;
394
+ return [createFuriganaSegment(term, reading)];
395
+ }
396
+ function distributeFuriganaInflected(term, reading, source) {
397
+ const termNormalized = convertKatakanaToHiragana(term);
398
+ const readingNormalized = convertKatakanaToHiragana(reading);
399
+ const sourceNormalized = convertKatakanaToHiragana(source);
400
+ let mainText = term;
401
+ let stemLength = getStemLength(termNormalized, sourceNormalized);
402
+ const readingStemLength = getStemLength(readingNormalized, sourceNormalized);
403
+ if (readingStemLength > 0 && readingStemLength >= stemLength) {
404
+ mainText = reading;
405
+ stemLength = readingStemLength;
406
+ reading = `${source.substring(0, stemLength)}${reading.substring(stemLength)}`;
407
+ }
408
+ const segments = [];
409
+ if (stemLength > 0) {
410
+ mainText = `${source.substring(0, stemLength)}${mainText.substring(stemLength)}`;
411
+ const segments2 = distributeFurigana(mainText, reading);
412
+ let consumed = 0;
413
+ for (const segment of segments2) {
414
+ const { text } = segment;
415
+ const start = consumed;
416
+ consumed += text.length;
417
+ if (consumed < stemLength) segments.push(segment);
418
+ else if (consumed === stemLength) {
419
+ segments.push(segment);
420
+ break;
421
+ } else {
422
+ if (start < stemLength) segments.push(createFuriganaSegment(mainText.substring(start, stemLength), ""));
423
+ break;
424
+ }
425
+ }
426
+ }
427
+ if (stemLength < source.length) {
428
+ const remainder = source.substring(stemLength);
429
+ const segmentCount = segments.length;
430
+ if (segmentCount > 0 && segments[segmentCount - 1].reading.length === 0) segments[segmentCount - 1].text += remainder;
431
+ else segments.push(createFuriganaSegment(remainder, ""));
432
+ }
433
+ return segments;
434
+ }
435
+ function isEmphaticCodePoint(codePoint) {
436
+ return codePoint === HIRAGANA_SMALL_TSU_CODE_POINT || codePoint === KATAKANA_SMALL_TSU_CODE_POINT || codePoint === KANA_PROLONGED_SOUND_MARK_CODE_POINT;
437
+ }
438
+ function collapseEmphaticSequences(text, fullCollapse) {
439
+ let left = 0;
440
+ while (left < text.length && isEmphaticCodePoint(text.codePointAt(left))) ++left;
441
+ let right = text.length - 1;
442
+ while (right >= 0 && isEmphaticCodePoint(text.codePointAt(right))) --right;
443
+ if (left > right) return text;
444
+ const leadingEmphatics = text.substring(0, left);
445
+ const trailingEmphatics = text.substring(right + 1);
446
+ let middle = "";
447
+ let currentCollapsedCodePoint = -1;
448
+ for (let i = left; i <= right; ++i) {
449
+ const char = text[i];
450
+ const codePoint = char.codePointAt(0);
451
+ if (isEmphaticCodePoint(codePoint)) {
452
+ if (currentCollapsedCodePoint !== codePoint) {
453
+ currentCollapsedCodePoint = codePoint;
454
+ if (!fullCollapse) middle += char;
455
+ }
456
+ } else {
457
+ currentCollapsedCodePoint = -1;
458
+ middle += char;
459
+ }
460
+ }
461
+ return leadingEmphatics + middle + trailingEmphatics;
462
+ }
463
+
464
+ //#endregion
465
+ //#region src/language/ja/furigana.ts
466
+ function generateFurigana(text, reading) {
467
+ return distributeFurigana(text, reading);
468
+ }
469
+
470
+ //#endregion
471
+ Object.defineProperty(exports, 'collapseEmphaticSequences', {
472
+ enumerable: true,
473
+ get: function () {
474
+ return collapseEmphaticSequences;
475
+ }
476
+ });
477
+ Object.defineProperty(exports, 'convertAlphanumericToFullWidth', {
478
+ enumerable: true,
479
+ get: function () {
480
+ return convertAlphanumericToFullWidth;
481
+ }
482
+ });
483
+ Object.defineProperty(exports, 'convertFullWidthAlphanumericToNormal', {
484
+ enumerable: true,
485
+ get: function () {
486
+ return convertFullWidthAlphanumericToNormal;
487
+ }
488
+ });
489
+ Object.defineProperty(exports, 'convertHalfWidthKanaToFullWidth', {
490
+ enumerable: true,
491
+ get: function () {
492
+ return convertHalfWidthKanaToFullWidth;
493
+ }
494
+ });
495
+ Object.defineProperty(exports, 'convertHiraganaToKatakana', {
496
+ enumerable: true,
497
+ get: function () {
498
+ return convertHiraganaToKatakana;
499
+ }
500
+ });
501
+ Object.defineProperty(exports, 'convertKatakanaToHiragana', {
502
+ enumerable: true,
503
+ get: function () {
504
+ return convertKatakanaToHiragana;
505
+ }
506
+ });
507
+ Object.defineProperty(exports, 'distributeFurigana', {
508
+ enumerable: true,
509
+ get: function () {
510
+ return distributeFurigana;
511
+ }
512
+ });
513
+ Object.defineProperty(exports, 'distributeFuriganaInflected', {
514
+ enumerable: true,
515
+ get: function () {
516
+ return distributeFuriganaInflected;
517
+ }
518
+ });
519
+ Object.defineProperty(exports, 'generateFurigana', {
520
+ enumerable: true,
521
+ get: function () {
522
+ return generateFurigana;
523
+ }
524
+ });
525
+ Object.defineProperty(exports, 'getDownstepPositions$1', {
526
+ enumerable: true,
527
+ get: function () {
528
+ return getDownstepPositions;
529
+ }
530
+ });
531
+ Object.defineProperty(exports, 'getKanaDiacriticInfo$1', {
532
+ enumerable: true,
533
+ get: function () {
534
+ return getKanaDiacriticInfo;
535
+ }
536
+ });
537
+ Object.defineProperty(exports, 'getKanaMoraCount$1', {
538
+ enumerable: true,
539
+ get: function () {
540
+ return getKanaMoraCount;
541
+ }
542
+ });
543
+ Object.defineProperty(exports, 'getKanaMorae$1', {
544
+ enumerable: true,
545
+ get: function () {
546
+ return getKanaMorae;
547
+ }
548
+ });
549
+ Object.defineProperty(exports, 'getPitchCategory$1', {
550
+ enumerable: true,
551
+ get: function () {
552
+ return getPitchCategory;
553
+ }
554
+ });
555
+ Object.defineProperty(exports, 'isCodePointJapanese', {
556
+ enumerable: true,
557
+ get: function () {
558
+ return isCodePointJapanese;
559
+ }
560
+ });
561
+ Object.defineProperty(exports, 'isCodePointKana', {
562
+ enumerable: true,
563
+ get: function () {
564
+ return isCodePointKana;
565
+ }
566
+ });
567
+ Object.defineProperty(exports, 'isCodePointKanji$1', {
568
+ enumerable: true,
569
+ get: function () {
570
+ return isCodePointKanji;
571
+ }
572
+ });
573
+ Object.defineProperty(exports, 'isEmphaticCodePoint', {
574
+ enumerable: true,
575
+ get: function () {
576
+ return isEmphaticCodePoint;
577
+ }
578
+ });
579
+ Object.defineProperty(exports, 'isMoraPitchHigh$1', {
580
+ enumerable: true,
581
+ get: function () {
582
+ return isMoraPitchHigh;
583
+ }
584
+ });
585
+ Object.defineProperty(exports, 'isStringEntirelyKana', {
586
+ enumerable: true,
587
+ get: function () {
588
+ return isStringEntirelyKana;
589
+ }
590
+ });
591
+ Object.defineProperty(exports, 'isStringPartiallyJapanese', {
592
+ enumerable: true,
593
+ get: function () {
594
+ return isStringPartiallyJapanese;
595
+ }
596
+ });
597
+ Object.defineProperty(exports, 'normalizeCJKCompatibilityCharacters', {
598
+ enumerable: true,
599
+ get: function () {
600
+ return normalizeCJKCompatibilityCharacters;
601
+ }
602
+ });
603
+ Object.defineProperty(exports, 'normalizeCombiningCharacters', {
604
+ enumerable: true,
605
+ get: function () {
606
+ return normalizeCombiningCharacters;
607
+ }
608
+ });
609
+ //# sourceMappingURL=furigana-DpZLcues.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"furigana-DpZLcues.cjs","names":["HIRAGANA_RANGE: CodepointRange","KATAKANA_RANGE: CodepointRange","HIRAGANA_CONVERSION_RANGE: CodepointRange","KATAKANA_CONVERSION_RANGE: CodepointRange","KANA_RANGES: CodepointRange[]","JAPANESE_RANGES: CodepointRange[]","CJK_IDEOGRAPH_RANGES","CJK_PUNCTUATION_RANGE","FULLWIDTH_CHARACTER_RANGES","previousCharacter: string","text: string","reading: string","readingNormalized: string","groups: FuriganaGroup[]","groupsStart: number","result: FuriganaSegment[] | null","newSegments: FuriganaSegment[]","text1: string","text2: string","codePoint: number","str: string","moraIndex: number","pitchAccentValue: number | string","isVerbOrAdjective: boolean","pitchString: string","downsteps: number[]","morae: string[]","i: number","character: string","CJK_COMPATIBILITY","term: string","groupPre: FuriganaGroup | null","isKanaPre: boolean | null","source: string","segments: FuriganaSegment[]","fullCollapse: boolean","text: string","reading: string"],"sources":["../src/language/ja/japanese.ts","../src/language/ja/furigana.ts"],"sourcesContent":["import {\n CJK_COMPATIBILITY,\n CJK_IDEOGRAPH_RANGES,\n CJK_PUNCTUATION_RANGE,\n FULLWIDTH_CHARACTER_RANGES,\n isCodePointInRange,\n isCodePointInRanges,\n} from '../cjk-util';\nimport type { CodepointRange } from '../cjk-util';\n\nexport type FuriganaSegment = {\n text: string;\n reading: string;\n};\n\nexport type FuriganaGroup = {\n isKana: boolean;\n text: string;\n textNormalized: string | null;\n};\n\nexport type DiacriticType = 'dakuten' | 'handakuten';\n\nexport type PitchCategory = 'heiban' | 'atamadaka' | 'nakadaka' | 'odaka' | 'kifuku';\n\nconst HIRAGANA_SMALL_TSU_CODE_POINT = 0x3063;\nconst KATAKANA_SMALL_TSU_CODE_POINT = 0x30c3;\nconst KATAKANA_SMALL_KA_CODE_POINT = 0x30f5;\nconst KATAKANA_SMALL_KE_CODE_POINT = 0x30f6;\nconst KANA_PROLONGED_SOUND_MARK_CODE_POINT = 0x30fc;\n\nconst HIRAGANA_RANGE: CodepointRange = [0x3040, 0x309f];\nconst KATAKANA_RANGE: CodepointRange = [0x30a0, 0x30ff];\n\nconst HIRAGANA_CONVERSION_RANGE: CodepointRange = [0x3041, 0x3096];\nconst KATAKANA_CONVERSION_RANGE: CodepointRange = [0x30a1, 0x30f6];\n\nconst KANA_RANGES: CodepointRange[] = [HIRAGANA_RANGE, KATAKANA_RANGE];\n\nconst JAPANESE_RANGES: CodepointRange[] = [\n HIRAGANA_RANGE,\n KATAKANA_RANGE,\n ...CJK_IDEOGRAPH_RANGES,\n [0xff66, 0xff9f], // Halfwidth katakana\n [0x30fb, 0x30fc], // Katakana punctuation\n [0xff61, 0xff65], // Kana punctuation\n CJK_PUNCTUATION_RANGE,\n ...FULLWIDTH_CHARACTER_RANGES,\n];\n\nconst SMALL_KANA_SET = new Set('ぁぃぅぇぉゃゅょゎァィゥェォャュョヮ');\n\nconst HALFWIDTH_KATAKANA_MAPPING = new Map<string, string>([\n ['・', '・--'],\n ['ヲ', 'ヲヺ-'],\n ['ァ', 'ァ--'],\n ['ィ', 'ィ--'],\n ['ゥ', 'ゥ--'],\n ['ェ', 'ェ--'],\n ['ォ', 'ォ--'],\n ['ャ', 'ャ--'],\n ['ュ', 'ュ--'],\n ['ョ', 'ョ--'],\n ['ッ', 'ッ--'],\n ['ー', 'ー--'],\n ['ア', 'ア--'],\n ['イ', 'イ--'],\n ['ウ', 'ウヴ-'],\n ['エ', 'エ--'],\n ['オ', 'オ--'],\n ['カ', 'カガ-'],\n ['キ', 'キギ-'],\n ['ク', 'クグ-'],\n ['ケ', 'ケゲ-'],\n ['コ', 'コゴ-'],\n ['サ', 'サザ-'],\n ['シ', 'シジ-'],\n ['ス', 'スズ-'],\n ['セ', 'セゼ-'],\n ['ソ', 'ソゾ-'],\n ['タ', 'タダ-'],\n ['チ', 'チヂ-'],\n ['ツ', 'ツヅ-'],\n ['テ', 'テデ-'],\n ['ト', 'トド-'],\n ['ナ', 'ナ--'],\n ['ニ', 'ニ--'],\n ['ヌ', 'ヌ--'],\n ['ネ', 'ネ--'],\n ['ノ', 'ノ--'],\n ['ハ', 'ハバパ'],\n ['ヒ', 'ヒビピ'],\n ['フ', 'フブプ'],\n ['ヘ', 'ヘベペ'],\n ['ホ', 'ホボポ'],\n ['マ', 'マ--'],\n ['ミ', 'ミ--'],\n ['ム', 'ム--'],\n ['メ', 'メ--'],\n ['モ', 'モ--'],\n ['ヤ', 'ヤ--'],\n ['ユ', 'ユ--'],\n ['ヨ', 'ヨ--'],\n ['ラ', 'ラ--'],\n ['リ', 'リ--'],\n ['ル', 'ル--'],\n ['レ', 'レ--'],\n ['ロ', 'ロ--'],\n ['ワ', 'ワ--'],\n ['ン', 'ン--'],\n]);\n\nconst VOWEL_TO_KANA_MAPPING = new Map<string, string>([\n ['a', 'ぁあかがさざただなはばぱまゃやらゎわヵァアカガサザタダナハバパマャヤラヮワヵヷ'],\n ['i', 'ぃいきぎしじちぢにひびぴみりゐィイキギシジチヂニヒビピミリヰヸ'],\n ['u', 'ぅうくぐすずっつづぬふぶぷむゅゆるゥウクグスズッツヅヌフブプムュユルヴ'],\n ['e', 'ぇえけげせぜてでねへべぺめれゑヶェエケゲセゼテデネヘベペメレヱヶヹ'],\n ['o', 'ぉおこごそぞとどのほぼぽもょよろをォオコゴソゾトドノホボポモョヨロヲヺ'],\n ['', 'のノ'],\n]);\n\nconst KANA_TO_VOWEL_MAPPING = new Map<string, string>();\nfor (const [vowel, characters] of VOWEL_TO_KANA_MAPPING) {\n for (const character of characters) {\n KANA_TO_VOWEL_MAPPING.set(character, vowel);\n }\n}\n\nconst kana =\n 'うゔ-かが-きぎ-くぐ-けげ-こご-さざ-しじ-すず-せぜ-そぞ-ただ-ちぢ-つづ-てで-とど-はばぱひびぴふぶぷへべぺほぼぽワヷ-ヰヸ-ウヴ-ヱヹ-ヲヺ-カガ-キギ-クグ-ケゲ-コゴ-サザ-シジ-スズ-セゼ-ソゾ-タダ-チヂ-ツヅ-テデ-トド-ハバパヒビピフブプヘベペホボポ';\nconst DIACRITIC_MAPPING = new Map<string, { character: string; type: DiacriticType }>();\nfor (let i = 0, ii = kana.length; i < ii; i += 3) {\n const character = kana[i];\n const dakuten = kana[i + 1];\n const handakuten = kana[i + 2];\n DIACRITIC_MAPPING.set(dakuten, { character, type: 'dakuten' });\n if (handakuten !== '-') {\n DIACRITIC_MAPPING.set(handakuten, { character, type: 'handakuten' });\n }\n}\n\nfunction getProlongedHiragana(previousCharacter: string): string | null {\n switch (KANA_TO_VOWEL_MAPPING.get(previousCharacter)) {\n case 'a':\n return 'あ';\n case 'i':\n return 'い';\n case 'u':\n return 'う';\n case 'e':\n return 'え';\n case 'o':\n return 'う';\n default:\n return null;\n }\n}\n\nfunction createFuriganaSegment(text: string, reading: string): FuriganaSegment {\n return { text, reading };\n}\n\nfunction segmentizeFurigana(\n reading: string,\n readingNormalized: string,\n groups: FuriganaGroup[],\n groupsStart: number,\n): FuriganaSegment[] | null {\n const groupCount = groups.length - groupsStart;\n if (groupCount <= 0) {\n return reading.length === 0 ? [] : null;\n }\n\n const group = groups[groupsStart];\n const { isKana, text } = group;\n const textLength = text.length;\n if (isKana) {\n const { textNormalized } = group;\n if (textNormalized !== null && readingNormalized.startsWith(textNormalized)) {\n const segments = segmentizeFurigana(\n reading.substring(textLength),\n readingNormalized.substring(textLength),\n groups,\n groupsStart + 1,\n );\n if (segments !== null) {\n if (reading.startsWith(text)) {\n segments.unshift(createFuriganaSegment(text, ''));\n } else {\n segments.unshift(...getFuriganaKanaSegments(text, reading));\n }\n return segments;\n }\n }\n return null;\n }\n let result: FuriganaSegment[] | null = null;\n for (let i = reading.length; i >= textLength; --i) {\n const segments = segmentizeFurigana(\n reading.substring(i),\n readingNormalized.substring(i),\n groups,\n groupsStart + 1,\n );\n if (segments !== null) {\n if (result !== null) {\n // More than one way to segmentize the tail; mark as ambiguous\n return null;\n }\n const segmentReading = reading.substring(0, i);\n segments.unshift(createFuriganaSegment(text, segmentReading));\n result = segments;\n }\n // There is only one way to segmentize the last non-kana group\n if (groupCount === 1) {\n break;\n }\n }\n return result;\n}\n\nfunction getFuriganaKanaSegments(text: string, reading: string): FuriganaSegment[] {\n const textLength = text.length;\n const newSegments: FuriganaSegment[] = [];\n let start = 0;\n let state = reading[0] === text[0];\n for (let i = 1; i < textLength; ++i) {\n const newState = reading[i] === text[i];\n if (state === newState) {\n continue;\n }\n newSegments.push(createFuriganaSegment(text.substring(start, i), state ? '' : reading.substring(start, i)));\n state = newState;\n start = i;\n }\n newSegments.push(\n createFuriganaSegment(text.substring(start, textLength), state ? '' : reading.substring(start, textLength)),\n );\n return newSegments;\n}\n\nfunction getStemLength(text1: string, text2: string): number {\n const minLength = Math.min(text1.length, text2.length);\n if (minLength === 0) {\n return 0;\n }\n\n let i = 0;\n while (true) {\n const char1 = text1.codePointAt(i) as number;\n const char2 = text2.codePointAt(i) as number;\n if (char1 !== char2) {\n break;\n }\n const charLength = String.fromCodePoint(char1).length;\n i += charLength;\n if (i >= minLength) {\n if (i > minLength) {\n i -= charLength; // Don't consume partial UTF16 surrogate characters\n }\n break;\n }\n }\n return i;\n}\n\n// Character code testing functions\n\nexport function isCodePointKanji(codePoint: number): boolean {\n return isCodePointInRanges(codePoint, CJK_IDEOGRAPH_RANGES);\n}\n\nexport function isCodePointKana(codePoint: number): boolean {\n return isCodePointInRanges(codePoint, KANA_RANGES);\n}\n\nexport function isCodePointJapanese(codePoint: number): boolean {\n return isCodePointInRanges(codePoint, JAPANESE_RANGES);\n}\n\n// String testing functions\n\nexport function isStringEntirelyKana(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const c of str) {\n if (!isCodePointInRanges(c.codePointAt(0) as number, KANA_RANGES)) {\n return false;\n }\n }\n return true;\n}\n\nexport function isStringPartiallyJapanese(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const c of str) {\n if (isCodePointInRanges(c.codePointAt(0) as number, JAPANESE_RANGES)) {\n return true;\n }\n }\n return false;\n}\n\n// Mora functions\n\nexport function isMoraPitchHigh(moraIndex: number, pitchAccentValue: number | string): boolean {\n if (typeof pitchAccentValue === 'string') {\n return pitchAccentValue[moraIndex] === 'H';\n }\n switch (pitchAccentValue) {\n case 0:\n return moraIndex > 0;\n case 1:\n return moraIndex < 1;\n default:\n return moraIndex > 0 && moraIndex < pitchAccentValue;\n }\n}\n\nexport function getPitchCategory(\n text: string,\n pitchAccentValue: number | string,\n isVerbOrAdjective: boolean,\n): PitchCategory | null {\n const pitchAccentDownstepPosition =\n typeof pitchAccentValue === 'string' ? getDownstepPositions(pitchAccentValue)[0] : pitchAccentValue;\n if (pitchAccentDownstepPosition === 0) {\n return 'heiban';\n }\n if (isVerbOrAdjective) {\n return pitchAccentDownstepPosition > 0 ? 'kifuku' : null;\n }\n if (pitchAccentDownstepPosition === 1) {\n return 'atamadaka';\n }\n if (pitchAccentDownstepPosition > 1) {\n return pitchAccentDownstepPosition >= getKanaMoraCount(text) ? 'odaka' : 'nakadaka';\n }\n return null;\n}\n\nexport function getDownstepPositions(pitchString: string): number[] {\n const downsteps: number[] = [];\n const moraCount = pitchString.length;\n for (let i = 0; i < moraCount; i++) {\n if (i > 0 && pitchString[i - 1] === 'H' && pitchString[i] === 'L') {\n downsteps.push(i);\n }\n }\n if (downsteps.length === 0) {\n downsteps.push(pitchString.startsWith('L') ? 0 : -1);\n }\n return downsteps;\n}\n\nexport function getKanaMorae(text: string): string[] {\n const morae: string[] = [];\n let i: number;\n for (const c of text) {\n if (SMALL_KANA_SET.has(c) && (i = morae.length) > 0) {\n morae[i - 1] += c;\n } else {\n morae.push(c);\n }\n }\n return morae;\n}\n\nexport function getKanaMoraCount(text: string): number {\n let moraCount = 0;\n for (const c of text) {\n if (!(SMALL_KANA_SET.has(c) && moraCount > 0)) {\n ++moraCount;\n }\n }\n return moraCount;\n}\n\n// Conversion functions\n\nexport function convertKatakanaToHiragana(text: string, keepProlongedSoundMarks = false): string {\n let result = '';\n const offset = HIRAGANA_CONVERSION_RANGE[0] - KATAKANA_CONVERSION_RANGE[0];\n for (let char of text) {\n const codePoint = char.codePointAt(0) as number;\n switch (codePoint) {\n case KATAKANA_SMALL_KA_CODE_POINT:\n case KATAKANA_SMALL_KE_CODE_POINT:\n // No change\n break;\n case KANA_PROLONGED_SOUND_MARK_CODE_POINT:\n if (!keepProlongedSoundMarks && result.length > 0) {\n const char2 = getProlongedHiragana(result[result.length - 1]);\n if (char2 !== null) {\n char = char2;\n }\n }\n break;\n default:\n if (isCodePointInRange(codePoint, KATAKANA_CONVERSION_RANGE)) {\n char = String.fromCodePoint(codePoint + offset);\n }\n break;\n }\n result += char;\n }\n return result;\n}\n\nexport function convertHiraganaToKatakana(text: string): string {\n let result = '';\n const offset = KATAKANA_CONVERSION_RANGE[0] - HIRAGANA_CONVERSION_RANGE[0];\n for (let char of text) {\n const codePoint = char.codePointAt(0) as number;\n if (isCodePointInRange(codePoint, HIRAGANA_CONVERSION_RANGE)) {\n char = String.fromCodePoint(codePoint + offset);\n }\n result += char;\n }\n return result;\n}\n\nexport function convertAlphanumericToFullWidth(text: string): string {\n let result = '';\n for (const char of text) {\n let c = char.codePointAt(0) as number;\n if (c >= 0x30 && c <= 0x39) {\n // ['0', '9']\n c += 0xff10 - 0x30;\n } else if (c >= 0x41 && c <= 0x5a) {\n // ['A', 'Z']\n c += 0xff21 - 0x41;\n } else if (c >= 0x61 && c <= 0x7a) {\n // ['a', 'z']\n c += 0xff41 - 0x61;\n }\n result += String.fromCodePoint(c);\n }\n return result;\n}\n\nexport function convertFullWidthAlphanumericToNormal(text: string): string {\n let result = '';\n const length = text.length;\n for (let i = 0; i < length; i++) {\n let c = text[i].codePointAt(0) as number;\n if (c >= 0xff10 && c <= 0xff19) {\n // ['0', '9']\n c -= 0xff10 - 0x30;\n } else if (c >= 0xff21 && c <= 0xff3a) {\n // ['A', 'Z']\n c -= 0xff21 - 0x41;\n } else if (c >= 0xff41 && c <= 0xff5a) {\n // ['a', 'z']\n c -= 0xff41 - 0x61;\n }\n result += String.fromCodePoint(c);\n }\n return result;\n}\n\nexport function convertHalfWidthKanaToFullWidth(text: string): string {\n let result = '';\n\n for (let i = 0, ii = text.length; i < ii; ++i) {\n const c = text[i];\n const mapping = HALFWIDTH_KATAKANA_MAPPING.get(c);\n if (typeof mapping !== 'string') {\n result += c;\n continue;\n }\n\n let index = 0;\n switch (text.charCodeAt(i + 1)) {\n case 0xff9e: // Dakuten\n index = 1;\n break;\n case 0xff9f: // Handakuten\n index = 2;\n break;\n }\n\n let c2 = mapping[index];\n if (index > 0) {\n if (c2 === '-') {\n // Invalid\n index = 0;\n c2 = mapping[0];\n } else {\n ++i;\n }\n }\n\n result += c2;\n }\n\n return result;\n}\n\nexport function getKanaDiacriticInfo(character: string): { character: string; type: DiacriticType } | null {\n const info = DIACRITIC_MAPPING.get(character);\n return typeof info !== 'undefined' ? { character: info.character, type: info.type } : null;\n}\n\nfunction dakutenAllowed(codePoint: number): boolean {\n return (\n (codePoint >= 0x304b && codePoint <= 0x3068) ||\n (codePoint >= 0x306f && codePoint <= 0x307b) ||\n (codePoint >= 0x30ab && codePoint <= 0x30c8) ||\n (codePoint >= 0x30cf && codePoint <= 0x30db)\n );\n}\n\nfunction handakutenAllowed(codePoint: number): boolean {\n return (codePoint >= 0x306f && codePoint <= 0x307b) || (codePoint >= 0x30cf && codePoint <= 0x30db);\n}\n\nexport function normalizeCombiningCharacters(text: string): string {\n let result = '';\n let i = text.length - 1;\n while (i > 0) {\n if (text[i] === '\\u3099') {\n const dakutenCombinee = text[i - 1].codePointAt(0);\n if (dakutenCombinee && dakutenAllowed(dakutenCombinee)) {\n result = String.fromCodePoint(dakutenCombinee + 1) + result;\n i -= 2;\n continue;\n }\n } else if (text[i] === '\\u309A') {\n const handakutenCombinee = text[i - 1].codePointAt(0);\n if (handakutenCombinee && handakutenAllowed(handakutenCombinee)) {\n result = String.fromCodePoint(handakutenCombinee + 2) + result;\n i -= 2;\n continue;\n }\n }\n result = text[i] + result;\n i--;\n }\n if (i === 0) {\n result = text[0] + result;\n }\n return result;\n}\n\nexport function normalizeCJKCompatibilityCharacters(text: string): string {\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const codePoint = text[i].codePointAt(0);\n result += codePoint && isCodePointInRange(codePoint, CJK_COMPATIBILITY) ? text[i].normalize('NFKD') : text[i];\n }\n return result;\n}\n\n// Furigana distribution\n\nexport function distributeFurigana(term: string, reading: string): FuriganaSegment[] {\n if (reading === term) {\n return [createFuriganaSegment(term, '')];\n }\n\n const groups: FuriganaGroup[] = [];\n let groupPre: FuriganaGroup | null = null;\n let isKanaPre: boolean | null = null;\n for (const c of term) {\n const codePoint = c.codePointAt(0) as number;\n const isKana = isCodePointKana(codePoint);\n if (isKana === isKanaPre) {\n (groupPre as FuriganaGroup).text += c;\n } else {\n groupPre = { isKana, text: c, textNormalized: null };\n groups.push(groupPre);\n isKanaPre = isKana;\n }\n }\n for (const group of groups) {\n if (group.isKana) {\n group.textNormalized = convertKatakanaToHiragana(group.text);\n }\n }\n\n const readingNormalized = convertKatakanaToHiragana(reading);\n const segments = segmentizeFurigana(reading, readingNormalized, groups, 0);\n if (segments !== null) {\n return segments;\n }\n\n // Fallback\n return [createFuriganaSegment(term, reading)];\n}\n\nexport function distributeFuriganaInflected(term: string, reading: string, source: string): FuriganaSegment[] {\n const termNormalized = convertKatakanaToHiragana(term);\n const readingNormalized = convertKatakanaToHiragana(reading);\n const sourceNormalized = convertKatakanaToHiragana(source);\n\n let mainText = term;\n let stemLength = getStemLength(termNormalized, sourceNormalized);\n\n const readingStemLength = getStemLength(readingNormalized, sourceNormalized);\n if (readingStemLength > 0 && readingStemLength >= stemLength) {\n mainText = reading;\n stemLength = readingStemLength;\n reading = `${source.substring(0, stemLength)}${reading.substring(stemLength)}`;\n }\n\n const segments: FuriganaSegment[] = [];\n if (stemLength > 0) {\n mainText = `${source.substring(0, stemLength)}${mainText.substring(stemLength)}`;\n const segments2 = distributeFurigana(mainText, reading);\n let consumed = 0;\n for (const segment of segments2) {\n const { text } = segment;\n const start = consumed;\n consumed += text.length;\n if (consumed < stemLength) {\n segments.push(segment);\n } else if (consumed === stemLength) {\n segments.push(segment);\n break;\n } else {\n if (start < stemLength) {\n segments.push(createFuriganaSegment(mainText.substring(start, stemLength), ''));\n }\n break;\n }\n }\n }\n\n if (stemLength < source.length) {\n const remainder = source.substring(stemLength);\n const segmentCount = segments.length;\n if (segmentCount > 0 && segments[segmentCount - 1].reading.length === 0) {\n segments[segmentCount - 1].text += remainder;\n } else {\n segments.push(createFuriganaSegment(remainder, ''));\n }\n }\n\n return segments;\n}\n\n// Miscellaneous\n\nexport function isEmphaticCodePoint(codePoint: number): boolean {\n return (\n codePoint === HIRAGANA_SMALL_TSU_CODE_POINT ||\n codePoint === KATAKANA_SMALL_TSU_CODE_POINT ||\n codePoint === KANA_PROLONGED_SOUND_MARK_CODE_POINT\n );\n}\n\nexport function collapseEmphaticSequences(text: string, fullCollapse: boolean): string {\n let left = 0;\n while (left < text.length && isEmphaticCodePoint(text.codePointAt(left) as number)) {\n ++left;\n }\n let right = text.length - 1;\n while (right >= 0 && isEmphaticCodePoint(text.codePointAt(right) as number)) {\n --right;\n }\n if (left > right) {\n return text;\n }\n\n const leadingEmphatics = text.substring(0, left);\n const trailingEmphatics = text.substring(right + 1);\n let middle = '';\n let currentCollapsedCodePoint = -1;\n\n for (let i = left; i <= right; ++i) {\n const char = text[i];\n const codePoint = char.codePointAt(0) as number;\n if (isEmphaticCodePoint(codePoint)) {\n if (currentCollapsedCodePoint !== codePoint) {\n currentCollapsedCodePoint = codePoint;\n if (!fullCollapse) {\n middle += char;\n }\n }\n } else {\n currentCollapsedCodePoint = -1;\n middle += char;\n }\n }\n\n return leadingEmphatics + middle + trailingEmphatics;\n}\n","export type { FuriganaSegment } from './japanese';\nexport { distributeFurigana, distributeFuriganaInflected } from './japanese';\n\nimport { distributeFurigana } from './japanese';\nimport type { FuriganaSegment } from './japanese';\n\nexport function generateFurigana(text: string, reading: string): FuriganaSegment[] {\n return distributeFurigana(text, reading);\n}\n"],"mappings":"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"}