yomitan-core 1.0.2 → 1.2.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 (198) hide show
  1. package/README.md +8 -1
  2. package/dist/anki-connect-B2UXtiUS.js +6 -0
  3. package/dist/anki-connect-BXvjYYm0.cjs +6 -0
  4. package/dist/{anki-connect-B_YpChhu.cjs → anki-connect-DGx7Gr0H.cjs} +3 -3
  5. package/dist/{anki-connect-B_YpChhu.cjs.map → anki-connect-DGx7Gr0H.cjs.map} +1 -1
  6. package/dist/{anki-connect-697E04LF.js → anki-connect-Dau8nAXZ.js} +3 -3
  7. package/dist/{anki-connect-697E04LF.js.map → anki-connect-Dau8nAXZ.js.map} +1 -1
  8. package/dist/anki.cjs +6 -6
  9. package/dist/anki.d.cts.map +1 -1
  10. package/dist/anki.d.ts +2 -2
  11. package/dist/anki.d.ts.map +1 -1
  12. package/dist/anki.js +6 -6
  13. package/dist/{audio-ZuaDkaUZ.d.ts → audio-DN-FhZ5k.d.ts} +1 -1
  14. package/dist/{audio-ZuaDkaUZ.d.ts.map → audio-DN-FhZ5k.d.ts.map} +1 -1
  15. package/dist/{audio-url-generator-CgTMaTM2.js → audio-url-generator-C7mkxYeq.js} +2 -2
  16. package/dist/{audio-url-generator-CfXaxZ47.cjs → audio-url-generator-CZECihX-.cjs} +2 -2
  17. package/dist/{audio-url-generator-C23AXVj1.cjs → audio-url-generator-CorFRyBU.cjs} +2 -2
  18. package/dist/{audio-url-generator-C23AXVj1.cjs.map → audio-url-generator-CorFRyBU.cjs.map} +1 -1
  19. package/dist/{audio-url-generator-DykdzZJu.js → audio-url-generator-_6Qk0i3T.js} +2 -2
  20. package/dist/{audio-url-generator-DykdzZJu.js.map → audio-url-generator-_6Qk0i3T.js.map} +1 -1
  21. package/dist/audio.cjs +2 -2
  22. package/dist/audio.d.ts +2 -2
  23. package/dist/audio.js +2 -2
  24. package/dist/{batch-processor-CXZZhx5t.js → batch-processor-BR-gB3H3.js} +1 -1
  25. package/dist/{batch-processor-CXZZhx5t.js.map → batch-processor-BR-gB3H3.js.map} +1 -1
  26. package/dist/batch-processor-CSF1acTw.cjs +3 -0
  27. package/dist/{batch-processor-C8pSzqRE.cjs → batch-processor-DFqM_L-_.cjs} +1 -1
  28. package/dist/{batch-processor-C8pSzqRE.cjs.map → batch-processor-DFqM_L-_.cjs.map} +1 -1
  29. package/dist/batch-processor-Quo9jUyf.js +3 -0
  30. package/dist/{core-C_0QjRBI.d.ts → core-CRjMTF7c.d.ts} +1 -1
  31. package/dist/{core-C_0QjRBI.d.ts.map → core-CRjMTF7c.d.ts.map} +1 -1
  32. package/dist/database.d.ts +3 -3
  33. package/dist/debug-I2dyAd2e.cjs +51 -0
  34. package/dist/debug-I2dyAd2e.cjs.map +1 -0
  35. package/dist/debug-hF63AFkq.js +38 -0
  36. package/dist/debug-hF63AFkq.js.map +1 -0
  37. package/dist/{dictionary-CfzEFbXZ.d.ts → dictionary-DdxghSJP.d.ts} +1 -1
  38. package/dist/{dictionary-CfzEFbXZ.d.ts.map → dictionary-DdxghSJP.d.ts.map} +1 -1
  39. package/dist/{dictionary-data-util-BY_72f3u.cjs → dictionary-data-util-DmLJMtGc.cjs} +1 -1
  40. package/dist/{dictionary-data-util-BY_72f3u.cjs.map → dictionary-data-util-DmLJMtGc.cjs.map} +1 -1
  41. package/dist/{dictionary-data-util-CKDT7n2t.js → dictionary-data-util-gUUD9ElK.js} +1 -1
  42. package/dist/{dictionary-data-util-CKDT7n2t.js.map → dictionary-data-util-gUUD9ElK.js.map} +1 -1
  43. package/dist/{dictionary-database-BRAqOF_M.d.ts → dictionary-database-D0lvK2n3.d.ts} +2 -2
  44. package/dist/{dictionary-database-BRAqOF_M.d.ts.map → dictionary-database-D0lvK2n3.d.ts.map} +1 -1
  45. package/dist/{dictionary-importer-C7mNL5CJ.js → dictionary-importer-BPlLeF5R.js} +5 -5
  46. package/dist/{dictionary-importer-C7mNL5CJ.js.map → dictionary-importer-BPlLeF5R.js.map} +1 -1
  47. package/dist/{dictionary-importer-CbMwsqEX.cjs → dictionary-importer-BvgP1Fs9.cjs} +5 -5
  48. package/dist/{dictionary-importer-CbMwsqEX.cjs.map → dictionary-importer-BvgP1Fs9.cjs.map} +1 -1
  49. package/dist/{dictionary-importer-C-AlWsIN.d.ts → dictionary-importer-CDbCAbwG.d.ts} +2 -2
  50. package/dist/{dictionary-importer-C-AlWsIN.d.ts.map → dictionary-importer-CDbCAbwG.d.ts.map} +1 -1
  51. package/dist/dictionary-importer-DEMVqTjR.js +8 -0
  52. package/dist/dictionary-importer-Luz6usUQ.cjs +8 -0
  53. package/dist/{dictionary-update-checker-DE2ymYcs.js → dictionary-update-checker-CLbtQ48X.js} +2 -2
  54. package/dist/{dictionary-update-checker-DE2ymYcs.js.map → dictionary-update-checker-CLbtQ48X.js.map} +1 -1
  55. package/dist/dictionary-update-checker-CsS7MxK_.js +4 -0
  56. package/dist/{dictionary-update-checker-CU3q0aoP.cjs → dictionary-update-checker-DgjPsURI.cjs} +2 -2
  57. package/dist/{dictionary-update-checker-xIwF77-R.cjs → dictionary-update-checker-DmiIUoKw.cjs} +2 -2
  58. package/dist/{dictionary-update-checker-xIwF77-R.cjs.map → dictionary-update-checker-DmiIUoKw.cjs.map} +1 -1
  59. package/dist/{display-generator-vjbG05fn.js → display-generator-BAEJDrHT.js} +9 -7
  60. package/dist/display-generator-BAEJDrHT.js.map +1 -0
  61. package/dist/display-generator-D5fkD0JI.cjs +10 -0
  62. package/dist/display-generator-DZLMaVuP.js +10 -0
  63. package/dist/{display-generator-BhV_MOD1.cjs → display-generator-D_0chBzj.cjs} +9 -7
  64. package/dist/display-generator-D_0chBzj.cjs.map +1 -0
  65. package/dist/{errors-ZI2FcGUl.cjs → errors-0pIJI6N2.cjs} +1 -1
  66. package/dist/{errors-ZI2FcGUl.cjs.map → errors-0pIJI6N2.cjs.map} +1 -1
  67. package/dist/{errors-D2JfYV-C.js → errors-DvKlMRXC.js} +1 -1
  68. package/dist/{errors-D2JfYV-C.js.map → errors-DvKlMRXC.js.map} +1 -1
  69. package/dist/frequency-ranking-BXjfhhUQ.js +3 -0
  70. package/dist/{frequency-ranking-DmNIoxut.cjs → frequency-ranking-Cx1kkIrw.cjs} +1 -1
  71. package/dist/{frequency-ranking-DzbdZghE.js → frequency-ranking-DEJMTMdg.js} +1 -1
  72. package/dist/{frequency-ranking-DzbdZghE.js.map → frequency-ranking-DEJMTMdg.js.map} +1 -1
  73. package/dist/{frequency-ranking-Dm6xCMkY.cjs → frequency-ranking-DVYxTXN-.cjs} +1 -1
  74. package/dist/{frequency-ranking-Dm6xCMkY.cjs.map → frequency-ranking-DVYxTXN-.cjs.map} +1 -1
  75. package/dist/furigana-MU_j_m5i.cjs +5 -0
  76. package/dist/{furigana-BnY7-dJ-.cjs → furigana-SZuBaUyl.cjs} +2 -2
  77. package/dist/{furigana-BnY7-dJ-.cjs.map → furigana-SZuBaUyl.cjs.map} +1 -1
  78. package/dist/furigana-ZCs0Xs0b.js +5 -0
  79. package/dist/{furigana-CI6LUA-6.js → furigana-h18vaQ7a.js} +2 -2
  80. package/dist/{furigana-CI6LUA-6.js.map → furigana-h18vaQ7a.js.map} +1 -1
  81. package/dist/import.cjs +6 -6
  82. package/dist/import.d.ts +3 -3
  83. package/dist/import.js +6 -6
  84. package/dist/index.cjs +44 -18
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.d.cts +3 -3
  87. package/dist/index.d.cts.map +1 -1
  88. package/dist/index.d.ts +10 -10
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +44 -18
  91. package/dist/index.js.map +1 -1
  92. package/dist/{japanese-BVV1Ctk-.cjs → japanese-C83fmEfb.cjs} +1 -1
  93. package/dist/{japanese-BVV1Ctk-.cjs.map → japanese-C83fmEfb.cjs.map} +1 -1
  94. package/dist/{japanese-DhmmW35J.js → japanese-OKEGf_i4.js} +2 -2
  95. package/dist/{japanese-DhmmW35J.js.map → japanese-OKEGf_i4.js.map} +1 -1
  96. package/dist/{json-CyQBn52D.cjs → json-Cdj6aIOQ.cjs} +1 -1
  97. package/dist/{json-CyQBn52D.cjs.map → json-Cdj6aIOQ.cjs.map} +1 -1
  98. package/dist/{json-DTq_IXXF.js → json-rIgOFqVY.js} +1 -1
  99. package/dist/{json-DTq_IXXF.js.map → json-rIgOFqVY.js.map} +1 -1
  100. package/dist/{language-DFFp_7nc.d.ts → language-DMwuc2-C.d.ts} +1 -1
  101. package/dist/{language-DFFp_7nc.d.ts.map → language-DMwuc2-C.d.ts.map} +1 -1
  102. package/dist/language.cjs +12 -12
  103. package/dist/language.d.cts +41 -3
  104. package/dist/language.d.cts.map +1 -1
  105. package/dist/language.d.ts +44 -6
  106. package/dist/language.d.ts.map +1 -1
  107. package/dist/language.js +5 -5
  108. package/dist/lookup.cjs +7 -6
  109. package/dist/lookup.d.cts +5 -78
  110. package/dist/lookup.d.cts.map +1 -1
  111. package/dist/lookup.d.ts +8 -81
  112. package/dist/lookup.d.ts.map +1 -1
  113. package/dist/lookup.js +7 -6
  114. package/dist/{media-loader-CMEuD0fn.js → media-loader-C1WZVVaA.js} +1 -1
  115. package/dist/{media-loader-CMEuD0fn.js.map → media-loader-C1WZVVaA.js.map} +1 -1
  116. package/dist/media-loader-CWNb22gc.cjs +3 -0
  117. package/dist/media-loader-CrQnDnSp.js +3 -0
  118. package/dist/{media-loader-DS2ZXpSI.cjs → media-loader-RE32nGs3.cjs} +1 -1
  119. package/dist/{media-loader-DS2ZXpSI.cjs.map → media-loader-RE32nGs3.cjs.map} +1 -1
  120. package/dist/{multi-language-transformer-CjLO0S8V.d.ts → multi-language-transformer-CFu0CVWY.d.ts} +3 -3
  121. package/dist/{multi-language-transformer-CjLO0S8V.d.ts.map → multi-language-transformer-CFu0CVWY.d.ts.map} +1 -1
  122. package/dist/multi-language-transformer-Dk8S4W6j.js +12503 -0
  123. package/dist/multi-language-transformer-Dk8S4W6j.js.map +1 -0
  124. package/dist/{multi-language-transformer-B2133Zg_.cjs → multi-language-transformer-N66Mmb2E.cjs} +9614 -5
  125. package/dist/multi-language-transformer-N66Mmb2E.cjs.map +1 -0
  126. package/dist/{pronunciation-generator-cNtAQi5s.js → pronunciation-generator-BXcwS3By.js} +2 -2
  127. package/dist/{pronunciation-generator-cNtAQi5s.js.map → pronunciation-generator-BXcwS3By.js.map} +1 -1
  128. package/dist/{pronunciation-generator-CPwnr43z.cjs → pronunciation-generator-CP1kjYje.cjs} +1 -1
  129. package/dist/{pronunciation-generator-B8y__W7I.cjs → pronunciation-generator-CeC3LFPU.cjs} +1 -1
  130. package/dist/{pronunciation-generator-B8y__W7I.cjs.map → pronunciation-generator-CeC3LFPU.cjs.map} +1 -1
  131. package/dist/{pronunciation-generator-BvTbUlOy.js → pronunciation-generator-I1xpdJu0.js} +1 -1
  132. package/dist/render.cjs +96 -8
  133. package/dist/render.cjs.map +1 -1
  134. package/dist/render.d.cts +33 -3
  135. package/dist/render.d.cts.map +1 -1
  136. package/dist/render.d.ts +35 -5
  137. package/dist/render.d.ts.map +1 -1
  138. package/dist/render.js +95 -9
  139. package/dist/render.js.map +1 -1
  140. package/dist/{sentence-parser-DUQJ3cTT.cjs → sentence-parser-8i1Y_OGS.cjs} +74 -46
  141. package/dist/sentence-parser-8i1Y_OGS.cjs.map +1 -0
  142. package/dist/{translator-TiTDVbmS.d.cts → sentence-parser-BQpu2oSA.d.cts} +80 -4
  143. package/dist/sentence-parser-BQpu2oSA.d.cts.map +1 -0
  144. package/dist/{sentence-parser-sx7y6Oyh.js → sentence-parser-CXDs4R_c.js} +74 -46
  145. package/dist/sentence-parser-CXDs4R_c.js.map +1 -0
  146. package/dist/{translator-CYvGmODX.d.ts → sentence-parser-CmsHUc_p.d.ts} +81 -5
  147. package/dist/sentence-parser-CmsHUc_p.d.ts.map +1 -0
  148. package/dist/sentence-parser-DQccqSpq.cjs +6 -0
  149. package/dist/sentence-parser-DsleseSI.js +6 -0
  150. package/dist/structured-content-generator-BhEkwa0T.js +4 -0
  151. package/dist/{structured-content-generator-C5Hhaurz.cjs → structured-content-generator-CokLKgrb.cjs} +2 -2
  152. package/dist/{structured-content-generator-C5Hhaurz.cjs.map → structured-content-generator-CokLKgrb.cjs.map} +1 -1
  153. package/dist/{structured-content-generator-D48bLhPA.cjs → structured-content-generator-_z5dJECG.cjs} +2 -2
  154. package/dist/{structured-content-generator-aJieXElq.js → structured-content-generator-gnjtdBcC.js} +2 -2
  155. package/dist/{structured-content-generator-aJieXElq.js.map → structured-content-generator-gnjtdBcC.js.map} +1 -1
  156. package/dist/{text-utilities-CFDC9Bkr.cjs → text-utilities-CTsN1Bq8.cjs} +1 -1
  157. package/dist/{text-utilities-CFDC9Bkr.cjs.map → text-utilities-CTsN1Bq8.cjs.map} +1 -1
  158. package/dist/{text-utilities-D5eno9GK.js → text-utilities-DjLdStjv.js} +1 -1
  159. package/dist/{text-utilities-D5eno9GK.js.map → text-utilities-DjLdStjv.js.map} +1 -1
  160. package/dist/translator-BGI37WRC.js +7 -0
  161. package/dist/translator-Cd1ECBM1.cjs +7 -0
  162. package/dist/{translator-B1uTusjx.cjs → translator-ClzybVmi.cjs} +2 -2
  163. package/dist/{translator-B1uTusjx.cjs.map → translator-ClzybVmi.cjs.map} +1 -1
  164. package/dist/{translator-CrDE1UJW.js → translator-jFVzLjEs.js} +2 -2
  165. package/dist/{translator-CrDE1UJW.js.map → translator-jFVzLjEs.js.map} +1 -1
  166. package/package.json +1 -1
  167. package/dist/anki-connect-D-02BbHi.cjs +0 -6
  168. package/dist/anki-connect-Vn-cnxs8.js +0 -6
  169. package/dist/batch-processor-DItpL6Pp.js +0 -3
  170. package/dist/batch-processor-fiLvFS2_.cjs +0 -3
  171. package/dist/dictionary-importer-B9M3SD2y.js +0 -8
  172. package/dist/dictionary-importer-DnR8Bsai.cjs +0 -8
  173. package/dist/dictionary-update-checker-Cnjz4tQD.js +0 -4
  174. package/dist/display-generator-BhV_MOD1.cjs.map +0 -1
  175. package/dist/display-generator-Cn4vCiSI.js +0 -10
  176. package/dist/display-generator-G2e03o0R.cjs +0 -10
  177. package/dist/display-generator-vjbG05fn.js.map +0 -1
  178. package/dist/frequency-ranking-B-kvnxro.js +0 -3
  179. package/dist/furigana-cpPhFnBv.cjs +0 -5
  180. package/dist/furigana-kZjqnnFC.js +0 -5
  181. package/dist/japanese-DdsS8rT1.d.ts +0 -41
  182. package/dist/japanese-DdsS8rT1.d.ts.map +0 -1
  183. package/dist/japanese-DgmP3i76.d.cts +0 -41
  184. package/dist/japanese-DgmP3i76.d.cts.map +0 -1
  185. package/dist/media-loader-BBTESZXn.cjs +0 -3
  186. package/dist/media-loader-CNKoAjQs.js +0 -3
  187. package/dist/multi-language-transformer-B2133Zg_.cjs.map +0 -1
  188. package/dist/multi-language-transformer-BkwMTV2g.js +0 -2893
  189. package/dist/multi-language-transformer-BkwMTV2g.js.map +0 -1
  190. package/dist/sentence-parser-B-gM8mKk.js +0 -5
  191. package/dist/sentence-parser-Cp3cm_QU.cjs +0 -5
  192. package/dist/sentence-parser-DUQJ3cTT.cjs.map +0 -1
  193. package/dist/sentence-parser-sx7y6Oyh.js.map +0 -1
  194. package/dist/structured-content-generator-Dww8IT7Y.js +0 -4
  195. package/dist/translator-BiTHo9Nm.js +0 -7
  196. package/dist/translator-CYvGmODX.d.ts.map +0 -1
  197. package/dist/translator-TiTDVbmS.d.cts.map +0 -1
  198. package/dist/translator-Y7Haj_qJ.cjs +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"anki.d.ts","names":[],"sources":["../src/anki/anki-connect.ts","../src/anki/anki-note-builder.ts","../src/anki/anki-note-data-creator.ts","../src/anki/anki-template-renderer.ts"],"sourcesContent":null,"mappings":"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"}
1
+ {"version":3,"file":"anki.d.ts","names":[],"sources":["../src/anki/anki-connect.ts","../src/anki/anki-note-builder.ts","../src/anki/anki-note-data-creator.ts","../src/anki/anki-template-renderer.ts"],"sourcesContent":null,"mappings":"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"}
package/dist/anki.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { deferPromise } from "./utilities-bi3EF-q5.js";
2
2
  import "./cjk-util-DubXBGDG.js";
3
- import { distributeFurigana } from "./japanese-DhmmW35J.js";
4
- import { YomitanError } from "./errors-D2JfYV-C.js";
5
- import { getDisambiguations, getGroupedPronunciations, getPronunciationsOfType, getTermFrequency, groupTermTags, isNonNounVerbOrAdjective } from "./dictionary-data-util-CKDT7n2t.js";
6
- import "./json-DTq_IXXF.js";
7
- import "./furigana-CI6LUA-6.js";
8
- import { AnkiConnect, cloneFieldMarkerPattern, getRootDeckName } from "./anki-connect-697E04LF.js";
3
+ import { distributeFurigana } from "./japanese-OKEGf_i4.js";
4
+ import { YomitanError } from "./errors-DvKlMRXC.js";
5
+ import { getDisambiguations, getGroupedPronunciations, getPronunciationsOfType, getTermFrequency, groupTermTags, isNonNounVerbOrAdjective } from "./dictionary-data-util-gUUD9ElK.js";
6
+ import "./json-rIgOFqVY.js";
7
+ import "./furigana-h18vaQ7a.js";
8
+ import { AnkiConnect, cloneFieldMarkerPattern, getRootDeckName } from "./anki-connect-Dau8nAXZ.js";
9
9
 
10
10
  //#region src/anki/anki-note-builder.ts
11
11
  /**
@@ -45,4 +45,4 @@ type CustomAudioList = {
45
45
 
46
46
  //# sourceMappingURL=audio.d.ts.map
47
47
  export { AudioInfo, AudioSourceInfo, AudioSourceType, AudioTtsInfo, AudioUrlInfo, CustomAudioList, WikimediaCommonsFileResponse, WikimediaCommonsLookupResponse };
48
- //# sourceMappingURL=audio-ZuaDkaUZ.d.ts.map
48
+ //# sourceMappingURL=audio-DN-FhZ5k.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-ZuaDkaUZ.d.ts","names":[],"sources":["../src/types/audio.ts"],"sourcesContent":null,"mappings":";KAAY,eAAA;AAAA,KAWA,eAAA,GAXe;EAWf,IAAA,EACF,eADiB;EAMf,GAAA,EAAA,MAAA;EAMA,KAAA,EAAA,MAAA;AAMZ,CAAA;AAAqB,KAZT,YAAA,GAYS;EAAA,IAAG,EAAA,KAAA;EAAY,GAAG,EAAA,MAAA;EAAY,IAAA,CAAA,EAAA,MAAA;AAEnD,CAAA;AAMY,KAdA,YAAA,GAcA;EAUA,IAAA,EAAA,KAAA;;;;KAlBA,SAAA,GAAY,eAAe;KAE3B,8BAAA;;;;;;;KAMA,4BAAA;;;;;;;;;;;;KAUA,eAAA"}
1
+ {"version":3,"file":"audio-DN-FhZ5k.d.ts","names":[],"sources":["../src/types/audio.ts"],"sourcesContent":null,"mappings":";KAAY,eAAA;AAAA,KAWA,eAAA,GAXe;EAWf,IAAA,EACF,eADiB;EAMf,GAAA,EAAA,MAAA;EAMA,KAAA,EAAA,MAAA;AAMZ,CAAA;AAAqB,KAZT,YAAA,GAYS;EAAA,IAAG,EAAA,KAAA;EAAY,GAAG,EAAA,MAAA;EAAY,IAAA,CAAA,EAAA,MAAA;AAEnD,CAAA;AAMY,KAdA,YAAA,GAcA;EAUA,IAAA,EAAA,KAAA;;;;KAlBA,SAAA,GAAY,eAAe;KAE3B,8BAAA;;;;;;;KAMA,4BAAA;;;;;;;;;;;;KAUA,eAAA"}
@@ -1,4 +1,4 @@
1
- import "./json-DTq_IXXF.js";
2
- import { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources } from "./audio-url-generator-DykdzZJu.js";
1
+ import "./json-rIgOFqVY.js";
2
+ import { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources } from "./audio-url-generator-_6Qk0i3T.js";
3
3
 
4
4
  export { AudioUrlGenerator };
@@ -1,4 +1,4 @@
1
- require('./json-CyQBn52D.cjs');
2
- const require_audio_url_generator = require('./audio-url-generator-C23AXVj1.cjs');
1
+ require('./json-Cdj6aIOQ.cjs');
2
+ const require_audio_url_generator = require('./audio-url-generator-CorFRyBU.cjs');
3
3
 
4
4
  exports.AudioUrlGenerator = require_audio_url_generator.AudioUrlGenerator
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const require_json = require('./json-CyQBn52D.cjs');
2
+ const require_json = require('./json-Cdj6aIOQ.cjs');
3
3
 
4
4
  //#region src/audio/audio-url-generator.ts
5
5
  /**
@@ -411,4 +411,4 @@ Object.defineProperty(exports, 'getRequiredAudioSources', {
411
411
  return getRequiredAudioSources;
412
412
  }
413
413
  });
414
- //# sourceMappingURL=audio-url-generator-C23AXVj1.cjs.map
414
+ //# sourceMappingURL=audio-url-generator-CorFRyBU.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-url-generator-C23AXVj1.cjs","names":["content: string","id: string","className: string","root?: Element","tagName: string","element: Element","attribute: string","DEFAULT_REQUEST_INIT_PARAMS: RequestInit","options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }","source: AudioSourceInfo","term: string","reading: string","languageSummary: LanguageSummary","sources: AudioSourceInfo[]","results: AudioInfo[]","url: string","base: string","_details: AudioSourceInfo","language: string","dom: SimpleDOMParser","row: Element","_reading: string","filename: string","fileUser: string","fetchUrl: string","validateFilename: (filename: string, fileUser: string) => boolean","displayName: (filename: string, fileUser: string) => string","results: AudioUrlInfo[]","details: AudioSourceInfo","_term: string","info: AudioUrlInfo","data: Record<string, string>","m0: string","m1: string","data: unknown","str: string"],"sources":["../src/audio/audio-url-generator.ts"],"sourcesContent":["import type {\n AudioInfo,\n AudioSourceInfo,\n AudioSourceType,\n AudioUrlInfo,\n CustomAudioList,\n WikimediaCommonsFileResponse,\n WikimediaCommonsLookupResponse,\n} from '../types/audio';\nimport type { LanguageSummary } from '../types/language';\nimport { readResponseJson } from '../util/json';\n\n/**\n * Interface for parsing HTML content. Consumers can inject\n * a DOM parser implementation (e.g. linkedom, jsdom, or the browser's native DOMParser).\n */\nexport interface SimpleDOMParser {\n getElementById(id: string): Element | null;\n getElementsByClassName(className: string, root?: Element): Element[];\n getElementByTagName(tagName: string, root?: Element): Element | null;\n getAttribute(element: Element, attribute: string): string | null;\n getTextContent(element: Element): string;\n}\n\n/**\n * A default DOM parser implementation that uses the standard DOMParser API\n * (available in browsers and some Node.js DOM libraries like linkedom/jsdom).\n */\nexport class NativeSimpleDOMParser implements SimpleDOMParser {\n private _document: Document;\n\n constructor(content: string) {\n const parser = new DOMParser();\n this._document = parser.parseFromString(content, 'text/html');\n }\n\n getElementById(id: string): Element | null {\n return this._document.getElementById(id);\n }\n\n getElementsByClassName(className: string, root?: Element): Element[] {\n const parent = root ?? this._document;\n return [...parent.getElementsByClassName(className)];\n }\n\n getElementByTagName(tagName: string, root?: Element): Element | null {\n const parent = root ?? this._document;\n const elements = parent.getElementsByTagName(tagName);\n return elements.length > 0 ? elements[0] : null;\n }\n\n getAttribute(element: Element, attribute: string): string | null {\n return element.getAttribute(attribute);\n }\n\n getTextContent(element: Element): string {\n return element.textContent ?? '';\n }\n}\n\nconst DEFAULT_REQUEST_INIT_PARAMS: RequestInit = {\n method: 'GET',\n mode: 'cors',\n cache: 'default',\n credentials: 'omit',\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n};\n\ntype GetInfoHandler = (\n term: string,\n reading: string,\n source: AudioSourceInfo,\n languageSummary: LanguageSummary,\n) => Promise<AudioInfo[]>;\n\n/**\n * Generates audio URLs for dictionary terms from various audio sources.\n * Ported from Yomitan's AudioDownloader, but only extracts URL generation logic (not download).\n */\nexport class AudioUrlGenerator {\n private _getInfoHandlers: Map<AudioSourceType, GetInfoHandler>;\n private _regionNames: Intl.DisplayNames;\n private _domParserFactory: ((content: string) => SimpleDOMParser) | null;\n private _customAudioListSchema: object | null;\n\n constructor(options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }) {\n this._domParserFactory = options?.domParserFactory ?? null;\n this._customAudioListSchema = null;\n this._regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\n\n this._getInfoHandlers = new Map<AudioSourceType, GetInfoHandler>([\n ['jpod101', this._getInfoJpod101.bind(this)],\n ['language-pod-101', this._getInfoLanguagePod101.bind(this)],\n ['jisho', this._getInfoJisho.bind(this)],\n ['lingua-libre', this._getInfoLinguaLibre.bind(this)],\n ['wiktionary', this._getInfoWiktionary.bind(this)],\n ['text-to-speech', this._getInfoTextToSpeech.bind(this)],\n ['text-to-speech-reading', this._getInfoTextToSpeechReading.bind(this)],\n ['custom', this._getInfoCustom.bind(this)],\n ['custom-json', this._getInfoCustomJson.bind(this)],\n ]);\n }\n\n /**\n * Gets audio URL info for a single source.\n */\n async getTermAudioInfoList(\n source: AudioSourceInfo,\n term: string,\n reading: string,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const handler = this._getInfoHandlers.get(source.type);\n if (typeof handler === 'function') {\n try {\n return await handler(term, reading, source, languageSummary);\n } catch (_e) {\n // NOP\n }\n }\n return [];\n }\n\n /**\n * Gets audio URLs for a term from multiple sources.\n */\n async getUrls(\n term: string,\n reading: string,\n sources: AudioSourceInfo[],\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const results: AudioInfo[] = [];\n for (const source of sources) {\n const infoList = await this.getTermAudioInfoList(source, term, reading, languageSummary);\n results.push(...infoList);\n }\n return results;\n }\n\n // Private\n\n private _normalizeUrl(url: string, base: string): string {\n return new URL(url, base).href;\n }\n\n private _createSimpleDOMParser(content: string): SimpleDOMParser {\n if (this._domParserFactory !== null) {\n return this._domParserFactory(content);\n }\n // Try native DOMParser\n if (typeof DOMParser !== 'undefined') {\n return new NativeSimpleDOMParser(content);\n }\n throw new Error('DOM parsing not supported. Provide a domParserFactory in the constructor.');\n }\n\n private async _getInfoJpod101(term: string, reading: string): Promise<AudioInfo[]> {\n if (reading === term && this._isStringEntirelyKana(term)) {\n reading = term;\n term = '';\n }\n\n const params = new URLSearchParams();\n if (term.length > 0) {\n params.set('kanji', term);\n }\n if (reading.length > 0) {\n params.set('kana', reading);\n }\n\n const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.toString()}`;\n return [{ type: 'url', url }];\n }\n\n private async _getInfoLanguagePod101(\n term: string,\n reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const { name: language } = languageSummary;\n\n const fetchUrl = this._getLanguagePod101FetchUrl(language);\n const data = new URLSearchParams({\n post: 'dictionary_reference',\n match_type: 'exact',\n search_query: term,\n vulgar: 'true',\n });\n const response = await fetch(fetchUrl, {\n ...DEFAULT_REQUEST_INIT_PARAMS,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n });\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n const urls = new Set<string>();\n for (const row of dom.getElementsByClassName('dc-result-row')) {\n try {\n const audio = dom.getElementByTagName('audio', row);\n if (audio === null) {\n continue;\n }\n\n const source = dom.getElementByTagName('source', audio);\n if (source === null) {\n continue;\n }\n\n let url = dom.getAttribute(source, 'src');\n if (url === null) {\n continue;\n }\n\n if (!this._validateLanguagePod101Row(language, dom, row, term, reading)) {\n continue;\n }\n url = this._normalizeUrl(url, response.url);\n urls.add(url);\n } catch (_e) {\n // NOP\n }\n }\n return [...urls].map((url): AudioUrlInfo => ({ type: 'url', url }));\n }\n\n private _validateLanguagePod101Row(\n language: string,\n dom: SimpleDOMParser,\n row: Element,\n term: string,\n reading: string,\n ): boolean {\n switch (language) {\n case 'Japanese':\n {\n const htmlReadings = dom.getElementsByClassName('dc-vocab_kana', row);\n if (htmlReadings.length === 0) {\n return false;\n }\n\n const htmlReading = dom.getTextContent(htmlReadings[0]);\n if (!htmlReading) {\n return false;\n }\n if (reading !== term && reading !== htmlReading) {\n return false;\n }\n }\n break;\n default: {\n const vocab = dom.getElementsByClassName('dc-vocab', row);\n if (vocab.length === 0) {\n return false;\n }\n\n if (term !== dom.getTextContent(vocab[0])) {\n return false;\n }\n }\n }\n return true;\n }\n\n private _getLanguagePod101FetchUrl(language: string): string {\n const podOrClass = this._getLanguagePod101PodOrClass(language);\n const lowerCaseLanguage = language.toLowerCase();\n return `https://www.${lowerCaseLanguage}${podOrClass}101.com/learningcenter/reference/dictionary_post`;\n }\n\n private _getLanguagePod101PodOrClass(language: string): 'pod' | 'class' {\n switch (language) {\n case 'Afrikaans':\n case 'Arabic':\n case 'Bulgarian':\n case 'Dutch':\n case 'Filipino':\n case 'Finnish':\n case 'French':\n case 'German':\n case 'Greek':\n case 'Hebrew':\n case 'Hindi':\n case 'Hungarian':\n case 'Indonesian':\n case 'Italian':\n case 'Japanese':\n case 'Persian':\n case 'Polish':\n case 'Portuguese':\n case 'Romanian':\n case 'Russian':\n case 'Spanish':\n case 'Swahili':\n case 'Swedish':\n case 'Thai':\n case 'Urdu':\n case 'Vietnamese':\n return 'pod';\n case 'Cantonese':\n case 'Chinese':\n case 'Czech':\n case 'Danish':\n case 'English':\n case 'Korean':\n case 'Norwegian':\n case 'Turkish':\n return 'class';\n default:\n throw new Error('Invalid language for LanguagePod101');\n }\n }\n\n private async _getInfoJisho(term: string, reading: string): Promise<AudioInfo[]> {\n const fetchUrl = `https://jisho.org/search/${term}`;\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n try {\n const audio = dom.getElementById(`audio_${term}:${reading}`);\n if (audio !== null) {\n const source = dom.getElementByTagName('source', audio);\n if (source !== null) {\n let url = dom.getAttribute(source, 'src');\n if (url !== null) {\n url = this._normalizeUrl(url, response.url);\n return [{ type: 'url', url }];\n }\n }\n }\n } catch (_e) {\n // NOP\n }\n\n throw new Error('Failed to find audio URL');\n }\n\n private async _getInfoLinguaLibre(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso639_3 } = languageSummary;\n const searchCategory = `incategory:\"Lingua_Libre_pronunciation-${iso639_3}\"`;\n const searchString = `-${term}.wav`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i+${searchCategory}&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string, fileUser: string): boolean => {\n const validFilenameTest = new RegExp(`^File:LL-Q\\\\d+\\\\s+\\\\(${iso639_3}\\\\)-${fileUser}-${term}\\\\.wav$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename);\n }\n\n private async _getInfoWiktionary(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso } = languageSummary;\n const searchString = `${iso}(-[a-zA-Z]{2})?-${term}[0123456789]*.ogg`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string): boolean => {\n const validFilenameTest = new RegExp(`^File:${iso}(-\\\\w\\\\w)?-${term}\\\\d*\\\\.ogg$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n const displayName = (filename: string, fileUser: string): string => {\n const match = filename.match(new RegExp(`^File:${iso}(-\\\\w\\\\w)-${term}`, 'i'));\n if (match === null) {\n return fileUser;\n }\n const region = match[1].substring(1).toUpperCase();\n const regionName = this._regionNames.of(region);\n return `(${regionName}) ${fileUser}`;\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename, displayName);\n }\n\n private async _getInfoWikimediaCommons(\n fetchUrl: string,\n validateFilename: (filename: string, fileUser: string) => boolean,\n displayName: (filename: string, fileUser: string) => string = (_filename, fileUser) => fileUser,\n ): Promise<AudioUrlInfo[]> {\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n\n const lookupResponse = await readResponseJson<WikimediaCommonsLookupResponse>(response);\n const lookupResults = lookupResponse.query.search;\n\n const fetchFileInfos = lookupResults.map(async ({ title }) => {\n const fileInfoURL = `https://commons.wikimedia.org/w/api.php?action=query&format=json&titles=${title}&prop=imageinfo&iiprop=user|url&origin=*`;\n const response2 = await fetch(fileInfoURL, DEFAULT_REQUEST_INIT_PARAMS);\n const fileResponse = await readResponseJson<WikimediaCommonsFileResponse>(response2);\n const fileResults = fileResponse.query.pages;\n const results: AudioUrlInfo[] = [];\n for (const page of Object.values(fileResults)) {\n const fileUrl = page.imageinfo[0].url;\n const fileUser = page.imageinfo[0].user;\n if (validateFilename(title, fileUser)) {\n results.push({ type: 'url', url: fileUrl, name: displayName(title, fileUser) });\n }\n }\n return results;\n });\n\n return (await Promise.all(fetchFileInfos)).flat();\n }\n\n private async _getInfoTextToSpeech(term: string, _reading: string, details: AudioSourceInfo): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: term, voice }];\n }\n\n private async _getInfoTextToSpeechReading(\n _term: string,\n reading: string,\n details: AudioSourceInfo,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: reading, voice }];\n }\n\n private async _getInfoCustom(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n return [{ type: 'url', url }];\n }\n\n private async _getInfoCustomJson(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n\n const response = await fetch(url, DEFAULT_REQUEST_INIT_PARAMS);\n\n if (!response.ok) {\n throw new Error(`Invalid response: ${response.status}`);\n }\n\n const responseJson = await readResponseJson<CustomAudioList>(response);\n\n this._validateCustomAudioList(responseJson);\n\n const results: AudioInfo[] = [];\n for (const { url: url2, name } of responseJson.audioSources) {\n const info: AudioUrlInfo = { type: 'url', url: url2 };\n if (typeof name === 'string') {\n info.name = name;\n }\n results.push(info);\n }\n return results;\n }\n\n private _getCustomUrl(term: string, reading: string, url: string, languageSummary: LanguageSummary): string {\n if (typeof url !== 'string') {\n throw new Error('No custom URL defined');\n }\n const data: Record<string, string> = {\n term,\n reading,\n language: languageSummary.iso,\n };\n const replacer = (m0: string, m1: string): string =>\n Object.prototype.hasOwnProperty.call(data, m1) ? `${data[m1]}` : m0;\n return url.replace(/\\{([^}]*)\\}/g, replacer);\n }\n\n private _validateCustomAudioList(data: unknown): void {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid custom audio list response');\n }\n const obj = data as Record<string, unknown>;\n if (obj.type !== 'audioSourceList') {\n throw new Error('Invalid custom audio list type');\n }\n if (!Array.isArray(obj.audioSources)) {\n throw new Error('Invalid custom audio list audioSources');\n }\n }\n\n /**\n * Simple check for whether a string is entirely kana (hiragana/katakana).\n */\n private _isStringEntirelyKana(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const char of str) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n // Hiragana: U+3040-U+309F, Katakana: U+30A0-U+30FF\n if (!((code >= 0x3040 && code <= 0x309f) || (code >= 0x30a0 && code <= 0x30ff))) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * Returns the set of required audio source types for a given language ISO code.\n */\nexport function getRequiredAudioSourceList(language: string): Set<AudioSourceType> {\n return language === 'ja'\n ? new Set<AudioSourceType>(['jpod101', 'language-pod-101', 'jisho'])\n : new Set<AudioSourceType>(['lingua-libre', 'language-pod-101', 'wiktionary']);\n}\n\n/**\n * Returns required audio sources that are not already present in the given sources list.\n */\nexport function getRequiredAudioSources(language: string, sources: AudioSourceInfo[]): AudioSourceInfo[] {\n const requiredSources = getRequiredAudioSourceList(language);\n\n for (const { type } of sources) {\n requiredSources.delete(type);\n }\n\n return [...requiredSources].map((type): AudioSourceInfo => ({ type, url: '', voice: '' }));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"audio-url-generator-CorFRyBU.cjs","names":["content: string","id: string","className: string","root?: Element","tagName: string","element: Element","attribute: string","DEFAULT_REQUEST_INIT_PARAMS: RequestInit","options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }","source: AudioSourceInfo","term: string","reading: string","languageSummary: LanguageSummary","sources: AudioSourceInfo[]","results: AudioInfo[]","url: string","base: string","_details: AudioSourceInfo","language: string","dom: SimpleDOMParser","row: Element","_reading: string","filename: string","fileUser: string","fetchUrl: string","validateFilename: (filename: string, fileUser: string) => boolean","displayName: (filename: string, fileUser: string) => string","results: AudioUrlInfo[]","details: AudioSourceInfo","_term: string","info: AudioUrlInfo","data: Record<string, string>","m0: string","m1: string","data: unknown","str: string"],"sources":["../src/audio/audio-url-generator.ts"],"sourcesContent":["import type {\n AudioInfo,\n AudioSourceInfo,\n AudioSourceType,\n AudioUrlInfo,\n CustomAudioList,\n WikimediaCommonsFileResponse,\n WikimediaCommonsLookupResponse,\n} from '../types/audio';\nimport type { LanguageSummary } from '../types/language';\nimport { readResponseJson } from '../util/json';\n\n/**\n * Interface for parsing HTML content. Consumers can inject\n * a DOM parser implementation (e.g. linkedom, jsdom, or the browser's native DOMParser).\n */\nexport interface SimpleDOMParser {\n getElementById(id: string): Element | null;\n getElementsByClassName(className: string, root?: Element): Element[];\n getElementByTagName(tagName: string, root?: Element): Element | null;\n getAttribute(element: Element, attribute: string): string | null;\n getTextContent(element: Element): string;\n}\n\n/**\n * A default DOM parser implementation that uses the standard DOMParser API\n * (available in browsers and some Node.js DOM libraries like linkedom/jsdom).\n */\nexport class NativeSimpleDOMParser implements SimpleDOMParser {\n private _document: Document;\n\n constructor(content: string) {\n const parser = new DOMParser();\n this._document = parser.parseFromString(content, 'text/html');\n }\n\n getElementById(id: string): Element | null {\n return this._document.getElementById(id);\n }\n\n getElementsByClassName(className: string, root?: Element): Element[] {\n const parent = root ?? this._document;\n return [...parent.getElementsByClassName(className)];\n }\n\n getElementByTagName(tagName: string, root?: Element): Element | null {\n const parent = root ?? this._document;\n const elements = parent.getElementsByTagName(tagName);\n return elements.length > 0 ? elements[0] : null;\n }\n\n getAttribute(element: Element, attribute: string): string | null {\n return element.getAttribute(attribute);\n }\n\n getTextContent(element: Element): string {\n return element.textContent ?? '';\n }\n}\n\nconst DEFAULT_REQUEST_INIT_PARAMS: RequestInit = {\n method: 'GET',\n mode: 'cors',\n cache: 'default',\n credentials: 'omit',\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n};\n\ntype GetInfoHandler = (\n term: string,\n reading: string,\n source: AudioSourceInfo,\n languageSummary: LanguageSummary,\n) => Promise<AudioInfo[]>;\n\n/**\n * Generates audio URLs for dictionary terms from various audio sources.\n * Ported from Yomitan's AudioDownloader, but only extracts URL generation logic (not download).\n */\nexport class AudioUrlGenerator {\n private _getInfoHandlers: Map<AudioSourceType, GetInfoHandler>;\n private _regionNames: Intl.DisplayNames;\n private _domParserFactory: ((content: string) => SimpleDOMParser) | null;\n private _customAudioListSchema: object | null;\n\n constructor(options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }) {\n this._domParserFactory = options?.domParserFactory ?? null;\n this._customAudioListSchema = null;\n this._regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\n\n this._getInfoHandlers = new Map<AudioSourceType, GetInfoHandler>([\n ['jpod101', this._getInfoJpod101.bind(this)],\n ['language-pod-101', this._getInfoLanguagePod101.bind(this)],\n ['jisho', this._getInfoJisho.bind(this)],\n ['lingua-libre', this._getInfoLinguaLibre.bind(this)],\n ['wiktionary', this._getInfoWiktionary.bind(this)],\n ['text-to-speech', this._getInfoTextToSpeech.bind(this)],\n ['text-to-speech-reading', this._getInfoTextToSpeechReading.bind(this)],\n ['custom', this._getInfoCustom.bind(this)],\n ['custom-json', this._getInfoCustomJson.bind(this)],\n ]);\n }\n\n /**\n * Gets audio URL info for a single source.\n */\n async getTermAudioInfoList(\n source: AudioSourceInfo,\n term: string,\n reading: string,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const handler = this._getInfoHandlers.get(source.type);\n if (typeof handler === 'function') {\n try {\n return await handler(term, reading, source, languageSummary);\n } catch (_e) {\n // NOP\n }\n }\n return [];\n }\n\n /**\n * Gets audio URLs for a term from multiple sources.\n */\n async getUrls(\n term: string,\n reading: string,\n sources: AudioSourceInfo[],\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const results: AudioInfo[] = [];\n for (const source of sources) {\n const infoList = await this.getTermAudioInfoList(source, term, reading, languageSummary);\n results.push(...infoList);\n }\n return results;\n }\n\n // Private\n\n private _normalizeUrl(url: string, base: string): string {\n return new URL(url, base).href;\n }\n\n private _createSimpleDOMParser(content: string): SimpleDOMParser {\n if (this._domParserFactory !== null) {\n return this._domParserFactory(content);\n }\n // Try native DOMParser\n if (typeof DOMParser !== 'undefined') {\n return new NativeSimpleDOMParser(content);\n }\n throw new Error('DOM parsing not supported. Provide a domParserFactory in the constructor.');\n }\n\n private async _getInfoJpod101(term: string, reading: string): Promise<AudioInfo[]> {\n if (reading === term && this._isStringEntirelyKana(term)) {\n reading = term;\n term = '';\n }\n\n const params = new URLSearchParams();\n if (term.length > 0) {\n params.set('kanji', term);\n }\n if (reading.length > 0) {\n params.set('kana', reading);\n }\n\n const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.toString()}`;\n return [{ type: 'url', url }];\n }\n\n private async _getInfoLanguagePod101(\n term: string,\n reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const { name: language } = languageSummary;\n\n const fetchUrl = this._getLanguagePod101FetchUrl(language);\n const data = new URLSearchParams({\n post: 'dictionary_reference',\n match_type: 'exact',\n search_query: term,\n vulgar: 'true',\n });\n const response = await fetch(fetchUrl, {\n ...DEFAULT_REQUEST_INIT_PARAMS,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n });\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n const urls = new Set<string>();\n for (const row of dom.getElementsByClassName('dc-result-row')) {\n try {\n const audio = dom.getElementByTagName('audio', row);\n if (audio === null) {\n continue;\n }\n\n const source = dom.getElementByTagName('source', audio);\n if (source === null) {\n continue;\n }\n\n let url = dom.getAttribute(source, 'src');\n if (url === null) {\n continue;\n }\n\n if (!this._validateLanguagePod101Row(language, dom, row, term, reading)) {\n continue;\n }\n url = this._normalizeUrl(url, response.url);\n urls.add(url);\n } catch (_e) {\n // NOP\n }\n }\n return [...urls].map((url): AudioUrlInfo => ({ type: 'url', url }));\n }\n\n private _validateLanguagePod101Row(\n language: string,\n dom: SimpleDOMParser,\n row: Element,\n term: string,\n reading: string,\n ): boolean {\n switch (language) {\n case 'Japanese':\n {\n const htmlReadings = dom.getElementsByClassName('dc-vocab_kana', row);\n if (htmlReadings.length === 0) {\n return false;\n }\n\n const htmlReading = dom.getTextContent(htmlReadings[0]);\n if (!htmlReading) {\n return false;\n }\n if (reading !== term && reading !== htmlReading) {\n return false;\n }\n }\n break;\n default: {\n const vocab = dom.getElementsByClassName('dc-vocab', row);\n if (vocab.length === 0) {\n return false;\n }\n\n if (term !== dom.getTextContent(vocab[0])) {\n return false;\n }\n }\n }\n return true;\n }\n\n private _getLanguagePod101FetchUrl(language: string): string {\n const podOrClass = this._getLanguagePod101PodOrClass(language);\n const lowerCaseLanguage = language.toLowerCase();\n return `https://www.${lowerCaseLanguage}${podOrClass}101.com/learningcenter/reference/dictionary_post`;\n }\n\n private _getLanguagePod101PodOrClass(language: string): 'pod' | 'class' {\n switch (language) {\n case 'Afrikaans':\n case 'Arabic':\n case 'Bulgarian':\n case 'Dutch':\n case 'Filipino':\n case 'Finnish':\n case 'French':\n case 'German':\n case 'Greek':\n case 'Hebrew':\n case 'Hindi':\n case 'Hungarian':\n case 'Indonesian':\n case 'Italian':\n case 'Japanese':\n case 'Persian':\n case 'Polish':\n case 'Portuguese':\n case 'Romanian':\n case 'Russian':\n case 'Spanish':\n case 'Swahili':\n case 'Swedish':\n case 'Thai':\n case 'Urdu':\n case 'Vietnamese':\n return 'pod';\n case 'Cantonese':\n case 'Chinese':\n case 'Czech':\n case 'Danish':\n case 'English':\n case 'Korean':\n case 'Norwegian':\n case 'Turkish':\n return 'class';\n default:\n throw new Error('Invalid language for LanguagePod101');\n }\n }\n\n private async _getInfoJisho(term: string, reading: string): Promise<AudioInfo[]> {\n const fetchUrl = `https://jisho.org/search/${term}`;\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n try {\n const audio = dom.getElementById(`audio_${term}:${reading}`);\n if (audio !== null) {\n const source = dom.getElementByTagName('source', audio);\n if (source !== null) {\n let url = dom.getAttribute(source, 'src');\n if (url !== null) {\n url = this._normalizeUrl(url, response.url);\n return [{ type: 'url', url }];\n }\n }\n }\n } catch (_e) {\n // NOP\n }\n\n throw new Error('Failed to find audio URL');\n }\n\n private async _getInfoLinguaLibre(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso639_3 } = languageSummary;\n const searchCategory = `incategory:\"Lingua_Libre_pronunciation-${iso639_3}\"`;\n const searchString = `-${term}.wav`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i+${searchCategory}&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string, fileUser: string): boolean => {\n const validFilenameTest = new RegExp(`^File:LL-Q\\\\d+\\\\s+\\\\(${iso639_3}\\\\)-${fileUser}-${term}\\\\.wav$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename);\n }\n\n private async _getInfoWiktionary(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso } = languageSummary;\n const searchString = `${iso}(-[a-zA-Z]{2})?-${term}[0123456789]*.ogg`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string): boolean => {\n const validFilenameTest = new RegExp(`^File:${iso}(-\\\\w\\\\w)?-${term}\\\\d*\\\\.ogg$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n const displayName = (filename: string, fileUser: string): string => {\n const match = filename.match(new RegExp(`^File:${iso}(-\\\\w\\\\w)-${term}`, 'i'));\n if (match === null) {\n return fileUser;\n }\n const region = match[1].substring(1).toUpperCase();\n const regionName = this._regionNames.of(region);\n return `(${regionName}) ${fileUser}`;\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename, displayName);\n }\n\n private async _getInfoWikimediaCommons(\n fetchUrl: string,\n validateFilename: (filename: string, fileUser: string) => boolean,\n displayName: (filename: string, fileUser: string) => string = (_filename, fileUser) => fileUser,\n ): Promise<AudioUrlInfo[]> {\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n\n const lookupResponse = await readResponseJson<WikimediaCommonsLookupResponse>(response);\n const lookupResults = lookupResponse.query.search;\n\n const fetchFileInfos = lookupResults.map(async ({ title }) => {\n const fileInfoURL = `https://commons.wikimedia.org/w/api.php?action=query&format=json&titles=${title}&prop=imageinfo&iiprop=user|url&origin=*`;\n const response2 = await fetch(fileInfoURL, DEFAULT_REQUEST_INIT_PARAMS);\n const fileResponse = await readResponseJson<WikimediaCommonsFileResponse>(response2);\n const fileResults = fileResponse.query.pages;\n const results: AudioUrlInfo[] = [];\n for (const page of Object.values(fileResults)) {\n const fileUrl = page.imageinfo[0].url;\n const fileUser = page.imageinfo[0].user;\n if (validateFilename(title, fileUser)) {\n results.push({ type: 'url', url: fileUrl, name: displayName(title, fileUser) });\n }\n }\n return results;\n });\n\n return (await Promise.all(fetchFileInfos)).flat();\n }\n\n private async _getInfoTextToSpeech(term: string, _reading: string, details: AudioSourceInfo): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: term, voice }];\n }\n\n private async _getInfoTextToSpeechReading(\n _term: string,\n reading: string,\n details: AudioSourceInfo,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: reading, voice }];\n }\n\n private async _getInfoCustom(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n return [{ type: 'url', url }];\n }\n\n private async _getInfoCustomJson(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n\n const response = await fetch(url, DEFAULT_REQUEST_INIT_PARAMS);\n\n if (!response.ok) {\n throw new Error(`Invalid response: ${response.status}`);\n }\n\n const responseJson = await readResponseJson<CustomAudioList>(response);\n\n this._validateCustomAudioList(responseJson);\n\n const results: AudioInfo[] = [];\n for (const { url: url2, name } of responseJson.audioSources) {\n const info: AudioUrlInfo = { type: 'url', url: url2 };\n if (typeof name === 'string') {\n info.name = name;\n }\n results.push(info);\n }\n return results;\n }\n\n private _getCustomUrl(term: string, reading: string, url: string, languageSummary: LanguageSummary): string {\n if (typeof url !== 'string') {\n throw new Error('No custom URL defined');\n }\n const data: Record<string, string> = {\n term,\n reading,\n language: languageSummary.iso,\n };\n const replacer = (m0: string, m1: string): string =>\n Object.prototype.hasOwnProperty.call(data, m1) ? `${data[m1]}` : m0;\n return url.replace(/\\{([^}]*)\\}/g, replacer);\n }\n\n private _validateCustomAudioList(data: unknown): void {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid custom audio list response');\n }\n const obj = data as Record<string, unknown>;\n if (obj.type !== 'audioSourceList') {\n throw new Error('Invalid custom audio list type');\n }\n if (!Array.isArray(obj.audioSources)) {\n throw new Error('Invalid custom audio list audioSources');\n }\n }\n\n /**\n * Simple check for whether a string is entirely kana (hiragana/katakana).\n */\n private _isStringEntirelyKana(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const char of str) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n // Hiragana: U+3040-U+309F, Katakana: U+30A0-U+30FF\n if (!((code >= 0x3040 && code <= 0x309f) || (code >= 0x30a0 && code <= 0x30ff))) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * Returns the set of required audio source types for a given language ISO code.\n */\nexport function getRequiredAudioSourceList(language: string): Set<AudioSourceType> {\n return language === 'ja'\n ? new Set<AudioSourceType>(['jpod101', 'language-pod-101', 'jisho'])\n : new Set<AudioSourceType>(['lingua-libre', 'language-pod-101', 'wiktionary']);\n}\n\n/**\n * Returns required audio sources that are not already present in the given sources list.\n */\nexport function getRequiredAudioSources(language: string, sources: AudioSourceInfo[]): AudioSourceInfo[] {\n const requiredSources = getRequiredAudioSourceList(language);\n\n for (const { type } of sources) {\n requiredSources.delete(type);\n }\n\n return [...requiredSources].map((type): AudioSourceInfo => ({ type, url: '', voice: '' }));\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { readResponseJson } from "./json-DTq_IXXF.js";
1
+ import { readResponseJson } from "./json-rIgOFqVY.js";
2
2
 
3
3
  //#region src/audio/audio-url-generator.ts
4
4
  /**
@@ -387,4 +387,4 @@ function getRequiredAudioSources(language, sources) {
387
387
 
388
388
  //#endregion
389
389
  export { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources };
390
- //# sourceMappingURL=audio-url-generator-DykdzZJu.js.map
390
+ //# sourceMappingURL=audio-url-generator-_6Qk0i3T.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audio-url-generator-DykdzZJu.js","names":["content: string","id: string","className: string","root?: Element","tagName: string","element: Element","attribute: string","DEFAULT_REQUEST_INIT_PARAMS: RequestInit","options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }","source: AudioSourceInfo","term: string","reading: string","languageSummary: LanguageSummary","sources: AudioSourceInfo[]","results: AudioInfo[]","url: string","base: string","_details: AudioSourceInfo","language: string","dom: SimpleDOMParser","row: Element","_reading: string","filename: string","fileUser: string","fetchUrl: string","validateFilename: (filename: string, fileUser: string) => boolean","displayName: (filename: string, fileUser: string) => string","results: AudioUrlInfo[]","details: AudioSourceInfo","_term: string","info: AudioUrlInfo","data: Record<string, string>","m0: string","m1: string","data: unknown","str: string"],"sources":["../src/audio/audio-url-generator.ts"],"sourcesContent":["import type {\n AudioInfo,\n AudioSourceInfo,\n AudioSourceType,\n AudioUrlInfo,\n CustomAudioList,\n WikimediaCommonsFileResponse,\n WikimediaCommonsLookupResponse,\n} from '../types/audio';\nimport type { LanguageSummary } from '../types/language';\nimport { readResponseJson } from '../util/json';\n\n/**\n * Interface for parsing HTML content. Consumers can inject\n * a DOM parser implementation (e.g. linkedom, jsdom, or the browser's native DOMParser).\n */\nexport interface SimpleDOMParser {\n getElementById(id: string): Element | null;\n getElementsByClassName(className: string, root?: Element): Element[];\n getElementByTagName(tagName: string, root?: Element): Element | null;\n getAttribute(element: Element, attribute: string): string | null;\n getTextContent(element: Element): string;\n}\n\n/**\n * A default DOM parser implementation that uses the standard DOMParser API\n * (available in browsers and some Node.js DOM libraries like linkedom/jsdom).\n */\nexport class NativeSimpleDOMParser implements SimpleDOMParser {\n private _document: Document;\n\n constructor(content: string) {\n const parser = new DOMParser();\n this._document = parser.parseFromString(content, 'text/html');\n }\n\n getElementById(id: string): Element | null {\n return this._document.getElementById(id);\n }\n\n getElementsByClassName(className: string, root?: Element): Element[] {\n const parent = root ?? this._document;\n return [...parent.getElementsByClassName(className)];\n }\n\n getElementByTagName(tagName: string, root?: Element): Element | null {\n const parent = root ?? this._document;\n const elements = parent.getElementsByTagName(tagName);\n return elements.length > 0 ? elements[0] : null;\n }\n\n getAttribute(element: Element, attribute: string): string | null {\n return element.getAttribute(attribute);\n }\n\n getTextContent(element: Element): string {\n return element.textContent ?? '';\n }\n}\n\nconst DEFAULT_REQUEST_INIT_PARAMS: RequestInit = {\n method: 'GET',\n mode: 'cors',\n cache: 'default',\n credentials: 'omit',\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n};\n\ntype GetInfoHandler = (\n term: string,\n reading: string,\n source: AudioSourceInfo,\n languageSummary: LanguageSummary,\n) => Promise<AudioInfo[]>;\n\n/**\n * Generates audio URLs for dictionary terms from various audio sources.\n * Ported from Yomitan's AudioDownloader, but only extracts URL generation logic (not download).\n */\nexport class AudioUrlGenerator {\n private _getInfoHandlers: Map<AudioSourceType, GetInfoHandler>;\n private _regionNames: Intl.DisplayNames;\n private _domParserFactory: ((content: string) => SimpleDOMParser) | null;\n private _customAudioListSchema: object | null;\n\n constructor(options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }) {\n this._domParserFactory = options?.domParserFactory ?? null;\n this._customAudioListSchema = null;\n this._regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\n\n this._getInfoHandlers = new Map<AudioSourceType, GetInfoHandler>([\n ['jpod101', this._getInfoJpod101.bind(this)],\n ['language-pod-101', this._getInfoLanguagePod101.bind(this)],\n ['jisho', this._getInfoJisho.bind(this)],\n ['lingua-libre', this._getInfoLinguaLibre.bind(this)],\n ['wiktionary', this._getInfoWiktionary.bind(this)],\n ['text-to-speech', this._getInfoTextToSpeech.bind(this)],\n ['text-to-speech-reading', this._getInfoTextToSpeechReading.bind(this)],\n ['custom', this._getInfoCustom.bind(this)],\n ['custom-json', this._getInfoCustomJson.bind(this)],\n ]);\n }\n\n /**\n * Gets audio URL info for a single source.\n */\n async getTermAudioInfoList(\n source: AudioSourceInfo,\n term: string,\n reading: string,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const handler = this._getInfoHandlers.get(source.type);\n if (typeof handler === 'function') {\n try {\n return await handler(term, reading, source, languageSummary);\n } catch (_e) {\n // NOP\n }\n }\n return [];\n }\n\n /**\n * Gets audio URLs for a term from multiple sources.\n */\n async getUrls(\n term: string,\n reading: string,\n sources: AudioSourceInfo[],\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const results: AudioInfo[] = [];\n for (const source of sources) {\n const infoList = await this.getTermAudioInfoList(source, term, reading, languageSummary);\n results.push(...infoList);\n }\n return results;\n }\n\n // Private\n\n private _normalizeUrl(url: string, base: string): string {\n return new URL(url, base).href;\n }\n\n private _createSimpleDOMParser(content: string): SimpleDOMParser {\n if (this._domParserFactory !== null) {\n return this._domParserFactory(content);\n }\n // Try native DOMParser\n if (typeof DOMParser !== 'undefined') {\n return new NativeSimpleDOMParser(content);\n }\n throw new Error('DOM parsing not supported. Provide a domParserFactory in the constructor.');\n }\n\n private async _getInfoJpod101(term: string, reading: string): Promise<AudioInfo[]> {\n if (reading === term && this._isStringEntirelyKana(term)) {\n reading = term;\n term = '';\n }\n\n const params = new URLSearchParams();\n if (term.length > 0) {\n params.set('kanji', term);\n }\n if (reading.length > 0) {\n params.set('kana', reading);\n }\n\n const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.toString()}`;\n return [{ type: 'url', url }];\n }\n\n private async _getInfoLanguagePod101(\n term: string,\n reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const { name: language } = languageSummary;\n\n const fetchUrl = this._getLanguagePod101FetchUrl(language);\n const data = new URLSearchParams({\n post: 'dictionary_reference',\n match_type: 'exact',\n search_query: term,\n vulgar: 'true',\n });\n const response = await fetch(fetchUrl, {\n ...DEFAULT_REQUEST_INIT_PARAMS,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n });\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n const urls = new Set<string>();\n for (const row of dom.getElementsByClassName('dc-result-row')) {\n try {\n const audio = dom.getElementByTagName('audio', row);\n if (audio === null) {\n continue;\n }\n\n const source = dom.getElementByTagName('source', audio);\n if (source === null) {\n continue;\n }\n\n let url = dom.getAttribute(source, 'src');\n if (url === null) {\n continue;\n }\n\n if (!this._validateLanguagePod101Row(language, dom, row, term, reading)) {\n continue;\n }\n url = this._normalizeUrl(url, response.url);\n urls.add(url);\n } catch (_e) {\n // NOP\n }\n }\n return [...urls].map((url): AudioUrlInfo => ({ type: 'url', url }));\n }\n\n private _validateLanguagePod101Row(\n language: string,\n dom: SimpleDOMParser,\n row: Element,\n term: string,\n reading: string,\n ): boolean {\n switch (language) {\n case 'Japanese':\n {\n const htmlReadings = dom.getElementsByClassName('dc-vocab_kana', row);\n if (htmlReadings.length === 0) {\n return false;\n }\n\n const htmlReading = dom.getTextContent(htmlReadings[0]);\n if (!htmlReading) {\n return false;\n }\n if (reading !== term && reading !== htmlReading) {\n return false;\n }\n }\n break;\n default: {\n const vocab = dom.getElementsByClassName('dc-vocab', row);\n if (vocab.length === 0) {\n return false;\n }\n\n if (term !== dom.getTextContent(vocab[0])) {\n return false;\n }\n }\n }\n return true;\n }\n\n private _getLanguagePod101FetchUrl(language: string): string {\n const podOrClass = this._getLanguagePod101PodOrClass(language);\n const lowerCaseLanguage = language.toLowerCase();\n return `https://www.${lowerCaseLanguage}${podOrClass}101.com/learningcenter/reference/dictionary_post`;\n }\n\n private _getLanguagePod101PodOrClass(language: string): 'pod' | 'class' {\n switch (language) {\n case 'Afrikaans':\n case 'Arabic':\n case 'Bulgarian':\n case 'Dutch':\n case 'Filipino':\n case 'Finnish':\n case 'French':\n case 'German':\n case 'Greek':\n case 'Hebrew':\n case 'Hindi':\n case 'Hungarian':\n case 'Indonesian':\n case 'Italian':\n case 'Japanese':\n case 'Persian':\n case 'Polish':\n case 'Portuguese':\n case 'Romanian':\n case 'Russian':\n case 'Spanish':\n case 'Swahili':\n case 'Swedish':\n case 'Thai':\n case 'Urdu':\n case 'Vietnamese':\n return 'pod';\n case 'Cantonese':\n case 'Chinese':\n case 'Czech':\n case 'Danish':\n case 'English':\n case 'Korean':\n case 'Norwegian':\n case 'Turkish':\n return 'class';\n default:\n throw new Error('Invalid language for LanguagePod101');\n }\n }\n\n private async _getInfoJisho(term: string, reading: string): Promise<AudioInfo[]> {\n const fetchUrl = `https://jisho.org/search/${term}`;\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n try {\n const audio = dom.getElementById(`audio_${term}:${reading}`);\n if (audio !== null) {\n const source = dom.getElementByTagName('source', audio);\n if (source !== null) {\n let url = dom.getAttribute(source, 'src');\n if (url !== null) {\n url = this._normalizeUrl(url, response.url);\n return [{ type: 'url', url }];\n }\n }\n }\n } catch (_e) {\n // NOP\n }\n\n throw new Error('Failed to find audio URL');\n }\n\n private async _getInfoLinguaLibre(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso639_3 } = languageSummary;\n const searchCategory = `incategory:\"Lingua_Libre_pronunciation-${iso639_3}\"`;\n const searchString = `-${term}.wav`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i+${searchCategory}&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string, fileUser: string): boolean => {\n const validFilenameTest = new RegExp(`^File:LL-Q\\\\d+\\\\s+\\\\(${iso639_3}\\\\)-${fileUser}-${term}\\\\.wav$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename);\n }\n\n private async _getInfoWiktionary(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso } = languageSummary;\n const searchString = `${iso}(-[a-zA-Z]{2})?-${term}[0123456789]*.ogg`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string): boolean => {\n const validFilenameTest = new RegExp(`^File:${iso}(-\\\\w\\\\w)?-${term}\\\\d*\\\\.ogg$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n const displayName = (filename: string, fileUser: string): string => {\n const match = filename.match(new RegExp(`^File:${iso}(-\\\\w\\\\w)-${term}`, 'i'));\n if (match === null) {\n return fileUser;\n }\n const region = match[1].substring(1).toUpperCase();\n const regionName = this._regionNames.of(region);\n return `(${regionName}) ${fileUser}`;\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename, displayName);\n }\n\n private async _getInfoWikimediaCommons(\n fetchUrl: string,\n validateFilename: (filename: string, fileUser: string) => boolean,\n displayName: (filename: string, fileUser: string) => string = (_filename, fileUser) => fileUser,\n ): Promise<AudioUrlInfo[]> {\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n\n const lookupResponse = await readResponseJson<WikimediaCommonsLookupResponse>(response);\n const lookupResults = lookupResponse.query.search;\n\n const fetchFileInfos = lookupResults.map(async ({ title }) => {\n const fileInfoURL = `https://commons.wikimedia.org/w/api.php?action=query&format=json&titles=${title}&prop=imageinfo&iiprop=user|url&origin=*`;\n const response2 = await fetch(fileInfoURL, DEFAULT_REQUEST_INIT_PARAMS);\n const fileResponse = await readResponseJson<WikimediaCommonsFileResponse>(response2);\n const fileResults = fileResponse.query.pages;\n const results: AudioUrlInfo[] = [];\n for (const page of Object.values(fileResults)) {\n const fileUrl = page.imageinfo[0].url;\n const fileUser = page.imageinfo[0].user;\n if (validateFilename(title, fileUser)) {\n results.push({ type: 'url', url: fileUrl, name: displayName(title, fileUser) });\n }\n }\n return results;\n });\n\n return (await Promise.all(fetchFileInfos)).flat();\n }\n\n private async _getInfoTextToSpeech(term: string, _reading: string, details: AudioSourceInfo): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: term, voice }];\n }\n\n private async _getInfoTextToSpeechReading(\n _term: string,\n reading: string,\n details: AudioSourceInfo,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: reading, voice }];\n }\n\n private async _getInfoCustom(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n return [{ type: 'url', url }];\n }\n\n private async _getInfoCustomJson(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n\n const response = await fetch(url, DEFAULT_REQUEST_INIT_PARAMS);\n\n if (!response.ok) {\n throw new Error(`Invalid response: ${response.status}`);\n }\n\n const responseJson = await readResponseJson<CustomAudioList>(response);\n\n this._validateCustomAudioList(responseJson);\n\n const results: AudioInfo[] = [];\n for (const { url: url2, name } of responseJson.audioSources) {\n const info: AudioUrlInfo = { type: 'url', url: url2 };\n if (typeof name === 'string') {\n info.name = name;\n }\n results.push(info);\n }\n return results;\n }\n\n private _getCustomUrl(term: string, reading: string, url: string, languageSummary: LanguageSummary): string {\n if (typeof url !== 'string') {\n throw new Error('No custom URL defined');\n }\n const data: Record<string, string> = {\n term,\n reading,\n language: languageSummary.iso,\n };\n const replacer = (m0: string, m1: string): string =>\n Object.prototype.hasOwnProperty.call(data, m1) ? `${data[m1]}` : m0;\n return url.replace(/\\{([^}]*)\\}/g, replacer);\n }\n\n private _validateCustomAudioList(data: unknown): void {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid custom audio list response');\n }\n const obj = data as Record<string, unknown>;\n if (obj.type !== 'audioSourceList') {\n throw new Error('Invalid custom audio list type');\n }\n if (!Array.isArray(obj.audioSources)) {\n throw new Error('Invalid custom audio list audioSources');\n }\n }\n\n /**\n * Simple check for whether a string is entirely kana (hiragana/katakana).\n */\n private _isStringEntirelyKana(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const char of str) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n // Hiragana: U+3040-U+309F, Katakana: U+30A0-U+30FF\n if (!((code >= 0x3040 && code <= 0x309f) || (code >= 0x30a0 && code <= 0x30ff))) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * Returns the set of required audio source types for a given language ISO code.\n */\nexport function getRequiredAudioSourceList(language: string): Set<AudioSourceType> {\n return language === 'ja'\n ? new Set<AudioSourceType>(['jpod101', 'language-pod-101', 'jisho'])\n : new Set<AudioSourceType>(['lingua-libre', 'language-pod-101', 'wiktionary']);\n}\n\n/**\n * Returns required audio sources that are not already present in the given sources list.\n */\nexport function getRequiredAudioSources(language: string, sources: AudioSourceInfo[]): AudioSourceInfo[] {\n const requiredSources = getRequiredAudioSourceList(language);\n\n for (const { type } of sources) {\n requiredSources.delete(type);\n }\n\n return [...requiredSources].map((type): AudioSourceInfo => ({ type, url: '', voice: '' }));\n}\n"],"mappings":";;;;;;;AA4BA,IAAa,wBAAb,MAA8D;CAC1D,AAAQ;CAER,YAAYA,SAAiB;EACzB,MAAM,SAAS,IAAI;AACnB,OAAK,YAAY,OAAO,gBAAgB,SAAS,YAAY;CAChE;CAED,eAAeC,IAA4B;AACvC,SAAO,KAAK,UAAU,eAAe,GAAG;CAC3C;CAED,uBAAuBC,WAAmBC,MAA2B;EACjE,MAAM,SAAS,QAAQ,KAAK;AAC5B,SAAO,CAAC,GAAG,OAAO,uBAAuB,UAAU,AAAC;CACvD;CAED,oBAAoBC,SAAiBD,MAAgC;EACjE,MAAM,SAAS,QAAQ,KAAK;EAC5B,MAAM,WAAW,OAAO,qBAAqB,QAAQ;AACrD,SAAO,SAAS,SAAS,IAAI,SAAS,KAAK;CAC9C;CAED,aAAaE,SAAkBC,WAAkC;AAC7D,SAAO,QAAQ,aAAa,UAAU;CACzC;CAED,eAAeD,SAA0B;AACrC,SAAO,QAAQ,eAAe;CACjC;AACJ;AAED,MAAME,8BAA2C;CAC7C,QAAQ;CACR,MAAM;CACN,OAAO;CACP,aAAa;CACb,UAAU;CACV,gBAAgB;AACnB;;;;;AAaD,IAAa,oBAAb,MAA+B;CAC3B,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAYC,SAET;AACC,OAAK,oBAAoB,SAAS,oBAAoB;AACtD,OAAK,yBAAyB;AAC9B,OAAK,eAAe,IAAI,KAAK,aAAa,CAAC,IAAK,GAAE,EAAE,MAAM,SAAU;AAEpE,OAAK,mBAAmB,IAAI,IAAqC;GAC7D,CAAC,WAAW,KAAK,gBAAgB,KAAK,KAAK,AAAC;GAC5C,CAAC,oBAAoB,KAAK,uBAAuB,KAAK,KAAK,AAAC;GAC5D,CAAC,SAAS,KAAK,cAAc,KAAK,KAAK,AAAC;GACxC,CAAC,gBAAgB,KAAK,oBAAoB,KAAK,KAAK,AAAC;GACrD,CAAC,cAAc,KAAK,mBAAmB,KAAK,KAAK,AAAC;GAClD,CAAC,kBAAkB,KAAK,qBAAqB,KAAK,KAAK,AAAC;GACxD,CAAC,0BAA0B,KAAK,4BAA4B,KAAK,KAAK,AAAC;GACvE,CAAC,UAAU,KAAK,eAAe,KAAK,KAAK,AAAC;GAC1C,CAAC,eAAe,KAAK,mBAAmB,KAAK,KAAK,AAAC;EACtD;CACJ;;;;CAKD,MAAM,qBACFC,QACAC,MACAC,SACAC,iBACoB;EACpB,MAAM,UAAU,KAAK,iBAAiB,IAAI,OAAO,KAAK;AACtD,aAAW,YAAY,WACnB,KAAI;AACA,UAAO,MAAM,QAAQ,MAAM,SAAS,QAAQ,gBAAgB;EAC/D,SAAQ,IAAI,CAEZ;AAEL,SAAO,CAAE;CACZ;;;;CAKD,MAAM,QACFF,MACAC,SACAE,SACAD,iBACoB;EACpB,MAAME,UAAuB,CAAE;AAC/B,OAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,WAAW,MAAM,KAAK,qBAAqB,QAAQ,MAAM,SAAS,gBAAgB;AACxF,WAAQ,KAAK,GAAG,SAAS;EAC5B;AACD,SAAO;CACV;CAID,AAAQ,cAAcC,KAAaC,MAAsB;AACrD,SAAO,IAAI,IAAI,KAAK,MAAM;CAC7B;CAED,AAAQ,uBAAuBhB,SAAkC;AAC7D,MAAI,KAAK,sBAAsB,KAC3B,QAAO,KAAK,kBAAkB,QAAQ;AAG1C,aAAW,cAAc,YACrB,QAAO,IAAI,sBAAsB;AAErC,QAAM,IAAI,MAAM;CACnB;CAED,MAAc,gBAAgBU,MAAcC,SAAuC;AAC/E,MAAI,YAAY,QAAQ,KAAK,sBAAsB,KAAK,EAAE;AACtD,aAAU;AACV,UAAO;EACV;EAED,MAAM,SAAS,IAAI;AACnB,MAAI,KAAK,SAAS,EACd,QAAO,IAAI,SAAS,KAAK;AAE7B,MAAI,QAAQ,SAAS,EACjB,QAAO,IAAI,QAAQ,QAAQ;EAG/B,MAAM,OAAO,qEAAqE,OAAO,UAAU,CAAC;AACpG,SAAO,CAAC;GAAE,MAAM;GAAO;EAAK,CAAC;CAChC;CAED,MAAc,uBACVD,MACAC,SACAM,UACAL,iBACoB;EACpB,MAAM,EAAE,MAAM,UAAU,GAAG;EAE3B,MAAM,WAAW,KAAK,2BAA2B,SAAS;EAC1D,MAAM,OAAO,IAAI,gBAAgB;GAC7B,MAAM;GACN,YAAY;GACZ,cAAc;GACd,QAAQ;EACX;EACD,MAAM,WAAW,MAAM,MAAM,UAAU;GACnC,GAAG;GACH,QAAQ;GACR,SAAS,EACL,gBAAgB,oCACnB;GACD,MAAM;EACT,EAAC;EACF,MAAM,eAAe,MAAM,SAAS,MAAM;EAE1C,MAAM,MAAM,KAAK,uBAAuB,aAAa;EACrD,MAAM,OAAO,IAAI;AACjB,OAAK,MAAM,OAAO,IAAI,uBAAuB,gBAAgB,CACzD,KAAI;GACA,MAAM,QAAQ,IAAI,oBAAoB,SAAS,IAAI;AACnD,OAAI,UAAU,KACV;GAGJ,MAAM,SAAS,IAAI,oBAAoB,UAAU,MAAM;AACvD,OAAI,WAAW,KACX;GAGJ,IAAI,MAAM,IAAI,aAAa,QAAQ,MAAM;AACzC,OAAI,QAAQ,KACR;AAGJ,QAAK,KAAK,2BAA2B,UAAU,KAAK,KAAK,MAAM,QAAQ,CACnE;AAEJ,SAAM,KAAK,cAAc,KAAK,SAAS,IAAI;AAC3C,QAAK,IAAI,IAAI;EAChB,SAAQ,IAAI,CAEZ;AAEL,SAAO,CAAC,GAAG,IAAK,EAAC,IAAI,CAAC,SAAuB;GAAE,MAAM;GAAO;EAAK,GAAE;CACtE;CAED,AAAQ,2BACJM,UACAC,KACAC,KACAV,MACAC,SACO;AACP,UAAQ,UAAR;GACI,KAAK;IACD;KACI,MAAM,eAAe,IAAI,uBAAuB,iBAAiB,IAAI;AACrE,SAAI,aAAa,WAAW,EACxB,QAAO;KAGX,MAAM,cAAc,IAAI,eAAe,aAAa,GAAG;AACvD,UAAK,YACD,QAAO;AAEX,SAAI,YAAY,QAAQ,YAAY,YAChC,QAAO;IAEd;AACD;GACJ,SAAS;IACL,MAAM,QAAQ,IAAI,uBAAuB,YAAY,IAAI;AACzD,QAAI,MAAM,WAAW,EACjB,QAAO;AAGX,QAAI,SAAS,IAAI,eAAe,MAAM,GAAG,CACrC,QAAO;GAEd;EACJ;AACD,SAAO;CACV;CAED,AAAQ,2BAA2BO,UAA0B;EACzD,MAAM,aAAa,KAAK,6BAA6B,SAAS;EAC9D,MAAM,oBAAoB,SAAS,aAAa;AAChD,UAAQ,cAAc,kBAAkB,EAAE,WAAW;CACxD;CAED,AAAQ,6BAA6BA,UAAmC;AACpE,UAAQ,UAAR;GACI,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,aACD,QAAO;GACX,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,UACD,QAAO;GACX,QACI,OAAM,IAAI,MAAM;EACvB;CACJ;CAED,MAAc,cAAcR,MAAcC,SAAuC;EAC7E,MAAM,YAAY,2BAA2B,KAAK;EAClD,MAAM,WAAW,MAAM,MAAM,UAAU,4BAA4B;EACnE,MAAM,eAAe,MAAM,SAAS,MAAM;EAE1C,MAAM,MAAM,KAAK,uBAAuB,aAAa;AACrD,MAAI;GACA,MAAM,QAAQ,IAAI,gBAAgB,QAAQ,KAAK,GAAG,QAAQ,EAAE;AAC5D,OAAI,UAAU,MAAM;IAChB,MAAM,SAAS,IAAI,oBAAoB,UAAU,MAAM;AACvD,QAAI,WAAW,MAAM;KACjB,IAAI,MAAM,IAAI,aAAa,QAAQ,MAAM;AACzC,SAAI,QAAQ,MAAM;AACd,YAAM,KAAK,cAAc,KAAK,SAAS,IAAI;AAC3C,aAAO,CAAC;OAAE,MAAM;OAAO;MAAK,CAAC;KAChC;IACJ;GACJ;EACJ,SAAQ,IAAI,CAEZ;AAED,QAAM,IAAI,MAAM;CACnB;CAED,MAAc,oBACVD,MACAW,UACAJ,UACAL,iBACoB;AACpB,aAAW,oBAAoB,YAAY,oBAAoB,KAC3D,OAAM,IAAI,MAAM;EAEpB,MAAM,EAAE,UAAU,GAAG;EACrB,MAAM,kBAAkB,yCAAyC,SAAS;EAC1E,MAAM,gBAAgB,GAAG,KAAK;EAC9B,MAAM,YAAY,iGAAiG,aAAa,KAAK,eAAe;EAEpJ,MAAM,mBAAmB,CAACU,UAAkBC,aAA8B;GACtE,MAAM,oBAAoB,IAAI,QAAQ,uBAAuB,SAAS,MAAM,SAAS,GAAG,KAAK,UAAU;AACvG,UAAO,kBAAkB,KAAK,SAAS;EAC1C;AAED,SAAO,MAAM,KAAK,yBAAyB,UAAU,iBAAiB;CACzE;CAED,MAAc,mBACVb,MACAW,UACAJ,UACAL,iBACoB;AACpB,aAAW,oBAAoB,YAAY,oBAAoB,KAC3D,OAAM,IAAI,MAAM;EAEpB,MAAM,EAAE,KAAK,GAAG;EAChB,MAAM,gBAAgB,EAAE,IAAI,kBAAkB,KAAK;EACnD,MAAM,YAAY,iGAAiG,aAAa;EAEhI,MAAM,mBAAmB,CAACU,aAA8B;GACpD,MAAM,oBAAoB,IAAI,QAAQ,QAAQ,IAAI,aAAa,KAAK,cAAc;AAClF,UAAO,kBAAkB,KAAK,SAAS;EAC1C;EAED,MAAM,cAAc,CAACA,UAAkBC,aAA6B;GAChE,MAAM,QAAQ,SAAS,MAAM,IAAI,QAAQ,QAAQ,IAAI,YAAY,KAAK,GAAG,KAAK;AAC9E,OAAI,UAAU,KACV,QAAO;GAEX,MAAM,SAAS,MAAM,GAAG,UAAU,EAAE,CAAC,aAAa;GAClD,MAAM,aAAa,KAAK,aAAa,GAAG,OAAO;AAC/C,WAAQ,GAAG,WAAW,IAAI,SAAS;EACtC;AAED,SAAO,MAAM,KAAK,yBAAyB,UAAU,kBAAkB,YAAY;CACtF;CAED,MAAc,yBACVC,UACAC,kBACAC,cAA8D,CAAC,WAAW,aAAa,UAChE;EACvB,MAAM,WAAW,MAAM,MAAM,UAAU,4BAA4B;EAEnE,MAAM,iBAAiB,MAAM,iBAAiD,SAAS;EACvF,MAAM,gBAAgB,eAAe,MAAM;EAE3C,MAAM,iBAAiB,cAAc,IAAI,OAAO,EAAE,OAAO,KAAK;GAC1D,MAAM,eAAe,0EAA0E,MAAM;GACrG,MAAM,YAAY,MAAM,MAAM,aAAa,4BAA4B;GACvE,MAAM,eAAe,MAAM,iBAA+C,UAAU;GACpF,MAAM,cAAc,aAAa,MAAM;GACvC,MAAMC,UAA0B,CAAE;AAClC,QAAK,MAAM,QAAQ,OAAO,OAAO,YAAY,EAAE;IAC3C,MAAM,UAAU,KAAK,UAAU,GAAG;IAClC,MAAM,WAAW,KAAK,UAAU,GAAG;AACnC,QAAI,iBAAiB,OAAO,SAAS,CACjC,SAAQ,KAAK;KAAE,MAAM;KAAO,KAAK;KAAS,MAAM,YAAY,OAAO,SAAS;IAAE,EAAC;GAEtF;AACD,UAAO;EACV,EAAC;AAEF,SAAO,CAAC,MAAM,QAAQ,IAAI,eAAe,EAAE,MAAM;CACpD;CAED,MAAc,qBAAqBjB,MAAcW,UAAkBO,SAAgD;AAC/G,aAAW,YAAY,YAAY,YAAY,KAC3C,OAAM,IAAI,MAAM;EAEpB,MAAM,EAAE,OAAO,GAAG;AAClB,aAAW,UAAU,SACjB,OAAM,IAAI,MAAM;AAEpB,SAAO,CAAC;GAAE,MAAM;GAAO,MAAM;GAAM;EAAO,CAAC;CAC9C;CAED,MAAc,4BACVC,OACAlB,SACAiB,SACoB;AACpB,aAAW,YAAY,YAAY,YAAY,KAC3C,OAAM,IAAI,MAAM;EAEpB,MAAM,EAAE,OAAO,GAAG;AAClB,aAAW,UAAU,SACjB,OAAM,IAAI,MAAM;AAEpB,SAAO,CAAC;GAAE,MAAM;GAAO,MAAM;GAAS;EAAO,CAAC;CACjD;CAED,MAAc,eACVlB,MACAC,SACAiB,SACAhB,iBACoB;AACpB,aAAW,YAAY,YAAY,YAAY,KAC3C,OAAM,IAAI,MAAM;EAEpB,IAAI,EAAE,KAAK,GAAG;AACd,aAAW,QAAQ,SACf,OAAM,IAAI,MAAM;AAEpB,QAAM,KAAK,cAAc,MAAM,SAAS,KAAK,gBAAgB;AAC7D,SAAO,CAAC;GAAE,MAAM;GAAO;EAAK,CAAC;CAChC;CAED,MAAc,mBACVF,MACAC,SACAiB,SACAhB,iBACoB;AACpB,aAAW,YAAY,YAAY,YAAY,KAC3C,OAAM,IAAI,MAAM;EAEpB,IAAI,EAAE,KAAK,GAAG;AACd,aAAW,QAAQ,SACf,OAAM,IAAI,MAAM;AAEpB,QAAM,KAAK,cAAc,MAAM,SAAS,KAAK,gBAAgB;EAE7D,MAAM,WAAW,MAAM,MAAM,KAAK,4BAA4B;AAE9D,OAAK,SAAS,GACV,OAAM,IAAI,OAAO,oBAAoB,SAAS,OAAO;EAGzD,MAAM,eAAe,MAAM,iBAAkC,SAAS;AAEtE,OAAK,yBAAyB,aAAa;EAE3C,MAAME,UAAuB,CAAE;AAC/B,OAAK,MAAM,EAAE,KAAK,MAAM,MAAM,IAAI,aAAa,cAAc;GACzD,MAAMgB,OAAqB;IAAE,MAAM;IAAO,KAAK;GAAM;AACrD,cAAW,SAAS,SAChB,MAAK,OAAO;AAEhB,WAAQ,KAAK,KAAK;EACrB;AACD,SAAO;CACV;CAED,AAAQ,cAAcpB,MAAcC,SAAiBI,KAAaH,iBAA0C;AACxG,aAAW,QAAQ,SACf,OAAM,IAAI,MAAM;EAEpB,MAAMmB,OAA+B;GACjC;GACA;GACA,UAAU,gBAAgB;EAC7B;EACD,MAAM,WAAW,CAACC,IAAYC,OAC1B,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI;AACrE,SAAO,IAAI,QAAQ,gBAAgB,SAAS;CAC/C;CAED,AAAQ,yBAAyBC,MAAqB;AAClD,aAAW,SAAS,YAAY,SAAS,KACrC,OAAM,IAAI,MAAM;EAEpB,MAAM,MAAM;AACZ,MAAI,IAAI,SAAS,kBACb,OAAM,IAAI,MAAM;AAEpB,OAAK,MAAM,QAAQ,IAAI,aAAa,CAChC,OAAM,IAAI,MAAM;CAEvB;;;;CAKD,AAAQ,sBAAsBC,KAAsB;AAChD,MAAI,IAAI,WAAW,EACf,QAAO;AAEX,OAAK,MAAM,QAAQ,KAAK;GACpB,MAAM,OAAO,KAAK,YAAY,EAAE;AAChC,OAAI,gBACA,QAAO;AAGX,SAAO,QAAQ,SAAU,QAAQ,SAAY,QAAQ,SAAU,QAAQ,OACnE,QAAO;EAEd;AACD,SAAO;CACV;AACJ;;;;AAKD,SAAgB,2BAA2BjB,UAAwC;AAC/E,QAAO,aAAa,OACd,IAAI,IAAqB;EAAC;EAAW;EAAoB;CAAQ,KACjE,IAAI,IAAqB;EAAC;EAAgB;EAAoB;CAAa;AACpF;;;;AAKD,SAAgB,wBAAwBA,UAAkBL,SAA+C;CACrG,MAAM,kBAAkB,2BAA2B,SAAS;AAE5D,MAAK,MAAM,EAAE,MAAM,IAAI,QACnB,iBAAgB,OAAO,KAAK;AAGhC,QAAO,CAAC,GAAG,eAAgB,EAAC,IAAI,CAAC,UAA2B;EAAE;EAAM,KAAK;EAAI,OAAO;CAAI,GAAE;AAC7F"}
1
+ {"version":3,"file":"audio-url-generator-_6Qk0i3T.js","names":["content: string","id: string","className: string","root?: Element","tagName: string","element: Element","attribute: string","DEFAULT_REQUEST_INIT_PARAMS: RequestInit","options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }","source: AudioSourceInfo","term: string","reading: string","languageSummary: LanguageSummary","sources: AudioSourceInfo[]","results: AudioInfo[]","url: string","base: string","_details: AudioSourceInfo","language: string","dom: SimpleDOMParser","row: Element","_reading: string","filename: string","fileUser: string","fetchUrl: string","validateFilename: (filename: string, fileUser: string) => boolean","displayName: (filename: string, fileUser: string) => string","results: AudioUrlInfo[]","details: AudioSourceInfo","_term: string","info: AudioUrlInfo","data: Record<string, string>","m0: string","m1: string","data: unknown","str: string"],"sources":["../src/audio/audio-url-generator.ts"],"sourcesContent":["import type {\n AudioInfo,\n AudioSourceInfo,\n AudioSourceType,\n AudioUrlInfo,\n CustomAudioList,\n WikimediaCommonsFileResponse,\n WikimediaCommonsLookupResponse,\n} from '../types/audio';\nimport type { LanguageSummary } from '../types/language';\nimport { readResponseJson } from '../util/json';\n\n/**\n * Interface for parsing HTML content. Consumers can inject\n * a DOM parser implementation (e.g. linkedom, jsdom, or the browser's native DOMParser).\n */\nexport interface SimpleDOMParser {\n getElementById(id: string): Element | null;\n getElementsByClassName(className: string, root?: Element): Element[];\n getElementByTagName(tagName: string, root?: Element): Element | null;\n getAttribute(element: Element, attribute: string): string | null;\n getTextContent(element: Element): string;\n}\n\n/**\n * A default DOM parser implementation that uses the standard DOMParser API\n * (available in browsers and some Node.js DOM libraries like linkedom/jsdom).\n */\nexport class NativeSimpleDOMParser implements SimpleDOMParser {\n private _document: Document;\n\n constructor(content: string) {\n const parser = new DOMParser();\n this._document = parser.parseFromString(content, 'text/html');\n }\n\n getElementById(id: string): Element | null {\n return this._document.getElementById(id);\n }\n\n getElementsByClassName(className: string, root?: Element): Element[] {\n const parent = root ?? this._document;\n return [...parent.getElementsByClassName(className)];\n }\n\n getElementByTagName(tagName: string, root?: Element): Element | null {\n const parent = root ?? this._document;\n const elements = parent.getElementsByTagName(tagName);\n return elements.length > 0 ? elements[0] : null;\n }\n\n getAttribute(element: Element, attribute: string): string | null {\n return element.getAttribute(attribute);\n }\n\n getTextContent(element: Element): string {\n return element.textContent ?? '';\n }\n}\n\nconst DEFAULT_REQUEST_INIT_PARAMS: RequestInit = {\n method: 'GET',\n mode: 'cors',\n cache: 'default',\n credentials: 'omit',\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n};\n\ntype GetInfoHandler = (\n term: string,\n reading: string,\n source: AudioSourceInfo,\n languageSummary: LanguageSummary,\n) => Promise<AudioInfo[]>;\n\n/**\n * Generates audio URLs for dictionary terms from various audio sources.\n * Ported from Yomitan's AudioDownloader, but only extracts URL generation logic (not download).\n */\nexport class AudioUrlGenerator {\n private _getInfoHandlers: Map<AudioSourceType, GetInfoHandler>;\n private _regionNames: Intl.DisplayNames;\n private _domParserFactory: ((content: string) => SimpleDOMParser) | null;\n private _customAudioListSchema: object | null;\n\n constructor(options?: {\n domParserFactory?: (content: string) => SimpleDOMParser;\n }) {\n this._domParserFactory = options?.domParserFactory ?? null;\n this._customAudioListSchema = null;\n this._regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\n\n this._getInfoHandlers = new Map<AudioSourceType, GetInfoHandler>([\n ['jpod101', this._getInfoJpod101.bind(this)],\n ['language-pod-101', this._getInfoLanguagePod101.bind(this)],\n ['jisho', this._getInfoJisho.bind(this)],\n ['lingua-libre', this._getInfoLinguaLibre.bind(this)],\n ['wiktionary', this._getInfoWiktionary.bind(this)],\n ['text-to-speech', this._getInfoTextToSpeech.bind(this)],\n ['text-to-speech-reading', this._getInfoTextToSpeechReading.bind(this)],\n ['custom', this._getInfoCustom.bind(this)],\n ['custom-json', this._getInfoCustomJson.bind(this)],\n ]);\n }\n\n /**\n * Gets audio URL info for a single source.\n */\n async getTermAudioInfoList(\n source: AudioSourceInfo,\n term: string,\n reading: string,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const handler = this._getInfoHandlers.get(source.type);\n if (typeof handler === 'function') {\n try {\n return await handler(term, reading, source, languageSummary);\n } catch (_e) {\n // NOP\n }\n }\n return [];\n }\n\n /**\n * Gets audio URLs for a term from multiple sources.\n */\n async getUrls(\n term: string,\n reading: string,\n sources: AudioSourceInfo[],\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const results: AudioInfo[] = [];\n for (const source of sources) {\n const infoList = await this.getTermAudioInfoList(source, term, reading, languageSummary);\n results.push(...infoList);\n }\n return results;\n }\n\n // Private\n\n private _normalizeUrl(url: string, base: string): string {\n return new URL(url, base).href;\n }\n\n private _createSimpleDOMParser(content: string): SimpleDOMParser {\n if (this._domParserFactory !== null) {\n return this._domParserFactory(content);\n }\n // Try native DOMParser\n if (typeof DOMParser !== 'undefined') {\n return new NativeSimpleDOMParser(content);\n }\n throw new Error('DOM parsing not supported. Provide a domParserFactory in the constructor.');\n }\n\n private async _getInfoJpod101(term: string, reading: string): Promise<AudioInfo[]> {\n if (reading === term && this._isStringEntirelyKana(term)) {\n reading = term;\n term = '';\n }\n\n const params = new URLSearchParams();\n if (term.length > 0) {\n params.set('kanji', term);\n }\n if (reading.length > 0) {\n params.set('kana', reading);\n }\n\n const url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?${params.toString()}`;\n return [{ type: 'url', url }];\n }\n\n private async _getInfoLanguagePod101(\n term: string,\n reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n const { name: language } = languageSummary;\n\n const fetchUrl = this._getLanguagePod101FetchUrl(language);\n const data = new URLSearchParams({\n post: 'dictionary_reference',\n match_type: 'exact',\n search_query: term,\n vulgar: 'true',\n });\n const response = await fetch(fetchUrl, {\n ...DEFAULT_REQUEST_INIT_PARAMS,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: data,\n });\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n const urls = new Set<string>();\n for (const row of dom.getElementsByClassName('dc-result-row')) {\n try {\n const audio = dom.getElementByTagName('audio', row);\n if (audio === null) {\n continue;\n }\n\n const source = dom.getElementByTagName('source', audio);\n if (source === null) {\n continue;\n }\n\n let url = dom.getAttribute(source, 'src');\n if (url === null) {\n continue;\n }\n\n if (!this._validateLanguagePod101Row(language, dom, row, term, reading)) {\n continue;\n }\n url = this._normalizeUrl(url, response.url);\n urls.add(url);\n } catch (_e) {\n // NOP\n }\n }\n return [...urls].map((url): AudioUrlInfo => ({ type: 'url', url }));\n }\n\n private _validateLanguagePod101Row(\n language: string,\n dom: SimpleDOMParser,\n row: Element,\n term: string,\n reading: string,\n ): boolean {\n switch (language) {\n case 'Japanese':\n {\n const htmlReadings = dom.getElementsByClassName('dc-vocab_kana', row);\n if (htmlReadings.length === 0) {\n return false;\n }\n\n const htmlReading = dom.getTextContent(htmlReadings[0]);\n if (!htmlReading) {\n return false;\n }\n if (reading !== term && reading !== htmlReading) {\n return false;\n }\n }\n break;\n default: {\n const vocab = dom.getElementsByClassName('dc-vocab', row);\n if (vocab.length === 0) {\n return false;\n }\n\n if (term !== dom.getTextContent(vocab[0])) {\n return false;\n }\n }\n }\n return true;\n }\n\n private _getLanguagePod101FetchUrl(language: string): string {\n const podOrClass = this._getLanguagePod101PodOrClass(language);\n const lowerCaseLanguage = language.toLowerCase();\n return `https://www.${lowerCaseLanguage}${podOrClass}101.com/learningcenter/reference/dictionary_post`;\n }\n\n private _getLanguagePod101PodOrClass(language: string): 'pod' | 'class' {\n switch (language) {\n case 'Afrikaans':\n case 'Arabic':\n case 'Bulgarian':\n case 'Dutch':\n case 'Filipino':\n case 'Finnish':\n case 'French':\n case 'German':\n case 'Greek':\n case 'Hebrew':\n case 'Hindi':\n case 'Hungarian':\n case 'Indonesian':\n case 'Italian':\n case 'Japanese':\n case 'Persian':\n case 'Polish':\n case 'Portuguese':\n case 'Romanian':\n case 'Russian':\n case 'Spanish':\n case 'Swahili':\n case 'Swedish':\n case 'Thai':\n case 'Urdu':\n case 'Vietnamese':\n return 'pod';\n case 'Cantonese':\n case 'Chinese':\n case 'Czech':\n case 'Danish':\n case 'English':\n case 'Korean':\n case 'Norwegian':\n case 'Turkish':\n return 'class';\n default:\n throw new Error('Invalid language for LanguagePod101');\n }\n }\n\n private async _getInfoJisho(term: string, reading: string): Promise<AudioInfo[]> {\n const fetchUrl = `https://jisho.org/search/${term}`;\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n const responseText = await response.text();\n\n const dom = this._createSimpleDOMParser(responseText);\n try {\n const audio = dom.getElementById(`audio_${term}:${reading}`);\n if (audio !== null) {\n const source = dom.getElementByTagName('source', audio);\n if (source !== null) {\n let url = dom.getAttribute(source, 'src');\n if (url !== null) {\n url = this._normalizeUrl(url, response.url);\n return [{ type: 'url', url }];\n }\n }\n }\n } catch (_e) {\n // NOP\n }\n\n throw new Error('Failed to find audio URL');\n }\n\n private async _getInfoLinguaLibre(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso639_3 } = languageSummary;\n const searchCategory = `incategory:\"Lingua_Libre_pronunciation-${iso639_3}\"`;\n const searchString = `-${term}.wav`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i+${searchCategory}&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string, fileUser: string): boolean => {\n const validFilenameTest = new RegExp(`^File:LL-Q\\\\d+\\\\s+\\\\(${iso639_3}\\\\)-${fileUser}-${term}\\\\.wav$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename);\n }\n\n private async _getInfoWiktionary(\n term: string,\n _reading: string,\n _details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof languageSummary !== 'object' || languageSummary === null) {\n throw new Error('Invalid arguments');\n }\n const { iso } = languageSummary;\n const searchString = `${iso}(-[a-zA-Z]{2})?-${term}[0123456789]*.ogg`;\n const fetchUrl = `https://commons.wikimedia.org/w/api.php?action=query&format=json&list=search&srsearch=intitle:/${searchString}/i&srnamespace=6&origin=*`;\n\n const validateFilename = (filename: string): boolean => {\n const validFilenameTest = new RegExp(`^File:${iso}(-\\\\w\\\\w)?-${term}\\\\d*\\\\.ogg$`, 'i');\n return validFilenameTest.test(filename);\n };\n\n const displayName = (filename: string, fileUser: string): string => {\n const match = filename.match(new RegExp(`^File:${iso}(-\\\\w\\\\w)-${term}`, 'i'));\n if (match === null) {\n return fileUser;\n }\n const region = match[1].substring(1).toUpperCase();\n const regionName = this._regionNames.of(region);\n return `(${regionName}) ${fileUser}`;\n };\n\n return await this._getInfoWikimediaCommons(fetchUrl, validateFilename, displayName);\n }\n\n private async _getInfoWikimediaCommons(\n fetchUrl: string,\n validateFilename: (filename: string, fileUser: string) => boolean,\n displayName: (filename: string, fileUser: string) => string = (_filename, fileUser) => fileUser,\n ): Promise<AudioUrlInfo[]> {\n const response = await fetch(fetchUrl, DEFAULT_REQUEST_INIT_PARAMS);\n\n const lookupResponse = await readResponseJson<WikimediaCommonsLookupResponse>(response);\n const lookupResults = lookupResponse.query.search;\n\n const fetchFileInfos = lookupResults.map(async ({ title }) => {\n const fileInfoURL = `https://commons.wikimedia.org/w/api.php?action=query&format=json&titles=${title}&prop=imageinfo&iiprop=user|url&origin=*`;\n const response2 = await fetch(fileInfoURL, DEFAULT_REQUEST_INIT_PARAMS);\n const fileResponse = await readResponseJson<WikimediaCommonsFileResponse>(response2);\n const fileResults = fileResponse.query.pages;\n const results: AudioUrlInfo[] = [];\n for (const page of Object.values(fileResults)) {\n const fileUrl = page.imageinfo[0].url;\n const fileUser = page.imageinfo[0].user;\n if (validateFilename(title, fileUser)) {\n results.push({ type: 'url', url: fileUrl, name: displayName(title, fileUser) });\n }\n }\n return results;\n });\n\n return (await Promise.all(fetchFileInfos)).flat();\n }\n\n private async _getInfoTextToSpeech(term: string, _reading: string, details: AudioSourceInfo): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: term, voice }];\n }\n\n private async _getInfoTextToSpeechReading(\n _term: string,\n reading: string,\n details: AudioSourceInfo,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n const { voice } = details;\n if (typeof voice !== 'string') {\n throw new Error('Invalid voice');\n }\n return [{ type: 'tts', text: reading, voice }];\n }\n\n private async _getInfoCustom(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n return [{ type: 'url', url }];\n }\n\n private async _getInfoCustomJson(\n term: string,\n reading: string,\n details: AudioSourceInfo,\n languageSummary: LanguageSummary,\n ): Promise<AudioInfo[]> {\n if (typeof details !== 'object' || details === null) {\n throw new Error('Invalid arguments');\n }\n let { url } = details;\n if (typeof url !== 'string') {\n throw new Error('Invalid url');\n }\n url = this._getCustomUrl(term, reading, url, languageSummary);\n\n const response = await fetch(url, DEFAULT_REQUEST_INIT_PARAMS);\n\n if (!response.ok) {\n throw new Error(`Invalid response: ${response.status}`);\n }\n\n const responseJson = await readResponseJson<CustomAudioList>(response);\n\n this._validateCustomAudioList(responseJson);\n\n const results: AudioInfo[] = [];\n for (const { url: url2, name } of responseJson.audioSources) {\n const info: AudioUrlInfo = { type: 'url', url: url2 };\n if (typeof name === 'string') {\n info.name = name;\n }\n results.push(info);\n }\n return results;\n }\n\n private _getCustomUrl(term: string, reading: string, url: string, languageSummary: LanguageSummary): string {\n if (typeof url !== 'string') {\n throw new Error('No custom URL defined');\n }\n const data: Record<string, string> = {\n term,\n reading,\n language: languageSummary.iso,\n };\n const replacer = (m0: string, m1: string): string =>\n Object.prototype.hasOwnProperty.call(data, m1) ? `${data[m1]}` : m0;\n return url.replace(/\\{([^}]*)\\}/g, replacer);\n }\n\n private _validateCustomAudioList(data: unknown): void {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Invalid custom audio list response');\n }\n const obj = data as Record<string, unknown>;\n if (obj.type !== 'audioSourceList') {\n throw new Error('Invalid custom audio list type');\n }\n if (!Array.isArray(obj.audioSources)) {\n throw new Error('Invalid custom audio list audioSources');\n }\n }\n\n /**\n * Simple check for whether a string is entirely kana (hiragana/katakana).\n */\n private _isStringEntirelyKana(str: string): boolean {\n if (str.length === 0) {\n return false;\n }\n for (const char of str) {\n const code = char.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n // Hiragana: U+3040-U+309F, Katakana: U+30A0-U+30FF\n if (!((code >= 0x3040 && code <= 0x309f) || (code >= 0x30a0 && code <= 0x30ff))) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * Returns the set of required audio source types for a given language ISO code.\n */\nexport function getRequiredAudioSourceList(language: string): Set<AudioSourceType> {\n return language === 'ja'\n ? new Set<AudioSourceType>(['jpod101', 'language-pod-101', 'jisho'])\n : new Set<AudioSourceType>(['lingua-libre', 'language-pod-101', 'wiktionary']);\n}\n\n/**\n * Returns required audio sources that are not already present in the given sources list.\n */\nexport function getRequiredAudioSources(language: string, sources: AudioSourceInfo[]): AudioSourceInfo[] {\n const requiredSources = getRequiredAudioSourceList(language);\n\n for (const { type } of sources) {\n requiredSources.delete(type);\n }\n\n return [...requiredSources].map((type): AudioSourceInfo => ({ type, url: '', voice: '' }));\n}\n"],"mappings":"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"}
package/dist/audio.cjs CHANGED
@@ -1,5 +1,5 @@
1
- require('./json-CyQBn52D.cjs');
2
- const require_audio_url_generator = require('./audio-url-generator-C23AXVj1.cjs');
1
+ require('./json-Cdj6aIOQ.cjs');
2
+ const require_audio_url_generator = require('./audio-url-generator-CorFRyBU.cjs');
3
3
 
4
4
  exports.AudioUrlGenerator = require_audio_url_generator.AudioUrlGenerator
5
5
  exports.NativeSimpleDOMParser = require_audio_url_generator.NativeSimpleDOMParser
package/dist/audio.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { AudioInfo, AudioSourceInfo, AudioSourceType } from "./audio-ZuaDkaUZ.js";
2
- import { LanguageSummary } from "./language-DFFp_7nc.js";
1
+ import { AudioInfo, AudioSourceInfo, AudioSourceType } from "./audio-DN-FhZ5k.js";
2
+ import { LanguageSummary } from "./language-DMwuc2-C.js";
3
3
 
4
4
  //#region src/audio/audio-url-generator.d.ts
5
5
  /**
package/dist/audio.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./json-DTq_IXXF.js";
2
- import { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources } from "./audio-url-generator-DykdzZJu.js";
1
+ import "./json-rIgOFqVY.js";
2
+ import { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources } from "./audio-url-generator-_6Qk0i3T.js";
3
3
 
4
4
  export { AudioUrlGenerator, NativeSimpleDOMParser, getRequiredAudioSourceList, getRequiredAudioSources };
@@ -81,4 +81,4 @@ var BatchProcessor = class {
81
81
 
82
82
  //#endregion
83
83
  export { BatchProcessor };
84
- //# sourceMappingURL=batch-processor-CXZZhx5t.js.map
84
+ //# sourceMappingURL=batch-processor-BR-gB3H3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"batch-processor-CXZZhx5t.js","names":["translator: Translator","texts: string[]","config: BatchLookupConfig","text: string","language: string","mode: FindTermsMode","enabledDictionaryMap: Map<string, FindTermDictionary>","inputMap: Map<string, { index: number; priority: number }>"],"sources":["../src/lookup/batch-processor.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { TermDictionaryEntry } from '../types/dictionary';\nimport type { FindTermDictionary } from '../types/translation';\nimport type { FindTermsMode, Translator } from './translator';\n\nexport interface BatchLookupConfig {\n /** The language code for the lookup. Defaults to 'ja'. */\n language?: string;\n /** The enabled dictionary map for lookups. */\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n /** Maximum number of concurrent lookups. Defaults to 5. */\n concurrency?: number;\n /** The find terms mode. Defaults to 'group'. */\n mode?: FindTermsMode;\n}\n\nexport interface BatchResult {\n /** The original input text. */\n text: string;\n /** The dictionary entries found for this text. */\n entries: TermDictionaryEntry[];\n /** The length of the original text that was matched. */\n originalTextLength: number;\n}\n\n/**\n * Processes multiple text lookups in batch with optional concurrency limiting.\n * Shares the translator's tag cache across lookups for improved performance.\n */\nexport class BatchProcessor {\n private _translator: Translator;\n\n constructor(translator: Translator) {\n this._translator = translator;\n }\n\n /**\n * Looks up multiple texts and returns a map of text to results.\n * Texts are deduplicated before lookup. Concurrency is limited by the\n * `concurrency` config option.\n */\n async batchLookup(texts: string[], config: BatchLookupConfig): Promise<Map<string, BatchResult>> {\n const language = config.language ?? 'ja';\n const concurrency = config.concurrency ?? 5;\n const mode = config.mode ?? 'group';\n const enabledDictionaryMap = this._buildFindTermDictionaryMap(config.enabledDictionaryMap);\n\n // Deduplicate texts\n const uniqueTexts = [...new Set(texts)];\n const results = new Map<string, BatchResult>();\n\n // Process in batches with concurrency limiting\n for (let i = 0; i < uniqueTexts.length; i += concurrency) {\n const batch = uniqueTexts.slice(i, i + concurrency);\n const promises = batch.map(async (text) => {\n const result = await this._lookupSingle(text, language, mode, enabledDictionaryMap);\n results.set(text, result);\n });\n await Promise.all(promises);\n }\n\n return results;\n }\n\n /**\n * Performs a single text lookup.\n */\n private async _lookupSingle(\n text: string,\n language: string,\n mode: FindTermsMode,\n enabledDictionaryMap: Map<string, FindTermDictionary>,\n ): Promise<BatchResult> {\n const options = {\n matchType: 'exact' as const,\n deinflect: true,\n primaryReading: '',\n mainDictionary: '',\n sortFrequencyDictionary: null,\n sortFrequencyDictionaryOrder: 'descending' as const,\n removeNonJapaneseCharacters:\n language === 'ja' || language === 'zh' || language === 'yue' || language === 'ko',\n textReplacements: [null] as null[],\n enabledDictionaryMap,\n excludeDictionaryDefinitions: null,\n searchResolution: 'letter' as const,\n language,\n };\n\n try {\n const { dictionaryEntries, originalTextLength } = await this._translator.findTerms(mode, text, options);\n return {\n text,\n entries: dictionaryEntries,\n originalTextLength,\n };\n } catch {\n return {\n text,\n entries: [],\n originalTextLength: 0,\n };\n }\n }\n\n /**\n * Builds a FindTermDictionary map from the simplified input format.\n */\n private _buildFindTermDictionaryMap(\n inputMap: Map<string, { index: number; priority: number }>,\n ): Map<string, FindTermDictionary> {\n const result = new Map<string, FindTermDictionary>();\n for (const [name, { index }] of inputMap.entries()) {\n result.set(name, {\n index,\n alias: name,\n allowSecondarySearches: false,\n partsOfSpeechFilter: true,\n useDeinflections: true,\n });\n }\n return result;\n }\n}\n"],"mappings":";;;;;AA6CA,IAAa,iBAAb,MAA4B;CACxB,AAAQ;CAER,YAAYA,YAAwB;AAChC,OAAK,cAAc;CACtB;;;;;;CAOD,MAAM,YAAYC,OAAiBC,QAA8D;EAC7F,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,cAAc,OAAO,eAAe;EAC1C,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,uBAAuB,KAAK,4BAA4B,OAAO,qBAAqB;EAG1F,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAO;EACvC,MAAM,UAAU,IAAI;AAGpB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,aAAa;GACtD,MAAM,QAAQ,YAAY,MAAM,GAAG,IAAI,YAAY;GACnD,MAAM,WAAW,MAAM,IAAI,OAAO,SAAS;IACvC,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,UAAU,MAAM,qBAAqB;AACnF,YAAQ,IAAI,MAAM,OAAO;GAC5B,EAAC;AACF,SAAM,QAAQ,IAAI,SAAS;EAC9B;AAED,SAAO;CACV;;;;CAKD,MAAc,cACVC,MACAC,UACAC,MACAC,sBACoB;EACpB,MAAM,UAAU;GACZ,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,8BAA8B;GAC9B,6BACI,aAAa,QAAQ,aAAa,QAAQ,aAAa,SAAS,aAAa;GACjF,kBAAkB,CAAC,IAAK;GACxB;GACA,8BAA8B;GAC9B,kBAAkB;GAClB;EACH;AAED,MAAI;GACA,MAAM,EAAE,mBAAmB,oBAAoB,GAAG,MAAM,KAAK,YAAY,UAAU,MAAM,MAAM,QAAQ;AACvG,UAAO;IACH;IACA,SAAS;IACT;GACH;EACJ,QAAO;AACJ,UAAO;IACH;IACA,SAAS,CAAE;IACX,oBAAoB;GACvB;EACJ;CACJ;;;;CAKD,AAAQ,4BACJC,UAC+B;EAC/B,MAAM,SAAS,IAAI;AACnB,OAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS,SAAS,CAC9C,QAAO,IAAI,MAAM;GACb;GACA,OAAO;GACP,wBAAwB;GACxB,qBAAqB;GACrB,kBAAkB;EACrB,EAAC;AAEN,SAAO;CACV;AACJ"}
1
+ {"version":3,"file":"batch-processor-BR-gB3H3.js","names":["translator: Translator","texts: string[]","config: BatchLookupConfig","text: string","language: string","mode: FindTermsMode","enabledDictionaryMap: Map<string, FindTermDictionary>","inputMap: Map<string, { index: number; priority: number }>"],"sources":["../src/lookup/batch-processor.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { TermDictionaryEntry } from '../types/dictionary';\nimport type { FindTermDictionary } from '../types/translation';\nimport type { FindTermsMode, Translator } from './translator';\n\nexport interface BatchLookupConfig {\n /** The language code for the lookup. Defaults to 'ja'. */\n language?: string;\n /** The enabled dictionary map for lookups. */\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n /** Maximum number of concurrent lookups. Defaults to 5. */\n concurrency?: number;\n /** The find terms mode. Defaults to 'group'. */\n mode?: FindTermsMode;\n}\n\nexport interface BatchResult {\n /** The original input text. */\n text: string;\n /** The dictionary entries found for this text. */\n entries: TermDictionaryEntry[];\n /** The length of the original text that was matched. */\n originalTextLength: number;\n}\n\n/**\n * Processes multiple text lookups in batch with optional concurrency limiting.\n * Shares the translator's tag cache across lookups for improved performance.\n */\nexport class BatchProcessor {\n private _translator: Translator;\n\n constructor(translator: Translator) {\n this._translator = translator;\n }\n\n /**\n * Looks up multiple texts and returns a map of text to results.\n * Texts are deduplicated before lookup. Concurrency is limited by the\n * `concurrency` config option.\n */\n async batchLookup(texts: string[], config: BatchLookupConfig): Promise<Map<string, BatchResult>> {\n const language = config.language ?? 'ja';\n const concurrency = config.concurrency ?? 5;\n const mode = config.mode ?? 'group';\n const enabledDictionaryMap = this._buildFindTermDictionaryMap(config.enabledDictionaryMap);\n\n // Deduplicate texts\n const uniqueTexts = [...new Set(texts)];\n const results = new Map<string, BatchResult>();\n\n // Process in batches with concurrency limiting\n for (let i = 0; i < uniqueTexts.length; i += concurrency) {\n const batch = uniqueTexts.slice(i, i + concurrency);\n const promises = batch.map(async (text) => {\n const result = await this._lookupSingle(text, language, mode, enabledDictionaryMap);\n results.set(text, result);\n });\n await Promise.all(promises);\n }\n\n return results;\n }\n\n /**\n * Performs a single text lookup.\n */\n private async _lookupSingle(\n text: string,\n language: string,\n mode: FindTermsMode,\n enabledDictionaryMap: Map<string, FindTermDictionary>,\n ): Promise<BatchResult> {\n const options = {\n matchType: 'exact' as const,\n deinflect: true,\n primaryReading: '',\n mainDictionary: '',\n sortFrequencyDictionary: null,\n sortFrequencyDictionaryOrder: 'descending' as const,\n removeNonJapaneseCharacters:\n language === 'ja' || language === 'zh' || language === 'yue' || language === 'ko',\n textReplacements: [null] as null[],\n enabledDictionaryMap,\n excludeDictionaryDefinitions: null,\n searchResolution: 'letter' as const,\n language,\n };\n\n try {\n const { dictionaryEntries, originalTextLength } = await this._translator.findTerms(mode, text, options);\n return {\n text,\n entries: dictionaryEntries,\n originalTextLength,\n };\n } catch {\n return {\n text,\n entries: [],\n originalTextLength: 0,\n };\n }\n }\n\n /**\n * Builds a FindTermDictionary map from the simplified input format.\n */\n private _buildFindTermDictionaryMap(\n inputMap: Map<string, { index: number; priority: number }>,\n ): Map<string, FindTermDictionary> {\n const result = new Map<string, FindTermDictionary>();\n for (const [name, { index }] of inputMap.entries()) {\n result.set(name, {\n index,\n alias: name,\n allowSecondarySearches: false,\n partsOfSpeechFilter: true,\n useDeinflections: true,\n });\n }\n return result;\n }\n}\n"],"mappings":";;;;;AA6CA,IAAa,iBAAb,MAA4B;CACxB,AAAQ;CAER,YAAYA,YAAwB;AAChC,OAAK,cAAc;CACtB;;;;;;CAOD,MAAM,YAAYC,OAAiBC,QAA8D;EAC7F,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,cAAc,OAAO,eAAe;EAC1C,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,uBAAuB,KAAK,4BAA4B,OAAO,qBAAqB;EAG1F,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAO;EACvC,MAAM,UAAU,IAAI;AAGpB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,aAAa;GACtD,MAAM,QAAQ,YAAY,MAAM,GAAG,IAAI,YAAY;GACnD,MAAM,WAAW,MAAM,IAAI,OAAO,SAAS;IACvC,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,UAAU,MAAM,qBAAqB;AACnF,YAAQ,IAAI,MAAM,OAAO;GAC5B,EAAC;AACF,SAAM,QAAQ,IAAI,SAAS;EAC9B;AAED,SAAO;CACV;;;;CAKD,MAAc,cACVC,MACAC,UACAC,MACAC,sBACoB;EACpB,MAAM,UAAU;GACZ,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,8BAA8B;GAC9B,6BACI,aAAa,QAAQ,aAAa,QAAQ,aAAa,SAAS,aAAa;GACjF,kBAAkB,CAAC,IAAK;GACxB;GACA,8BAA8B;GAC9B,kBAAkB;GAClB;EACH;AAED,MAAI;GACA,MAAM,EAAE,mBAAmB,oBAAoB,GAAG,MAAM,KAAK,YAAY,UAAU,MAAM,MAAM,QAAQ;AACvG,UAAO;IACH;IACA,SAAS;IACT;GACH;EACJ,QAAO;AACJ,UAAO;IACH;IACA,SAAS,CAAE;IACX,oBAAoB;GACvB;EACJ;CACJ;;;;CAKD,AAAQ,4BACJC,UAC+B;EAC/B,MAAM,SAAS,IAAI;AACnB,OAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS,SAAS,CAC9C,QAAO,IAAI,MAAM;GACb;GACA,OAAO;GACP,wBAAwB;GACxB,qBAAqB;GACrB,kBAAkB;EACrB,EAAC;AAEN,SAAO;CACV;AACJ"}
@@ -0,0 +1,3 @@
1
+ const require_batch_processor = require('./batch-processor-DFqM_L-_.cjs');
2
+
3
+ exports.BatchProcessor = require_batch_processor.BatchProcessor
@@ -88,4 +88,4 @@ Object.defineProperty(exports, 'BatchProcessor', {
88
88
  return BatchProcessor;
89
89
  }
90
90
  });
91
- //# sourceMappingURL=batch-processor-C8pSzqRE.cjs.map
91
+ //# sourceMappingURL=batch-processor-DFqM_L-_.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"batch-processor-C8pSzqRE.cjs","names":["translator: Translator","texts: string[]","config: BatchLookupConfig","text: string","language: string","mode: FindTermsMode","enabledDictionaryMap: Map<string, FindTermDictionary>","inputMap: Map<string, { index: number; priority: number }>"],"sources":["../src/lookup/batch-processor.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { TermDictionaryEntry } from '../types/dictionary';\nimport type { FindTermDictionary } from '../types/translation';\nimport type { FindTermsMode, Translator } from './translator';\n\nexport interface BatchLookupConfig {\n /** The language code for the lookup. Defaults to 'ja'. */\n language?: string;\n /** The enabled dictionary map for lookups. */\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n /** Maximum number of concurrent lookups. Defaults to 5. */\n concurrency?: number;\n /** The find terms mode. Defaults to 'group'. */\n mode?: FindTermsMode;\n}\n\nexport interface BatchResult {\n /** The original input text. */\n text: string;\n /** The dictionary entries found for this text. */\n entries: TermDictionaryEntry[];\n /** The length of the original text that was matched. */\n originalTextLength: number;\n}\n\n/**\n * Processes multiple text lookups in batch with optional concurrency limiting.\n * Shares the translator's tag cache across lookups for improved performance.\n */\nexport class BatchProcessor {\n private _translator: Translator;\n\n constructor(translator: Translator) {\n this._translator = translator;\n }\n\n /**\n * Looks up multiple texts and returns a map of text to results.\n * Texts are deduplicated before lookup. Concurrency is limited by the\n * `concurrency` config option.\n */\n async batchLookup(texts: string[], config: BatchLookupConfig): Promise<Map<string, BatchResult>> {\n const language = config.language ?? 'ja';\n const concurrency = config.concurrency ?? 5;\n const mode = config.mode ?? 'group';\n const enabledDictionaryMap = this._buildFindTermDictionaryMap(config.enabledDictionaryMap);\n\n // Deduplicate texts\n const uniqueTexts = [...new Set(texts)];\n const results = new Map<string, BatchResult>();\n\n // Process in batches with concurrency limiting\n for (let i = 0; i < uniqueTexts.length; i += concurrency) {\n const batch = uniqueTexts.slice(i, i + concurrency);\n const promises = batch.map(async (text) => {\n const result = await this._lookupSingle(text, language, mode, enabledDictionaryMap);\n results.set(text, result);\n });\n await Promise.all(promises);\n }\n\n return results;\n }\n\n /**\n * Performs a single text lookup.\n */\n private async _lookupSingle(\n text: string,\n language: string,\n mode: FindTermsMode,\n enabledDictionaryMap: Map<string, FindTermDictionary>,\n ): Promise<BatchResult> {\n const options = {\n matchType: 'exact' as const,\n deinflect: true,\n primaryReading: '',\n mainDictionary: '',\n sortFrequencyDictionary: null,\n sortFrequencyDictionaryOrder: 'descending' as const,\n removeNonJapaneseCharacters:\n language === 'ja' || language === 'zh' || language === 'yue' || language === 'ko',\n textReplacements: [null] as null[],\n enabledDictionaryMap,\n excludeDictionaryDefinitions: null,\n searchResolution: 'letter' as const,\n language,\n };\n\n try {\n const { dictionaryEntries, originalTextLength } = await this._translator.findTerms(mode, text, options);\n return {\n text,\n entries: dictionaryEntries,\n originalTextLength,\n };\n } catch {\n return {\n text,\n entries: [],\n originalTextLength: 0,\n };\n }\n }\n\n /**\n * Builds a FindTermDictionary map from the simplified input format.\n */\n private _buildFindTermDictionaryMap(\n inputMap: Map<string, { index: number; priority: number }>,\n ): Map<string, FindTermDictionary> {\n const result = new Map<string, FindTermDictionary>();\n for (const [name, { index }] of inputMap.entries()) {\n result.set(name, {\n index,\n alias: name,\n allowSecondarySearches: false,\n partsOfSpeechFilter: true,\n useDeinflections: true,\n });\n }\n return result;\n }\n}\n"],"mappings":";;;;;;;AA6CA,IAAa,iBAAb,MAA4B;CACxB,AAAQ;CAER,YAAYA,YAAwB;AAChC,OAAK,cAAc;CACtB;;;;;;CAOD,MAAM,YAAYC,OAAiBC,QAA8D;EAC7F,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,cAAc,OAAO,eAAe;EAC1C,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,uBAAuB,KAAK,4BAA4B,OAAO,qBAAqB;EAG1F,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAO;EACvC,MAAM,UAAU,IAAI;AAGpB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,aAAa;GACtD,MAAM,QAAQ,YAAY,MAAM,GAAG,IAAI,YAAY;GACnD,MAAM,WAAW,MAAM,IAAI,OAAO,SAAS;IACvC,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,UAAU,MAAM,qBAAqB;AACnF,YAAQ,IAAI,MAAM,OAAO;GAC5B,EAAC;AACF,SAAM,QAAQ,IAAI,SAAS;EAC9B;AAED,SAAO;CACV;;;;CAKD,MAAc,cACVC,MACAC,UACAC,MACAC,sBACoB;EACpB,MAAM,UAAU;GACZ,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,8BAA8B;GAC9B,6BACI,aAAa,QAAQ,aAAa,QAAQ,aAAa,SAAS,aAAa;GACjF,kBAAkB,CAAC,IAAK;GACxB;GACA,8BAA8B;GAC9B,kBAAkB;GAClB;EACH;AAED,MAAI;GACA,MAAM,EAAE,mBAAmB,oBAAoB,GAAG,MAAM,KAAK,YAAY,UAAU,MAAM,MAAM,QAAQ;AACvG,UAAO;IACH;IACA,SAAS;IACT;GACH;EACJ,QAAO;AACJ,UAAO;IACH;IACA,SAAS,CAAE;IACX,oBAAoB;GACvB;EACJ;CACJ;;;;CAKD,AAAQ,4BACJC,UAC+B;EAC/B,MAAM,SAAS,IAAI;AACnB,OAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS,SAAS,CAC9C,QAAO,IAAI,MAAM;GACb;GACA,OAAO;GACP,wBAAwB;GACxB,qBAAqB;GACrB,kBAAkB;EACrB,EAAC;AAEN,SAAO;CACV;AACJ"}
1
+ {"version":3,"file":"batch-processor-DFqM_L-_.cjs","names":["translator: Translator","texts: string[]","config: BatchLookupConfig","text: string","language: string","mode: FindTermsMode","enabledDictionaryMap: Map<string, FindTermDictionary>","inputMap: Map<string, { index: number; priority: number }>"],"sources":["../src/lookup/batch-processor.ts"],"sourcesContent":["/*\n * Copyright (C) 2023-2025 Yomitan Authors\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\n */\n\nimport type { TermDictionaryEntry } from '../types/dictionary';\nimport type { FindTermDictionary } from '../types/translation';\nimport type { FindTermsMode, Translator } from './translator';\n\nexport interface BatchLookupConfig {\n /** The language code for the lookup. Defaults to 'ja'. */\n language?: string;\n /** The enabled dictionary map for lookups. */\n enabledDictionaryMap: Map<string, { index: number; priority: number }>;\n /** Maximum number of concurrent lookups. Defaults to 5. */\n concurrency?: number;\n /** The find terms mode. Defaults to 'group'. */\n mode?: FindTermsMode;\n}\n\nexport interface BatchResult {\n /** The original input text. */\n text: string;\n /** The dictionary entries found for this text. */\n entries: TermDictionaryEntry[];\n /** The length of the original text that was matched. */\n originalTextLength: number;\n}\n\n/**\n * Processes multiple text lookups in batch with optional concurrency limiting.\n * Shares the translator's tag cache across lookups for improved performance.\n */\nexport class BatchProcessor {\n private _translator: Translator;\n\n constructor(translator: Translator) {\n this._translator = translator;\n }\n\n /**\n * Looks up multiple texts and returns a map of text to results.\n * Texts are deduplicated before lookup. Concurrency is limited by the\n * `concurrency` config option.\n */\n async batchLookup(texts: string[], config: BatchLookupConfig): Promise<Map<string, BatchResult>> {\n const language = config.language ?? 'ja';\n const concurrency = config.concurrency ?? 5;\n const mode = config.mode ?? 'group';\n const enabledDictionaryMap = this._buildFindTermDictionaryMap(config.enabledDictionaryMap);\n\n // Deduplicate texts\n const uniqueTexts = [...new Set(texts)];\n const results = new Map<string, BatchResult>();\n\n // Process in batches with concurrency limiting\n for (let i = 0; i < uniqueTexts.length; i += concurrency) {\n const batch = uniqueTexts.slice(i, i + concurrency);\n const promises = batch.map(async (text) => {\n const result = await this._lookupSingle(text, language, mode, enabledDictionaryMap);\n results.set(text, result);\n });\n await Promise.all(promises);\n }\n\n return results;\n }\n\n /**\n * Performs a single text lookup.\n */\n private async _lookupSingle(\n text: string,\n language: string,\n mode: FindTermsMode,\n enabledDictionaryMap: Map<string, FindTermDictionary>,\n ): Promise<BatchResult> {\n const options = {\n matchType: 'exact' as const,\n deinflect: true,\n primaryReading: '',\n mainDictionary: '',\n sortFrequencyDictionary: null,\n sortFrequencyDictionaryOrder: 'descending' as const,\n removeNonJapaneseCharacters:\n language === 'ja' || language === 'zh' || language === 'yue' || language === 'ko',\n textReplacements: [null] as null[],\n enabledDictionaryMap,\n excludeDictionaryDefinitions: null,\n searchResolution: 'letter' as const,\n language,\n };\n\n try {\n const { dictionaryEntries, originalTextLength } = await this._translator.findTerms(mode, text, options);\n return {\n text,\n entries: dictionaryEntries,\n originalTextLength,\n };\n } catch {\n return {\n text,\n entries: [],\n originalTextLength: 0,\n };\n }\n }\n\n /**\n * Builds a FindTermDictionary map from the simplified input format.\n */\n private _buildFindTermDictionaryMap(\n inputMap: Map<string, { index: number; priority: number }>,\n ): Map<string, FindTermDictionary> {\n const result = new Map<string, FindTermDictionary>();\n for (const [name, { index }] of inputMap.entries()) {\n result.set(name, {\n index,\n alias: name,\n allowSecondarySearches: false,\n partsOfSpeechFilter: true,\n useDeinflections: true,\n });\n }\n return result;\n }\n}\n"],"mappings":";;;;;;;AA6CA,IAAa,iBAAb,MAA4B;CACxB,AAAQ;CAER,YAAYA,YAAwB;AAChC,OAAK,cAAc;CACtB;;;;;;CAOD,MAAM,YAAYC,OAAiBC,QAA8D;EAC7F,MAAM,WAAW,OAAO,YAAY;EACpC,MAAM,cAAc,OAAO,eAAe;EAC1C,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,uBAAuB,KAAK,4BAA4B,OAAO,qBAAqB;EAG1F,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAO;EACvC,MAAM,UAAU,IAAI;AAGpB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,aAAa;GACtD,MAAM,QAAQ,YAAY,MAAM,GAAG,IAAI,YAAY;GACnD,MAAM,WAAW,MAAM,IAAI,OAAO,SAAS;IACvC,MAAM,SAAS,MAAM,KAAK,cAAc,MAAM,UAAU,MAAM,qBAAqB;AACnF,YAAQ,IAAI,MAAM,OAAO;GAC5B,EAAC;AACF,SAAM,QAAQ,IAAI,SAAS;EAC9B;AAED,SAAO;CACV;;;;CAKD,MAAc,cACVC,MACAC,UACAC,MACAC,sBACoB;EACpB,MAAM,UAAU;GACZ,WAAW;GACX,WAAW;GACX,gBAAgB;GAChB,gBAAgB;GAChB,yBAAyB;GACzB,8BAA8B;GAC9B,6BACI,aAAa,QAAQ,aAAa,QAAQ,aAAa,SAAS,aAAa;GACjF,kBAAkB,CAAC,IAAK;GACxB;GACA,8BAA8B;GAC9B,kBAAkB;GAClB;EACH;AAED,MAAI;GACA,MAAM,EAAE,mBAAmB,oBAAoB,GAAG,MAAM,KAAK,YAAY,UAAU,MAAM,MAAM,QAAQ;AACvG,UAAO;IACH;IACA,SAAS;IACT;GACH;EACJ,QAAO;AACJ,UAAO;IACH;IACA,SAAS,CAAE;IACX,oBAAoB;GACvB;EACJ;CACJ;;;;CAKD,AAAQ,4BACJC,UAC+B;EAC/B,MAAM,SAAS,IAAI;AACnB,OAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS,SAAS,CAC9C,QAAO,IAAI,MAAM;GACb;GACA,OAAO;GACP,wBAAwB;GACxB,qBAAqB;GACrB,kBAAkB;EACrB,EAAC;AAEN,SAAO;CACV;AACJ"}
@@ -0,0 +1,3 @@
1
+ import { BatchProcessor } from "./batch-processor-BR-gB3H3.js";
2
+
3
+ export { BatchProcessor };
@@ -99,4 +99,4 @@ type Timeout = number | ReturnType<typeof setTimeout>;
99
99
  //# sourceMappingURL=core.d.ts.map
100
100
 
101
101
  export { ApiReflectResult, CanAddNotesDetail, CardId, CardInfo, DeferredPromiseDetails, EventArgument, EventDispatcherOffGeneric, EventHandler, EventHandlerAny, EventNames, EventSurface, MessageBody, Note, NoteFieldInfo, NoteFields, NoteId, NoteInfo, NoteInfoWrapper, NoteWithId, RejectionReason, SafeAny, SerializableObject, Timeout, TokenObject, TokenString, TypeofResult, UnknownObject };
102
- //# sourceMappingURL=core-C_0QjRBI.d.ts.map
102
+ //# sourceMappingURL=core-CRjMTF7c.d.ts.map