yomitan-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +485 -0
- package/dist/anki-connect-BQyCGW3O.cjs +513 -0
- package/dist/anki-connect-BQyCGW3O.cjs.map +1 -0
- package/dist/anki-connect-CPPuhyiQ.js +6 -0
- package/dist/anki-connect-DbrQHphS.js +495 -0
- package/dist/anki-connect-DbrQHphS.js.map +1 -0
- package/dist/anki-connect-DcheJrp-.cjs +6 -0
- package/dist/anki.cjs +1758 -0
- package/dist/anki.cjs.map +1 -0
- package/dist/anki.d.cts +751 -0
- package/dist/anki.d.cts.map +1 -0
- package/dist/anki.d.ts +751 -0
- package/dist/anki.d.ts.map +1 -0
- package/dist/anki.js +1751 -0
- package/dist/anki.js.map +1 -0
- package/dist/audio-D9DvYyB7.d.cts +48 -0
- package/dist/audio-D9DvYyB7.d.cts.map +1 -0
- package/dist/audio-DQulUkDM.d.ts +48 -0
- package/dist/audio-DQulUkDM.d.ts.map +1 -0
- package/dist/audio-url-generator-BXvQaqUi.cjs +4 -0
- package/dist/audio-url-generator-Dy2hb2Mm.cjs +414 -0
- package/dist/audio-url-generator-Dy2hb2Mm.cjs.map +1 -0
- package/dist/audio-url-generator-Qi0rfzHz.js +4 -0
- package/dist/audio-url-generator-pFQAB5Nb.js +390 -0
- package/dist/audio-url-generator-pFQAB5Nb.js.map +1 -0
- package/dist/audio.cjs +7 -0
- package/dist/audio.d.cts +86 -0
- package/dist/audio.d.cts.map +1 -0
- package/dist/audio.d.ts +86 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +4 -0
- package/dist/batch-processor-BR-gB3H3.js +84 -0
- package/dist/batch-processor-BR-gB3H3.js.map +1 -0
- package/dist/batch-processor-CSF1acTw.cjs +3 -0
- package/dist/batch-processor-DFqM_L-_.cjs +91 -0
- package/dist/batch-processor-DFqM_L-_.cjs.map +1 -0
- package/dist/batch-processor-Quo9jUyf.js +3 -0
- package/dist/chunk-BCwAaXi7.cjs +31 -0
- package/dist/cjk-util-Dp0ZU0sh.cjs +167 -0
- package/dist/cjk-util-Dp0ZU0sh.cjs.map +1 -0
- package/dist/cjk-util-DubXBGDG.js +94 -0
- package/dist/cjk-util-DubXBGDG.js.map +1 -0
- package/dist/core-BUpclilG.d.cts +102 -0
- package/dist/core-BUpclilG.d.cts.map +1 -0
- package/dist/core-DFUj5GtA.d.ts +102 -0
- package/dist/core-DFUj5GtA.d.ts.map +1 -0
- package/dist/database.cjs +7 -0
- package/dist/database.d.cts +4 -0
- package/dist/database.d.ts +4 -0
- package/dist/database.js +5 -0
- package/dist/dictionary-D7l-qFt1.d.cts +316 -0
- package/dist/dictionary-D7l-qFt1.d.cts.map +1 -0
- package/dist/dictionary-_vzfBLWi.d.ts +316 -0
- package/dist/dictionary-_vzfBLWi.d.ts.map +1 -0
- package/dist/dictionary-data-util-CHnRdYZ9.cjs +378 -0
- package/dist/dictionary-data-util-CHnRdYZ9.cjs.map +1 -0
- package/dist/dictionary-data-util-CfOLfEDE.js +323 -0
- package/dist/dictionary-data-util-CfOLfEDE.js.map +1 -0
- package/dist/dictionary-database-BDC2f9zc.d.ts +58 -0
- package/dist/dictionary-database-BDC2f9zc.d.ts.map +1 -0
- package/dist/dictionary-database-CU4TsvCC.js +393 -0
- package/dist/dictionary-database-CU4TsvCC.js.map +1 -0
- package/dist/dictionary-database-DsOi04Sg.d.cts +58 -0
- package/dist/dictionary-database-DsOi04Sg.d.cts.map +1 -0
- package/dist/dictionary-database-lvFvftnO.cjs +412 -0
- package/dist/dictionary-database-lvFvftnO.cjs.map +1 -0
- package/dist/dictionary-importer-BkQQSBhm.d.ts +237 -0
- package/dist/dictionary-importer-BkQQSBhm.d.ts.map +1 -0
- package/dist/dictionary-importer-Cen1z6co.js +1821 -0
- package/dist/dictionary-importer-Cen1z6co.js.map +1 -0
- package/dist/dictionary-importer-DYmmWmcX.cjs +8 -0
- package/dist/dictionary-importer-Da3AuTZw.d.cts +237 -0
- package/dist/dictionary-importer-Da3AuTZw.d.cts.map +1 -0
- package/dist/dictionary-importer-Dhn75iZ4.cjs +1834 -0
- package/dist/dictionary-importer-Dhn75iZ4.cjs.map +1 -0
- package/dist/dictionary-importer-xWkel0h-.js +8 -0
- package/dist/dictionary-update-checker-BNE4pGTx.js +4 -0
- package/dist/dictionary-update-checker-Byjvifd2.cjs +75 -0
- package/dist/dictionary-update-checker-Byjvifd2.cjs.map +1 -0
- package/dist/dictionary-update-checker-YdpalZ41.cjs +4 -0
- package/dist/dictionary-update-checker-kKukiovj.js +69 -0
- package/dist/dictionary-update-checker-kKukiovj.js.map +1 -0
- package/dist/display-generator-BGVWiI0t.js +746 -0
- package/dist/display-generator-BGVWiI0t.js.map +1 -0
- package/dist/display-generator-BMQmG5Ov.cjs +9 -0
- package/dist/display-generator-BxZ7mBjP.js +9 -0
- package/dist/display-generator-DyP-HNzP.cjs +758 -0
- package/dist/display-generator-DyP-HNzP.cjs.map +1 -0
- package/dist/errors-BSezaJwm.cjs +35 -0
- package/dist/errors-BSezaJwm.cjs.map +1 -0
- package/dist/errors-DuuDSO5N.js +22 -0
- package/dist/errors-DuuDSO5N.js.map +1 -0
- package/dist/frequency-ranking-BXjfhhUQ.js +3 -0
- package/dist/frequency-ranking-Cx1kkIrw.cjs +3 -0
- package/dist/frequency-ranking-DEJMTMdg.js +159 -0
- package/dist/frequency-ranking-DEJMTMdg.js.map +1 -0
- package/dist/frequency-ranking-DVYxTXN-.cjs +166 -0
- package/dist/frequency-ranking-DVYxTXN-.cjs.map +1 -0
- package/dist/furigana-5HK97CY8.js +4 -0
- package/dist/furigana-9bBI9-qe.d.ts +47 -0
- package/dist/furigana-9bBI9-qe.d.ts.map +1 -0
- package/dist/furigana-B3-0y231.js +471 -0
- package/dist/furigana-B3-0y231.js.map +1 -0
- package/dist/furigana-CjOhzvZt.d.cts +47 -0
- package/dist/furigana-CjOhzvZt.d.cts.map +1 -0
- package/dist/furigana-DpZLcues.cjs +609 -0
- package/dist/furigana-DpZLcues.cjs.map +1 -0
- package/dist/furigana-h3v2ub4-.cjs +4 -0
- package/dist/import.cjs +12 -0
- package/dist/import.d.cts +107 -0
- package/dist/import.d.cts.map +1 -0
- package/dist/import.d.ts +107 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +9 -0
- package/dist/index.cjs +275 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +211 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +211 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +238 -0
- package/dist/index.js.map +1 -0
- package/dist/json-DGd-cunA.js +17 -0
- package/dist/json-DGd-cunA.js.map +1 -0
- package/dist/json-DKWp-B7Y.cjs +30 -0
- package/dist/json-DKWp-B7Y.cjs.map +1 -0
- package/dist/language-KN_u-nTR.d.ts +104 -0
- package/dist/language-KN_u-nTR.d.ts.map +1 -0
- package/dist/language-xAbQxgXc.d.cts +104 -0
- package/dist/language-xAbQxgXc.d.cts.map +1 -0
- package/dist/language.cjs +15626 -0
- package/dist/language.cjs.map +1 -0
- package/dist/language.d.cts +959 -0
- package/dist/language.d.cts.map +1 -0
- package/dist/language.d.ts +959 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +15522 -0
- package/dist/language.js.map +1 -0
- package/dist/log-D8KtR3aP.cjs +67 -0
- package/dist/log-D8KtR3aP.cjs.map +1 -0
- package/dist/log-hgSll-dS.js +60 -0
- package/dist/log-hgSll-dS.js.map +1 -0
- package/dist/lookup.cjs +13 -0
- package/dist/lookup.d.cts +161 -0
- package/dist/lookup.d.cts.map +1 -0
- package/dist/lookup.d.ts +161 -0
- package/dist/lookup.d.ts.map +1 -0
- package/dist/lookup.js +10 -0
- package/dist/media-loader-BABA_E4W.js +3 -0
- package/dist/media-loader-Ce9cuANS.cjs +21 -0
- package/dist/media-loader-Ce9cuANS.cjs.map +1 -0
- package/dist/media-loader-qRti-Q6h.js +14 -0
- package/dist/media-loader-qRti-Q6h.js.map +1 -0
- package/dist/media-loader-xlUGaJrx.cjs +3 -0
- package/dist/multi-language-transformer-AlxOM6b3.js +637 -0
- package/dist/multi-language-transformer-AlxOM6b3.js.map +1 -0
- package/dist/multi-language-transformer-MdbQBBOt.cjs +685 -0
- package/dist/multi-language-transformer-MdbQBBOt.cjs.map +1 -0
- package/dist/multi-language-transformer-SEhcJXEB.d.ts +63 -0
- package/dist/multi-language-transformer-SEhcJXEB.d.ts.map +1 -0
- package/dist/multi-language-transformer-Ul9mbRce.d.cts +63 -0
- package/dist/multi-language-transformer-Ul9mbRce.d.cts.map +1 -0
- package/dist/pronunciation-generator-BtBc4q_V.js +397 -0
- package/dist/pronunciation-generator-BtBc4q_V.js.map +1 -0
- package/dist/pronunciation-generator-CBYdXYou.js +4 -0
- package/dist/pronunciation-generator-CFbZlf5J.cjs +445 -0
- package/dist/pronunciation-generator-CFbZlf5J.cjs.map +1 -0
- package/dist/pronunciation-generator-DOz9hEuk.cjs +4 -0
- package/dist/render.cjs +2796 -0
- package/dist/render.cjs.map +1 -0
- package/dist/render.d.cts +424 -0
- package/dist/render.d.cts.map +1 -0
- package/dist/render.d.ts +424 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +2777 -0
- package/dist/render.js.map +1 -0
- package/dist/sentence-parser-BPAJNzqW.js +126 -0
- package/dist/sentence-parser-BPAJNzqW.js.map +1 -0
- package/dist/sentence-parser-BVIOI64h.cjs +132 -0
- package/dist/sentence-parser-BVIOI64h.cjs.map +1 -0
- package/dist/sentence-parser-BoHO3cHn.js +5 -0
- package/dist/sentence-parser-DQVLSW0z.cjs +5 -0
- package/dist/structured-content-generator-BtOApkTW.cjs +4 -0
- package/dist/structured-content-generator-Bx62RYa8.js +4 -0
- package/dist/structured-content-generator-CLnybumI.js +276 -0
- package/dist/structured-content-generator-CLnybumI.js.map +1 -0
- package/dist/structured-content-generator-DrwkB0-k.cjs +282 -0
- package/dist/structured-content-generator-DrwkB0-k.cjs.map +1 -0
- package/dist/text-utilities-B7PIythe.js +8 -0
- package/dist/text-utilities-B7PIythe.js.map +1 -0
- package/dist/text-utilities-Del2Ivkg.cjs +15 -0
- package/dist/text-utilities-Del2Ivkg.cjs.map +1 -0
- package/dist/translator-CRPlPzqi.cjs +1545 -0
- package/dist/translator-CRPlPzqi.cjs.map +1 -0
- package/dist/translator-CWgG5drA.js +1539 -0
- package/dist/translator-CWgG5drA.js.map +1 -0
- package/dist/translator-CaGtJvnQ.cjs +6 -0
- package/dist/translator-Cc6OGxrW.d.ts +180 -0
- package/dist/translator-Cc6OGxrW.d.ts.map +1 -0
- package/dist/translator-CcA-s-W4.d.cts +180 -0
- package/dist/translator-CcA-s-W4.d.cts.map +1 -0
- package/dist/translator-CuJOTK6l.js +6 -0
- package/dist/utilities-C-lbZaJE.cjs +52 -0
- package/dist/utilities-C-lbZaJE.cjs.map +1 -0
- package/dist/utilities-bi3EF-q5.js +33 -0
- package/dist/utilities-bi3EF-q5.js.map +1 -0
- package/package.json +102 -0
package/dist/anki.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anki.js","names":["templateRenderer: TemplateRenderer","api?: MinimalApi","duplicateScopeDeckName: string | null","allErrors: Error[]","media: Media | undefined","errors: SerializedError[]","noteFields: NoteFields","note: Note","dictionaryEntry: DictionaryEntry","term","reading","cardFormat: AnkiCardFormat","context: Context","resultOutputMode: ResultOutputMode","glossaryLayoutMode: GlossaryLayoutMode","compactTags: boolean","dictionaryStylesMap: Map<string, string>","field: string","commonData: CommonData","template: string","errors: YomitanError[]","requirements: Requirement[]","str: string","regex: RegExp","replacer: (match: RegExpExecArray, index: number, str: string) => string | Promise<string>","match: RegExpExecArray | null","parts: (Promise<string> | string)[]","result: BatchedRequestGroup","marker: string","allRequests: BatchedRequestData[]","items: RenderMultiItem[]","templateItems: RenderMultiTemplateItem[]","datas: PartialRenderData[]","requests: BatchedRequestData[]","responses: RenderMultiResponse[]","mediaOptions: MediaOptions","dictionaryMediaDetails: { dictionary: string; path: string }[]","audioDetails: unknown","screenshotDetails: unknown","dictionaryMedia: DictionaryMedia","media: Media","error: SerializedError","getter: () => T","item: CachedValue<T>","marker: string","details: CommonData","resolvedMedia: Media","result: NoteData","dictionaryEntry: Dictionary.TermDictionaryEntry","dictionaryEntry: Dictionary.DictionaryEntry","context: Context","dictionaryEntry: Dictionary.TermDictionaryEntry | Dictionary.KanjiDictionaryEntry","requestedHeadwordIndex: number | null","previousDictionary: string | undefined","frequencies: FrequencyNumber[]","headwordIndex: number | null","results: PitchGroup[]","pitches: Pitch[]","results: TranscriptionGroup[]","phoneticTranscriptions: Transcription[]","cachedPitches: CachedValue<PitchGroup[]>","resultOutputMode: ResultOutputMode","dictionaryStylesMap: Map<string, string>","glossaryLayoutMode: GlossaryLayoutMode","dictionaryEntry: Dictionary.KanjiDictionaryEntry","results: KanjiStatGroups","results: KanjiFrequencyEntry[]","type: TermDictionaryEntryType","_dictionaryStylesMap: Map<string, string>","_glossaryLayoutMode: GlossaryLayoutMode","definitions: TermDefinition[]","definitionTags: Tag[]","definitionTags2: Tag[]","results: TermFrequencyEntry[]","results: TermPitchAccent[]","pitches: Dictionary.PitchAccent[]","results: { positions: number | string; tags: Tag[] }[]","results: TermPhoneticTranscription[]","phoneticTranscriptions: Dictionary.PhoneticTranscription[]","results: { ipa: string; tags: Tag[] }[]","results: TermHeadword[]","item: TermHeadword","i: number","cachedTermTags: CachedValue<Tag[]>","results: DictionaryData.TermGlossaryContent[]","results: Tag[]","tags: Dictionary.Tag[]","results: PitchTag[]","text: string | undefined","offset: number | undefined","textSegments: string[]","term: string","reading: string","result: FuriganaSegment[]","value: Requirement[] | null","root: NoteData","args: unknown[]","namedArgs: SerializableObject","handlebars: HandlebarsInstance","value: Requirement","data: { value: string }","media: Media","type: 'audio' | 'screenshot' | 'clipboardImage' | 'clipboardText' | 'popupSelectionText'","path: unknown","text: unknown","furiganaFormat: 'furiganaHtml' | 'furiganaPlain'","value: unknown","helpers: [string, HelperFunction][]","name: string","details: DataType","setup: ((data: NoteData) => { requirements: Requirement[] }) | null","cleanup: ((data: NoteData) => void) | null","template: string","data: PartialRenderData","type: string","items: RenderMultiItem[]","results: RenderMultiResponse[]","result: RenderMultiResponse","data: CompositeRenderData","instance: (data: NoteData) => string","data: NoteData","result: string","additions1: { requirements: Requirement[] } | null","commonData: CommonData | undefined","compositeData: CompositeRenderData","maxSize: number","helper: HelperFunction","commonData: CommonData","requirements: Requirement[]","text: string","context: unknown","options: HelperOptions","expression: unknown","reading: unknown","string: string","_args: unknown[]","parts: string[]","g0: string","tagSources: { name: string }[][]","results: string[]","result: unknown[]","operator: string","operand1: SafeAny","operand2: SafeAny","operand3: SafeAny","_context: unknown","HIRAGANA_CONVERSION_RANGE: [number, number]","KATAKANA_CONVERSION_RANGE: [number, number]","moraIndex: number","pitchAccentPosition: number | string","morae: string[]","reading: string","positions: number | string","isVerbOrAdjective: boolean"],"sources":["../src/anki/anki-note-builder.ts","../src/anki/anki-note-data-creator.ts","../src/anki/anki-template-renderer.ts"],"sourcesContent":["import type { Note, NoteFields } from '../types/anki';\nimport type { DictionaryEntry, TermDictionaryEntry } from '../types/dictionary';\nimport { cloneFieldMarkerPattern, getRootDeckName } from '../util/anki-util';\nimport { YomitanError } from '../util/errors';\nimport { deferPromise } from '../util/utilities';\n\n// --- Interfaces for injection ---\n\n/**\n * Represents a template rendering result.\n */\nexport type RenderResult = {\n result: string;\n requirements: Requirement[];\n};\n\n/**\n * Represents a rendering response from renderMulti.\n */\nexport type RenderMultiResponse = {\n result?: RenderResult;\n error?: SerializedError;\n};\n\nexport type SerializedError = {\n name?: string;\n message?: string;\n stack?: string;\n data?: unknown;\n};\n\n/**\n * Interface for a template renderer that can be injected into AnkiNoteBuilder.\n */\nexport interface TemplateRenderer {\n getModifiedData(data: { marker: string; commonData: CommonData }, type: string): Promise<NoteData>;\n renderMulti(items: RenderMultiItem[]): Promise<RenderMultiResponse[]>;\n}\n\nexport type RenderMultiItem = {\n template: string;\n templateItems: RenderMultiTemplateItem[];\n};\n\nexport type RenderMultiTemplateItem = {\n type: string;\n commonData: CommonData;\n datas: PartialRenderData[];\n};\n\nexport type PartialRenderData = {\n marker: string;\n};\n\n/**\n * Common data passed through the template rendering process.\n */\nexport type CommonData = {\n dictionaryEntry: DictionaryEntry;\n cardFormat: AnkiCardFormat;\n context: Context;\n resultOutputMode: ResultOutputMode;\n glossaryLayoutMode: GlossaryLayoutMode;\n compactTags: boolean;\n media?: Media;\n dictionaryStylesMap: Map<string, string>;\n};\n\nexport type AnkiCardFormat = {\n deck: string;\n model: string;\n fields: { [fieldName: string]: { value: string } };\n};\n\nexport type Context = {\n url: string;\n sentence?: { text: string; offset: number };\n query: string;\n fullQuery: string;\n documentTitle?: string;\n};\n\nexport type ResultOutputMode = 'group' | 'merge' | 'split';\nexport type GlossaryLayoutMode = 'default' | 'compact' | 'compact-popup-anki';\n\nexport type MediaObject = { value: string };\n\nexport type Media = {\n audio?: MediaObject;\n screenshot?: MediaObject;\n clipboardImage?: MediaObject;\n clipboardText?: MediaObject;\n popupSelectionText?: MediaObject;\n textFurigana: TextFuriganaSegment[];\n dictionaryMedia: DictionaryMedia;\n};\n\nexport type TextFuriganaSegment = {\n text: string;\n readingMode: TextFuriganaReadingMode | null;\n detailsHtml: MediaObject;\n detailsPlain: MediaObject;\n};\n\nexport type TextFuriganaReadingMode = 'hiragana' | 'katakana';\n\nexport type DictionaryMedia = {\n [dictionary: string]: {\n [path: string]: MediaObject;\n };\n};\n\nexport type NoteData = Record<string, unknown>;\n\nexport type Requirement =\n | { type: 'audio' }\n | { type: 'screenshot' }\n | { type: 'clipboardImage' }\n | { type: 'clipboardText' }\n | { type: 'popupSelectionText' }\n | { type: 'textFurigana'; text: string; readingMode: TextFuriganaReadingMode | null }\n | { type: 'dictionaryMedia'; dictionary: string; path: string };\n\nexport type CreateNoteDetails = {\n dictionaryEntry: DictionaryEntry;\n cardFormat: AnkiCardFormat;\n context: Context;\n template: string;\n tags?: string[];\n requirements?: Requirement[];\n duplicateScope?: string;\n duplicateScopeCheckAllModels?: boolean;\n resultOutputMode?: ResultOutputMode;\n glossaryLayoutMode?: GlossaryLayoutMode;\n compactTags?: boolean;\n mediaOptions?: MediaOptions | null;\n dictionaryStylesMap?: Map<string, string>;\n};\n\nexport type MediaOptions = {\n audio?: {\n sources: { type: string; url: string; voice: string }[];\n preferredAudioIndex: number | null;\n idleTimeout: number | null;\n languageSummary: unknown;\n enableDefaultAudioSources: boolean;\n };\n screenshot?: {\n format: string;\n quality: number;\n contentOrigin: { tabId: number; frameId: number };\n };\n textParsing?: {\n optionsContext: unknown;\n scanLength: number;\n };\n};\n\nexport type CreateNoteResult = {\n note: Note;\n errors: Error[];\n requirements: Requirement[];\n};\n\nexport type InjectAnkiNoteMediaDefinitionDetails =\n | { type: 'kanji'; character: string }\n | { type: 'term'; term: string; reading: string };\n\n// Batched request types\ntype BatchedRequestData = {\n resolve: (value: RenderResult) => void;\n reject: (reason?: unknown) => void;\n marker: string;\n};\n\ntype BatchedRequestGroup = {\n template: string;\n commonDataRequestsMap: Map<CommonData, BatchedRequestData[]>;\n};\n\n/**\n * Minimal API interface needed by AnkiNoteBuilder for media injection.\n */\nexport interface MinimalApi {\n injectAnkiNoteMedia(\n timestamp: number,\n dictionaryEntryDetails: InjectAnkiNoteMediaDefinitionDetails,\n audioDetails: unknown,\n screenshotDetails: unknown,\n clipboardDetails: { image: boolean; text: boolean },\n dictionaryMediaDetails: { dictionary: string; path: string }[],\n ): Promise<{\n audioFileName: string | null;\n screenshotFileName: string | null;\n clipboardImageFileName: string | null;\n clipboardText: string | null;\n dictionaryMedia: { dictionary: string; path: string; fileName: string | null }[];\n errors: SerializedError[];\n }>;\n parseText(\n text: string,\n optionsContext: unknown,\n scanLength: number,\n useInternalParser: boolean,\n useMecabParser: boolean,\n ): Promise<{ source: string; content: unknown }[]>;\n}\n\n/**\n * Builds Anki notes from dictionary entries using template rendering.\n */\nexport class AnkiNoteBuilder {\n private _api: MinimalApi | null;\n private _markerPattern: RegExp;\n private _templateRenderer: TemplateRenderer;\n private _batchedRequests: BatchedRequestGroup[];\n private _batchedRequestsQueued: boolean;\n\n constructor(templateRenderer: TemplateRenderer, api?: MinimalApi) {\n this._api = api ?? null;\n this._markerPattern = cloneFieldMarkerPattern(true);\n this._templateRenderer = templateRenderer;\n this._batchedRequests = [];\n this._batchedRequestsQueued = false;\n }\n\n async createNote({\n dictionaryEntry,\n cardFormat,\n context,\n template,\n tags = [],\n requirements = [],\n duplicateScope = 'collection',\n duplicateScopeCheckAllModels = false,\n resultOutputMode = 'split',\n glossaryLayoutMode = 'default',\n compactTags = false,\n mediaOptions = null,\n dictionaryStylesMap = new Map(),\n }: CreateNoteDetails): Promise<CreateNoteResult> {\n const { deck: deckName, model: modelName, fields: fieldsSettings } = cardFormat;\n const fields = Object.entries(fieldsSettings);\n let duplicateScopeDeckName: string | null = null;\n let duplicateScopeCheckChildren = false;\n if (duplicateScope === 'deck-root') {\n duplicateScope = 'deck';\n duplicateScopeDeckName = getRootDeckName(deckName);\n duplicateScopeCheckChildren = true;\n }\n\n const allErrors: Error[] = [];\n let media: Media | undefined;\n if (requirements.length > 0 && mediaOptions !== null && this._api !== null) {\n let errors: SerializedError[];\n ({ media, errors } = await this._injectMedia(dictionaryEntry, requirements, mediaOptions));\n for (const error of errors) {\n allErrors.push(this._deserializeError(error));\n }\n }\n\n const commonData = this._createData(\n dictionaryEntry,\n cardFormat,\n context,\n resultOutputMode,\n glossaryLayoutMode,\n compactTags,\n media,\n dictionaryStylesMap,\n );\n const formattedFieldValuePromises = [];\n for (const [, { value: fieldValue }] of fields) {\n const formattedFieldValuePromise = this._formatField(fieldValue, commonData, template);\n formattedFieldValuePromises.push(formattedFieldValuePromise);\n }\n\n const formattedFieldValues = await Promise.all(formattedFieldValuePromises);\n const uniqueRequirements = new Map<string, Requirement>();\n const noteFields: NoteFields = {};\n for (let i = 0, ii = fields.length; i < ii; ++i) {\n const fieldName = fields[i][0];\n const { value, errors: fieldErrors, requirements: fieldRequirements } = formattedFieldValues[i];\n noteFields[fieldName] = value;\n allErrors.push(...fieldErrors);\n for (const requirement of fieldRequirements) {\n const key = JSON.stringify(requirement);\n if (uniqueRequirements.has(key)) {\n continue;\n }\n uniqueRequirements.set(key, requirement);\n }\n }\n\n const note: Note = {\n fields: noteFields,\n tags,\n deckName,\n modelName,\n options: {\n allowDuplicate: true,\n duplicateScope,\n duplicateScopeOptions: {\n deckName: duplicateScopeDeckName,\n checkChildren: duplicateScopeCheckChildren,\n checkAllModels: duplicateScopeCheckAllModels,\n },\n },\n };\n return { note, errors: allErrors, requirements: [...uniqueRequirements.values()] };\n }\n\n async getRenderingData({\n dictionaryEntry,\n cardFormat,\n context,\n resultOutputMode = 'split',\n glossaryLayoutMode = 'default',\n compactTags = false,\n marker,\n dictionaryStylesMap,\n }: {\n dictionaryEntry: DictionaryEntry;\n cardFormat: AnkiCardFormat;\n context: Context;\n resultOutputMode?: ResultOutputMode;\n glossaryLayoutMode?: GlossaryLayoutMode;\n compactTags?: boolean;\n marker: string;\n dictionaryStylesMap: Map<string, string>;\n }): Promise<NoteData> {\n const commonData = this._createData(\n dictionaryEntry,\n cardFormat,\n context,\n resultOutputMode,\n glossaryLayoutMode,\n compactTags,\n undefined,\n dictionaryStylesMap,\n );\n return await this._templateRenderer.getModifiedData({ marker, commonData }, 'ankiNote');\n }\n\n getDictionaryEntryDetailsForNote(dictionaryEntry: DictionaryEntry): InjectAnkiNoteMediaDefinitionDetails {\n const { type } = dictionaryEntry;\n if (type === 'kanji') {\n const { character } = dictionaryEntry;\n return { type, character };\n }\n\n const { headwords } = dictionaryEntry;\n let bestIndex = -1;\n for (let i = 0, ii = headwords.length; i < ii; ++i) {\n const { term, reading, sources } = headwords[i];\n for (const { deinflectedText } of sources) {\n if (term === deinflectedText) {\n bestIndex = i;\n i = ii;\n break;\n }\n if (reading === deinflectedText && bestIndex < 0) {\n bestIndex = i;\n break;\n }\n }\n }\n\n const { term, reading } = headwords[Math.max(0, bestIndex)];\n return { type, term, reading };\n }\n\n // Private\n\n private _createData(\n dictionaryEntry: DictionaryEntry,\n cardFormat: AnkiCardFormat,\n context: Context,\n resultOutputMode: ResultOutputMode,\n glossaryLayoutMode: GlossaryLayoutMode,\n compactTags: boolean,\n media: Media | undefined,\n dictionaryStylesMap: Map<string, string>,\n ): CommonData {\n return {\n dictionaryEntry,\n cardFormat,\n context,\n resultOutputMode,\n glossaryLayoutMode,\n compactTags,\n media,\n dictionaryStylesMap,\n };\n }\n\n private async _formatField(\n field: string,\n commonData: CommonData,\n template: string,\n ): Promise<{ value: string; errors: YomitanError[]; requirements: Requirement[] }> {\n const errors: YomitanError[] = [];\n const requirements: Requirement[] = [];\n const value = await this._stringReplaceAsync(field, this._markerPattern, async (match) => {\n const marker = match[1];\n try {\n const { result, requirements: fieldRequirements } = await this._renderTemplateBatched(\n template,\n commonData,\n marker,\n );\n requirements.push(...fieldRequirements);\n return result;\n } catch (e) {\n const error = new YomitanError(`Template render error for {${marker}}`);\n error.data = { error: e };\n errors.push(error);\n return `{${marker}-render-error}`;\n }\n });\n return { value, errors, requirements };\n }\n\n private async _stringReplaceAsync(\n str: string,\n regex: RegExp,\n replacer: (match: RegExpExecArray, index: number, str: string) => string | Promise<string>,\n ): Promise<string> {\n let match: RegExpExecArray | null;\n let index = 0;\n const parts: (Promise<string> | string)[] = [];\n while ((match = regex.exec(str)) !== null) {\n parts.push(str.substring(index, match.index), replacer(match, match.index, str));\n index = regex.lastIndex;\n }\n if (parts.length === 0) {\n return str;\n }\n parts.push(str.substring(index));\n return (await Promise.all(parts)).join('');\n }\n\n private _getBatchedTemplateGroup(template: string): BatchedRequestGroup {\n for (const item of this._batchedRequests) {\n if (item.template === template) {\n return item;\n }\n }\n\n const result: BatchedRequestGroup = { template, commonDataRequestsMap: new Map() };\n this._batchedRequests.push(result);\n return result;\n }\n\n private _renderTemplateBatched(template: string, commonData: CommonData, marker: string): Promise<RenderResult> {\n const { promise, resolve, reject } = deferPromise<RenderResult>();\n const { commonDataRequestsMap } = this._getBatchedTemplateGroup(template);\n let requests = commonDataRequestsMap.get(commonData);\n if (typeof requests === 'undefined') {\n requests = [];\n commonDataRequestsMap.set(commonData, requests);\n }\n requests.push({ resolve, reject, marker });\n this._runBatchedRequestsDelayed();\n return promise;\n }\n\n private _runBatchedRequestsDelayed(): void {\n if (this._batchedRequestsQueued) {\n return;\n }\n this._batchedRequestsQueued = true;\n void Promise.resolve().then(() => {\n this._batchedRequestsQueued = false;\n this._runBatchedRequests();\n });\n }\n\n private _runBatchedRequests(): void {\n if (this._batchedRequests.length === 0) {\n return;\n }\n\n const allRequests: BatchedRequestData[] = [];\n const items: RenderMultiItem[] = [];\n for (const { template, commonDataRequestsMap } of this._batchedRequests) {\n const templateItems: RenderMultiTemplateItem[] = [];\n for (const [commonData, requests] of commonDataRequestsMap.entries()) {\n const datas: PartialRenderData[] = [];\n for (const { marker } of requests) {\n datas.push({ marker });\n }\n allRequests.push(...requests);\n templateItems.push({\n type: 'ankiNote',\n commonData,\n datas,\n });\n }\n items.push({ template, templateItems });\n }\n\n this._batchedRequests.length = 0;\n\n void this._resolveBatchedRequests(items, allRequests);\n }\n\n private async _resolveBatchedRequests(items: RenderMultiItem[], requests: BatchedRequestData[]): Promise<void> {\n let responses: RenderMultiResponse[];\n try {\n responses = await this._templateRenderer.renderMulti(items);\n } catch (e) {\n for (const { reject } of requests) {\n reject(e);\n }\n return;\n }\n\n for (let i = 0, ii = requests.length; i < ii; ++i) {\n const request = requests[i];\n try {\n const response = responses[i];\n const { error } = response;\n if (typeof error !== 'undefined') {\n throw this._deserializeError(error);\n }\n request.resolve(response.result!);\n } catch (e) {\n request.reject(e);\n }\n }\n }\n\n private async _injectMedia(\n dictionaryEntry: DictionaryEntry,\n requirements: Requirement[],\n mediaOptions: MediaOptions,\n ): Promise<{ media: Media; errors: SerializedError[] }> {\n const timestamp = Date.now();\n\n // Parse requirements\n let injectAudio = false;\n let injectScreenshot = false;\n let injectClipboardImage = false;\n let injectClipboardText = false;\n let injectPopupSelectionText = false;\n const dictionaryMediaDetails: { dictionary: string; path: string }[] = [];\n for (const requirement of requirements) {\n const { type } = requirement;\n switch (type) {\n case 'audio':\n injectAudio = true;\n break;\n case 'screenshot':\n injectScreenshot = true;\n break;\n case 'clipboardImage':\n injectClipboardImage = true;\n break;\n case 'clipboardText':\n injectClipboardText = true;\n break;\n case 'popupSelectionText':\n injectPopupSelectionText = true;\n break;\n case 'dictionaryMedia':\n {\n const { dictionary, path } = requirement;\n dictionaryMediaDetails.push({ dictionary, path });\n }\n break;\n }\n }\n\n // Generate request data\n const dictionaryEntryDetails = this.getDictionaryEntryDetailsForNote(dictionaryEntry);\n let audioDetails: unknown = null;\n let screenshotDetails: unknown = null;\n const clipboardDetails = { image: injectClipboardImage, text: injectClipboardText };\n if (injectAudio && dictionaryEntryDetails.type !== 'kanji') {\n const audioOptions = mediaOptions.audio;\n if (typeof audioOptions === 'object' && audioOptions !== null) {\n const { sources, preferredAudioIndex, idleTimeout, languageSummary, enableDefaultAudioSources } =\n audioOptions;\n audioDetails = {\n sources,\n preferredAudioIndex,\n idleTimeout,\n languageSummary,\n enableDefaultAudioSources,\n };\n }\n }\n if (injectScreenshot) {\n const screenshotOptions = mediaOptions.screenshot;\n if (typeof screenshotOptions === 'object' && screenshotOptions !== null) {\n const {\n format,\n quality,\n contentOrigin: { tabId, frameId },\n } = screenshotOptions;\n if (typeof tabId === 'number' && typeof frameId === 'number') {\n screenshotDetails = { tabId, frameId, format, quality };\n }\n }\n }\n\n // Inject media\n const injectedMedia = await this._api?.injectAnkiNoteMedia(\n timestamp,\n dictionaryEntryDetails,\n audioDetails,\n screenshotDetails,\n clipboardDetails,\n dictionaryMediaDetails,\n );\n if (!injectedMedia) {\n throw new Error('Media injection API is not available');\n }\n const {\n audioFileName,\n screenshotFileName,\n clipboardImageFileName,\n clipboardText,\n dictionaryMedia: dictionaryMediaArray,\n errors,\n } = injectedMedia;\n\n // Format results\n const dictionaryMedia: DictionaryMedia = {};\n for (const { dictionary, path, fileName } of dictionaryMediaArray) {\n if (fileName === null) {\n continue;\n }\n const dictionaryMedia2 = Object.prototype.hasOwnProperty.call(dictionaryMedia, dictionary)\n ? dictionaryMedia[dictionary]\n : (dictionaryMedia[dictionary] = {});\n dictionaryMedia2[path] = { value: fileName };\n }\n const media: Media = {\n audio: typeof audioFileName === 'string' ? { value: audioFileName } : undefined,\n screenshot: typeof screenshotFileName === 'string' ? { value: screenshotFileName } : undefined,\n clipboardImage: typeof clipboardImageFileName === 'string' ? { value: clipboardImageFileName } : undefined,\n clipboardText: typeof clipboardText === 'string' ? { value: clipboardText } : undefined,\n popupSelectionText: injectPopupSelectionText ? { value: '' } : undefined,\n textFurigana: [],\n dictionaryMedia,\n };\n return { media, errors };\n }\n\n private _deserializeError(error: SerializedError): Error {\n const e = new YomitanError(error.message ?? 'Unknown error');\n e.data = error.data;\n return e;\n }\n}\n","import { distributeFurigana } from '../language/ja/furigana';\nimport type * as Dictionary from '../types/dictionary';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport {\n getDisambiguations,\n getGroupedPronunciations,\n getPronunciationsOfType,\n getTermFrequency,\n groupTermTags,\n isNonNounVerbOrAdjective,\n} from '../util/dictionary-data-util';\nimport type {\n AnkiCardFormat,\n CommonData,\n Context,\n GlossaryLayoutMode,\n Media,\n ResultOutputMode,\n} from './anki-note-builder';\n\n// --- Anki template types ---\n\nexport type NoteData = {\n marker: string;\n definition: AnkiDictionaryEntry;\n glossaryLayoutMode: GlossaryLayoutMode;\n compactTags: boolean;\n group: boolean;\n merge: boolean;\n compactGlossaries: boolean;\n uniqueExpressions: string[];\n uniqueReadings: string[];\n pitches: PitchGroup[];\n pitchCount: number;\n phoneticTranscriptions: TranscriptionGroup[];\n context: PublicContext;\n media: Media;\n dictionaryEntry: Dictionary.DictionaryEntry;\n};\n\nexport type PublicContext = {\n query: string;\n fullQuery: string;\n document: { title: string };\n};\n\nexport type AnkiDictionaryEntry = AnkiTermDictionaryEntry | AnkiKanjiDictionaryEntry | Record<string, never>;\n\nexport type TermDictionaryEntryType = 'term' | 'termGrouped' | 'termMerged';\n\nexport type Tag = {\n name: string;\n category: string;\n notes: string;\n order: number;\n score: number;\n dictionary: string;\n redundant: boolean;\n};\n\nexport type PitchTag = {\n name: string;\n category: string;\n order: number;\n score: number;\n content: string[];\n dictionaries: string[];\n redundant: boolean;\n};\n\nexport type Pitch = {\n expressions: string[];\n reading: string;\n positions: number | string;\n nasalPositions: number[];\n devoicePositions: number[];\n tags: PitchTag[];\n exclusiveExpressions: string[];\n exclusiveReadings: string[];\n};\n\nexport type PitchGroup = {\n dictionary: string;\n pitches: Pitch[];\n};\n\nexport type Transcription = {\n expressions: string[];\n reading: string;\n ipa: string;\n tags: Dictionary.Tag[];\n exclusiveExpressions: string[];\n exclusiveReadings: string[];\n};\n\nexport type TranscriptionGroup = {\n dictionary: string;\n phoneticTranscriptions: Transcription[];\n};\n\nexport type FuriganaSegment = {\n text: string;\n furigana: string;\n};\n\nexport type Cloze = {\n sentence: string;\n prefix: string;\n body: string;\n bodyKana: string;\n suffix: string;\n};\n\nexport type FrequencyNumber = {\n dictionary: string;\n frequency: number;\n};\n\nexport type TermFrequencyEntry = {\n index: number;\n expressionIndex: number;\n dictionary: string;\n dictionaryAlias: string;\n dictionaryOrder: { index: number };\n expression: string;\n reading: string;\n hasReading: boolean;\n frequency: number | string;\n};\n\nexport type TermPitchAccent = {\n index: number;\n expressionIndex: number;\n dictionary: string;\n dictionaryAlias: string;\n dictionaryOrder: { index: number };\n expression: string;\n reading: string;\n pitches: { positions: number | string; tags: Tag[] }[];\n};\n\nexport type TermPhoneticTranscription = {\n index: number;\n expressionIndex: number;\n dictionary: string;\n dictionaryAlias: string;\n dictionaryOrder: { index: number };\n expression: string;\n reading: string;\n phoneticTranscriptions: { ipa: string; tags: Tag[] }[];\n};\n\nexport type TermHeadword = {\n sourceTerm: string;\n expression: string;\n reading: string;\n termTags: Tag[];\n frequencies: TermFrequencyEntry[];\n pitches: TermPitchAccent[];\n furiganaSegments: FuriganaSegment[];\n termFrequency: 'popular' | 'rare' | 'normal';\n wordClasses: string[];\n};\n\nexport type TermDefinition = {\n sequence: number;\n dictionary: string;\n dictionaryAlias: string;\n glossaryScopedStyles: string;\n dictScopedStyles: string;\n glossary: DictionaryData.TermGlossaryContent[];\n definitionTags: Tag[];\n only?: string[];\n};\n\nexport type KanjiStat = {\n name: string;\n category: string;\n notes: string;\n order: number;\n score: number;\n dictionary: string;\n value: number | string;\n};\n\nexport type KanjiStatGroups = {\n [key: string]: KanjiStat[];\n};\n\nexport type KanjiFrequencyEntry = {\n index: number;\n dictionary: string;\n dictionaryAlias: string;\n dictionaryOrder: { index: number };\n character: string;\n frequency: number | string;\n};\n\nexport type AnkiTermDictionaryEntry = {\n type: TermDictionaryEntryType;\n id?: number;\n source: string | null;\n rawSource: string | null;\n sourceTerm?: string | null;\n inflectionRuleChainCandidates: Dictionary.InflectionRuleChainCandidate[];\n score: number;\n isPrimary?: boolean;\n sequence: number;\n dictionary: string;\n dictionaryAlias: string;\n dictionaryOrder: { index: number };\n dictionaryNames: string[];\n expression: string | string[];\n reading: string | string[];\n expressions: TermHeadword[];\n glossary?: DictionaryData.TermGlossaryContent[];\n glossaryScopedStyles?: string;\n dictScopedStyles?: string;\n definitionTags?: Tag[];\n termTags?: Tag[];\n definitions?: TermDefinition[];\n frequencies: TermFrequencyEntry[];\n frequencyNumbers: FrequencyNumber[];\n frequencyHarmonic: number;\n frequencyAverage: number;\n pitches: TermPitchAccent[];\n phoneticTranscriptions: TermPhoneticTranscription[];\n sourceTermExactMatchCount: number;\n url: string;\n cloze: Cloze;\n furiganaSegments?: FuriganaSegment[];\n};\n\nexport type AnkiKanjiDictionaryEntry = {\n type: 'kanji';\n character: string;\n dictionary: string;\n dictionaryAlias: string;\n onyomi: string[];\n kunyomi: string[];\n glossary: string[];\n tags: Tag[];\n stats: KanjiStatGroups;\n frequencies: KanjiFrequencyEntry[];\n frequencyHarmonic: number;\n frequencyAverage: number;\n url: string;\n cloze: Cloze;\n};\n\n// --- Cached value helpers ---\n\ntype CachedValue<T> = {\n getter: () => T;\n hasValue: boolean;\n value: T | undefined;\n};\n\nexport function createCachedValue<T>(getter: () => T): CachedValue<T> {\n return { getter, hasValue: false, value: undefined };\n}\n\nexport function getCachedValue<T>(item: CachedValue<T>): T {\n if (item.hasValue) {\n return item.value as T;\n }\n const value = item.getter();\n item.value = value;\n item.hasValue = true;\n return value;\n}\n\n// --- Main function ---\n\n/**\n * Creates a compatibility representation of the specified data for Anki template rendering.\n */\nexport function createAnkiNoteData(marker: string, details: CommonData): NoteData {\n const { dictionaryEntry, resultOutputMode, glossaryLayoutMode, compactTags, context, media, dictionaryStylesMap } =\n details;\n\n const definition = createCachedValue(() =>\n getDefinition(dictionaryEntry, context, resultOutputMode, dictionaryStylesMap, glossaryLayoutMode),\n );\n const uniqueExpressions = createCachedValue(() => getUniqueExpressions(dictionaryEntry));\n const uniqueReadings = createCachedValue(() => getUniqueReadings(dictionaryEntry));\n const context2 = createCachedValue(() => getPublicContext(context));\n const pitches = createCachedValue(() => getPitches(dictionaryEntry));\n const pitchCount = createCachedValue(() => getPitchCount(pitches));\n const phoneticTranscriptions = createCachedValue(() => getPhoneticTranscriptions(dictionaryEntry));\n\n let resolvedMedia: Media;\n if (typeof media !== 'object' || media === null || Array.isArray(media)) {\n resolvedMedia = {\n audio: undefined,\n screenshot: undefined,\n clipboardImage: undefined,\n clipboardText: undefined,\n popupSelectionText: undefined,\n textFurigana: [],\n dictionaryMedia: {},\n };\n } else {\n resolvedMedia = media;\n }\n\n const result: NoteData = {\n marker,\n get definition() {\n return getCachedValue(definition);\n },\n glossaryLayoutMode,\n compactTags,\n group: resultOutputMode === 'group',\n merge: resultOutputMode === 'merge',\n compactGlossaries: glossaryLayoutMode === 'compact-popup-anki',\n get uniqueExpressions() {\n return getCachedValue(uniqueExpressions);\n },\n get uniqueReadings() {\n return getCachedValue(uniqueReadings);\n },\n get pitches() {\n return getCachedValue(pitches);\n },\n get pitchCount() {\n return getCachedValue(pitchCount);\n },\n get phoneticTranscriptions() {\n return getCachedValue(phoneticTranscriptions);\n },\n get context() {\n return getCachedValue(context2);\n },\n media: resolvedMedia,\n dictionaryEntry,\n };\n Object.defineProperty(result, 'dictionaryEntry', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: dictionaryEntry,\n });\n return result;\n}\n\n// --- Private helpers ---\n\nfunction getPrimarySource(dictionaryEntry: Dictionary.TermDictionaryEntry): Dictionary.TermSource | null {\n for (const headword of dictionaryEntry.headwords) {\n for (const source of headword.sources) {\n if (source.isPrimary) {\n return source;\n }\n }\n }\n return null;\n}\n\nfunction getUniqueExpressions(dictionaryEntry: Dictionary.DictionaryEntry): string[] {\n if (dictionaryEntry.type === 'term') {\n const results = new Set<string>();\n for (const { term } of dictionaryEntry.headwords) {\n results.add(term);\n }\n return [...results];\n }\n return [];\n}\n\nfunction getUniqueReadings(dictionaryEntry: Dictionary.DictionaryEntry): string[] {\n if (dictionaryEntry.type === 'term') {\n const results = new Set<string>();\n for (const { reading } of dictionaryEntry.headwords) {\n results.add(reading);\n }\n return [...results];\n }\n return [];\n}\n\nfunction getPublicContext(context: Context): PublicContext {\n let { documentTitle } = context;\n if (typeof documentTitle !== 'string') {\n documentTitle = '';\n }\n return {\n query: context.query,\n fullQuery: context.fullQuery,\n document: {\n title: documentTitle,\n },\n };\n}\n\nfunction getFrequencyNumbers(\n dictionaryEntry: Dictionary.TermDictionaryEntry | Dictionary.KanjiDictionaryEntry,\n requestedHeadwordIndex: number | null,\n): FrequencyNumber[] {\n let previousDictionary: string | undefined;\n const frequencies: FrequencyNumber[] = [];\n for (const dictionaryEntryFrequency of dictionaryEntry.frequencies) {\n const { dictionary, frequency, displayValue } = dictionaryEntryFrequency;\n const wrongHeadwordIndex =\n Number.isInteger(requestedHeadwordIndex) &&\n 'headwordIndex' in dictionaryEntryFrequency &&\n dictionaryEntryFrequency.headwordIndex !== requestedHeadwordIndex;\n if (dictionary === previousDictionary || wrongHeadwordIndex) {\n continue;\n }\n previousDictionary = dictionary;\n\n if (displayValue !== null) {\n const frequencyMatch = displayValue.match(/^\\d+/);\n if (frequencyMatch !== null) {\n const frequencyParsed = Number.parseInt(frequencyMatch[0], 10);\n if (frequencyParsed > 0) {\n frequencies.push({ dictionary, frequency: frequencyParsed });\n continue;\n }\n }\n }\n if (frequency > 0) {\n frequencies.push({ dictionary, frequency });\n }\n }\n return frequencies;\n}\n\nexport function getFrequencyHarmonic(\n dictionaryEntry: Dictionary.TermDictionaryEntry | Dictionary.KanjiDictionaryEntry,\n headwordIndex: number | null,\n): number {\n const frequencies = getFrequencyNumbers(dictionaryEntry, headwordIndex);\n\n if (frequencies.length === 0) {\n return -1;\n }\n\n let total = 0;\n for (const frequency of frequencies) {\n total += 1 / frequency.frequency;\n }\n return Math.floor(frequencies.length / total);\n}\n\nfunction getFrequencyAverage(\n dictionaryEntry: Dictionary.TermDictionaryEntry | Dictionary.KanjiDictionaryEntry,\n headwordIndex: number | null,\n): number {\n const frequencies = getFrequencyNumbers(dictionaryEntry, headwordIndex);\n\n if (frequencies.length === 0) {\n return -1;\n }\n\n let total = 0;\n for (const frequency of frequencies) {\n total += frequency.frequency;\n }\n return Math.floor(total / frequencies.length);\n}\n\nfunction getPitches(dictionaryEntry: Dictionary.DictionaryEntry): PitchGroup[] {\n const results: PitchGroup[] = [];\n if (dictionaryEntry.type === 'term') {\n for (const { dictionary, pronunciations } of getGroupedPronunciations(dictionaryEntry)) {\n const pitches: Pitch[] = [];\n for (const groupedPronunciation of pronunciations) {\n const { pronunciation } = groupedPronunciation;\n if (pronunciation.type !== 'pitch-accent') {\n continue;\n }\n const { positions, nasalPositions, devoicePositions, tags } = pronunciation;\n const { terms, reading, exclusiveTerms, exclusiveReadings } = groupedPronunciation;\n pitches.push({\n expressions: terms,\n reading,\n positions,\n nasalPositions,\n devoicePositions,\n tags: convertPitchTags(tags),\n exclusiveExpressions: exclusiveTerms,\n exclusiveReadings,\n });\n }\n results.push({ dictionary, pitches });\n }\n }\n return results;\n}\n\nfunction getPhoneticTranscriptions(dictionaryEntry: Dictionary.DictionaryEntry): TranscriptionGroup[] {\n const results: TranscriptionGroup[] = [];\n if (dictionaryEntry.type === 'term') {\n for (const { dictionary, pronunciations } of getGroupedPronunciations(dictionaryEntry)) {\n const phoneticTranscriptions: Transcription[] = [];\n for (const groupedPronunciation of pronunciations) {\n const { pronunciation } = groupedPronunciation;\n if (pronunciation.type !== 'phonetic-transcription') {\n continue;\n }\n const { ipa, tags } = pronunciation;\n const { terms, reading, exclusiveTerms, exclusiveReadings } = groupedPronunciation;\n phoneticTranscriptions.push({\n expressions: terms,\n reading,\n ipa,\n tags,\n exclusiveExpressions: exclusiveTerms,\n exclusiveReadings,\n });\n }\n results.push({ dictionary, phoneticTranscriptions });\n }\n }\n return results;\n}\n\nfunction getPitchCount(cachedPitches: CachedValue<PitchGroup[]>): number {\n const pitches = getCachedValue(cachedPitches);\n return pitches.reduce((i, v) => i + v.pitches.length, 0);\n}\n\nfunction getDefinition(\n dictionaryEntry: Dictionary.DictionaryEntry,\n context: Context,\n resultOutputMode: ResultOutputMode,\n dictionaryStylesMap: Map<string, string>,\n glossaryLayoutMode: GlossaryLayoutMode,\n): AnkiDictionaryEntry {\n switch (dictionaryEntry.type) {\n case 'term':\n return getTermDefinition(\n dictionaryEntry,\n context,\n resultOutputMode,\n dictionaryStylesMap,\n glossaryLayoutMode,\n );\n case 'kanji':\n return getKanjiDefinition(dictionaryEntry, context);\n default:\n return {} as Record<string, never>;\n }\n}\n\nfunction getKanjiDefinition(\n dictionaryEntry: Dictionary.KanjiDictionaryEntry,\n context: Context,\n): AnkiKanjiDictionaryEntry {\n const { character, dictionary, dictionaryAlias, onyomi, kunyomi, definitions } = dictionaryEntry;\n\n let { url } = context;\n if (typeof url !== 'string') {\n url = '';\n }\n\n const stats = createCachedValue(() => getKanjiStats(dictionaryEntry));\n const tags = createCachedValue(() => convertTags(dictionaryEntry.tags));\n const frequencies = createCachedValue(() => getKanjiFrequencies(dictionaryEntry));\n const frequencyHarmonic = createCachedValue(() => getFrequencyHarmonic(dictionaryEntry, null));\n const frequencyAverage = createCachedValue(() => getFrequencyAverage(dictionaryEntry, null));\n const cloze = createCachedValue(() => getCloze(dictionaryEntry, context));\n\n return {\n type: 'kanji',\n character,\n dictionary,\n dictionaryAlias,\n onyomi,\n kunyomi,\n glossary: definitions,\n get tags() {\n return getCachedValue(tags);\n },\n get stats() {\n return getCachedValue(stats);\n },\n get frequencies() {\n return getCachedValue(frequencies);\n },\n get frequencyHarmonic() {\n return getCachedValue(frequencyHarmonic);\n },\n get frequencyAverage() {\n return getCachedValue(frequencyAverage);\n },\n url,\n get cloze() {\n return getCachedValue(cloze);\n },\n };\n}\n\nfunction getKanjiStats(dictionaryEntry: Dictionary.KanjiDictionaryEntry): KanjiStatGroups {\n const results: KanjiStatGroups = {};\n for (const [key, value] of Object.entries(dictionaryEntry.stats)) {\n results[key] = value.map(convertKanjiStat);\n }\n return results;\n}\n\nfunction convertKanjiStat({\n name,\n category,\n content,\n order,\n score,\n dictionary,\n value,\n}: Dictionary.KanjiStat): KanjiStat {\n return {\n name,\n category,\n notes: content,\n order,\n score,\n dictionary,\n value,\n };\n}\n\nfunction getKanjiFrequencies(dictionaryEntry: Dictionary.KanjiDictionaryEntry): KanjiFrequencyEntry[] {\n const results: KanjiFrequencyEntry[] = [];\n for (const {\n index,\n dictionary,\n dictionaryAlias,\n dictionaryIndex,\n character,\n frequency,\n displayValue,\n } of dictionaryEntry.frequencies) {\n results.push({\n index,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n character,\n frequency: displayValue !== null ? displayValue : frequency,\n });\n }\n return results;\n}\n\nfunction getTermDefinition(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n context: Context,\n resultOutputMode: ResultOutputMode,\n dictionaryStylesMap: Map<string, string>,\n glossaryLayoutMode: GlossaryLayoutMode,\n): AnkiTermDictionaryEntry {\n let type: TermDictionaryEntryType = 'term';\n switch (resultOutputMode) {\n case 'group':\n type = 'termGrouped';\n break;\n case 'merge':\n type = 'termMerged';\n break;\n }\n\n const { inflectionRuleChainCandidates, score, dictionaryIndex, sourceTermExactMatchCount, definitions } =\n dictionaryEntry;\n\n let { url } = context;\n if (typeof url !== 'string') {\n url = '';\n }\n\n const primarySource = getPrimarySource(dictionaryEntry);\n\n const dictionaryAliases = createCachedValue(() => getTermDictionaryAliases(dictionaryEntry));\n const dictionaryNames = createCachedValue(() => getTermDictionaryNames(dictionaryEntry));\n const commonInfo = createCachedValue(() =>\n getTermDictionaryEntryCommonInfo(dictionaryEntry, type, dictionaryStylesMap, glossaryLayoutMode),\n );\n const termTags = createCachedValue(() => getTermTags(dictionaryEntry, type));\n const expressions = createCachedValue(() => getTermExpressions(dictionaryEntry));\n const frequencies = createCachedValue(() => getTermFrequenciesAnki(dictionaryEntry));\n const frequencyNumbersCV = createCachedValue(() => getFrequencyNumbers(dictionaryEntry, null));\n const frequencyHarmonic = createCachedValue(() => getFrequencyHarmonic(dictionaryEntry, null));\n const frequencyAverage = createCachedValue(() => getFrequencyAverage(dictionaryEntry, null));\n const pitches = createCachedValue(() => getTermPitches(dictionaryEntry));\n const phoneticTranscriptions = createCachedValue(() => getTermPhoneticTranscriptions(dictionaryEntry));\n const glossary = createCachedValue(() => getTermGlossaryArray(dictionaryEntry, type));\n const styleInfo = createCachedValue(() => getTermStyles(dictionaryEntry, type, dictionaryStylesMap));\n const cloze = createCachedValue(() => getCloze(dictionaryEntry, context));\n const furiganaSegments = createCachedValue(() => getTermFuriganaSegments(dictionaryEntry, type));\n const sequence = createCachedValue(() => getTermDictionaryEntrySequence(dictionaryEntry));\n\n return {\n type,\n id: type === 'term' && definitions.length > 0 ? definitions[0].id : undefined,\n source: primarySource !== null ? primarySource.transformedText : null,\n rawSource: primarySource !== null ? primarySource.originalText : null,\n sourceTerm: type !== 'termMerged' ? (primarySource !== null ? primarySource.deinflectedText : null) : undefined,\n inflectionRuleChainCandidates,\n score,\n isPrimary: type === 'term' ? dictionaryEntry.isPrimary : undefined,\n get sequence() {\n return getCachedValue(sequence);\n },\n get dictionary() {\n return getCachedValue(dictionaryNames)[0];\n },\n get dictionaryAlias() {\n return getCachedValue(dictionaryAliases)[0];\n },\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n get dictionaryNames() {\n return getCachedValue(dictionaryNames);\n },\n get expression() {\n const { uniqueTerms } = getCachedValue(commonInfo);\n return (type === 'term' || type === 'termGrouped' ? uniqueTerms[0] : uniqueTerms) as string | string[];\n },\n get reading() {\n const { uniqueReadings } = getCachedValue(commonInfo);\n return (type === 'term' || type === 'termGrouped' ? uniqueReadings[0] : uniqueReadings) as\n | string\n | string[];\n },\n get expressions() {\n return getCachedValue(expressions);\n },\n get glossary() {\n return getCachedValue(glossary);\n },\n get glossaryScopedStyles() {\n return getCachedValue(styleInfo)?.glossaryScopedStyles;\n },\n get dictScopedStyles() {\n return getCachedValue(styleInfo)?.dictScopedStyles;\n },\n get definitionTags() {\n return type === 'term' ? getCachedValue(commonInfo).definitionTags : undefined;\n },\n get termTags() {\n return getCachedValue(termTags);\n },\n get definitions() {\n return getCachedValue(commonInfo).definitions;\n },\n get frequencies() {\n return getCachedValue(frequencies);\n },\n get frequencyNumbers() {\n return getCachedValue(frequencyNumbersCV);\n },\n get frequencyHarmonic() {\n return getCachedValue(frequencyHarmonic);\n },\n get frequencyAverage() {\n return getCachedValue(frequencyAverage);\n },\n get pitches() {\n return getCachedValue(pitches);\n },\n get phoneticTranscriptions() {\n return getCachedValue(phoneticTranscriptions);\n },\n sourceTermExactMatchCount,\n url,\n get cloze() {\n return getCachedValue(cloze);\n },\n get furiganaSegments() {\n return getCachedValue(furiganaSegments);\n },\n };\n}\n\nfunction getTermDictionaryNames(dictionaryEntry: Dictionary.TermDictionaryEntry): string[] {\n const dictionaryNames = new Set<string>();\n for (const { dictionary } of dictionaryEntry.definitions) {\n dictionaryNames.add(dictionary);\n }\n return [...dictionaryNames];\n}\n\nfunction getTermDictionaryAliases(dictionaryEntry: Dictionary.TermDictionaryEntry): string[] {\n const dictionaryAliases = new Set<string>();\n for (const { dictionaryAlias } of dictionaryEntry.definitions) {\n dictionaryAliases.add(dictionaryAlias);\n }\n return [...dictionaryAliases];\n}\n\nfunction getTermDictionaryEntryCommonInfo(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n type: TermDictionaryEntryType,\n _dictionaryStylesMap: Map<string, string>,\n _glossaryLayoutMode: GlossaryLayoutMode,\n): { uniqueTerms: string[]; uniqueReadings: string[]; definitionTags: Tag[]; definitions?: TermDefinition[] } {\n const merged = type === 'termMerged';\n const hasDefinitions = type !== 'term';\n\n const allTermsSet = new Set<string>();\n const allReadingsSet = new Set<string>();\n for (const { term, reading } of dictionaryEntry.headwords) {\n allTermsSet.add(term);\n allReadingsSet.add(reading);\n }\n const uniqueTerms = [...allTermsSet];\n const uniqueReadings = [...allReadingsSet];\n\n const definitions: TermDefinition[] = [];\n const definitionTags: Tag[] = [];\n for (const {\n tags,\n headwordIndices,\n entries,\n dictionary,\n dictionaryAlias,\n sequences,\n } of dictionaryEntry.definitions) {\n const definitionTags2: Tag[] = [];\n for (const tag of tags) {\n definitionTags.push(convertTag(tag));\n definitionTags2.push(convertTag(tag));\n }\n if (!hasDefinitions) {\n continue;\n }\n const only = merged\n ? getDisambiguations(dictionaryEntry.headwords, headwordIndices, allTermsSet, allReadingsSet)\n : undefined;\n definitions.push({\n sequence: sequences[0],\n dictionary,\n dictionaryAlias,\n glossaryScopedStyles: '',\n dictScopedStyles: '',\n glossary: entries,\n definitionTags: definitionTags2,\n only,\n });\n }\n\n return {\n uniqueTerms,\n uniqueReadings,\n definitionTags,\n definitions: hasDefinitions ? definitions : undefined,\n };\n}\n\nfunction getTermFrequenciesAnki(dictionaryEntry: Dictionary.TermDictionaryEntry): TermFrequencyEntry[] {\n const results: TermFrequencyEntry[] = [];\n const { headwords } = dictionaryEntry;\n for (const {\n headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryIndex,\n hasReading,\n frequency,\n displayValue,\n } of dictionaryEntry.frequencies) {\n const { term, reading } = headwords[headwordIndex];\n results.push({\n index: results.length,\n expressionIndex: headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n expression: term,\n reading,\n hasReading,\n frequency: displayValue !== null ? displayValue : frequency,\n });\n }\n return results;\n}\n\nfunction getTermPitches(dictionaryEntry: Dictionary.TermDictionaryEntry): TermPitchAccent[] {\n const results: TermPitchAccent[] = [];\n const { headwords } = dictionaryEntry;\n for (const {\n headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryIndex,\n pronunciations,\n } of dictionaryEntry.pronunciations) {\n const { term, reading } = headwords[headwordIndex];\n const pitchAccents = getPronunciationsOfType(pronunciations, 'pitch-accent');\n const cachedPitches = createCachedValue(() => getTermPitchesInner(pitchAccents));\n results.push({\n index: results.length,\n expressionIndex: headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n expression: term,\n reading,\n get pitches() {\n return getCachedValue(cachedPitches);\n },\n });\n }\n return results;\n}\n\nfunction getTermPitchesInner(pitches: Dictionary.PitchAccent[]): { positions: number | string; tags: Tag[] }[] {\n const results: { positions: number | string; tags: Tag[] }[] = [];\n for (const { positions, tags } of pitches) {\n const cachedTags = createCachedValue(() => convertTags(tags));\n results.push({\n positions,\n get tags() {\n return getCachedValue(cachedTags);\n },\n });\n }\n return results;\n}\n\nfunction getTermPhoneticTranscriptions(dictionaryEntry: Dictionary.TermDictionaryEntry): TermPhoneticTranscription[] {\n const results: TermPhoneticTranscription[] = [];\n const { headwords } = dictionaryEntry;\n for (const {\n headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryIndex,\n pronunciations,\n } of dictionaryEntry.pronunciations) {\n const { term, reading } = headwords[headwordIndex];\n const phoneticTranscriptions = getPronunciationsOfType(pronunciations, 'phonetic-transcription');\n const termPhoneticTranscriptions = getTermPhoneticTranscriptionsInner(phoneticTranscriptions);\n results.push({\n index: results.length,\n expressionIndex: headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n expression: term,\n reading,\n get phoneticTranscriptions() {\n return termPhoneticTranscriptions;\n },\n });\n }\n return results;\n}\n\nfunction getTermPhoneticTranscriptionsInner(\n phoneticTranscriptions: Dictionary.PhoneticTranscription[],\n): { ipa: string; tags: Tag[] }[] {\n const results: { ipa: string; tags: Tag[] }[] = [];\n for (const { ipa, tags } of phoneticTranscriptions) {\n const cachedTags = createCachedValue(() => convertTags(tags));\n results.push({\n ipa,\n get tags() {\n return getCachedValue(cachedTags);\n },\n });\n }\n return results;\n}\n\nfunction getTermExpressions(dictionaryEntry: Dictionary.TermDictionaryEntry): TermHeadword[] {\n const results: TermHeadword[] = [];\n const { headwords } = dictionaryEntry;\n for (let i = 0, ii = headwords.length; i < ii; ++i) {\n const {\n term,\n reading,\n tags,\n sources: [{ deinflectedText }],\n wordClasses,\n } = headwords[i];\n const termTagsCV = createCachedValue(() => convertTags(tags));\n const frequenciesCV = createCachedValue(() => getTermExpressionFrequencies(dictionaryEntry, i));\n const pitchesCV = createCachedValue(() => getTermExpressionPitches(dictionaryEntry, i));\n const termFrequencyCV = createCachedValue(() => getTermExpressionTermFrequency(termTagsCV));\n const furiganaSegmentsCV = createCachedValue(() => getTermHeadwordFuriganaSegments(term, reading));\n const item: TermHeadword = {\n sourceTerm: deinflectedText,\n expression: term,\n reading,\n get termTags() {\n return getCachedValue(termTagsCV);\n },\n get frequencies() {\n return getCachedValue(frequenciesCV);\n },\n get pitches() {\n return getCachedValue(pitchesCV);\n },\n get furiganaSegments() {\n return getCachedValue(furiganaSegmentsCV);\n },\n get termFrequency() {\n return getCachedValue(termFrequencyCV);\n },\n wordClasses,\n };\n results.push(item);\n }\n return results;\n}\n\nfunction getTermExpressionFrequencies(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n i: number,\n): TermFrequencyEntry[] {\n const results: TermFrequencyEntry[] = [];\n const { headwords, frequencies } = dictionaryEntry;\n for (const {\n headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryIndex,\n hasReading,\n frequency,\n displayValue,\n } of frequencies) {\n if (headwordIndex !== i) {\n continue;\n }\n const { term, reading } = headwords[headwordIndex];\n results.push({\n index: results.length,\n expressionIndex: headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n expression: term,\n reading,\n hasReading,\n frequency: displayValue !== null ? displayValue : frequency,\n });\n }\n return results;\n}\n\nfunction getTermExpressionPitches(dictionaryEntry: Dictionary.TermDictionaryEntry, i: number): TermPitchAccent[] {\n const results: TermPitchAccent[] = [];\n const { headwords, pronunciations: termPronunciations } = dictionaryEntry;\n for (const { headwordIndex, dictionary, dictionaryAlias, dictionaryIndex, pronunciations } of termPronunciations) {\n if (headwordIndex !== i) {\n continue;\n }\n const { term, reading } = headwords[headwordIndex];\n const pitchAccents = getPronunciationsOfType(pronunciations, 'pitch-accent');\n const cachedPitches = createCachedValue(() => getTermPitchesInner(pitchAccents));\n results.push({\n index: results.length,\n expressionIndex: headwordIndex,\n dictionary,\n dictionaryAlias,\n dictionaryOrder: {\n index: dictionaryIndex,\n },\n expression: term,\n reading,\n get pitches() {\n return getCachedValue(cachedPitches);\n },\n });\n }\n return results;\n}\n\nfunction getTermExpressionTermFrequency(cachedTermTags: CachedValue<Tag[]>): 'popular' | 'rare' | 'normal' {\n const termTags = getCachedValue(cachedTermTags);\n return getTermFrequency(termTags);\n}\n\nfunction getTermGlossaryArray(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n type: TermDictionaryEntryType,\n): DictionaryData.TermGlossaryContent[] | undefined {\n if (type === 'term') {\n const results: DictionaryData.TermGlossaryContent[] = [];\n for (const { entries } of dictionaryEntry.definitions) {\n results.push(...entries);\n }\n return results;\n }\n return undefined;\n}\n\nfunction getTermStyles(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n type: TermDictionaryEntryType,\n _dictionaryStylesMap: Map<string, string>,\n): { glossaryScopedStyles: string; dictScopedStyles: string } | undefined {\n if (type !== 'term') {\n return undefined;\n }\n // In the library version, CSS scoping is simplified since we don't have\n // the full CSS manipulation utilities. Consumers can post-process styles.\n return { glossaryScopedStyles: '', dictScopedStyles: '' };\n}\n\nfunction getTermTags(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n type: TermDictionaryEntryType,\n): Tag[] | undefined {\n if (type !== 'termMerged') {\n const results: Tag[] = [];\n for (const { tag } of groupTermTags(dictionaryEntry)) {\n results.push(convertTag(tag));\n }\n return results;\n }\n return undefined;\n}\n\nfunction convertTags(tags: Dictionary.Tag[]): Tag[] {\n const results: Tag[] = [];\n for (const tag of tags) {\n results.push(convertTag(tag));\n }\n return results;\n}\n\nfunction convertTag({ name, category, content, order, score, dictionaries, redundant }: Dictionary.Tag): Tag {\n return {\n name,\n category,\n notes: content.length > 0 ? content[0] : '',\n order,\n score,\n dictionary: dictionaries.length > 0 ? dictionaries[0] : '',\n redundant,\n };\n}\n\nfunction convertPitchTags(tags: Dictionary.Tag[]): PitchTag[] {\n const results: PitchTag[] = [];\n for (const tag of tags) {\n results.push(convertPitchTag(tag));\n }\n return results;\n}\n\nfunction convertPitchTag({ name, category, content, order, score, dictionaries, redundant }: Dictionary.Tag): PitchTag {\n return {\n name,\n category,\n order,\n score,\n content: [...content],\n dictionaries: [...dictionaries],\n redundant,\n };\n}\n\nfunction getCloze(dictionaryEntry: Dictionary.DictionaryEntry, context: Context): Cloze {\n let originalText = '';\n let term = '';\n let reading = '';\n switch (dictionaryEntry.type) {\n case 'term':\n {\n term = dictionaryEntry.headwords[0].term;\n reading = dictionaryEntry.headwords[0].reading;\n const primarySource = getPrimarySource(dictionaryEntry);\n if (primarySource !== null) {\n originalText = primarySource.originalText;\n }\n }\n break;\n case 'kanji':\n originalText = dictionaryEntry.character;\n break;\n }\n\n const { sentence } = context;\n let text: string | undefined;\n let offset: number | undefined;\n if (typeof sentence === 'object' && sentence !== null) {\n ({ text, offset } = sentence);\n }\n if (typeof text !== 'string') {\n text = '';\n }\n if (typeof offset !== 'number') {\n offset = 0;\n }\n const textChars = [...text];\n\n const textSegments: string[] = [];\n for (const { text: text2, reading: reading2 } of distributeFurigana(\n term,\n textChars.slice(offset, offset + originalText.length).join(''),\n )) {\n textSegments.push(reading2.length > 0 ? reading2 : text2);\n }\n\n return {\n sentence: textChars.join(''),\n prefix: textChars.slice(0, offset).join(''),\n body: textChars.slice(offset, offset + originalText.length).join(''),\n bodyKana: textSegments.join(''),\n suffix: textChars.slice(offset + originalText.length).join(''),\n };\n}\n\nfunction getTermFuriganaSegments(\n dictionaryEntry: Dictionary.TermDictionaryEntry,\n type: TermDictionaryEntryType,\n): FuriganaSegment[] | undefined {\n if (type === 'term') {\n for (const { term, reading } of dictionaryEntry.headwords) {\n return getTermHeadwordFuriganaSegments(term, reading);\n }\n }\n return undefined;\n}\n\nfunction getTermHeadwordFuriganaSegments(term: string, reading: string): FuriganaSegment[] {\n const result: FuriganaSegment[] = [];\n for (const { text, reading: reading2 } of distributeFurigana(term, reading)) {\n result.push({ text, furigana: reading2 });\n }\n return result;\n}\n\nfunction getTermDictionaryEntrySequence(dictionaryEntry: Dictionary.TermDictionaryEntry): number {\n let hasSequence = false;\n let mainSequence = -1;\n if (!dictionaryEntry.isPrimary) {\n return mainSequence;\n }\n for (const { sequences } of dictionaryEntry.definitions) {\n const sequence = sequences[0];\n if (!hasSequence) {\n mainSequence = sequence;\n hasSequence = true;\n if (mainSequence === -1) {\n break;\n }\n } else if (mainSequence !== sequence) {\n mainSequence = -1;\n break;\n }\n }\n return mainSequence;\n}\n","import { distributeFurigana } from '../language/ja/furigana';\nimport type { SafeAny, SerializableObject, TypeofResult } from '../types/core';\nimport type * as Dictionary from '../types/dictionary';\nimport type * as DictionaryData from '../types/dictionary-data';\nimport { getPronunciationsOfType, isNonNounVerbOrAdjective } from '../util/dictionary-data-util';\nimport type { CommonData, Media, Requirement, TextFuriganaReadingMode } from './anki-note-builder';\nimport { createAnkiNoteData } from './anki-note-data-creator';\nimport type { NoteData } from './anki-note-data-creator';\n\n// --- Types ---\n\nexport type HelperOptions = {\n fn?: (context: unknown) => string;\n inverse?: (context: unknown) => string;\n hash: SerializableObject;\n data: { root: NoteData };\n};\n\nexport type HelperFunction<T = unknown> = (args: unknown[], context: unknown, options: HelperOptions) => T;\n\nexport type DataType = {\n modifier: (data: CompositeRenderData) => NoteData;\n composeData: (data: PartialRenderData, commonData: CommonData) => CompositeRenderData;\n};\n\nexport type PartialRenderData = {\n marker: string;\n commonData?: CommonData;\n};\n\nexport type CompositeRenderData = {\n marker: string;\n commonData: CommonData;\n};\n\nexport type RenderResult = {\n result: string;\n requirements: Requirement[];\n};\n\nexport type RenderMultiItem = {\n template: string;\n templateItems: RenderMultiTemplateItem[];\n};\n\nexport type RenderMultiTemplateItem = {\n type: string;\n commonData: CommonData;\n datas: PartialRenderData[];\n};\n\nexport type RenderMultiResponse = {\n result?: RenderResult;\n error?: { name?: string; message?: string; stack?: string; data?: unknown };\n};\n\n/**\n * Interface for a Handlebars-compatible template engine.\n * Consumers should provide an implementation that wraps their Handlebars instance.\n */\nexport interface HandlebarsInstance {\n compileAST(template: string): (data: NoteData) => string;\n registerHelper(name: string, helper: (...args: unknown[]) => unknown): void;\n SafeString: new (value: string) => unknown;\n Utils: {\n escapeExpression(value: string): string;\n };\n}\n\n/**\n * Manages media access during template rendering.\n */\nclass TemplateRendererMediaProvider {\n private _requirements: Requirement[] | null;\n\n constructor() {\n this._requirements = null;\n }\n\n get requirements(): Requirement[] | null {\n return this._requirements;\n }\n\n set requirements(value: Requirement[] | null) {\n this._requirements = value;\n }\n\n hasMedia(root: NoteData, args: unknown[], namedArgs: SerializableObject): boolean {\n const { media } = root;\n const data = this._getMediaData(media as Media, args, namedArgs);\n return data !== null;\n }\n\n getMedia(\n root: NoteData,\n args: unknown[],\n namedArgs: SerializableObject,\n handlebars: HandlebarsInstance,\n ): string | null {\n const { media } = root;\n const data = this._getMediaData(media as Media, args, namedArgs);\n if (data !== null) {\n const result = this._getFormattedValue(data, namedArgs, handlebars);\n if (typeof result === 'string') {\n return result.replaceAll('\\n', '<br>\\n');\n }\n }\n const defaultValue = namedArgs.default;\n return defaultValue === null || typeof defaultValue === 'string' ? (defaultValue as string | null) : '';\n }\n\n private _addRequirement(value: Requirement): void {\n if (this._requirements === null) {\n return;\n }\n this._requirements.push(value);\n }\n\n private _getFormattedValue(\n data: { value: string },\n namedArgs: SerializableObject,\n handlebars: HandlebarsInstance,\n ): string {\n let { value } = data;\n const { escape = true } = namedArgs;\n if (escape) {\n value = handlebars.Utils.escapeExpression(value);\n }\n return value;\n }\n\n private _getMediaData(media: Media, args: unknown[], namedArgs: SerializableObject): { value: string } | null {\n const type = args[0];\n switch (type) {\n case 'audio':\n return this._getSimpleMediaData(media, 'audio');\n case 'screenshot':\n return this._getSimpleMediaData(media, 'screenshot');\n case 'clipboardImage':\n return this._getSimpleMediaData(media, 'clipboardImage');\n case 'clipboardText':\n return this._getSimpleMediaData(media, 'clipboardText');\n case 'popupSelectionText':\n return this._getSimpleMediaData(media, 'popupSelectionText');\n case 'textFurigana':\n return this._getTextFurigana(media, args[1], namedArgs, 'furiganaHtml');\n case 'textFuriganaPlain':\n return this._getTextFurigana(media, args[1], namedArgs, 'furiganaPlain');\n case 'dictionaryMedia':\n return this._getDictionaryMedia(media, args[1], namedArgs);\n default:\n return null;\n }\n }\n\n private _getSimpleMediaData(\n media: Media,\n type: 'audio' | 'screenshot' | 'clipboardImage' | 'clipboardText' | 'popupSelectionText',\n ): { value: string } | null {\n const result = media[type];\n if (typeof result === 'object' && result !== null) {\n return result;\n }\n this._addRequirement({ type } as Requirement);\n return null;\n }\n\n private _getDictionaryMedia(media: Media, path: unknown, namedArgs: SerializableObject): { value: string } | null {\n if (typeof path !== 'string') {\n return null;\n }\n const { dictionaryMedia } = media;\n const { dictionary } = namedArgs;\n if (typeof dictionary !== 'string') {\n return null;\n }\n if (\n typeof dictionaryMedia !== 'undefined' &&\n Object.prototype.hasOwnProperty.call(dictionaryMedia, dictionary)\n ) {\n const dictionaryMedia2 = dictionaryMedia[dictionary];\n if (Object.prototype.hasOwnProperty.call(dictionaryMedia2, path)) {\n const result = dictionaryMedia2[path];\n if (typeof result === 'object' && result !== null) {\n return result;\n }\n }\n }\n this._addRequirement({\n type: 'dictionaryMedia',\n dictionary,\n path,\n });\n return null;\n }\n\n private _getTextFurigana(\n media: Media,\n text: unknown,\n namedArgs: SerializableObject,\n furiganaFormat: 'furiganaHtml' | 'furiganaPlain',\n ): { value: string } | null {\n if (typeof text !== 'string') {\n return null;\n }\n const readingMode = this._normalizeReadingMode(namedArgs.readingMode);\n const { textFurigana } = media;\n if (Array.isArray(textFurigana)) {\n for (const entry of textFurigana) {\n if (entry.text !== text || entry.readingMode !== readingMode) {\n continue;\n }\n switch (furiganaFormat) {\n case 'furiganaHtml':\n return entry.detailsHtml;\n case 'furiganaPlain':\n return entry.detailsPlain;\n }\n }\n }\n this._addRequirement({\n type: 'textFurigana',\n text,\n readingMode,\n });\n return null;\n }\n\n private _normalizeReadingMode(value: unknown): TextFuriganaReadingMode | null {\n switch (value) {\n case 'hiragana':\n case 'katakana':\n return value;\n default:\n return null;\n }\n }\n}\n\n// --- Template Renderer ---\n\nclass TemplateRendererCore {\n private _cache: Map<string, (data: NoteData) => string>;\n private _cacheMaxSize: number;\n private _dataTypes: Map<string, DataType>;\n private _renderSetup: ((data: NoteData) => { requirements: Requirement[] }) | null;\n private _renderCleanup: ((data: NoteData) => void) | null;\n private _handlebars: HandlebarsInstance;\n\n constructor(handlebars: HandlebarsInstance) {\n this._cache = new Map();\n this._cacheMaxSize = 5;\n this._dataTypes = new Map();\n this._renderSetup = null;\n this._renderCleanup = null;\n this._handlebars = handlebars;\n }\n\n registerHelpers(helpers: [string, HelperFunction][]): void {\n for (const [name, helper] of helpers) {\n this._registerHelper(name, helper);\n }\n }\n\n registerDataType(name: string, details: DataType): void {\n this._dataTypes.set(name, details);\n }\n\n setRenderCallbacks(\n setup: ((data: NoteData) => { requirements: Requirement[] }) | null,\n cleanup: ((data: NoteData) => void) | null,\n ): void {\n this._renderSetup = setup;\n this._renderCleanup = cleanup;\n }\n\n render(template: string, data: PartialRenderData, type: string): RenderResult {\n const instance = this._getTemplateInstance(template);\n const modifiedData = this._getModifiedData(data, undefined, type);\n return this._renderTemplate(instance, modifiedData);\n }\n\n renderMulti(items: RenderMultiItem[]): RenderMultiResponse[] {\n const results: RenderMultiResponse[] = [];\n for (const { template, templateItems } of items) {\n const instance = this._getTemplateInstance(template);\n for (const { type, commonData, datas } of templateItems) {\n for (const data of datas) {\n let result: RenderMultiResponse;\n try {\n const data2 = this._getModifiedData(data, commonData, type);\n const renderResult = this._renderTemplate(instance, data2);\n result = { result: renderResult };\n } catch (error) {\n const e = error instanceof Error ? error : new Error(`${error}`);\n result = { error: { name: e.name, message: e.message, stack: e.stack } };\n }\n results.push(result);\n }\n }\n }\n return results;\n }\n\n getModifiedData(data: CompositeRenderData, type: string): NoteData {\n return this._getModifiedData(data, undefined, type);\n }\n\n private _getTemplateInstance(template: string): (data: NoteData) => string {\n const cache = this._cache;\n let instance = cache.get(template);\n if (typeof instance === 'undefined') {\n this._updateCacheSize(this._cacheMaxSize - 1);\n instance = this._handlebars.compileAST(template);\n cache.set(template, instance);\n }\n return instance;\n }\n\n private _renderTemplate(instance: (data: NoteData) => string, data: NoteData): RenderResult {\n const renderSetup = this._renderSetup;\n const renderCleanup = this._renderCleanup;\n let result: string;\n let additions1: { requirements: Requirement[] } | null;\n try {\n additions1 = typeof renderSetup === 'function' ? renderSetup(data) : null;\n result = instance(data).replace(/^\\n+|\\n+$/g, '');\n } finally {\n if (typeof renderCleanup === 'function') {\n renderCleanup(data);\n }\n }\n return {\n result,\n requirements: additions1?.requirements ?? [],\n };\n }\n\n private _getModifiedData(data: PartialRenderData, commonData: CommonData | undefined, type: string): NoteData {\n if (typeof type === 'string') {\n const typeInfo = this._dataTypes.get(type);\n if (typeof typeInfo !== 'undefined') {\n let compositeData: CompositeRenderData;\n if (typeof commonData !== 'undefined') {\n compositeData = typeInfo.composeData(data, commonData);\n } else if (typeof (data as CompositeRenderData).commonData === 'undefined') {\n throw new Error('Incomplete data');\n } else {\n compositeData = data as CompositeRenderData;\n }\n return typeInfo.modifier(compositeData);\n }\n }\n throw new Error(`Invalid type: ${type}`);\n }\n\n private _updateCacheSize(maxSize: number): void {\n const cache = this._cache;\n let removeCount = cache.size - maxSize;\n if (removeCount <= 0) {\n return;\n }\n\n for (const key of cache.keys()) {\n cache.delete(key);\n if (--removeCount <= 0) {\n break;\n }\n }\n }\n\n private _registerHelper(name: string, helper: HelperFunction): void {\n const wrapper = function (this: unknown, ...args: unknown[]): unknown {\n const argCountM1 = Math.max(0, args.length - 1);\n const options = args[argCountM1] as HelperOptions;\n args.length = argCountM1;\n return helper(args, this, options);\n };\n this._handlebars.registerHelper(name, wrapper);\n }\n}\n\n// --- Main AnkiTemplateRenderer ---\n\n/**\n * This class contains all Anki-specific template rendering functionality.\n * It registers all 25+ Handlebars helpers and provides template rendering.\n *\n * Requires a Handlebars-compatible engine to be injected via the constructor.\n */\nexport class AnkiTemplateRenderer {\n private _templateRenderer: TemplateRendererCore;\n private _mediaProvider: TemplateRendererMediaProvider;\n private _stateStack: Map<string, unknown>[] | null;\n private _requirements: Requirement[] | null;\n private _cleanupCallbacks: (() => void)[];\n private _handlebars: HandlebarsInstance;\n\n constructor(handlebars: HandlebarsInstance) {\n this._handlebars = handlebars;\n this._templateRenderer = new TemplateRendererCore(handlebars);\n this._mediaProvider = new TemplateRendererMediaProvider();\n this._stateStack = null;\n this._requirements = null;\n this._cleanupCallbacks = [];\n }\n\n /**\n * Gets the core TemplateRenderer instance.\n */\n get templateRenderer(): TemplateRendererCore {\n return this._templateRenderer;\n }\n\n /**\n * Prepares the renderer by registering all Handlebars helpers and data types.\n */\n async prepare(): Promise<void> {\n this._templateRenderer.registerHelpers([\n ['dumpObject', this._dumpObject.bind(this)],\n ['furigana', this._furigana.bind(this)],\n ['furiganaPlain', this._furiganaPlain.bind(this)],\n ['multiLine', this._multiLine.bind(this)],\n ['regexReplace', this._regexReplace.bind(this)],\n ['regexMatch', this._regexMatch.bind(this)],\n ['mergeTags', this._mergeTags.bind(this)],\n ['eachUpTo', this._eachUpTo.bind(this)],\n ['spread', this._spread.bind(this)],\n ['op', this._op.bind(this)],\n ['get', this._get.bind(this)],\n ['set', this._set.bind(this)],\n ['scope', this._scope.bind(this)],\n ['property', this._property.bind(this)],\n ['noop', this._noop.bind(this)],\n ['isMoraPitchHigh', this._isMoraPitchHigh.bind(this)],\n ['getKanaMorae', this._getKanaMorae.bind(this)],\n ['typeof', this._getTypeof.bind(this)],\n ['join', this._join.bind(this)],\n ['concat', this._concat.bind(this)],\n ['pitchCategories', this._pitchCategories.bind(this)],\n ['formatGlossary', this._formatGlossary.bind(this)],\n ['hasMedia', this._hasMedia.bind(this)],\n ['getMedia', this._getMedia.bind(this)],\n ['hiragana', this._hiragana.bind(this)],\n ['katakana', this._katakana.bind(this)],\n ]);\n this._templateRenderer.registerDataType('ankiNote', {\n modifier: ({ marker, commonData }: CompositeRenderData) => createAnkiNoteData(marker, commonData),\n composeData: ({ marker }: PartialRenderData, commonData: CommonData): CompositeRenderData => ({\n marker,\n commonData,\n }),\n });\n this._templateRenderer.setRenderCallbacks(this._onRenderSetup.bind(this), this._onRenderCleanup.bind(this));\n }\n\n /**\n * Renders a single template with given data.\n */\n render(template: string, data: PartialRenderData, type: string): RenderResult {\n return this._templateRenderer.render(template, data, type);\n }\n\n /**\n * Renders multiple templates with given data.\n */\n renderMulti(items: RenderMultiItem[]): RenderMultiResponse[] {\n return this._templateRenderer.renderMulti(items);\n }\n\n /**\n * Gets modified data for a given type.\n */\n getModifiedData(data: CompositeRenderData, type: string): NoteData {\n return this._templateRenderer.getModifiedData(data, type);\n }\n\n // Private - callbacks\n\n private _onRenderSetup(): { requirements: Requirement[] } {\n const requirements: Requirement[] = [];\n this._stateStack = [new Map()];\n this._requirements = requirements;\n this._mediaProvider.requirements = requirements;\n return { requirements };\n }\n\n private _onRenderCleanup(): void {\n for (const callback of this._cleanupCallbacks) {\n callback();\n }\n this._stateStack = null;\n this._requirements = null;\n this._mediaProvider.requirements = null;\n this._cleanupCallbacks.length = 0;\n }\n\n private _safeString(text: string): unknown {\n return new this._handlebars.SafeString(text);\n }\n\n // Template helpers\n\n private _dumpObject(args: unknown[]): string {\n return JSON.stringify(args[0], null, 4);\n }\n\n private _furigana(args: unknown[], context: unknown, options: HelperOptions): unknown {\n const { expression, reading } = this._getFuriganaExpressionAndReading(args);\n const segments = distributeFurigana(expression, reading);\n\n let result = '';\n for (const { text, reading: reading2 } of segments) {\n result += reading2.length > 0 ? `<ruby>${text}<rt>${reading2}</rt></ruby>` : text;\n }\n\n return this._safeString(result);\n }\n\n private _furiganaPlain(args: unknown[]): string {\n const { expression, reading } = this._getFuriganaExpressionAndReading(args);\n const segments = distributeFurigana(expression, reading);\n\n let result = '';\n for (const { text, reading: reading2 } of segments) {\n if (reading2.length > 0) {\n if (result.length > 0) {\n result += ' ';\n }\n result += `${text}[${reading2}]`;\n } else {\n result += text;\n }\n }\n\n return result;\n }\n\n private _getFuriganaExpressionAndReading(args: unknown[]): { expression: string; reading: string } {\n let expression: unknown;\n let reading: unknown;\n if (args.length >= 2) {\n [expression, reading] = args;\n } else {\n const obj = args[0] as Record<string, unknown>;\n ({ expression, reading } = obj);\n }\n return {\n expression: typeof expression === 'string' ? expression : '',\n reading: typeof reading === 'string' ? reading : '',\n };\n }\n\n private _stringToMultiLineHtml(string: string): string {\n return string.split('\\n').join('<br>');\n }\n\n private _multiLine(_args: unknown[], context: unknown, options: HelperOptions): unknown {\n return this._safeString(this._stringToMultiLineHtml(this._computeValueString(options, context)));\n }\n\n private _regexReplace(args: unknown[], context: unknown, options: HelperOptions): string {\n const argCount = args.length;\n let value = this._computeValueString(options, context);\n if (argCount > 3) {\n value = `${(args.slice(3) as string[]).join('')}${value}`;\n }\n if (argCount > 1) {\n try {\n const [pattern, replacement, flags] = args as [string, string, string?];\n if (typeof pattern !== 'string') {\n throw new Error('Invalid pattern');\n }\n if (typeof replacement !== 'string') {\n throw new Error('Invalid replacement');\n }\n const regex = new RegExp(pattern, typeof flags === 'string' ? flags : 'g');\n value = value.replace(regex, replacement);\n } catch (e) {\n return `${e}`;\n }\n }\n return value;\n }\n\n private _regexMatch(args: unknown[], context: unknown, options: HelperOptions): string {\n const argCount = args.length;\n let value = this._computeValueString(options, context);\n if (argCount > 2) {\n value = `${(args.slice(2) as string[]).join('')}${value}`;\n }\n if (argCount > 0) {\n try {\n const [pattern, flags] = args as [string, string?];\n if (typeof pattern !== 'string') {\n throw new Error('Invalid pattern');\n }\n const regex = new RegExp(pattern, typeof flags === 'string' ? flags : '');\n const parts: string[] = [];\n value.replace(regex, (g0: string) => {\n parts.push(g0);\n return g0;\n });\n value = parts.join('');\n } catch (e) {\n return `${e}`;\n }\n }\n return value;\n }\n\n private _mergeTags(args: unknown[]): string {\n const [object, isGroupMode, isMergeMode] = args as [Record<string, SafeAny>, boolean, boolean];\n const tagSources: { name: string }[][] = [];\n if (Array.isArray(object.termTags)) {\n tagSources.push(object.termTags);\n }\n if (isGroupMode || isMergeMode) {\n const { definitions } = object;\n if (Array.isArray(definitions)) {\n for (const definition of definitions) {\n tagSources.push(definition.definitionTags);\n }\n }\n } else {\n if (Array.isArray(object.definitionTags)) {\n tagSources.push(object.definitionTags);\n }\n }\n\n const tags = new Set<string>();\n for (const tagSource of tagSources) {\n for (const tag of tagSource) {\n tags.add(tag.name);\n }\n }\n\n return [...tags].join(', ');\n }\n\n private _eachUpTo(args: unknown[], context: unknown, options: HelperOptions): string {\n const [iterable, maxCount] = args as [Iterable<unknown>, number];\n if (iterable) {\n const results: string[] = [];\n let any = false;\n for (const entry of iterable) {\n any = true;\n if (results.length >= maxCount) {\n break;\n }\n const processedEntry = this._computeValue(options, entry);\n results.push(`${processedEntry}`);\n }\n if (any) {\n return results.join('');\n }\n }\n return this._computeInverseString(options, context);\n }\n\n private _spread(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const array of args as Iterable<unknown>[]) {\n try {\n result.push(...array);\n } catch (_e) {\n // NOP\n }\n }\n return result;\n }\n\n private _op(args: unknown[]): unknown {\n const [operator] = args as [string];\n switch (args.length) {\n case 2:\n return this._evaluateUnaryExpression(operator, args[1]);\n case 3:\n return this._evaluateBinaryExpression(operator, args[1], args[2]);\n case 4:\n return this._evaluateTernaryExpression(operator, args[1], args[2], args[3]);\n default:\n return undefined;\n }\n }\n\n private _evaluateUnaryExpression(operator: string, operand1: SafeAny): unknown {\n switch (operator) {\n case '+':\n return +operand1;\n case '-':\n return -operand1;\n case '~':\n return ~operand1;\n case '!':\n return !operand1;\n default:\n return undefined;\n }\n }\n\n private _evaluateBinaryExpression(operator: string, operand1: SafeAny, operand2: SafeAny): unknown {\n switch (operator) {\n case '+':\n return operand1 + operand2;\n case '-':\n return operand1 - operand2;\n case '/':\n return operand1 / operand2;\n case '*':\n return operand1 * operand2;\n case '%':\n return operand1 % operand2;\n case '**':\n return operand1 ** operand2;\n case '==':\n return operand1 === operand2;\n case '!=':\n return operand1 !== operand2;\n case '===':\n return operand1 === operand2;\n case '!==':\n return operand1 !== operand2;\n case '<':\n return operand1 < operand2;\n case '<=':\n return operand1 <= operand2;\n case '>':\n return operand1 > operand2;\n case '>=':\n return operand1 >= operand2;\n case '<<':\n return operand1 << operand2;\n case '>>':\n return operand1 >> operand2;\n case '>>>':\n return operand1 >>> operand2;\n case '&':\n return operand1 & operand2;\n case '|':\n return operand1 | operand2;\n case '^':\n return operand1 ^ operand2;\n case '&&':\n return operand1 && operand2;\n case '||':\n return operand1 || operand2;\n default:\n return undefined;\n }\n }\n\n private _evaluateTernaryExpression(\n operator: string,\n operand1: SafeAny,\n operand2: SafeAny,\n operand3: SafeAny,\n ): unknown {\n switch (operator) {\n case '?:':\n return operand1 ? operand2 : operand3;\n default:\n return undefined;\n }\n }\n\n private _get(args: unknown[]): unknown {\n const [key] = args as [string];\n const stateStack = this._stateStack;\n if (stateStack === null) {\n throw new Error('Invalid state');\n }\n for (let i = stateStack.length; --i >= 0; ) {\n const map = stateStack[i];\n if (map.has(key)) {\n return map.get(key);\n }\n }\n return undefined;\n }\n\n private _set(args: unknown[], context: unknown, options: HelperOptions): string {\n const stateStack = this._stateStack;\n if (stateStack === null) {\n throw new Error('Invalid state');\n }\n switch (args.length) {\n case 1:\n {\n const [key] = args as [string];\n const value = this._computeValue(options, context);\n stateStack[stateStack.length - 1].set(key, value);\n }\n break;\n case 2:\n {\n const [key, value] = args as [string, unknown];\n stateStack[stateStack.length - 1].set(key, value);\n }\n break;\n }\n return '';\n }\n\n private _scope(_args: unknown[], context: unknown, options: HelperOptions): unknown {\n const stateStack = this._stateStack;\n if (stateStack === null) {\n throw new Error('Invalid state');\n }\n try {\n stateStack.push(new Map());\n return this._computeValue(options, context);\n } finally {\n if (stateStack.length > 1) {\n stateStack.pop();\n }\n }\n }\n\n private _property(args: unknown[]): unknown {\n const ii = args.length;\n if (ii <= 0) {\n return undefined;\n }\n\n try {\n let value: unknown = args[0];\n for (let i = 1; i < ii; ++i) {\n if (typeof value !== 'object' || value === null) {\n throw new Error('Invalid object');\n }\n const key = args[i];\n switch (typeof key) {\n case 'number':\n case 'string':\n case 'symbol':\n break;\n default:\n throw new Error('Invalid key');\n }\n value = (value as Record<string | number | symbol, unknown>)[key];\n }\n return value;\n } catch (_e) {\n return undefined;\n }\n }\n\n private _noop(_args: unknown[], context: unknown, options: HelperOptions): unknown {\n return this._computeValue(options, context);\n }\n\n private _isMoraPitchHigh(args: unknown[]): boolean {\n const [index, position] = args as [number, number];\n return isMoraPitchHigh(index, position);\n }\n\n private _getKanaMorae(args: unknown[]): string[] {\n const [text] = args as [string];\n return getKanaMorae(`${text}`);\n }\n\n private _getTypeof(args: unknown[], context: unknown, options: HelperOptions): TypeofResult {\n const ii = args.length;\n const value = ii > 0 ? args[0] : this._computeValue(options, context);\n return typeof value;\n }\n\n private _join(args: unknown[]): string {\n return args.length > 0 ? (args.slice(1, args.length) as unknown[]).flat().join(args[0] as string) : '';\n }\n\n private _concat(args: unknown[]): string {\n let result = '';\n for (let i = 0, ii = args.length; i < ii; ++i) {\n result += args[i];\n }\n return result;\n }\n\n private _pitchCategories(args: unknown[]): string[] {\n const [data] = args as [NoteData];\n const { dictionaryEntry } = data;\n if (dictionaryEntry.type !== 'term') {\n return [];\n }\n const { pronunciations: termPronunciations, headwords } = dictionaryEntry;\n const categories = new Set<string>();\n for (const { headwordIndex, pronunciations } of termPronunciations) {\n const { reading, wordClasses } = headwords[headwordIndex];\n const isVerbOrAdjective = isNonNounVerbOrAdjective(wordClasses);\n const pitches = getPronunciationsOfType(pronunciations, 'pitch-accent');\n for (const { positions } of pitches) {\n const category = getPitchCategory(reading, positions, isVerbOrAdjective);\n if (category !== null) {\n categories.add(category);\n }\n }\n }\n return [...categories];\n }\n\n private _formatGlossary(args: unknown[], _context: unknown, options: HelperOptions): unknown {\n const [_dictionary, content] = args as [string, DictionaryData.TermGlossaryContent];\n if (typeof content === 'string') {\n return this._safeString(this._stringToMultiLineHtml(content));\n }\n if (!(typeof content === 'object' && content !== null)) {\n return '';\n }\n switch (content.type) {\n case 'text':\n return this._safeString(this._stringToMultiLineHtml(content.text));\n case 'image':\n return '';\n case 'structured-content':\n return this._safeString('[structured content]');\n }\n return '';\n }\n\n private _hasMedia(args: unknown[], _context: unknown, options: HelperOptions): boolean {\n const data = this._getNoteDataFromOptions(options);\n return this._mediaProvider.hasMedia(data, args, options.hash);\n }\n\n private _getMedia(args: unknown[], _context: unknown, options: HelperOptions): string | null {\n const data = this._getNoteDataFromOptions(options);\n return this._mediaProvider.getMedia(data, args, options.hash, this._handlebars);\n }\n\n private _hiragana(args: unknown[], context: unknown, options: HelperOptions): string {\n const ii = args.length;\n const value = ii > 0 ? args[0] : this._computeValue(options, context);\n return typeof value === 'string' ? convertKatakanaToHiragana(value) : '';\n }\n\n private _katakana(args: unknown[], context: unknown, options: HelperOptions): string {\n const ii = args.length;\n const value = ii > 0 ? args[0] : this._computeValue(options, context);\n return typeof value === 'string' ? convertHiraganaToKatakana(value) : '';\n }\n\n // Utility helpers\n\n private _getNoteDataFromOptions(options: HelperOptions): NoteData {\n return options.data.root;\n }\n\n private _asString(value: unknown): string {\n return typeof value === 'string' ? value : `${value}`;\n }\n\n private _computeValue(options: HelperOptions, context: unknown): unknown {\n return typeof options.fn === 'function' ? options.fn(context) : '';\n }\n\n private _computeValueString(options: HelperOptions, context: unknown): string {\n return this._asString(this._computeValue(options, context));\n }\n\n private _computeInverse(options: HelperOptions, context: unknown): unknown {\n return typeof options.inverse === 'function' ? options.inverse(context) : '';\n }\n\n private _computeInverseString(options: HelperOptions, context: unknown): string {\n return this._asString(this._computeInverse(options, context));\n }\n}\n\n// --- Japanese utility functions needed by helpers ---\n\nconst HIRAGANA_CONVERSION_RANGE: [number, number] = [0x3041, 0x3096];\nconst KATAKANA_CONVERSION_RANGE: [number, number] = [0x30a1, 0x30f6];\nconst KANA_PROLONGED_SOUND_MARK_CODE_POINT = 0x30fc;\n\nfunction convertKatakanaToHiragana(text: string, keepProlongedSoundMarks = false): string {\n let result = '';\n const offset = HIRAGANA_CONVERSION_RANGE[0] - KATAKANA_CONVERSION_RANGE[0];\n for (const char of text) {\n const codePoint = char.codePointAt(0)!;\n if (codePoint === KANA_PROLONGED_SOUND_MARK_CODE_POINT && !keepProlongedSoundMarks) {\n result += char;\n } else if (codePoint >= KATAKANA_CONVERSION_RANGE[0] && codePoint <= KATAKANA_CONVERSION_RANGE[1]) {\n result += String.fromCodePoint(codePoint + offset);\n } else {\n result += char;\n }\n }\n return result;\n}\n\nfunction convertHiraganaToKatakana(text: string): string {\n let result = '';\n const offset = KATAKANA_CONVERSION_RANGE[0] - HIRAGANA_CONVERSION_RANGE[0];\n for (const char of text) {\n const codePoint = char.codePointAt(0)!;\n if (codePoint >= HIRAGANA_CONVERSION_RANGE[0] && codePoint <= HIRAGANA_CONVERSION_RANGE[1]) {\n result += String.fromCodePoint(codePoint + offset);\n } else {\n result += char;\n }\n }\n return result;\n}\n\nfunction isMoraPitchHigh(moraIndex: number, pitchAccentPosition: number | string): boolean {\n const pos =\n typeof pitchAccentPosition === 'string' ? Number.parseInt(pitchAccentPosition, 10) : pitchAccentPosition;\n if (pos === 0) {\n return moraIndex > 0;\n }\n if (moraIndex === 0) {\n return pos > 1;\n }\n return moraIndex < pos;\n}\n\nfunction getKanaMorae(text: string): string[] {\n const morae: string[] = [];\n const SMALL_KANA_SET = new Set('ぁぃぅぇぉゃゅょゎァィゥェォャュョヮ');\n for (const char of text) {\n if (morae.length > 0 && SMALL_KANA_SET.has(char)) {\n morae[morae.length - 1] += char;\n } else {\n morae.push(char);\n }\n }\n return morae;\n}\n\nfunction getPitchCategory(reading: string, positions: number | string, isVerbOrAdjective: boolean): string | null {\n const pos = typeof positions === 'string' ? Number.parseInt(positions, 10) : positions;\n if (pos === 0) {\n return 'heiban';\n }\n if (pos === 1) {\n return 'atamadaka';\n }\n const morae = getKanaMorae(reading);\n if (pos >= morae.length) {\n return isVerbOrAdjective ? 'kifuku' : 'odaka';\n }\n return isVerbOrAdjective ? 'kifuku' : 'nakadaka';\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/types/audio.d.ts
|
|
2
|
+
type AudioSourceType = 'jpod101' | 'language-pod-101' | 'jisho' | 'lingua-libre' | 'wiktionary' | 'text-to-speech' | 'text-to-speech-reading' | 'custom' | 'custom-json';
|
|
3
|
+
type AudioSourceInfo = {
|
|
4
|
+
type: AudioSourceType;
|
|
5
|
+
url: string;
|
|
6
|
+
voice: string;
|
|
7
|
+
};
|
|
8
|
+
type AudioUrlInfo = {
|
|
9
|
+
type: 'url';
|
|
10
|
+
url: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
};
|
|
13
|
+
type AudioTtsInfo = {
|
|
14
|
+
type: 'tts';
|
|
15
|
+
text: string;
|
|
16
|
+
voice: string;
|
|
17
|
+
};
|
|
18
|
+
type AudioInfo = AudioUrlInfo | AudioTtsInfo;
|
|
19
|
+
type WikimediaCommonsLookupResponse = {
|
|
20
|
+
query: {
|
|
21
|
+
search: {
|
|
22
|
+
title: string;
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
type WikimediaCommonsFileResponse = {
|
|
27
|
+
query: {
|
|
28
|
+
pages: {
|
|
29
|
+
[key: string]: {
|
|
30
|
+
imageinfo: {
|
|
31
|
+
url: string;
|
|
32
|
+
user: string;
|
|
33
|
+
}[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
type CustomAudioList = {
|
|
39
|
+
type: 'audioSourceList';
|
|
40
|
+
audioSources: {
|
|
41
|
+
url: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
}[];
|
|
44
|
+
}; //#endregion
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
47
|
+
export { AudioInfo, AudioSourceInfo, AudioSourceType, AudioTtsInfo, AudioUrlInfo, CustomAudioList, WikimediaCommonsFileResponse, WikimediaCommonsLookupResponse };
|
|
48
|
+
//# sourceMappingURL=audio-D9DvYyB7.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-D9DvYyB7.d.cts","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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/types/audio.d.ts
|
|
2
|
+
type AudioSourceType = 'jpod101' | 'language-pod-101' | 'jisho' | 'lingua-libre' | 'wiktionary' | 'text-to-speech' | 'text-to-speech-reading' | 'custom' | 'custom-json';
|
|
3
|
+
type AudioSourceInfo = {
|
|
4
|
+
type: AudioSourceType;
|
|
5
|
+
url: string;
|
|
6
|
+
voice: string;
|
|
7
|
+
};
|
|
8
|
+
type AudioUrlInfo = {
|
|
9
|
+
type: 'url';
|
|
10
|
+
url: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
};
|
|
13
|
+
type AudioTtsInfo = {
|
|
14
|
+
type: 'tts';
|
|
15
|
+
text: string;
|
|
16
|
+
voice: string;
|
|
17
|
+
};
|
|
18
|
+
type AudioInfo = AudioUrlInfo | AudioTtsInfo;
|
|
19
|
+
type WikimediaCommonsLookupResponse = {
|
|
20
|
+
query: {
|
|
21
|
+
search: {
|
|
22
|
+
title: string;
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
type WikimediaCommonsFileResponse = {
|
|
27
|
+
query: {
|
|
28
|
+
pages: {
|
|
29
|
+
[key: string]: {
|
|
30
|
+
imageinfo: {
|
|
31
|
+
url: string;
|
|
32
|
+
user: string;
|
|
33
|
+
}[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
type CustomAudioList = {
|
|
39
|
+
type: 'audioSourceList';
|
|
40
|
+
audioSources: {
|
|
41
|
+
url: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
}[];
|
|
44
|
+
}; //#endregion
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
47
|
+
export { AudioInfo, AudioSourceInfo, AudioSourceType, AudioTtsInfo, AudioUrlInfo, CustomAudioList, WikimediaCommonsFileResponse, WikimediaCommonsLookupResponse };
|
|
48
|
+
//# sourceMappingURL=audio-DQulUkDM.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-DQulUkDM.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"}
|