ssml-builder-js 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/ssml-editor-react/src/ssmlInsertions.ts","../packages/ssml-editor-elements/src/SsmlEditorElement.ts","../packages/ssml-editor-elements/src/index.ts","../src/elements.ts"],"sourcesContent":["import type { SsmlEditorLocalizedText } from \"./locales\";\nimport {\n BREAK_TIME_DESCRIPTIONS,\n BREAK_TIME_PRESETS,\n EMPHASIS_LEVEL_DESCRIPTIONS,\n EMPHASIS_LEVEL_PRESETS,\n EXPRESS_AS_STYLE_DESCRIPTIONS,\n EXPRESS_AS_STYLE_PRESETS,\n LANGUAGE_DESCRIPTIONS,\n LANGUAGE_PRESETS,\n PROSODY_PITCH_DESCRIPTIONS,\n PROSODY_PITCH_PRESETS,\n PROSODY_RATE_DESCRIPTIONS,\n PROSODY_RATE_PRESETS,\n PROSODY_VOLUME_DESCRIPTIONS,\n PROSODY_VOLUME_PRESETS,\n SAY_AS_DESCRIPTIONS,\n SAY_AS_PRESETS,\n SILENCE_VALUE_DESCRIPTIONS,\n SILENCE_VALUE_PRESETS,\n} from \"./constants/ssmlPresets\";\n\nexport type SsmlEditorInsertionMode = \"insert\" | \"wrap\";\n\nexport interface SsmlEditorInsertionOption {\n value: string;\n labels: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n}\n\nexport interface SsmlEditorInsertionTemplate {\n prefix: string;\n suffix: string;\n mode: SsmlEditorInsertionMode;\n}\n\nexport interface SsmlEditorInsertionDefinition {\n id: string;\n icon: string;\n tagName?: string;\n selfClosing?: boolean;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions: SsmlEditorLocalizedText;\n parameterDescription: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n createTemplate: (value: string) => SsmlEditorInsertionTemplate;\n}\n\nexport interface SsmlEditorCustomInsertionDefinition {\n id: string;\n tagName: string;\n attribute?: string;\n icon?: string;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n parameterDescription?: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n mode?: SsmlEditorInsertionMode;\n}\n\nexport type SsmlEditorCustomInsertion = SsmlEditorInsertionDefinition | SsmlEditorCustomInsertionDefinition;\n\nexport type SsmlEditorCustomInsertionCollection =\n | readonly SsmlEditorCustomInsertion[]\n | Readonly<Record<string, SsmlEditorCustomInsertion | undefined>>;\n\nexport interface SsmlEditorInsertionGroup {\n id: string;\n labels: SsmlEditorLocalizedText;\n insertionIds: readonly string[];\n}\n\nexport interface SsmlEditorToolbarGroup {\n id: string;\n buttonIds: readonly string[];\n}\n\nfunction localizedText(value: string): SsmlEditorLocalizedText {\n return { ja: value, en: value };\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/'/g, \"&apos;\");\n}\n\nexport function createSsmlEditorInsertionDefinition(\n definition: SsmlEditorCustomInsertionDefinition,\n): SsmlEditorInsertionDefinition {\n const mode = definition.mode ?? \"wrap\";\n const attribute = definition.attribute ? ` ${definition.attribute}=\"` : \"\";\n\n return {\n id: definition.id,\n icon: definition.icon ?? \"+\",\n tagName: definition.tagName,\n selfClosing: mode === \"insert\",\n labels: definition.labels,\n titles: definition.titles,\n descriptions: definition.descriptions ?? localizedText(`Inserts the <${definition.tagName}> element.`),\n parameterDescription:\n definition.parameterDescription ?? localizedText(`Selects the value for the <${definition.tagName}> element.`),\n options: definition.options,\n createTemplate: (value) => {\n const attributeValue = definition.attribute ? `${attribute}${escapeXmlAttribute(value)}\"` : \"\";\n if (mode === \"wrap\") {\n return {\n prefix: `<${definition.tagName}${attributeValue}>`,\n suffix: `</${definition.tagName}>`,\n mode,\n };\n }\n\n return {\n prefix: `<${definition.tagName}${attributeValue}/>`,\n suffix: \"\",\n mode,\n };\n },\n };\n}\n\nfunction createInsertionOptions(\n values: readonly string[],\n descriptions?: Readonly<Record<string, SsmlEditorLocalizedText>>,\n): readonly SsmlEditorInsertionOption[] {\n return values.map((value) => ({\n value,\n labels: { ja: value, en: value },\n ...(descriptions?.[value] ? { descriptions: descriptions[value] } : {}),\n }));\n}\n\nexport const SSML_INSERTIONS = [\n {\n id: \"break\",\n icon: \"⏸\",\n tagName: \"break\",\n selfClosing: true,\n labels: { ja: \"間\", en: \"Break\" },\n descriptions: {\n ja: \"指定した時間だけ無音の間を挿入します。\",\n en: \"Inserts a silent pause for the selected duration.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the duration of the silent pause.\",\n },\n options: createInsertionOptions(BREAK_TIME_PRESETS, BREAK_TIME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<break time=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n {\n id: \"emphasis\",\n icon: \"✦\",\n tagName: \"emphasis\",\n labels: { ja: \"強調\", en: \"Emphasis\" },\n descriptions: {\n ja: \"選択範囲の強調レベルを変更します。\",\n en: \"Changes the emphasis level of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の強調レベルを選択します。\",\n en: \"Selects the emphasis level for the selected text.\",\n },\n options: createInsertionOptions(EMPHASIS_LEVEL_PRESETS, EMPHASIS_LEVEL_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<emphasis level=\"${value}\">`,\n suffix: \"</emphasis>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"rate\",\n icon: \"↕\",\n tagName: \"prosody\",\n labels: { ja: \"速度\", en: \"Rate\" },\n descriptions: {\n ja: \"選択範囲の読み上げ速度を変更します。\",\n en: \"Changes the speech rate of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ速度を選択します。\",\n en: \"Selects the speech rate for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_RATE_PRESETS, PROSODY_RATE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody rate=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"pitch\",\n icon: \"↗\",\n tagName: \"prosody\",\n labels: { ja: \"高さ\", en: \"Pitch\" },\n descriptions: {\n ja: \"選択範囲の声の高さを変更します。\",\n en: \"Changes the pitch of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の声の高さを半音単位で選択します。\",\n en: \"Selects the pitch adjustment in semitone steps.\",\n },\n options: createInsertionOptions(PROSODY_PITCH_PRESETS, PROSODY_PITCH_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody pitch=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"volume\",\n icon: \"🔊\",\n tagName: \"prosody\",\n labels: { ja: \"音量\", en: \"Volume\" },\n descriptions: {\n ja: \"選択範囲の音量を変更します。\",\n en: \"Changes the volume of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の音量レベルを選択します。\",\n en: \"Selects the volume level for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_VOLUME_PRESETS, PROSODY_VOLUME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody volume=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"emotion\",\n icon: \"☺\",\n tagName: \"mstts:express-as\",\n labels: { ja: \"感情\", en: \"Emotion\" },\n descriptions: {\n ja: \"選択範囲に音声の感情スタイルを適用します。\",\n en: \"Applies a voice emotion style to the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する音声の感情スタイルを選択します。\",\n en: \"Selects the voice emotion style to apply.\",\n },\n options: createInsertionOptions(EXPRESS_AS_STYLE_PRESETS, EXPRESS_AS_STYLE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:express-as style=\"${value}\">`,\n suffix: \"</mstts:express-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"say-as\",\n icon: \"Aa\",\n tagName: \"say-as\",\n labels: { ja: \"読み上げ\", en: \"Say as\" },\n descriptions: {\n ja: \"数字や日付などの読み上げ方を指定します。\",\n en: \"Specifies how values such as numbers or dates are spoken.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ方を選択します。\",\n en: \"Selects how the selected text is spoken.\",\n },\n options: createInsertionOptions(SAY_AS_PRESETS, SAY_AS_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<say-as interpret-as=\"${value}\">`,\n suffix: \"</say-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"lang\",\n icon: \"文\",\n tagName: \"lang\",\n labels: { ja: \"言語\", en: \"Language\" },\n descriptions: {\n ja: \"選択範囲の読み上げ言語を変更します。\",\n en: \"Changes the speaking language of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する BCP-47 言語タグを選択します。\",\n en: \"Selects the BCP-47 language tag for the selected text.\",\n },\n options: createInsertionOptions(LANGUAGE_PRESETS, LANGUAGE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<lang xml:lang=\"${value}\">`,\n suffix: \"</lang>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"mstts:silence\",\n icon: \"⏳\",\n tagName: \"mstts:silence\",\n selfClosing: true,\n labels: { ja: \"無音\", en: \"Silence\" },\n descriptions: {\n ja: \"無音時間を挿入します。\",\n en: \"Inserts a silence interval.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the silence duration.\",\n },\n options: createInsertionOptions(SILENCE_VALUE_PRESETS, SILENCE_VALUE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:silence type=\"Leading\" value=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n] satisfies readonly SsmlEditorInsertionDefinition[];\n\nexport const DEFAULT_INSERTION_GROUPS = [\n {\n id: \"pauses\",\n labels: { ja: \"間・無音\", en: \"Pauses\" },\n insertionIds: [\"break\", \"mstts:silence\"],\n },\n {\n id: \"prosody\",\n labels: { ja: \"声の調整\", en: \"Voice\" },\n insertionIds: [\"rate\", \"pitch\", \"volume\"],\n },\n {\n id: \"expression\",\n labels: { ja: \"表現\", en: \"Expression\" },\n insertionIds: [\"emphasis\", \"emotion\"],\n },\n {\n id: \"pronunciation\",\n labels: { ja: \"読み上げ\", en: \"Pronunciation\" },\n insertionIds: [\"say-as\", \"lang\"],\n },\n] satisfies readonly SsmlEditorInsertionGroup[];\n\nexport function createDefaultToolbarGroups(\n insertionGroups: readonly SsmlEditorInsertionGroup[],\n): readonly SsmlEditorToolbarGroup[] {\n return [\n {\n id: \"history\",\n buttonIds: [\"undo\", \"redo\"],\n },\n ...insertionGroups.map(({ id, insertionIds }) => ({\n id,\n buttonIds: insertionIds,\n })),\n {\n id: \"document\",\n buttonIds: [\"clearAll\", \"format\", \"decorations\"],\n },\n {\n id: \"help\",\n buttonIds: [\"help\"],\n },\n ];\n}\n\nfunction getInsertionCollection(\n collection: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlEditorCustomInsertion[] {\n if (!collection) {\n return [];\n }\n\n return Array.isArray(collection)\n ? collection\n : Object.values(collection).filter((insertion): insertion is SsmlEditorCustomInsertion => insertion !== undefined);\n}\n\nexport function getConfiguredInsertions(\n emotionStyles: readonly string[] | undefined,\n customInsertions: SsmlEditorCustomInsertionCollection | undefined,\n additionalInsertions: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlEditorInsertionDefinition[] {\n const insertions = new Map<string, SsmlEditorInsertionDefinition>();\n for (const insertion of SSML_INSERTIONS) {\n if (insertion.id === \"emotion\" && emotionStyles !== undefined) {\n insertions.set(insertion.id, {\n ...insertion,\n options: createInsertionOptions(emotionStyles),\n });\n continue;\n }\n insertions.set(insertion.id, insertion);\n }\n\n const normalizeInsertion = (insertion: SsmlEditorCustomInsertion): SsmlEditorInsertionDefinition =>\n \"createTemplate\" in insertion ? insertion : createSsmlEditorInsertionDefinition(insertion);\n\n for (const insertion of getInsertionCollection(additionalInsertions)) {\n const normalized = normalizeInsertion(insertion);\n if (!insertions.has(normalized.id)) {\n insertions.set(normalized.id, normalized);\n }\n }\n\n for (const insertion of getInsertionCollection(customInsertions)) {\n const normalized = normalizeInsertion(insertion);\n insertions.set(normalized.id, normalized);\n }\n\n return [...insertions.values()];\n}\n\nexport function orderInsertions(\n insertions: readonly SsmlEditorInsertionDefinition[],\n insertionOrder: readonly string[] | undefined,\n): readonly SsmlEditorInsertionDefinition[] {\n if (!insertionOrder || insertionOrder.length === 0) {\n return insertions;\n }\n\n const insertionsById = new Map(insertions.map((insertion) => [insertion.id, insertion]));\n const ordered: SsmlEditorInsertionDefinition[] = [];\n const included = new Set<string>();\n for (const id of insertionOrder) {\n const insertion = insertionsById.get(id);\n if (insertion && !included.has(id)) {\n ordered.push(insertion);\n included.add(id);\n }\n }\n\n for (const insertion of insertions) {\n if (!included.has(insertion.id)) {\n ordered.push(insertion);\n }\n }\n\n return ordered;\n}\n\nexport function orderToolbarButtons(\n buttonIds: readonly string[],\n toolbarOrder: readonly string[] | undefined,\n): readonly string[] {\n if (!toolbarOrder || toolbarOrder.length === 0) {\n return buttonIds;\n }\n\n const available = new Set(buttonIds);\n const ordered: string[] = [];\n const included = new Set<string>();\n for (const id of toolbarOrder) {\n if (available.has(id) && !included.has(id)) {\n ordered.push(id);\n included.add(id);\n }\n }\n\n for (const id of buttonIds) {\n if (!included.has(id)) {\n ordered.push(id);\n }\n }\n\n return ordered;\n}\n","import type * as monaco from \"monaco-editor\";\nimport { buildSsml, parseSsml } from \"@ssml-builder-js/ssml-core\";\nimport type { SsmlDocument } from \"@ssml-builder-js/ssml-core\";\nimport { clearSsmlDocument } from \"../../ssml-editor-react/src/clearSsmlDocument\";\nimport { getEditableRegion, getEditableText, updateEditableText } from \"../../ssml-editor-react/src/editableSsml\";\nimport { formatXmlFragment } from \"../../ssml-editor-react/src/formatXml\";\nimport { registerSsmlCompletionProvider } from \"../../ssml-editor-react/src/ssmlCompletion\";\nimport { findActiveSsmlTags, findSsmlVoiceContext } from \"../../ssml-editor-react/src/ssmlContext\";\nimport { findSsmlHoverTarget, formatSsmlHover } from \"../../ssml-editor-react/src/ssmlHover\";\nimport { createSsmlInsertionEdit } from \"../../ssml-editor-react/src/ssmlInsertion\";\nimport {\n DEFAULT_INSERTION_GROUPS,\n SSML_INSERTIONS,\n type SsmlEditorInsertionDefinition,\n type SsmlEditorInsertionOption,\n} from \"../../ssml-editor-react/src/ssmlInsertions\";\nimport { EDITOR_COPY } from \"../../ssml-editor-react/src/locales\";\nimport { getExpressAsStyleCategory, resolveExpressAsStyles } from \"../../ssml-editor-react/src/constants/ssmlPresets\";\n\ntype Monaco = typeof monaco;\ntype MonacoEditor = monaco.editor.IStandaloneCodeEditor;\ntype MonacoModel = monaco.editor.ITextModel;\ntype MonacoDisposable = { dispose(): void };\n\nexport type SsmlEditorTheme = \"vs-dark\" | \"light\" | (string & {});\nexport type SsmlEditorLocale = \"ja\" | \"en\";\n\nexport interface SsmlEditorChangeDetail {\n value: string;\n}\n\nconst HTMLElementBase = (typeof HTMLElement === \"undefined\" ? class {} : HTMLElement) as typeof HTMLElement;\nconst STYLE_ID = \"ssml-editor-elements-theme\";\nconst STYLE_CSS = `\n[data-ssml-editor] {\n --ssml-editor-color: #111827;\n --ssml-editor-bg: #ffffff;\n --ssml-editor-border: #d1d5db;\n --ssml-editor-control-bg: #f9fafb;\n --ssml-editor-control-border: #9ca3af;\n --ssml-editor-active-bg: #dbeafe;\n --ssml-editor-active-border: #2563eb;\n --ssml-editor-preview-bg: #f3f4f6;\n}\nsection[data-ssml-editor] {\n display: grid;\n grid-template-rows: auto minmax(8rem, 1fr);\n gap: 0.75rem;\n box-sizing: border-box;\n width: 100%;\n min-height: 100%;\n padding: 1rem;\n border: 1px solid var(--ssml-editor-border);\n border-radius: 0.5rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-bg);\n}\n[data-ssml-editor][data-theme=\"dark\"] {\n --ssml-editor-color: #f9fafb;\n --ssml-editor-bg: #1f2937;\n --ssml-editor-border: #374151;\n --ssml-editor-control-bg: #111827;\n --ssml-editor-control-border: #4b5563;\n --ssml-editor-active-bg: #1e3a8a;\n --ssml-editor-active-border: #60a5fa;\n --ssml-editor-preview-bg: #111827;\n}\n[data-ssml-editor] .ssml-editor-toolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n[data-ssml-editor] .ssml-editor-toolbar-actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n[data-ssml-editor] .ssml-editor-toolbar-separator {\n width: 1px;\n height: 2.25rem;\n margin: 0 0.25rem;\n background: var(--ssml-editor-border);\n}\n[data-ssml-editor] .ssml-editor-toolbar-dropdown {\n display: inline-block;\n}\n[data-ssml-editor] .ssml-editor-toolbar-button {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n min-height: 2.25rem;\n padding: 0.375rem 0.625rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-control-bg);\n font: inherit;\n cursor: pointer;\n}\n[data-ssml-editor] .ssml-editor-toolbar-button:hover,\n[data-ssml-editor] .ssml-editor-toolbar-option:hover {\n background: var(--ssml-editor-preview-bg);\n}\n[data-ssml-editor] .ssml-editor-toolbar-button:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n[data-ssml-editor] .ssml-editor-toolbar-button[data-active=\"true\"] {\n border-color: var(--ssml-editor-active-border);\n background: var(--ssml-editor-active-bg);\n}\n[data-ssml-editor] .ssml-editor-toolbar-icon {\n display: inline-flex;\n width: 1.25rem;\n justify-content: center;\n font-size: 1.1rem;\n line-height: 1;\n}\n[data-ssml-editor] .ssml-editor-toolbar-chevron {\n font-size: 0.7rem;\n line-height: 1;\n}\n[data-ssml-editor] .ssml-editor-toolbar-switch {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n min-height: 2.25rem;\n}\n[data-ssml-editor] .ssml-editor-switch-track {\n display: inline-flex;\n align-items: center;\n width: 2.75rem;\n height: 1.5rem;\n padding: 0.1875rem;\n border: 0;\n border-radius: 999px;\n background: var(--ssml-editor-control-border);\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] {\n background: var(--ssml-editor-active-border);\n}\n[data-ssml-editor] .ssml-editor-switch-track:focus-visible {\n outline: 2px solid var(--ssml-editor-active-border);\n outline-offset: 2px;\n}\n[data-ssml-editor] .ssml-editor-switch-thumb {\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 50%;\n background: var(--ssml-editor-bg);\n transition: transform 0.2s ease;\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] .ssml-editor-switch-thumb {\n transform: translateX(1.25rem);\n}\n[data-ssml-editor].ssml-editor-toolbar-menu {\n position: fixed;\n z-index: 9999;\n display: grid;\n min-width: max-content;\n max-height: min(24rem, calc(100vh - 1rem));\n gap: 0.125rem;\n padding: 0.25rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n background: var(--ssml-editor-control-bg);\n box-shadow: 0 0.25rem 0.75rem rgb(0 0 0 / 20%);\n overflow-y: auto;\n}\n[data-ssml-editor] .ssml-editor-toolbar-option {\n padding: 0.375rem 0.5rem;\n border: 0;\n border-radius: 0.125rem;\n color: var(--ssml-editor-color);\n background: transparent;\n font: inherit;\n text-align: left;\n white-space: nowrap;\n cursor: pointer;\n}\n[data-ssml-editor] .ssml-editor-toolbar-option-group {\n display: grid;\n gap: 0.125rem;\n margin: 0;\n padding: 0;\n border: 0;\n}\n[data-ssml-editor] .ssml-editor-toolbar-option-group legend {\n padding: 0.375rem 0.5rem 0.125rem;\n font-size: 0.875rem;\n font-weight: 600;\n white-space: nowrap;\n}\n[data-ssml-editor] .ssml-editor-help {\n display: grid;\n gap: 0.5rem;\n padding: 0.75rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n background: var(--ssml-editor-preview-bg);\n}\n[data-ssml-editor] .ssml-editor-help h3,\n[data-ssml-editor] .ssml-editor-help p {\n margin: 0;\n}\n[data-ssml-editor] .ssml-editor-help-list {\n display: grid;\n gap: 0.375rem;\n margin: 0;\n padding-left: 1.25rem;\n}\n[data-ssml-editor] .ssml-editor-help-item {\n list-style: none;\n}\n[data-ssml-editor] .ssml-editor-help-item details {\n margin-top: 0.375rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n background: var(--ssml-editor-control-bg);\n}\n[data-ssml-editor] .ssml-editor-help-item summary {\n padding: 0.5rem 0.625rem;\n cursor: pointer;\n}\n[data-ssml-editor] .ssml-editor-help-item details p,\n[data-ssml-editor] .ssml-editor-help-item details ul {\n margin: 0.5rem 0.75rem 0.75rem;\n font-size: 0.875rem;\n}\n[data-ssml-editor] .ssml-editor-display {\n display: grid;\n grid-template-rows: auto minmax(8rem, 1fr);\n gap: 0.5rem;\n min-height: 0;\n}\n[data-ssml-editor] .ssml-editor-editor {\n position: relative;\n min-height: 8rem;\n height: 100%;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n overflow: visible;\n}\n`.trim();\n\nfunction injectStyles(): void {\n if (typeof document === \"undefined\" || document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = STYLE_CSS;\n document.head.appendChild(style);\n}\n\nfunction isDarkTheme(theme: SsmlEditorTheme): boolean {\n return theme === \"vs-dark\" || theme.toLowerCase().includes(\"dark\");\n}\n\nfunction getMenuPosition(trigger: HTMLElement, menu: HTMLElement): { top: number; left: number } {\n const bounds = trigger.getBoundingClientRect();\n const margin = 8;\n const top = Math.min(bounds.bottom + 4, window.innerHeight - menu.offsetHeight - margin);\n const left = Math.min(bounds.left, window.innerWidth - menu.offsetWidth - margin);\n return {\n top: Math.max(margin, top),\n left: Math.max(margin, left),\n };\n}\n\nexport class SsmlEditorElement extends HTMLElementBase {\n static readonly tagName = \"ssml-editor\";\n static readonly observedAttributes = [\n \"value\",\n \"theme\",\n \"readonly\",\n \"locale\",\n \"show-toolbar\",\n \"show-toolbar-labels\",\n \"show-decorations\",\n ];\n\n private editor: MonacoEditor | null = null;\n private model: MonacoModel | null = null;\n private monaco: Monaco | null = null;\n private root: HTMLElement | null = null;\n private toolbar: HTMLElement | null = null;\n private toolbarActions: HTMLElement | null = null;\n private display: HTMLElement | null = null;\n private editorContainer: HTMLDivElement | null = null;\n private helpPanel: HTMLElement | null = null;\n private openMenu: HTMLElement | null = null;\n private openMenuTrigger: HTMLButtonElement | null = null;\n private toolbarButtons = new Map<string, HTMLButtonElement>();\n private contentDisposable: MonacoDisposable | null = null;\n private cursorDisposable: MonacoDisposable | null = null;\n private completionDisposable: MonacoDisposable | null = null;\n private hoverDisposable: MonacoDisposable | null = null;\n private suppressChangeEvent = false;\n private initializationToken = 0;\n private valueState: string | undefined;\n private documentState: SsmlDocument | null = null;\n private decorationsVisible = false;\n private helpOpen = false;\n\n get value(): string {\n return this.valueState ?? this.getAttribute(\"value\") ?? \"\";\n }\n\n set value(value: string) {\n this.valueState = value;\n this.setAttribute(\"value\", value);\n }\n\n get theme(): SsmlEditorTheme {\n return this.getAttribute(\"theme\") || \"light\";\n }\n\n set theme(theme: SsmlEditorTheme) {\n this.setAttribute(\"theme\", theme);\n }\n\n get readonly(): boolean {\n return this.hasAttribute(\"readonly\");\n }\n\n set readonly(readonly: boolean) {\n if (readonly) {\n this.setAttribute(\"readonly\", \"\");\n } else {\n this.removeAttribute(\"readonly\");\n }\n }\n\n get locale(): SsmlEditorLocale {\n return this.getAttribute(\"locale\") === \"en\" ? \"en\" : \"ja\";\n }\n\n set locale(locale: SsmlEditorLocale) {\n this.setAttribute(\"locale\", locale);\n }\n\n private prepareDocument(value: string): string {\n try {\n this.documentState = parseSsml(value);\n return getEditableText(this.documentState);\n } catch {\n this.documentState = null;\n return value;\n }\n }\n\n connectedCallback(): void {\n if (this.editor || this.root) {\n return;\n }\n\n injectStyles();\n document.addEventListener(\"pointerdown\", this.handleDocumentPointerDown);\n document.addEventListener(\"keydown\", this.handleDocumentKeyDown);\n this.render();\n const token = ++this.initializationToken;\n void this.initialize(token);\n }\n\n disconnectedCallback(): void {\n this.initializationToken += 1;\n document.removeEventListener(\"pointerdown\", this.handleDocumentPointerDown);\n document.removeEventListener(\"keydown\", this.handleDocumentKeyDown);\n this.closeMenu();\n this.disposeEditor();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"value\") {\n this.valueState = newValue ?? \"\";\n if (this.editor) {\n const value = newValue ?? \"\";\n const editableValue = this.prepareDocument(value);\n if (this.editor.getValue() !== editableValue) {\n this.suppressChangeEvent = true;\n try {\n this.editor.setValue(editableValue);\n } finally {\n this.suppressChangeEvent = false;\n }\n }\n }\n return;\n }\n\n if (name === \"theme\" && this.monaco) {\n this.monaco.editor.setTheme(this.theme);\n this.updateTheme();\n return;\n }\n\n if (name === \"readonly\") {\n this.editor?.updateOptions({ readOnly: this.readonly });\n this.renderToolbar();\n return;\n }\n\n if (name === \"locale\" || name === \"show-toolbar\" || name === \"show-toolbar-labels\") {\n this.renderToolbar();\n this.renderHelp();\n return;\n }\n\n if (name === \"show-decorations\") {\n this.decorationsVisible = newValue !== null;\n this.updateDecorations();\n }\n }\n\n private render(): void {\n const root = document.createElement(\"section\");\n root.dataset.ssmlEditor = \"\";\n root.setAttribute(\"aria-label\", EDITOR_COPY[this.locale].editorAriaLabel);\n root.dataset.theme = isDarkTheme(this.theme) ? \"dark\" : \"light\";\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"ssml-editor-toolbar\";\n toolbar.dataset.ssmlEditorToolbar = \"\";\n const toolbarActions = document.createElement(\"div\");\n toolbarActions.className = \"ssml-editor-toolbar-actions\";\n toolbarActions.setAttribute(\"role\", \"toolbar\");\n toolbarActions.setAttribute(\"aria-label\", EDITOR_COPY[this.locale].toolbarAriaLabel);\n toolbarActions.dataset.ssmlEditorToolbarActions = \"\";\n toolbar.append(toolbarActions);\n\n const display = document.createElement(\"div\");\n display.className = \"ssml-editor-display\";\n display.dataset.ssmlEditorDisplay = \"\";\n const editorContainer = document.createElement(\"div\");\n editorContainer.className = \"ssml-editor-editor\";\n display.append(editorContainer);\n root.append(toolbar, display);\n this.replaceChildren(root);\n\n this.root = root;\n this.toolbar = toolbar;\n this.toolbarActions = toolbarActions;\n this.display = display;\n this.editorContainer = editorContainer;\n this.renderToolbar();\n this.renderHelp();\n }\n\n private renderToolbar(): void {\n const toolbar = this.toolbar;\n const toolbarActions = this.toolbarActions;\n if (!toolbar || !toolbarActions) {\n return;\n }\n\n this.closeMenu();\n const copy = EDITOR_COPY[this.locale];\n toolbar.hidden = this.getAttribute(\"show-toolbar\") === \"false\";\n toolbar.setAttribute(\"aria-label\", copy.toolbarAriaLabel);\n toolbarActions.setAttribute(\"aria-label\", copy.toolbarAriaLabel);\n toolbarActions.replaceChildren();\n this.toolbarButtons.clear();\n if (toolbar.hidden) {\n return;\n }\n\n const insertionById = new Map(SSML_INSERTIONS.map((insertion) => [insertion.id, insertion]));\n const toolbarIds = [\n \"undo\",\n \"redo\",\n ...DEFAULT_INSERTION_GROUPS.flatMap((group) => group.insertionIds),\n \"clearAll\",\n \"format\",\n \"decorations\",\n \"help\",\n ];\n const groupByButtonId = new Map<string, string>();\n for (const group of DEFAULT_INSERTION_GROUPS) {\n for (const buttonId of group.insertionIds) {\n groupByButtonId.set(buttonId, group.id);\n }\n }\n groupByButtonId.set(\"undo\", \"history\");\n groupByButtonId.set(\"redo\", \"history\");\n groupByButtonId.set(\"clearAll\", \"document\");\n groupByButtonId.set(\"format\", \"document\");\n groupByButtonId.set(\"decorations\", \"document\");\n groupByButtonId.set(\"help\", \"help\");\n\n let previousGroup: string | undefined;\n for (const id of toolbarIds) {\n const group = groupByButtonId.get(id);\n if (previousGroup !== undefined && group !== previousGroup) {\n const separator = document.createElement(\"span\");\n separator.className = \"ssml-editor-toolbar-separator\";\n separator.setAttribute(\"aria-hidden\", \"true\");\n toolbarActions.append(separator);\n }\n previousGroup = group;\n\n const insertion = insertionById.get(id);\n if (insertion) {\n toolbarActions.append(this.createInsertionButton(insertion));\n } else if (id === \"decorations\") {\n toolbarActions.append(this.createDecorationsSwitch());\n } else {\n toolbarActions.append(this.createActionButton(id));\n }\n }\n this.updateActiveButtons();\n }\n\n private createActionButton(id: string): HTMLButtonElement {\n const copy = EDITOR_COPY[this.locale];\n const labels: Record<string, string> = {\n undo: copy.undo,\n redo: copy.redo,\n clearAll: copy.clearAll,\n format: copy.format,\n help: copy.help,\n };\n const icons: Record<string, string> = {\n undo: \"↩\",\n redo: \"↪\",\n clearAll: \"×\",\n format: \"≡\",\n help: \"?\",\n };\n const titles: Record<string, string> = {\n undo: copy.undoTitle,\n redo: copy.redoTitle,\n clearAll: copy.clearAllTitle,\n format: copy.formatTitle,\n help: copy.helpTitle,\n };\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"ssml-editor-toolbar-button\";\n button.dataset.ssmlEditorButton = id;\n button.setAttribute(\"aria-label\", labels[id] ?? id);\n button.title = titles[id] ?? labels[id] ?? id;\n button.disabled = this.readonly && id !== \"help\";\n if (id === \"help\") {\n button.setAttribute(\"aria-expanded\", String(this.helpOpen));\n }\n const icon = document.createElement(\"span\");\n icon.className = \"ssml-editor-toolbar-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n icon.textContent = icons[id] ?? \"\";\n button.append(icon);\n if (this.hasAttribute(\"show-toolbar-labels\")) {\n button.append(document.createTextNode(labels[id] ?? id));\n }\n button.addEventListener(\"click\", () => {\n if (id === \"help\") {\n this.helpOpen = !this.helpOpen;\n button.setAttribute(\"aria-expanded\", String(this.helpOpen));\n this.renderHelp();\n } else if (!this.readonly) {\n this.handleAction(id);\n }\n });\n this.toolbarButtons.set(id, button);\n return button;\n }\n\n private createDecorationsSwitch(): HTMLElement {\n const copy = EDITOR_COPY[this.locale];\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ssml-editor-toolbar-switch\";\n const icon = document.createElement(\"span\");\n icon.className = \"ssml-editor-toolbar-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n icon.textContent = \"☆\";\n wrapper.append(icon);\n if (this.hasAttribute(\"show-toolbar-labels\")) {\n wrapper.append(document.createTextNode(copy.decorations));\n }\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"ssml-editor-switch-track\";\n button.dataset.ssmlEditorButton = \"decorations\";\n button.setAttribute(\"role\", \"switch\");\n button.setAttribute(\"aria-label\", copy.decorations);\n button.addEventListener(\"click\", () => {\n this.decorationsVisible = !this.decorationsVisible;\n this.updateDecorations();\n });\n wrapper.append(button);\n this.toolbarButtons.set(\"decorations\", button);\n this.updateDecorations();\n return wrapper;\n }\n\n private createInsertionButton(insertion: SsmlEditorInsertionDefinition): HTMLElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"ssml-editor-toolbar-button\";\n button.dataset.ssmlEditorButton = insertion.id;\n button.setAttribute(\"aria-label\", insertion.labels[this.locale]);\n button.setAttribute(\"aria-haspopup\", \"menu\");\n button.setAttribute(\"aria-expanded\", \"false\");\n button.title =\n insertion.titles?.[this.locale] ?? `${insertion.labels[this.locale]} — ${insertion.descriptions[this.locale]}`;\n const icon = document.createElement(\"span\");\n icon.className = \"ssml-editor-toolbar-icon\";\n icon.setAttribute(\"aria-hidden\", \"true\");\n icon.textContent = insertion.icon;\n button.append(icon);\n if (this.hasAttribute(\"show-toolbar-labels\")) {\n button.append(document.createTextNode(insertion.labels[this.locale]));\n }\n const chevron = document.createElement(\"span\");\n chevron.className = \"ssml-editor-toolbar-chevron\";\n chevron.setAttribute(\"aria-hidden\", \"true\");\n chevron.textContent = \"▾\";\n button.append(chevron);\n button.addEventListener(\"click\", () => this.toggleInsertionMenu(insertion, button));\n this.toolbarButtons.set(insertion.id, button);\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ssml-editor-toolbar-dropdown\";\n wrapper.append(button);\n return wrapper;\n }\n\n private toggleInsertionMenu(insertion: SsmlEditorInsertionDefinition, trigger: HTMLButtonElement): void {\n if (this.openMenuTrigger === trigger) {\n this.closeMenu();\n return;\n }\n\n this.closeMenu();\n const menu = this.createInsertionMenu(insertion);\n document.body.append(menu);\n const position = getMenuPosition(trigger, menu);\n menu.style.top = `${position.top}px`;\n menu.style.left = `${position.left}px`;\n trigger.setAttribute(\"aria-expanded\", \"true\");\n trigger.setAttribute(\"aria-controls\", menu.id);\n this.openMenu = menu;\n this.openMenuTrigger = trigger;\n }\n\n private createInsertionMenu(insertion: SsmlEditorInsertionDefinition): HTMLElement {\n const menu = document.createElement(\"div\");\n menu.className = \"ssml-editor-toolbar-menu\";\n menu.dataset.ssmlEditor = \"\";\n menu.dataset.theme = isDarkTheme(this.theme) ? \"dark\" : \"light\";\n menu.id = `ssml-editor-elements-menu-${insertion.id.replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n menu.setAttribute(\"role\", \"menu\");\n menu.setAttribute(\"aria-label\", insertion.labels[this.locale]);\n menu.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n\n const options = this.getInsertionOptions(insertion);\n if (options.length === 0) {\n const empty = document.createElement(\"p\");\n empty.className = \"ssml-editor-toolbar-option\";\n empty.textContent = EDITOR_COPY[this.locale].noAvailableOptions;\n menu.append(empty);\n } else {\n for (const group of this.getOptionGroups(insertion, options)) {\n if (group.label) {\n const fieldset = document.createElement(\"fieldset\");\n fieldset.className = \"ssml-editor-toolbar-option-group\";\n const legend = document.createElement(\"legend\");\n legend.textContent = group.label;\n fieldset.append(legend);\n for (const option of group.options) {\n fieldset.append(this.createOptionButton(insertion, option));\n }\n menu.append(fieldset);\n } else {\n for (const option of group.options) {\n menu.append(this.createOptionButton(insertion, option));\n }\n }\n }\n }\n return menu;\n }\n\n private getInsertionOptions(insertion: SsmlEditorInsertionDefinition): readonly SsmlEditorInsertionOption[] {\n if (insertion.id !== \"emotion\") {\n return insertion.options;\n }\n\n const model = this.model;\n const selection = this.editor?.getSelection();\n const voiceContext =\n model && selection\n ? findSsmlVoiceContext(model.getValue(), model.getOffsetAt(selection.getStartPosition()))\n : undefined;\n const voiceName =\n voiceContext === undefined\n ? this.documentState\n ? getEditableRegion(this.documentState).voiceName\n : undefined\n : voiceContext.voiceName;\n const availableStyles = new Set(\n resolveExpressAsStyles(\n voiceName,\n insertion.options.map((option) => option.value),\n ),\n );\n return insertion.options.filter((option) => availableStyles.has(option.value));\n }\n\n private getOptionGroups(\n insertion: SsmlEditorInsertionDefinition,\n options: readonly SsmlEditorInsertionOption[],\n ): readonly { label: string; options: readonly SsmlEditorInsertionOption[] }[] {\n if (insertion.id !== \"emotion\") {\n return [{ label: \"\", options }];\n }\n\n const copy = EDITOR_COPY[this.locale];\n const labels: Record<string, string> = {\n emotions: copy.categoryEmotions,\n scenarios: copy.categoryScenarios,\n media: copy.categoryMedia,\n other: copy.categoryOther,\n };\n const categories = [\"emotions\", \"scenarios\", \"media\", \"other\"] as const;\n return categories\n .map((category) => ({\n label: labels[category],\n options: options.filter((option) => getExpressAsStyleCategory(option.value) === category),\n }))\n .filter((group) => group.options.length > 0);\n }\n\n private createOptionButton(\n insertion: SsmlEditorInsertionDefinition,\n option: SsmlEditorInsertionOption,\n ): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"ssml-editor-toolbar-option\";\n button.setAttribute(\"role\", \"menuitem\");\n button.title = option.descriptions?.[this.locale] ?? insertion.descriptions[this.locale];\n button.textContent = option.labels[this.locale];\n button.disabled = this.readonly;\n button.addEventListener(\"click\", () => {\n if (!this.readonly) {\n this.applyInsertion(insertion, option);\n }\n this.closeMenu(true);\n });\n button.addEventListener(\"mousedown\", (event) => event.preventDefault());\n return button;\n }\n\n private handleAction(id: string): void {\n if (!this.editor) {\n return;\n }\n if (id === \"undo\" || id === \"redo\") {\n this.editor.trigger(\"ssml-toolbar\", id, null);\n this.editor.focus();\n } else if (id === \"clearAll\") {\n if (this.documentState) {\n this.replaceDocument(clearSsmlDocument(this.documentState));\n }\n } else if (id === \"format\") {\n if (this.documentState) {\n this.replaceDocument(updateEditableText(this.documentState, formatXmlFragment(this.editor.getValue())));\n } else {\n this.replaceEditorValue(formatXmlFragment(this.editor.getValue()));\n }\n }\n }\n\n private applyInsertion(insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void {\n const editor = this.editor;\n const model = this.model;\n const selection = editor?.getSelection();\n if (!editor || !model || !selection) {\n return;\n }\n\n const startOffset = model.getOffsetAt(selection.getStartPosition());\n const endOffset = model.getOffsetAt(selection.getEndPosition());\n const selectedText = selection.isEmpty() ? \"\" : model.getValueInRange(selection);\n const result = createSsmlInsertionEdit(\n model.getValue(),\n startOffset,\n endOffset,\n insertion.createTemplate(option.value),\n model.getEOL(),\n selectedText,\n );\n editor.pushUndoStop();\n const applied = editor.executeEdits(\"ssml-toolbar\", [{ range: selection, text: result.replacement }]);\n editor.pushUndoStop();\n if (!applied) {\n return;\n }\n\n const start = model.getPositionAt(startOffset + result.selectionOffset);\n const end = model.getPositionAt(endOffset + result.selectionOffset);\n editor.setSelection({\n selectionStartLineNumber: start.lineNumber,\n selectionStartColumn: start.column,\n positionLineNumber: end.lineNumber,\n positionColumn: end.column,\n });\n editor.focus();\n }\n\n private replaceEditorValue(value: string): void {\n const editor = this.editor;\n const model = editor?.getModel();\n if (!editor || !model || editor.getValue() === value) {\n return;\n }\n editor.pushUndoStop();\n editor.executeEdits(\"ssml-editor-toolbar\", [\n {\n range: model.getFullModelRange(),\n text: value,\n forceMoveMarkers: true,\n },\n ]);\n editor.pushUndoStop();\n editor.focus();\n }\n\n private replaceDocument(document: SsmlDocument): void {\n const editor = this.editor;\n const model = editor?.getModel();\n const editableValue = getEditableText(document);\n const fullValue = buildSsml(document);\n this.documentState = document;\n this.valueState = fullValue;\n\n if (!editor || !model || editor.getValue() === editableValue) {\n this.updateActiveButtons();\n this.dispatchChange(fullValue);\n return;\n }\n\n editor.pushUndoStop();\n editor.executeEdits(\"ssml-editor-toolbar\", [\n {\n range: model.getFullModelRange(),\n text: editableValue,\n forceMoveMarkers: true,\n },\n ]);\n editor.pushUndoStop();\n editor.focus();\n }\n\n private dispatchChange(value: string): void {\n if (this.suppressChangeEvent) {\n return;\n }\n this.dispatchEvent(\n new CustomEvent<SsmlEditorChangeDetail>(\"change\", {\n detail: { value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private updateDecorations(): void {\n const button = this.toolbarButtons.get(\"decorations\");\n if (button) {\n const copy = EDITOR_COPY[this.locale];\n button.setAttribute(\"aria-checked\", String(this.decorationsVisible));\n button.title = this.decorationsVisible ? copy.decorationsHideTitle : copy.decorationsShowTitle;\n }\n this.editor?.updateOptions({\n inlayHints: { enabled: this.decorationsVisible ? \"on\" : \"off\" },\n });\n }\n\n private renderHelp(): void {\n const display = this.display;\n if (!display) {\n return;\n }\n\n this.helpPanel?.remove();\n this.helpPanel = null;\n const root = this.root;\n if (root) {\n root.setAttribute(\"aria-label\", EDITOR_COPY[this.locale].editorAriaLabel);\n this.updateTheme();\n }\n if (!this.helpOpen || this.getAttribute(\"show-toolbar\") === \"false\") {\n return;\n }\n\n const copy = EDITOR_COPY[this.locale];\n const panel = document.createElement(\"section\");\n panel.className = \"ssml-editor-help\";\n panel.setAttribute(\"aria-label\", copy.helpHeading);\n const heading = document.createElement(\"h3\");\n heading.textContent = copy.helpHeading;\n const description = document.createElement(\"p\");\n description.textContent = copy.helpDescription;\n const list = document.createElement(\"ul\");\n list.className = \"ssml-editor-help-list\";\n for (const insertion of SSML_INSERTIONS) {\n const item = document.createElement(\"li\");\n item.className = \"ssml-editor-help-item\";\n const details = document.createElement(\"details\");\n const summary = document.createElement(\"summary\");\n summary.textContent = `${insertion.icon} ${insertion.labels[this.locale]} — ${insertion.descriptions[this.locale]}`;\n const parameters = document.createElement(\"p\");\n parameters.textContent = `${copy.parameters}: ${insertion.parameterDescription[this.locale]}`;\n const options = document.createElement(\"ul\");\n for (const option of insertion.options) {\n const optionItem = document.createElement(\"li\");\n optionItem.textContent = `${option.labels[this.locale]}${option.descriptions?.[this.locale] ? ` — ${option.descriptions[this.locale]}` : \"\"}`;\n options.append(optionItem);\n }\n details.append(summary, parameters, options);\n item.append(details);\n list.append(item);\n }\n panel.append(heading, description, list);\n display.prepend(panel);\n this.helpPanel = panel;\n }\n\n private updateTheme(): void {\n if (this.root) {\n this.root.dataset.theme = isDarkTheme(this.theme) ? \"dark\" : \"light\";\n }\n }\n\n private updateActiveButtons(): void {\n const editor = this.editor;\n const model = this.model;\n const selection = editor?.getSelection();\n if (!editor || !model || !selection) {\n return;\n }\n\n const activeTags = findActiveSsmlTags(model.getValue(), model.getOffsetAt(selection.getStartPosition()));\n for (const insertion of SSML_INSERTIONS) {\n const button = this.toolbarButtons.get(insertion.id);\n if (button) {\n button.dataset.active = String(\n insertion.tagName !== undefined && activeTags.has(insertion.tagName.toLowerCase()),\n );\n }\n }\n }\n\n private async initialize(token: number): Promise<void> {\n const container = this.editorContainer;\n if (!container) {\n return;\n }\n\n const monacoModule = await import(\"monaco-editor\");\n if (token !== this.initializationToken || !this.isConnected) {\n return;\n }\n\n const model = monacoModule.editor.createModel(this.prepareDocument(this.value), \"xml\");\n const editor = monacoModule.editor.create(container, {\n model,\n theme: this.theme,\n readOnly: this.readonly,\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: \"on\",\n inlayHints: { enabled: this.decorationsVisible ? \"on\" : \"off\" },\n });\n\n if (token !== this.initializationToken || !this.isConnected) {\n editor.dispose();\n model.dispose();\n return;\n }\n\n this.monaco = monacoModule;\n this.model = model;\n this.editor = editor;\n this.contentDisposable = editor.onDidChangeModelContent(() => {\n const value = editor.getValue();\n let nextValue = value;\n if (this.documentState) {\n this.documentState = updateEditableText(this.documentState, value);\n nextValue = buildSsml(this.documentState);\n }\n this.valueState = nextValue;\n this.updateActiveButtons();\n this.dispatchChange(nextValue);\n });\n this.cursorDisposable = editor.onDidChangeCursorPosition(() => this.updateActiveButtons());\n this.completionDisposable = registerSsmlCompletionProvider(monacoModule, {\n model,\n getOuterVoiceName: () => (this.documentState ? getEditableRegion(this.documentState).voiceName : undefined),\n });\n this.hoverDisposable = monacoModule.languages.registerHoverProvider(\"xml\", {\n provideHover: (hoverModel, position) => {\n const target = findSsmlHoverTarget(hoverModel.getValue(), position.lineNumber, position.column);\n if (!target) {\n return undefined;\n }\n\n return {\n contents: [\n {\n isTrusted: false,\n supportHtml: false,\n value: formatSsmlHover(target),\n },\n ],\n range: target.range,\n };\n },\n });\n this.updateActiveButtons();\n }\n\n private readonly handleDocumentPointerDown = (event: PointerEvent): void => {\n const target = event.target;\n if (\n this.openMenu &&\n target instanceof Node &&\n !this.openMenu.contains(target) &&\n !this.openMenuTrigger?.contains(target)\n ) {\n this.closeMenu();\n }\n };\n\n private readonly handleDocumentKeyDown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\" && this.openMenu) {\n this.closeMenu(true);\n }\n };\n\n private closeMenu(restoreFocus = false): void {\n this.openMenu?.remove();\n this.openMenu = null;\n if (this.openMenuTrigger) {\n this.openMenuTrigger.setAttribute(\"aria-expanded\", \"false\");\n this.openMenuTrigger.removeAttribute(\"aria-controls\");\n if (restoreFocus) {\n this.openMenuTrigger.focus();\n }\n }\n this.openMenuTrigger = null;\n }\n\n private disposeEditor(): void {\n this.closeMenu();\n this.contentDisposable?.dispose();\n this.contentDisposable = null;\n this.cursorDisposable?.dispose();\n this.cursorDisposable = null;\n this.completionDisposable?.dispose();\n this.completionDisposable = null;\n this.hoverDisposable?.dispose();\n this.hoverDisposable = null;\n this.editor?.dispose();\n this.editor = null;\n this.model?.dispose();\n this.model = null;\n this.monaco = null;\n this.root?.remove();\n this.root = null;\n this.toolbar = null;\n this.toolbarActions = null;\n this.display = null;\n this.editorContainer = null;\n this.helpPanel = null;\n this.toolbarButtons.clear();\n }\n}\n","import { SsmlEditorElement } from \"./SsmlEditorElement\";\n\nexport { SsmlEditorElement } from \"./SsmlEditorElement\";\nexport type { SsmlEditorChangeDetail, SsmlEditorLocale, SsmlEditorTheme } from \"./SsmlEditorElement\";\n\nexport function defineSsmlEditorElement(): void {\n if (typeof customElements === \"undefined\" || customElements.get(SsmlEditorElement.tagName)) {\n return;\n }\n\n customElements.define(SsmlEditorElement.tagName, SsmlEditorElement);\n}\n","import { defineSsmlEditorElement } from \"../packages/ssml-editor-elements/src/index\";\n\nexport * from \"../packages/ssml-editor-elements/src/index\";\n\ndefineSsmlEditorElement();\n"],"mappings":"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","names":["document"]}
package/dist/index.js CHANGED
@@ -100,6 +100,7 @@ var SSML_ATTRS = {
100
100
  STYLE: "style",
101
101
  STYLE_DEGREE: "styledegree",
102
102
  STYLE_DEGREE_CAMEL: "styleDegree",
103
+ STYLE_DEGREE_HYPHEN: "style-degree",
103
104
  ROLE: "role",
104
105
  INTERPRET_AS: "interpret-as",
105
106
  FORMAT: "format",
@@ -647,7 +648,12 @@ function convertElement(node) {
647
648
  case SSML_TAGS.MSTTS_EXPRESS_AS: {
648
649
  const element = { type: node.name };
649
650
  const style = readAttribute(attributes, SSML_ATTRS.STYLE);
650
- const styleDegree = readAttribute(attributes, SSML_ATTRS.STYLE_DEGREE, SSML_ATTRS.STYLE_DEGREE_CAMEL);
651
+ const styleDegree = readAttribute(
652
+ attributes,
653
+ SSML_ATTRS.STYLE_DEGREE,
654
+ SSML_ATTRS.STYLE_DEGREE_CAMEL,
655
+ SSML_ATTRS.STYLE_DEGREE_HYPHEN
656
+ );
651
657
  const role = readAttribute(attributes, SSML_ATTRS.ROLE);
652
658
  if (style !== void 0) element.style = style;
653
659
  if (styleDegree !== void 0) element.styleDegree = styleDegree;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../packages/ssml-core/src/constants/ssml.ts","../packages/ssml-core/src/builder.ts","../packages/ssml-core/src/parser.ts","../packages/ssml-core/src/partial.ts","../packages/ssml-core/src/validation.ts","../packages/azure-tts-client/src/errors.ts","../packages/azure-tts-client/src/synthesis.ts","../packages/azure-tts-client/src/speechConfig.ts","../packages/azure-tts-client/src/outputFormats.ts","../packages/azure-tts-client/src/client.ts"],"sourcesContent":["export * from \"../packages/ssml-core/src/index\";\nexport * from \"../packages/azure-tts-client/src/index\";\n","export const SYNTHESIS_NAMESPACE = \"http://www.w3.org/2001/10/synthesis\" as const;\nexport const MSTTS_NAMESPACE = \"http://www.w3.org/2001/mstts\" as const;\nexport const DEFAULT_SSML_VERSION = \"1.0\" as const;\nexport const DEFAULT_SSML_LANGUAGE = \"en-US\" as const;\nexport const MAX_NESTING_DEPTH = 1000;\nexport const XML_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.:-]*$/;\nexport const MSTTS_TAG_PREFIX = \"mstts:\" as const;\n\nexport const SSML_TAGS = {\n SPEAK: \"speak\",\n VOICE: \"voice\",\n PROSODY: \"prosody\",\n BREAK: \"break\",\n EXPRESS_AS: \"express-as\",\n EXPRESS_AS_CAMEL: \"expressAs\",\n MSTTS_EXPRESS_AS: \"mstts:express-as\",\n SAY_AS: \"say-as\",\n SAY_AS_CAMEL: \"sayAs\",\n PHONEME: \"phoneme\",\n EMPHASIS: \"emphasis\",\n AUDIO: \"audio\",\n SUB: \"sub\",\n LANG: \"lang\",\n MARK: \"mark\",\n BOOKMARK: \"bookmark\",\n LEXICON: \"lexicon\",\n PARAGRAPH: \"p\",\n SENTENCE: \"s\",\n WORD: \"w\",\n MSTTS_SILENCE: \"mstts:silence\",\n SILENCE: \"silence\",\n MSTTS_VISEME: \"mstts:viseme\",\n VISEME: \"viseme\",\n} as const;\n\nexport const SSML_ATTRS = {\n VERSION: \"version\",\n XMLNS: \"xmlns\",\n XML_LANG: \"xml:lang\",\n LANG: \"lang\",\n MSTTS_XMLNS: \"xmlns:mstts\",\n NAME: \"name\",\n EFFECT: \"effect\",\n RATE: \"rate\",\n PITCH: \"pitch\",\n VOLUME: \"volume\",\n CONTOUR: \"contour\",\n RANGE: \"range\",\n TIME: \"time\",\n STRENGTH: \"strength\",\n STYLE: \"style\",\n STYLE_DEGREE: \"styledegree\",\n STYLE_DEGREE_CAMEL: \"styleDegree\",\n ROLE: \"role\",\n INTERPRET_AS: \"interpret-as\",\n FORMAT: \"format\",\n DETAIL: \"detail\",\n ALPHABET: \"alphabet\",\n PH: \"ph\",\n LEVEL: \"level\",\n SRC: \"src\",\n DESC: \"desc\",\n CLIP_BEGIN: \"clipBegin\",\n CLIP_END: \"clipEnd\",\n SPEED: \"speed\",\n REPEAT_COUNT: \"repeatCount\",\n REPEAT_DURATION: \"repeatDuration\",\n SOUND_LEVEL: \"soundLevel\",\n ALIAS: \"alias\",\n MARK: \"mark\",\n URI: \"uri\",\n TYPE: \"type\",\n VALUE: \"value\",\n} as const;\n","import type {\n SsmlAttributeValue,\n SsmlAttributes,\n SsmlDocument,\n SsmlElement,\n SsmlElementBase,\n SsmlNode,\n} from \"./types.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n MSTTS_NAMESPACE,\n MSTTS_TAG_PREFIX,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n XML_NAME_PATTERN,\n} from \"./constants/ssml.ts\";\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n}\n\nfunction addAttribute(attributes: SsmlAttributes, name: string, value: SsmlAttributeValue | undefined): void {\n if (value !== undefined) {\n attributes[name] = value;\n }\n}\n\nfunction getAttributes(element: SsmlElement): SsmlAttributes {\n const attributes: SsmlAttributes = {\n ...(element.attributes ?? {}),\n };\n\n switch (element.type) {\n case SSML_TAGS.VOICE:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n addAttribute(attributes, SSML_ATTRS.EFFECT, element.effect);\n break;\n case SSML_TAGS.PROSODY:\n addAttribute(attributes, SSML_ATTRS.RATE, element.rate);\n addAttribute(attributes, SSML_ATTRS.PITCH, element.pitch);\n addAttribute(attributes, SSML_ATTRS.VOLUME, element.volume);\n addAttribute(attributes, SSML_ATTRS.CONTOUR, element.contour);\n addAttribute(attributes, SSML_ATTRS.RANGE, element.range);\n break;\n case SSML_TAGS.BREAK:\n addAttribute(attributes, SSML_ATTRS.TIME, element.time);\n addAttribute(attributes, SSML_ATTRS.STRENGTH, element.strength);\n break;\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n addAttribute(attributes, SSML_ATTRS.STYLE, element.style);\n addAttribute(attributes, SSML_ATTRS.STYLE_DEGREE, element.styleDegree);\n addAttribute(attributes, SSML_ATTRS.ROLE, element.role);\n break;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n addAttribute(attributes, SSML_ATTRS.INTERPRET_AS, element.interpretAs);\n addAttribute(attributes, SSML_ATTRS.FORMAT, element.format);\n addAttribute(attributes, SSML_ATTRS.DETAIL, element.detail);\n break;\n case SSML_TAGS.PHONEME:\n addAttribute(attributes, SSML_ATTRS.ALPHABET, element.alphabet);\n addAttribute(attributes, SSML_ATTRS.PH, element.ph);\n break;\n case SSML_TAGS.EMPHASIS:\n addAttribute(attributes, SSML_ATTRS.LEVEL, element.level);\n break;\n case SSML_TAGS.AUDIO:\n addAttribute(attributes, SSML_ATTRS.SRC, element.src);\n addAttribute(attributes, SSML_ATTRS.DESC, element.desc);\n addAttribute(attributes, SSML_ATTRS.CLIP_BEGIN, element.clipBegin);\n addAttribute(attributes, SSML_ATTRS.CLIP_END, element.clipEnd);\n addAttribute(attributes, SSML_ATTRS.SPEED, element.speed);\n addAttribute(attributes, SSML_ATTRS.REPEAT_COUNT, element.repeatCount);\n addAttribute(attributes, SSML_ATTRS.REPEAT_DURATION, element.repeatDuration);\n addAttribute(attributes, SSML_ATTRS.SOUND_LEVEL, element.soundLevel);\n break;\n case SSML_TAGS.SUB:\n addAttribute(attributes, SSML_ATTRS.ALIAS, element.alias);\n break;\n case SSML_TAGS.LANG:\n addAttribute(attributes, SSML_ATTRS.XML_LANG, element.lang);\n break;\n case SSML_TAGS.MARK:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n break;\n case SSML_TAGS.BOOKMARK:\n addAttribute(attributes, SSML_ATTRS.MARK, element.mark);\n break;\n case SSML_TAGS.LEXICON:\n addAttribute(attributes, SSML_ATTRS.URI, element.uri);\n break;\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.silenceType);\n addAttribute(attributes, SSML_ATTRS.VALUE, element.value);\n break;\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.visemeType);\n break;\n case SSML_TAGS.PARAGRAPH:\n case SSML_TAGS.SENTENCE:\n case SSML_TAGS.WORD:\n case \"element\":\n case \"custom\":\n break;\n }\n\n return attributes;\n}\n\nfunction getTagName(element: SsmlElement): string {\n switch (element.type) {\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n return SSML_TAGS.MSTTS_EXPRESS_AS;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n return SSML_TAGS.SAY_AS;\n case SSML_TAGS.SILENCE:\n case SSML_TAGS.MSTTS_SILENCE:\n return SSML_TAGS.MSTTS_SILENCE;\n case SSML_TAGS.VISEME:\n case SSML_TAGS.MSTTS_VISEME:\n return SSML_TAGS.MSTTS_VISEME;\n case \"element\":\n case \"custom\":\n return element.name;\n default:\n return element.type;\n }\n}\n\nfunction getChildren(element: SsmlElementBase): SsmlNode[] {\n return element.children ?? [];\n}\n\nfunction validateName(name: string, kind: \"element\" | \"attribute\"): void {\n if (!XML_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid XML ${kind} name: ${name}`);\n }\n}\n\nfunction serializeAttributes(attributes: SsmlAttributes): string {\n return Object.entries(attributes)\n .map(([name, value]) => {\n validateName(name, \"attribute\");\n return ` ${name}=\"${escapeAttribute(String(value))}\"`;\n })\n .join(\"\");\n}\n\nfunction serializeNode(node: SsmlNode): string {\n if (typeof node === \"string\") {\n return escapeText(node);\n }\n\n if (node.type === \"text\") {\n return escapeText(node.value);\n }\n\n const tagName = getTagName(node);\n validateName(tagName, \"element\");\n\n const attributes = serializeAttributes(getAttributes(node));\n const children = getChildren(node);\n if (children.length === 0) {\n return `<${tagName}${attributes}/>`;\n }\n\n return `<${tagName}${attributes}>${children.map(serializeNode).join(\"\")}</${tagName}>`;\n}\n\nfunction usesMsttsNamespace(nodes: SsmlNode[]): boolean {\n return nodes.some((node) => {\n if (typeof node === \"string\" || node.type === \"text\") {\n return false;\n }\n\n const tagName = getTagName(node);\n return tagName.startsWith(MSTTS_TAG_PREFIX) || usesMsttsNamespace(getChildren(node));\n });\n}\n\nfunction serializeDocument(document: SsmlDocument): string {\n const children = document.children ?? (document.content === undefined ? [] : [document.content]);\n const attributes: SsmlAttributes = {\n ...(document.attributes ?? {}),\n [SSML_ATTRS.VERSION]: document.version,\n [SSML_ATTRS.XMLNS]: SYNTHESIS_NAMESPACE,\n [SSML_ATTRS.XML_LANG]: document.lang,\n };\n\n if (usesMsttsNamespace(children) && attributes[SSML_ATTRS.MSTTS_XMLNS] === undefined) {\n attributes[SSML_ATTRS.MSTTS_XMLNS] = MSTTS_NAMESPACE;\n }\n\n return `<${SSML_TAGS.SPEAK}${serializeAttributes(attributes)}>${children.map(serializeNode).join(\"\")}</${SSML_TAGS.SPEAK}>`;\n}\n\nexport function buildSsml(document: SsmlDocument): string;\nexport function buildSsml(content: string, lang?: string): SsmlDocument;\nexport function buildSsml(\n documentOrContent: SsmlDocument | string,\n lang: string = DEFAULT_SSML_LANGUAGE,\n): string | SsmlDocument {\n if (typeof documentOrContent === \"string\") {\n return {\n version: DEFAULT_SSML_VERSION,\n lang,\n content: documentOrContent,\n };\n }\n\n return serializeDocument(documentOrContent);\n}\n","import type {\n AudioElement,\n BookmarkElement,\n BreakElement,\n CustomElement,\n EmphasisElement,\n ExpressAsElement,\n LangElement,\n LexiconElement,\n MarkElement,\n MsttsSilenceElement,\n MsttsVisemeElement,\n ParagraphElement,\n PhonemeElement,\n ProsodyElement,\n SayAsElement,\n SentenceElement,\n SsmlAttributes,\n SsmlDocument,\n SsmlElement,\n SsmlNode,\n SubElement,\n VoiceElement,\n WordElement,\n} from \"./types.ts\";\nimport { MAX_NESTING_DEPTH, MSTTS_NAMESPACE, SSML_ATTRS, SSML_TAGS, SYNTHESIS_NAMESPACE } from \"./constants/ssml.ts\";\n\ninterface XmlElementNode {\n name: string;\n attributes: SsmlAttributes;\n children: XmlNode[];\n}\n\ntype XmlNode = string | XmlElementNode;\n\nconst XML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n quot: '\"',\n};\n\nfunction hasOwn(object: object, property: PropertyKey): boolean {\n return Object.getOwnPropertyDescriptor(object, property) !== undefined;\n}\n\nfunction setAttribute(attributes: SsmlAttributes, name: string, value: string): void {\n Object.defineProperty(attributes, name, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nfunction decodeEntity(entity: string): string {\n const namedValue = hasOwn(XML_ENTITIES, entity) ? XML_ENTITIES[entity] : undefined;\n if (namedValue !== undefined) {\n return namedValue;\n }\n\n const isHexadecimal = entity.startsWith(\"#x\") || entity.startsWith(\"#X\");\n const isDecimal = entity.startsWith(\"#\");\n if (!isHexadecimal && !isDecimal) {\n throw new Error(`Unknown XML entity: &${entity};`);\n }\n\n const digits = entity.slice(isHexadecimal ? 2 : 1);\n const codePoint = Number.parseInt(digits, isHexadecimal ? 16 : 10);\n if (\n !digits ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > 0x10ffff ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (codePoint < 0x20 && ![9, 10, 13].includes(codePoint))\n ) {\n throw new Error(`Invalid XML character reference: &${entity};`);\n }\n\n return String.fromCodePoint(codePoint);\n}\n\nfunction decodeXmlEntities(value: string): string {\n let result = \"\";\n let start = 0;\n\n while (true) {\n const ampersand = value.indexOf(\"&\", start);\n if (ampersand === -1) {\n return result + value.slice(start);\n }\n\n result += value.slice(start, ampersand);\n const semicolon = value.indexOf(\";\", ampersand + 1);\n if (semicolon === -1) {\n throw new Error(\"Unterminated XML entity reference\");\n }\n\n result += decodeEntity(value.slice(ampersand + 1, semicolon));\n start = semicolon + 1;\n }\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction removeStandardNamespaceAttributes(attributes: SsmlAttributes): void {\n if (attributes[SSML_ATTRS.XMLNS] === SYNTHESIS_NAMESPACE) {\n delete attributes[SSML_ATTRS.XMLNS];\n }\n if (attributes[SSML_ATTRS.MSTTS_XMLNS] === MSTTS_NAMESPACE) {\n delete attributes[SSML_ATTRS.MSTTS_XMLNS];\n }\n}\n\nclass XmlParser {\n #index = 0;\n private readonly source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n parse(): XmlElementNode {\n if (this.source.charCodeAt(0) === 0xfeff) {\n this.#index += 1;\n }\n\n this.skipMisc();\n if (this.#index >= this.source.length) {\n this.fail(\"SSML input is empty\");\n }\n if (this.source[this.#index] !== \"<\") {\n this.fail(\"SSML input must start with an XML element\");\n }\n\n const root = this.parseElement(0);\n this.skipMisc();\n if (this.#index !== this.source.length) {\n this.fail(\"Unexpected content after the root XML element\");\n }\n return root;\n }\n\n private parseElement(depth: number): XmlElementNode {\n if (depth > MAX_NESTING_DEPTH) {\n this.fail(\"XML nesting depth exceeds the supported limit\");\n }\n\n this.expect(\"<\");\n if (this.source[this.#index] === \"/\") {\n this.fail(\"Unexpected closing XML element\");\n }\n\n const name = this.parseName();\n const { attributes, selfClosing } = this.parseStartTag();\n if (selfClosing) {\n return { name, attributes, children: [] };\n }\n\n const children: XmlNode[] = [];\n while (this.#index < this.source.length) {\n if (this.source.startsWith(\"</\", this.#index)) {\n this.#index += 2;\n const closingName = this.parseName();\n this.skipWhitespace();\n this.expect(\">\");\n if (closingName !== name) {\n this.fail(`Mismatched closing element: expected </${name}> but found </${closingName}>`);\n }\n return { name, attributes, children };\n }\n\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n\n if (this.source.startsWith(\"<![CDATA[\", this.#index)) {\n this.appendText(children, this.parseCdata());\n continue;\n }\n\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n\n if (this.source.startsWith(\"<!\", this.#index)) {\n this.fail(\"Unsupported XML declaration inside an element\");\n }\n\n if (this.source[this.#index] === \"<\") {\n children.push(this.parseElement(depth + 1));\n } else {\n this.appendText(children, this.parseText());\n }\n }\n\n this.fail(`Unclosed XML element: <${name}>`);\n }\n\n private parseStartTag(): {\n attributes: SsmlAttributes;\n selfClosing: boolean;\n } {\n const attributes: SsmlAttributes = {};\n\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n\n if (this.source.startsWith(\"/>\", this.#index)) {\n this.#index += 2;\n return { attributes, selfClosing: true };\n }\n if (this.source[this.#index] === \">\") {\n this.#index += 1;\n return { attributes, selfClosing: false };\n }\n\n const name = this.parseName();\n this.skipWhitespace();\n this.expect(\"=\");\n this.skipWhitespace();\n\n const quote = this.source[this.#index];\n if (quote !== '\"' && quote !== \"'\") {\n this.fail(`XML attribute ${name} must use a quoted value`);\n }\n this.#index += 1;\n\n const valueStart = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== quote) {\n if (this.source[this.#index] === \"<\") {\n this.fail(`Invalid \"<\" in XML attribute ${name}`);\n }\n this.#index += 1;\n }\n if (this.#index >= this.source.length) {\n this.fail(`Unclosed XML attribute ${name}`);\n }\n\n const value = decodeXmlEntities(this.source.slice(valueStart, this.#index));\n this.#index += 1;\n\n if (hasOwn(attributes, name)) {\n this.fail(`Duplicate XML attribute: ${name}`);\n }\n setAttribute(attributes, name, value);\n }\n\n this.fail(\"Unclosed XML start tag\");\n }\n\n private parseText(): string {\n const start = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== \"<\") {\n this.#index += 1;\n }\n\n const value = this.source.slice(start, this.#index);\n if (value.includes(\"]]>\")) {\n this.fail(\"CDATA termination is not valid in ordinary XML text\");\n }\n return decodeXmlEntities(value);\n }\n\n private parseCdata(): string {\n this.#index += \"<![CDATA[\".length;\n const end = this.source.indexOf(\"]]>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML CDATA section\");\n }\n\n const value = this.source.slice(this.#index, end);\n this.#index = end + 3;\n return value;\n }\n\n private skipComment(): void {\n this.#index += \"<!--\".length;\n const end = this.source.indexOf(\"-->\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML comment\");\n }\n if (this.source.slice(this.#index, end).includes(\"--\")) {\n this.fail(\"XML comments cannot contain consecutive hyphens\");\n }\n this.#index = end + 3;\n }\n\n private skipProcessingInstruction(): void {\n this.#index += \"<?\".length;\n this.parseName();\n const end = this.source.indexOf(\"?>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML processing instruction\");\n }\n this.#index = end + 2;\n }\n\n private skipMisc(): void {\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n if (this.source.startsWith(\"<!DOCTYPE\", this.#index)) {\n this.fail(\"DOCTYPE declarations are not supported\");\n }\n break;\n }\n }\n\n private parseName(): string {\n const first = this.source[this.#index];\n if (!isXmlNameStart(first)) {\n this.fail(\"Invalid XML name\");\n }\n\n const start = this.#index;\n this.#index += 1;\n while (isXmlNameCharacter(this.source[this.#index])) {\n this.#index += 1;\n }\n return this.source.slice(start, this.#index);\n }\n\n private appendText(children: XmlNode[], value: string): void {\n if (!value) {\n return;\n }\n\n const previous = children[children.length - 1];\n if (typeof previous === \"string\") {\n children[children.length - 1] = previous + value;\n } else {\n children.push(value);\n }\n }\n\n private skipWhitespace(): void {\n while (isXmlWhitespace(this.source[this.#index])) {\n this.#index += 1;\n }\n }\n\n private expect(value: string): void {\n if (!this.source.startsWith(value, this.#index)) {\n this.fail(`Expected \"${value}\"`);\n }\n this.#index += value.length;\n }\n\n private fail(message: string): never {\n throw new Error(`${message} at position ${this.#index}`);\n }\n}\n\nfunction readAttribute(attributes: SsmlAttributes, ...names: string[]): string | undefined {\n let found = false;\n let value: string | undefined;\n\n for (const name of names) {\n if (hasOwn(attributes, name)) {\n if (!found) {\n value = String(attributes[name]);\n found = true;\n }\n delete attributes[name];\n }\n }\n\n return value;\n}\n\nfunction getElementAttributes(node: XmlElementNode): SsmlAttributes {\n const attributes: SsmlAttributes = { ...node.attributes };\n removeStandardNamespaceAttributes(attributes);\n return attributes;\n}\n\nfunction finishElement<T extends SsmlElement>(element: T, node: XmlElementNode, attributes: SsmlAttributes): T {\n if (node.children.length > 0) {\n element.children = node.children.map(convertNode);\n }\n if (Object.keys(attributes).length > 0) {\n element.attributes = attributes;\n }\n return element;\n}\n\nfunction convertElement(node: XmlElementNode): SsmlElement {\n const attributes = getElementAttributes(node);\n\n switch (node.name) {\n case SSML_TAGS.VOICE: {\n const element: VoiceElement = { type: SSML_TAGS.VOICE };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n const effect = readAttribute(attributes, SSML_ATTRS.EFFECT);\n if (name !== undefined) element.name = name;\n if (effect !== undefined) element.effect = effect;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PROSODY: {\n const element: ProsodyElement = { type: SSML_TAGS.PROSODY };\n const rate = readAttribute(attributes, SSML_ATTRS.RATE);\n const pitch = readAttribute(attributes, SSML_ATTRS.PITCH);\n const volume = readAttribute(attributes, SSML_ATTRS.VOLUME);\n const contour = readAttribute(attributes, SSML_ATTRS.CONTOUR);\n const range = readAttribute(attributes, SSML_ATTRS.RANGE);\n if (rate !== undefined) element.rate = rate;\n if (pitch !== undefined) element.pitch = pitch;\n if (volume !== undefined) element.volume = volume;\n if (contour !== undefined) element.contour = contour;\n if (range !== undefined) element.range = range;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BREAK: {\n const element: BreakElement = { type: SSML_TAGS.BREAK };\n const time = readAttribute(attributes, SSML_ATTRS.TIME);\n const strength = readAttribute(attributes, SSML_ATTRS.STRENGTH);\n if (time !== undefined) element.time = time;\n if (strength !== undefined) element.strength = strength;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS: {\n const element: ExpressAsElement = { type: node.name };\n const style = readAttribute(attributes, SSML_ATTRS.STYLE);\n const styleDegree = readAttribute(attributes, SSML_ATTRS.STYLE_DEGREE, SSML_ATTRS.STYLE_DEGREE_CAMEL);\n const role = readAttribute(attributes, SSML_ATTRS.ROLE);\n if (style !== undefined) element.style = style;\n if (styleDegree !== undefined) element.styleDegree = styleDegree;\n if (role !== undefined) element.role = role;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL: {\n const element: SayAsElement = { type: node.name };\n const interpretAs = readAttribute(attributes, SSML_ATTRS.INTERPRET_AS);\n const format = readAttribute(attributes, SSML_ATTRS.FORMAT);\n const detail = readAttribute(attributes, SSML_ATTRS.DETAIL);\n if (interpretAs !== undefined) element.interpretAs = interpretAs;\n if (format !== undefined) element.format = format;\n if (detail !== undefined) element.detail = detail;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PHONEME: {\n const element: PhonemeElement = { type: SSML_TAGS.PHONEME };\n const alphabet = readAttribute(attributes, SSML_ATTRS.ALPHABET);\n const ph = readAttribute(attributes, SSML_ATTRS.PH);\n if (alphabet !== undefined) element.alphabet = alphabet;\n if (ph !== undefined) element.ph = ph;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EMPHASIS: {\n const element: EmphasisElement = { type: SSML_TAGS.EMPHASIS };\n const level = readAttribute(attributes, SSML_ATTRS.LEVEL);\n if (level !== undefined) element.level = level;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.AUDIO: {\n const element: AudioElement = { type: SSML_TAGS.AUDIO };\n const src = readAttribute(attributes, SSML_ATTRS.SRC);\n const desc = readAttribute(attributes, SSML_ATTRS.DESC);\n const clipBegin = readAttribute(attributes, SSML_ATTRS.CLIP_BEGIN);\n const clipEnd = readAttribute(attributes, SSML_ATTRS.CLIP_END);\n const speed = readAttribute(attributes, SSML_ATTRS.SPEED);\n const repeatCount = readAttribute(attributes, SSML_ATTRS.REPEAT_COUNT);\n const repeatDuration = readAttribute(attributes, SSML_ATTRS.REPEAT_DURATION);\n const soundLevel = readAttribute(attributes, SSML_ATTRS.SOUND_LEVEL);\n if (src !== undefined) element.src = src;\n if (desc !== undefined) element.desc = desc;\n if (clipBegin !== undefined) element.clipBegin = clipBegin;\n if (clipEnd !== undefined) element.clipEnd = clipEnd;\n if (speed !== undefined) element.speed = speed;\n if (repeatCount !== undefined) element.repeatCount = repeatCount;\n if (repeatDuration !== undefined) element.repeatDuration = repeatDuration;\n if (soundLevel !== undefined) element.soundLevel = soundLevel;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SUB: {\n const element: SubElement = { type: SSML_TAGS.SUB };\n const alias = readAttribute(attributes, SSML_ATTRS.ALIAS);\n if (alias !== undefined) element.alias = alias;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LANG: {\n const element: LangElement = { type: SSML_TAGS.LANG };\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (lang !== undefined) element.lang = lang;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MARK: {\n const element: MarkElement = { type: SSML_TAGS.MARK };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n if (name !== undefined) element.name = name;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BOOKMARK: {\n const element: BookmarkElement = { type: SSML_TAGS.BOOKMARK };\n const mark = readAttribute(attributes, SSML_ATTRS.MARK);\n if (mark !== undefined) element.mark = mark;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LEXICON: {\n const element: LexiconElement = { type: SSML_TAGS.LEXICON };\n const uri = readAttribute(attributes, SSML_ATTRS.URI);\n if (uri !== undefined) element.uri = uri;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PARAGRAPH: {\n const element: ParagraphElement = { type: SSML_TAGS.PARAGRAPH };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SENTENCE: {\n const element: SentenceElement = { type: SSML_TAGS.SENTENCE };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.WORD: {\n const element: WordElement = { type: SSML_TAGS.WORD };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE: {\n const element: MsttsSilenceElement = {\n type: node.name === SSML_TAGS.MSTTS_SILENCE ? SSML_TAGS.MSTTS_SILENCE : SSML_TAGS.SILENCE,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n const value = readAttribute(attributes, SSML_ATTRS.VALUE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n if (value !== undefined) element.value = value;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME: {\n const element: MsttsVisemeElement = {\n type: node.name === SSML_TAGS.MSTTS_VISEME ? SSML_TAGS.MSTTS_VISEME : SSML_TAGS.VISEME,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n return finishElement(element, node, attributes);\n }\n default: {\n const element: CustomElement = {\n name: node.name,\n type: \"custom\",\n };\n return finishElement(element, node, attributes);\n }\n }\n}\n\nfunction convertNode(node: XmlNode): SsmlNode {\n return typeof node === \"string\" ? node : convertElement(node);\n}\n\nexport function parseSsml(xmlString: string): SsmlDocument {\n if (typeof xmlString !== \"string\") {\n throw new TypeError(\"SSML input must be a string\");\n }\n\n const root = new XmlParser(xmlString).parse();\n if (root.name !== SSML_TAGS.SPEAK) {\n throw new Error(`SSML root element must be <${SSML_TAGS.SPEAK}>, found <${root.name}>`);\n }\n\n const attributes: SsmlAttributes = { ...root.attributes };\n const version = readAttribute(attributes, SSML_ATTRS.VERSION);\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (version === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.VERSION}\" attribute`);\n }\n if (lang === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.XML_LANG}\" attribute`);\n }\n\n removeStandardNamespaceAttributes(attributes);\n const document: SsmlDocument = {\n children: root.children.map(convertNode),\n lang,\n type: SSML_TAGS.SPEAK,\n version,\n };\n if (Object.keys(attributes).length > 0) {\n document.attributes = attributes;\n }\n return document;\n}\n","import { buildSsml } from \"./builder.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n} from \"./constants/ssml.ts\";\nimport { parseSsml } from \"./parser.ts\";\nimport type { ProsodyElement, SsmlAttributes, SsmlDocument, SsmlNode, VoiceElement } from \"./types.ts\";\n\nexport type SsmlPartialVoice = Pick<VoiceElement, \"name\" | \"effect\" | \"attributes\">;\n\nexport type SsmlPartialProsody = Pick<ProsodyElement, \"rate\" | \"pitch\" | \"volume\" | \"contour\" | \"range\" | \"attributes\">;\n\nexport interface SsmlPartialContext {\n /** SSML version used for the generated document. */\n version?: string;\n /** BCP-47 language tag used for the generated document. */\n lang?: string;\n /** Preferred voice name; a voice object takes precedence, while this overrides a string `voice` shorthand. */\n voiceName?: string;\n /** Optional Azure voice effect used with `voiceName` or a string `voice` shorthand. */\n voiceEffect?: string;\n /** A voice name shorthand or a voice object whose attributes are preserved. */\n voice?: string | SsmlPartialVoice;\n /** Optional prosody values applied around the partial text. */\n prosody?: SsmlPartialProsody;\n /** Additional attributes added to the generated `speak` element. */\n attributes?: SsmlAttributes;\n}\n\nexport interface BuildPartialSsmlOptions extends SsmlPartialContext {\n text: string;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction getPartialTextNodes(text: string, version: string, lang: string): SsmlNode[] {\n if (!text.includes(\"<\")) {\n return [text];\n }\n\n try {\n const openingTag = `<${SSML_TAGS.SPEAK} ${SSML_ATTRS.VERSION}=\"${escapeAttribute(version)}\" ${SSML_ATTRS.XMLNS}=\"${SYNTHESIS_NAMESPACE}\" ${SSML_ATTRS.XML_LANG}=\"${escapeAttribute(lang)}\">`;\n return parseSsml(`${openingTag}${text}</${SSML_TAGS.SPEAK}>`).children ?? [];\n } catch {\n return [{ type: \"text\", value: text }];\n }\n}\n\nfunction getVoiceContext(context: SsmlPartialContext): SsmlPartialVoice | undefined {\n const voice = context.voice;\n if (typeof voice === \"object\" && voice !== null) {\n return voice;\n }\n\n if (context.voiceName === undefined && context.voiceEffect === undefined && typeof voice !== \"string\") {\n return undefined;\n }\n\n return {\n name: context.voiceName ?? voice,\n effect: context.voiceEffect,\n };\n}\n\nfunction serializePartialSsml(text: string, context: SsmlPartialContext): string {\n const version = context.version ?? DEFAULT_SSML_VERSION;\n const lang = context.lang ?? DEFAULT_SSML_LANGUAGE;\n let children = getPartialTextNodes(text, version, lang);\n\n if (context.prosody) {\n children = [\n {\n type: SSML_TAGS.PROSODY,\n ...context.prosody,\n children,\n },\n ];\n }\n\n const voice = getVoiceContext(context);\n if (voice) {\n children = [\n {\n type: SSML_TAGS.VOICE,\n ...voice,\n children,\n },\n ];\n }\n\n const document: SsmlDocument = {\n type: SSML_TAGS.SPEAK,\n version,\n lang,\n attributes: context.attributes,\n children,\n };\n return buildSsml(document);\n}\n\nexport function buildPartialSsml(text: string, context?: SsmlPartialContext): string;\nexport function buildPartialSsml(options: BuildPartialSsmlOptions): string;\nexport function buildPartialSsml(\n textOrOptions: string | BuildPartialSsmlOptions,\n context?: SsmlPartialContext,\n): string {\n if (typeof textOrOptions === \"string\") {\n return serializePartialSsml(textOrOptions, context ?? {});\n }\n\n return serializePartialSsml(textOrOptions.text, textOrOptions);\n}\n","import { parseSsml } from \"./parser.ts\";\n\nconst PARSER_POSITION_SUFFIX = / at position (\\d+)$/;\n\nexport interface SsmlValidationError {\n message: string;\n position: number;\n}\n\nexport function validateSsml(xmlString: string): SsmlValidationError | null {\n try {\n parseSsml(xmlString);\n return null;\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const positionMatch = PARSER_POSITION_SUFFIX.exec(rawMessage);\n\n return {\n message: positionMatch ? rawMessage.slice(0, positionMatch.index) : rawMessage,\n position: positionMatch ? Number.parseInt(positionMatch[1], 10) : 0,\n };\n }\n}\n","export class AzureTtsError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly responseBody: string;\n readonly requestId: string | null;\n\n constructor(status: number, statusText: string, responseBody: string, requestId: string | null) {\n super(`Azure TTS request failed: ${status} ${statusText}`);\n this.name = \"AzureTtsError\";\n this.status = status;\n this.statusText = statusText;\n this.responseBody = responseBody;\n this.requestId = requestId;\n }\n}\n\nexport class AzureTtsSdkError extends AzureTtsError {\n readonly errorDetails: string;\n\n constructor(errorDetails: string) {\n super(0, \"Speech SDK\", errorDetails, null);\n this.name = \"AzureTtsSdkError\";\n this.message = `Azure TTS synthesis failed: ${errorDetails}`;\n this.errorDetails = errorDetails;\n }\n}\n\nexport function createSpeechSdkError(error: unknown): AzureTtsSdkError {\n const message = error instanceof Error ? error.message : String(error);\n return new AzureTtsSdkError(message);\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\nimport { createSpeechSdkError } from \"./errors.ts\";\nimport { createSpeechConfig } from \"./speechConfig.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nfunction closeSpeechResources(speechConfig: SpeechSDK.SpeechConfig, synthesizer: SpeechSDK.SpeechSynthesizer): void {\n try {\n synthesizer.close();\n } catch {}\n\n try {\n speechConfig.close();\n } catch {}\n}\n\nexport async function synthesizeSpeech(ssml: string, config: TtsConfig): Promise<ArrayBuffer> {\n const speechConfig = createSpeechConfig(config);\n const synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, null);\n\n return await new Promise<ArrayBuffer>((resolve, reject) => {\n let resourcesClosed = false;\n const closeResources = () => {\n if (resourcesClosed) return;\n resourcesClosed = true;\n closeSpeechResources(speechConfig, synthesizer);\n };\n const rejectWithError = (error: unknown) => {\n closeResources();\n reject(createSpeechSdkError(error));\n };\n\n const cb = (result: SpeechSDK.SpeechSynthesisResult) => {\n const { reason, errorDetails } = result;\n if (reason !== SpeechSDK.ResultReason.SynthesizingAudioCompleted) {\n const err = errorDetails || `Speech synthesis failed with reason ${reason}.`;\n rejectWithError(err);\n return;\n }\n closeResources();\n resolve(result.audioData);\n };\n\n try {\n synthesizer.speakSsmlAsync(ssml, cb, rejectWithError);\n } catch (error) {\n rejectWithError(error);\n }\n });\n}\n","import { SpeechConfig } from \"microsoft-cognitiveservices-speech-sdk\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveOutputFormat } from \"./outputFormats.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nexport function resolveEndpoint(config: TtsConfig): string {\n return config.endpoint.replace(/\\{region\\}/g, encodeURIComponent(config.region));\n}\n\nexport function createSpeechConfig(config: TtsConfig): SpeechConfig {\n const { outputFormat = DEFAULT_OUTPUT_FORMAT, subscriptionKey } = config;\n\n const endpoint = new URL(resolveEndpoint(config));\n const speechConfig = SpeechConfig.fromEndpoint(endpoint, subscriptionKey);\n speechConfig.speechSynthesisOutputFormat = resolveOutputFormat(outputFormat);\n return speechConfig;\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\n\nexport const DEFAULT_OUTPUT_FORMAT = \"audio-16khz-128kbitrate-mono-mp3\";\n\nconst OUTPUT_FORMATS: Record<string, SpeechSDK.SpeechSynthesisOutputFormat> = {\n \"raw-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoMULaw,\n \"riff-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16KbpsMonoSiren,\n \"audio-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16KbpsMonoSiren,\n \"audio-16khz-32kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz32KBitRateMonoMp3,\n \"audio-16khz-128kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz128KBitRateMonoMp3,\n \"audio-16khz-64kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz64KBitRateMonoMp3,\n \"audio-24khz-48kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz48KBitRateMonoMp3,\n \"audio-24khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz96KBitRateMonoMp3,\n \"audio-24khz-160kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz160KBitRateMonoMp3,\n \"raw-16khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoTrueSilk,\n \"riff-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16BitMonoPcm,\n \"riff-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz16BitMonoPcm,\n \"riff-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm,\n \"riff-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoMULaw,\n \"raw-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoPcm,\n \"raw-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoPcm,\n \"raw-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz16BitMonoPcm,\n \"ogg-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg16Khz16BitMonoOpus,\n \"ogg-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus,\n \"raw-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw48Khz16BitMonoPcm,\n \"riff-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff48Khz16BitMonoPcm,\n \"audio-48khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz96KBitRateMonoMp3,\n \"audio-48khz-192kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz192KBitRateMonoMp3,\n \"ogg-48khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg48Khz16BitMonoOpus,\n \"webm-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm16Khz16BitMonoOpus,\n \"webm-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16BitMonoOpus,\n \"webm-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16Bit24KbpsMonoOpus,\n \"raw-24khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoTrueSilk,\n \"raw-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoALaw,\n \"riff-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoALaw,\n \"audio-16khz-16bit-32kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16Bit32KbpsMonoOpus,\n \"audio-24khz-16bit-48kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit48KbpsMonoOpus,\n \"audio-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit24KbpsMonoOpus,\n \"raw-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw22050Hz16BitMonoPcm,\n \"riff-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff22050Hz16BitMonoPcm,\n \"raw-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw44100Hz16BitMonoPcm,\n \"riff-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff44100Hz16BitMonoPcm,\n \"amr-wb-16000hz\": SpeechSDK.SpeechSynthesisOutputFormat.AmrWb16000Hz,\n \"g722-16khz-64kbps\": SpeechSDK.SpeechSynthesisOutputFormat.G72216Khz64Kbps,\n};\n\nexport function resolveOutputFormat(outputFormat: string): SpeechSDK.SpeechSynthesisOutputFormat {\n const resolvedFormat = OUTPUT_FORMATS[outputFormat];\n if (resolvedFormat === undefined) {\n throw new Error(`Unsupported Azure Speech output format: ${outputFormat}`);\n }\n\n return resolvedFormat;\n}\n","import { synthesizeSpeech } from \"./synthesis.ts\";\nimport type { AzureTtsClientOptions } from \"./types.ts\";\n\nconst ENDPOINT_TEMPLATE = \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n\nexport class AzureTtsClient {\n readonly #options: AzureTtsClientOptions;\n\n constructor(options: AzureTtsClientOptions) {\n this.#options = options;\n }\n\n async synthesize(ssml: string): Promise<ArrayBuffer> {\n const { region, subscriptionKey, outputFormat } = this.#options;\n const endpoint = this.#options.endpoint ?? ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n console.debug(\"Using Azure TTS endpoint:\", endpoint);\n\n const config = { endpoint, region, subscriptionKey, outputFormat };\n return synthesizeSpeech(ssml, config);\n }\n}\n"],"mappings":"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","names":["escapeAttribute","SpeechSDK"]}
1
+ {"version":3,"sources":["../src/index.ts","../packages/ssml-core/src/constants/ssml.ts","../packages/ssml-core/src/builder.ts","../packages/ssml-core/src/parser.ts","../packages/ssml-core/src/partial.ts","../packages/ssml-core/src/validation.ts","../packages/azure-tts-client/src/errors.ts","../packages/azure-tts-client/src/synthesis.ts","../packages/azure-tts-client/src/speechConfig.ts","../packages/azure-tts-client/src/outputFormats.ts","../packages/azure-tts-client/src/client.ts"],"sourcesContent":["export * from \"../packages/ssml-core/src/index\";\nexport * from \"../packages/azure-tts-client/src/index\";\n","export const SYNTHESIS_NAMESPACE = \"http://www.w3.org/2001/10/synthesis\" as const;\nexport const MSTTS_NAMESPACE = \"http://www.w3.org/2001/mstts\" as const;\nexport const DEFAULT_SSML_VERSION = \"1.0\" as const;\nexport const DEFAULT_SSML_LANGUAGE = \"en-US\" as const;\nexport const MAX_NESTING_DEPTH = 1000;\nexport const XML_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.:-]*$/;\nexport const MSTTS_TAG_PREFIX = \"mstts:\" as const;\n\nexport const SSML_TAGS = {\n SPEAK: \"speak\",\n VOICE: \"voice\",\n PROSODY: \"prosody\",\n BREAK: \"break\",\n EXPRESS_AS: \"express-as\",\n EXPRESS_AS_CAMEL: \"expressAs\",\n MSTTS_EXPRESS_AS: \"mstts:express-as\",\n SAY_AS: \"say-as\",\n SAY_AS_CAMEL: \"sayAs\",\n PHONEME: \"phoneme\",\n EMPHASIS: \"emphasis\",\n AUDIO: \"audio\",\n SUB: \"sub\",\n LANG: \"lang\",\n MARK: \"mark\",\n BOOKMARK: \"bookmark\",\n LEXICON: \"lexicon\",\n PARAGRAPH: \"p\",\n SENTENCE: \"s\",\n WORD: \"w\",\n MSTTS_SILENCE: \"mstts:silence\",\n SILENCE: \"silence\",\n MSTTS_VISEME: \"mstts:viseme\",\n VISEME: \"viseme\",\n} as const;\n\nexport const SSML_ATTRS = {\n VERSION: \"version\",\n XMLNS: \"xmlns\",\n XML_LANG: \"xml:lang\",\n LANG: \"lang\",\n MSTTS_XMLNS: \"xmlns:mstts\",\n NAME: \"name\",\n EFFECT: \"effect\",\n RATE: \"rate\",\n PITCH: \"pitch\",\n VOLUME: \"volume\",\n CONTOUR: \"contour\",\n RANGE: \"range\",\n TIME: \"time\",\n STRENGTH: \"strength\",\n STYLE: \"style\",\n STYLE_DEGREE: \"styledegree\",\n STYLE_DEGREE_CAMEL: \"styleDegree\",\n STYLE_DEGREE_HYPHEN: \"style-degree\",\n ROLE: \"role\",\n INTERPRET_AS: \"interpret-as\",\n FORMAT: \"format\",\n DETAIL: \"detail\",\n ALPHABET: \"alphabet\",\n PH: \"ph\",\n LEVEL: \"level\",\n SRC: \"src\",\n DESC: \"desc\",\n CLIP_BEGIN: \"clipBegin\",\n CLIP_END: \"clipEnd\",\n SPEED: \"speed\",\n REPEAT_COUNT: \"repeatCount\",\n REPEAT_DURATION: \"repeatDuration\",\n SOUND_LEVEL: \"soundLevel\",\n ALIAS: \"alias\",\n MARK: \"mark\",\n URI: \"uri\",\n TYPE: \"type\",\n VALUE: \"value\",\n} as const;\n","import type {\n SsmlAttributeValue,\n SsmlAttributes,\n SsmlDocument,\n SsmlElement,\n SsmlElementBase,\n SsmlNode,\n} from \"./types.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n MSTTS_NAMESPACE,\n MSTTS_TAG_PREFIX,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n XML_NAME_PATTERN,\n} from \"./constants/ssml.ts\";\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n}\n\nfunction addAttribute(attributes: SsmlAttributes, name: string, value: SsmlAttributeValue | undefined): void {\n if (value !== undefined) {\n attributes[name] = value;\n }\n}\n\nfunction getAttributes(element: SsmlElement): SsmlAttributes {\n const attributes: SsmlAttributes = {\n ...(element.attributes ?? {}),\n };\n\n switch (element.type) {\n case SSML_TAGS.VOICE:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n addAttribute(attributes, SSML_ATTRS.EFFECT, element.effect);\n break;\n case SSML_TAGS.PROSODY:\n addAttribute(attributes, SSML_ATTRS.RATE, element.rate);\n addAttribute(attributes, SSML_ATTRS.PITCH, element.pitch);\n addAttribute(attributes, SSML_ATTRS.VOLUME, element.volume);\n addAttribute(attributes, SSML_ATTRS.CONTOUR, element.contour);\n addAttribute(attributes, SSML_ATTRS.RANGE, element.range);\n break;\n case SSML_TAGS.BREAK:\n addAttribute(attributes, SSML_ATTRS.TIME, element.time);\n addAttribute(attributes, SSML_ATTRS.STRENGTH, element.strength);\n break;\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n addAttribute(attributes, SSML_ATTRS.STYLE, element.style);\n addAttribute(attributes, SSML_ATTRS.STYLE_DEGREE, element.styleDegree);\n addAttribute(attributes, SSML_ATTRS.ROLE, element.role);\n break;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n addAttribute(attributes, SSML_ATTRS.INTERPRET_AS, element.interpretAs);\n addAttribute(attributes, SSML_ATTRS.FORMAT, element.format);\n addAttribute(attributes, SSML_ATTRS.DETAIL, element.detail);\n break;\n case SSML_TAGS.PHONEME:\n addAttribute(attributes, SSML_ATTRS.ALPHABET, element.alphabet);\n addAttribute(attributes, SSML_ATTRS.PH, element.ph);\n break;\n case SSML_TAGS.EMPHASIS:\n addAttribute(attributes, SSML_ATTRS.LEVEL, element.level);\n break;\n case SSML_TAGS.AUDIO:\n addAttribute(attributes, SSML_ATTRS.SRC, element.src);\n addAttribute(attributes, SSML_ATTRS.DESC, element.desc);\n addAttribute(attributes, SSML_ATTRS.CLIP_BEGIN, element.clipBegin);\n addAttribute(attributes, SSML_ATTRS.CLIP_END, element.clipEnd);\n addAttribute(attributes, SSML_ATTRS.SPEED, element.speed);\n addAttribute(attributes, SSML_ATTRS.REPEAT_COUNT, element.repeatCount);\n addAttribute(attributes, SSML_ATTRS.REPEAT_DURATION, element.repeatDuration);\n addAttribute(attributes, SSML_ATTRS.SOUND_LEVEL, element.soundLevel);\n break;\n case SSML_TAGS.SUB:\n addAttribute(attributes, SSML_ATTRS.ALIAS, element.alias);\n break;\n case SSML_TAGS.LANG:\n addAttribute(attributes, SSML_ATTRS.XML_LANG, element.lang);\n break;\n case SSML_TAGS.MARK:\n addAttribute(attributes, SSML_ATTRS.NAME, element.name);\n break;\n case SSML_TAGS.BOOKMARK:\n addAttribute(attributes, SSML_ATTRS.MARK, element.mark);\n break;\n case SSML_TAGS.LEXICON:\n addAttribute(attributes, SSML_ATTRS.URI, element.uri);\n break;\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.silenceType);\n addAttribute(attributes, SSML_ATTRS.VALUE, element.value);\n break;\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME:\n addAttribute(attributes, SSML_ATTRS.TYPE, element.typeValue ?? element.visemeType);\n break;\n case SSML_TAGS.PARAGRAPH:\n case SSML_TAGS.SENTENCE:\n case SSML_TAGS.WORD:\n case \"element\":\n case \"custom\":\n break;\n }\n\n return attributes;\n}\n\nfunction getTagName(element: SsmlElement): string {\n switch (element.type) {\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS:\n return SSML_TAGS.MSTTS_EXPRESS_AS;\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL:\n return SSML_TAGS.SAY_AS;\n case SSML_TAGS.SILENCE:\n case SSML_TAGS.MSTTS_SILENCE:\n return SSML_TAGS.MSTTS_SILENCE;\n case SSML_TAGS.VISEME:\n case SSML_TAGS.MSTTS_VISEME:\n return SSML_TAGS.MSTTS_VISEME;\n case \"element\":\n case \"custom\":\n return element.name;\n default:\n return element.type;\n }\n}\n\nfunction getChildren(element: SsmlElementBase): SsmlNode[] {\n return element.children ?? [];\n}\n\nfunction validateName(name: string, kind: \"element\" | \"attribute\"): void {\n if (!XML_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid XML ${kind} name: ${name}`);\n }\n}\n\nfunction serializeAttributes(attributes: SsmlAttributes): string {\n return Object.entries(attributes)\n .map(([name, value]) => {\n validateName(name, \"attribute\");\n return ` ${name}=\"${escapeAttribute(String(value))}\"`;\n })\n .join(\"\");\n}\n\nfunction serializeNode(node: SsmlNode): string {\n if (typeof node === \"string\") {\n return escapeText(node);\n }\n\n if (node.type === \"text\") {\n return escapeText(node.value);\n }\n\n const tagName = getTagName(node);\n validateName(tagName, \"element\");\n\n const attributes = serializeAttributes(getAttributes(node));\n const children = getChildren(node);\n if (children.length === 0) {\n return `<${tagName}${attributes}/>`;\n }\n\n return `<${tagName}${attributes}>${children.map(serializeNode).join(\"\")}</${tagName}>`;\n}\n\nfunction usesMsttsNamespace(nodes: SsmlNode[]): boolean {\n return nodes.some((node) => {\n if (typeof node === \"string\" || node.type === \"text\") {\n return false;\n }\n\n const tagName = getTagName(node);\n return tagName.startsWith(MSTTS_TAG_PREFIX) || usesMsttsNamespace(getChildren(node));\n });\n}\n\nfunction serializeDocument(document: SsmlDocument): string {\n const children = document.children ?? (document.content === undefined ? [] : [document.content]);\n const attributes: SsmlAttributes = {\n ...(document.attributes ?? {}),\n [SSML_ATTRS.VERSION]: document.version,\n [SSML_ATTRS.XMLNS]: SYNTHESIS_NAMESPACE,\n [SSML_ATTRS.XML_LANG]: document.lang,\n };\n\n if (usesMsttsNamespace(children) && attributes[SSML_ATTRS.MSTTS_XMLNS] === undefined) {\n attributes[SSML_ATTRS.MSTTS_XMLNS] = MSTTS_NAMESPACE;\n }\n\n return `<${SSML_TAGS.SPEAK}${serializeAttributes(attributes)}>${children.map(serializeNode).join(\"\")}</${SSML_TAGS.SPEAK}>`;\n}\n\nexport function buildSsml(document: SsmlDocument): string;\nexport function buildSsml(content: string, lang?: string): SsmlDocument;\nexport function buildSsml(\n documentOrContent: SsmlDocument | string,\n lang: string = DEFAULT_SSML_LANGUAGE,\n): string | SsmlDocument {\n if (typeof documentOrContent === \"string\") {\n return {\n version: DEFAULT_SSML_VERSION,\n lang,\n content: documentOrContent,\n };\n }\n\n return serializeDocument(documentOrContent);\n}\n","import type {\n AudioElement,\n BookmarkElement,\n BreakElement,\n CustomElement,\n EmphasisElement,\n ExpressAsElement,\n LangElement,\n LexiconElement,\n MarkElement,\n MsttsSilenceElement,\n MsttsVisemeElement,\n ParagraphElement,\n PhonemeElement,\n ProsodyElement,\n SayAsElement,\n SentenceElement,\n SsmlAttributes,\n SsmlDocument,\n SsmlElement,\n SsmlNode,\n SubElement,\n VoiceElement,\n WordElement,\n} from \"./types.ts\";\nimport { MAX_NESTING_DEPTH, MSTTS_NAMESPACE, SSML_ATTRS, SSML_TAGS, SYNTHESIS_NAMESPACE } from \"./constants/ssml.ts\";\n\ninterface XmlElementNode {\n name: string;\n attributes: SsmlAttributes;\n children: XmlNode[];\n}\n\ntype XmlNode = string | XmlElementNode;\n\nconst XML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n quot: '\"',\n};\n\nfunction hasOwn(object: object, property: PropertyKey): boolean {\n return Object.getOwnPropertyDescriptor(object, property) !== undefined;\n}\n\nfunction setAttribute(attributes: SsmlAttributes, name: string, value: string): void {\n Object.defineProperty(attributes, name, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nfunction decodeEntity(entity: string): string {\n const namedValue = hasOwn(XML_ENTITIES, entity) ? XML_ENTITIES[entity] : undefined;\n if (namedValue !== undefined) {\n return namedValue;\n }\n\n const isHexadecimal = entity.startsWith(\"#x\") || entity.startsWith(\"#X\");\n const isDecimal = entity.startsWith(\"#\");\n if (!isHexadecimal && !isDecimal) {\n throw new Error(`Unknown XML entity: &${entity};`);\n }\n\n const digits = entity.slice(isHexadecimal ? 2 : 1);\n const codePoint = Number.parseInt(digits, isHexadecimal ? 16 : 10);\n if (\n !digits ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > 0x10ffff ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (codePoint < 0x20 && ![9, 10, 13].includes(codePoint))\n ) {\n throw new Error(`Invalid XML character reference: &${entity};`);\n }\n\n return String.fromCodePoint(codePoint);\n}\n\nfunction decodeXmlEntities(value: string): string {\n let result = \"\";\n let start = 0;\n\n while (true) {\n const ampersand = value.indexOf(\"&\", start);\n if (ampersand === -1) {\n return result + value.slice(start);\n }\n\n result += value.slice(start, ampersand);\n const semicolon = value.indexOf(\";\", ampersand + 1);\n if (semicolon === -1) {\n throw new Error(\"Unterminated XML entity reference\");\n }\n\n result += decodeEntity(value.slice(ampersand + 1, semicolon));\n start = semicolon + 1;\n }\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction removeStandardNamespaceAttributes(attributes: SsmlAttributes): void {\n if (attributes[SSML_ATTRS.XMLNS] === SYNTHESIS_NAMESPACE) {\n delete attributes[SSML_ATTRS.XMLNS];\n }\n if (attributes[SSML_ATTRS.MSTTS_XMLNS] === MSTTS_NAMESPACE) {\n delete attributes[SSML_ATTRS.MSTTS_XMLNS];\n }\n}\n\nclass XmlParser {\n #index = 0;\n private readonly source: string;\n\n constructor(source: string) {\n this.source = source;\n }\n\n parse(): XmlElementNode {\n if (this.source.charCodeAt(0) === 0xfeff) {\n this.#index += 1;\n }\n\n this.skipMisc();\n if (this.#index >= this.source.length) {\n this.fail(\"SSML input is empty\");\n }\n if (this.source[this.#index] !== \"<\") {\n this.fail(\"SSML input must start with an XML element\");\n }\n\n const root = this.parseElement(0);\n this.skipMisc();\n if (this.#index !== this.source.length) {\n this.fail(\"Unexpected content after the root XML element\");\n }\n return root;\n }\n\n private parseElement(depth: number): XmlElementNode {\n if (depth > MAX_NESTING_DEPTH) {\n this.fail(\"XML nesting depth exceeds the supported limit\");\n }\n\n this.expect(\"<\");\n if (this.source[this.#index] === \"/\") {\n this.fail(\"Unexpected closing XML element\");\n }\n\n const name = this.parseName();\n const { attributes, selfClosing } = this.parseStartTag();\n if (selfClosing) {\n return { name, attributes, children: [] };\n }\n\n const children: XmlNode[] = [];\n while (this.#index < this.source.length) {\n if (this.source.startsWith(\"</\", this.#index)) {\n this.#index += 2;\n const closingName = this.parseName();\n this.skipWhitespace();\n this.expect(\">\");\n if (closingName !== name) {\n this.fail(`Mismatched closing element: expected </${name}> but found </${closingName}>`);\n }\n return { name, attributes, children };\n }\n\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n\n if (this.source.startsWith(\"<![CDATA[\", this.#index)) {\n this.appendText(children, this.parseCdata());\n continue;\n }\n\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n\n if (this.source.startsWith(\"<!\", this.#index)) {\n this.fail(\"Unsupported XML declaration inside an element\");\n }\n\n if (this.source[this.#index] === \"<\") {\n children.push(this.parseElement(depth + 1));\n } else {\n this.appendText(children, this.parseText());\n }\n }\n\n this.fail(`Unclosed XML element: <${name}>`);\n }\n\n private parseStartTag(): {\n attributes: SsmlAttributes;\n selfClosing: boolean;\n } {\n const attributes: SsmlAttributes = {};\n\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n\n if (this.source.startsWith(\"/>\", this.#index)) {\n this.#index += 2;\n return { attributes, selfClosing: true };\n }\n if (this.source[this.#index] === \">\") {\n this.#index += 1;\n return { attributes, selfClosing: false };\n }\n\n const name = this.parseName();\n this.skipWhitespace();\n this.expect(\"=\");\n this.skipWhitespace();\n\n const quote = this.source[this.#index];\n if (quote !== '\"' && quote !== \"'\") {\n this.fail(`XML attribute ${name} must use a quoted value`);\n }\n this.#index += 1;\n\n const valueStart = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== quote) {\n if (this.source[this.#index] === \"<\") {\n this.fail(`Invalid \"<\" in XML attribute ${name}`);\n }\n this.#index += 1;\n }\n if (this.#index >= this.source.length) {\n this.fail(`Unclosed XML attribute ${name}`);\n }\n\n const value = decodeXmlEntities(this.source.slice(valueStart, this.#index));\n this.#index += 1;\n\n if (hasOwn(attributes, name)) {\n this.fail(`Duplicate XML attribute: ${name}`);\n }\n setAttribute(attributes, name, value);\n }\n\n this.fail(\"Unclosed XML start tag\");\n }\n\n private parseText(): string {\n const start = this.#index;\n while (this.#index < this.source.length && this.source[this.#index] !== \"<\") {\n this.#index += 1;\n }\n\n const value = this.source.slice(start, this.#index);\n if (value.includes(\"]]>\")) {\n this.fail(\"CDATA termination is not valid in ordinary XML text\");\n }\n return decodeXmlEntities(value);\n }\n\n private parseCdata(): string {\n this.#index += \"<![CDATA[\".length;\n const end = this.source.indexOf(\"]]>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML CDATA section\");\n }\n\n const value = this.source.slice(this.#index, end);\n this.#index = end + 3;\n return value;\n }\n\n private skipComment(): void {\n this.#index += \"<!--\".length;\n const end = this.source.indexOf(\"-->\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML comment\");\n }\n if (this.source.slice(this.#index, end).includes(\"--\")) {\n this.fail(\"XML comments cannot contain consecutive hyphens\");\n }\n this.#index = end + 3;\n }\n\n private skipProcessingInstruction(): void {\n this.#index += \"<?\".length;\n this.parseName();\n const end = this.source.indexOf(\"?>\", this.#index);\n if (end === -1) {\n this.fail(\"Unclosed XML processing instruction\");\n }\n this.#index = end + 2;\n }\n\n private skipMisc(): void {\n while (this.#index < this.source.length) {\n this.skipWhitespace();\n if (this.source.startsWith(\"<!--\", this.#index)) {\n this.skipComment();\n continue;\n }\n if (this.source.startsWith(\"<?\", this.#index)) {\n this.skipProcessingInstruction();\n continue;\n }\n if (this.source.startsWith(\"<!DOCTYPE\", this.#index)) {\n this.fail(\"DOCTYPE declarations are not supported\");\n }\n break;\n }\n }\n\n private parseName(): string {\n const first = this.source[this.#index];\n if (!isXmlNameStart(first)) {\n this.fail(\"Invalid XML name\");\n }\n\n const start = this.#index;\n this.#index += 1;\n while (isXmlNameCharacter(this.source[this.#index])) {\n this.#index += 1;\n }\n return this.source.slice(start, this.#index);\n }\n\n private appendText(children: XmlNode[], value: string): void {\n if (!value) {\n return;\n }\n\n const previous = children[children.length - 1];\n if (typeof previous === \"string\") {\n children[children.length - 1] = previous + value;\n } else {\n children.push(value);\n }\n }\n\n private skipWhitespace(): void {\n while (isXmlWhitespace(this.source[this.#index])) {\n this.#index += 1;\n }\n }\n\n private expect(value: string): void {\n if (!this.source.startsWith(value, this.#index)) {\n this.fail(`Expected \"${value}\"`);\n }\n this.#index += value.length;\n }\n\n private fail(message: string): never {\n throw new Error(`${message} at position ${this.#index}`);\n }\n}\n\nfunction readAttribute(attributes: SsmlAttributes, ...names: string[]): string | undefined {\n let found = false;\n let value: string | undefined;\n\n for (const name of names) {\n if (hasOwn(attributes, name)) {\n if (!found) {\n value = String(attributes[name]);\n found = true;\n }\n delete attributes[name];\n }\n }\n\n return value;\n}\n\nfunction getElementAttributes(node: XmlElementNode): SsmlAttributes {\n const attributes: SsmlAttributes = { ...node.attributes };\n removeStandardNamespaceAttributes(attributes);\n return attributes;\n}\n\nfunction finishElement<T extends SsmlElement>(element: T, node: XmlElementNode, attributes: SsmlAttributes): T {\n if (node.children.length > 0) {\n element.children = node.children.map(convertNode);\n }\n if (Object.keys(attributes).length > 0) {\n element.attributes = attributes;\n }\n return element;\n}\n\nfunction convertElement(node: XmlElementNode): SsmlElement {\n const attributes = getElementAttributes(node);\n\n switch (node.name) {\n case SSML_TAGS.VOICE: {\n const element: VoiceElement = { type: SSML_TAGS.VOICE };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n const effect = readAttribute(attributes, SSML_ATTRS.EFFECT);\n if (name !== undefined) element.name = name;\n if (effect !== undefined) element.effect = effect;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PROSODY: {\n const element: ProsodyElement = { type: SSML_TAGS.PROSODY };\n const rate = readAttribute(attributes, SSML_ATTRS.RATE);\n const pitch = readAttribute(attributes, SSML_ATTRS.PITCH);\n const volume = readAttribute(attributes, SSML_ATTRS.VOLUME);\n const contour = readAttribute(attributes, SSML_ATTRS.CONTOUR);\n const range = readAttribute(attributes, SSML_ATTRS.RANGE);\n if (rate !== undefined) element.rate = rate;\n if (pitch !== undefined) element.pitch = pitch;\n if (volume !== undefined) element.volume = volume;\n if (contour !== undefined) element.contour = contour;\n if (range !== undefined) element.range = range;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BREAK: {\n const element: BreakElement = { type: SSML_TAGS.BREAK };\n const time = readAttribute(attributes, SSML_ATTRS.TIME);\n const strength = readAttribute(attributes, SSML_ATTRS.STRENGTH);\n if (time !== undefined) element.time = time;\n if (strength !== undefined) element.strength = strength;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EXPRESS_AS:\n case SSML_TAGS.EXPRESS_AS_CAMEL:\n case SSML_TAGS.MSTTS_EXPRESS_AS: {\n const element: ExpressAsElement = { type: node.name };\n const style = readAttribute(attributes, SSML_ATTRS.STYLE);\n const styleDegree = readAttribute(\n attributes,\n SSML_ATTRS.STYLE_DEGREE,\n SSML_ATTRS.STYLE_DEGREE_CAMEL,\n SSML_ATTRS.STYLE_DEGREE_HYPHEN,\n );\n const role = readAttribute(attributes, SSML_ATTRS.ROLE);\n if (style !== undefined) element.style = style;\n if (styleDegree !== undefined) element.styleDegree = styleDegree;\n if (role !== undefined) element.role = role;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SAY_AS:\n case SSML_TAGS.SAY_AS_CAMEL: {\n const element: SayAsElement = { type: node.name };\n const interpretAs = readAttribute(attributes, SSML_ATTRS.INTERPRET_AS);\n const format = readAttribute(attributes, SSML_ATTRS.FORMAT);\n const detail = readAttribute(attributes, SSML_ATTRS.DETAIL);\n if (interpretAs !== undefined) element.interpretAs = interpretAs;\n if (format !== undefined) element.format = format;\n if (detail !== undefined) element.detail = detail;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PHONEME: {\n const element: PhonemeElement = { type: SSML_TAGS.PHONEME };\n const alphabet = readAttribute(attributes, SSML_ATTRS.ALPHABET);\n const ph = readAttribute(attributes, SSML_ATTRS.PH);\n if (alphabet !== undefined) element.alphabet = alphabet;\n if (ph !== undefined) element.ph = ph;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.EMPHASIS: {\n const element: EmphasisElement = { type: SSML_TAGS.EMPHASIS };\n const level = readAttribute(attributes, SSML_ATTRS.LEVEL);\n if (level !== undefined) element.level = level;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.AUDIO: {\n const element: AudioElement = { type: SSML_TAGS.AUDIO };\n const src = readAttribute(attributes, SSML_ATTRS.SRC);\n const desc = readAttribute(attributes, SSML_ATTRS.DESC);\n const clipBegin = readAttribute(attributes, SSML_ATTRS.CLIP_BEGIN);\n const clipEnd = readAttribute(attributes, SSML_ATTRS.CLIP_END);\n const speed = readAttribute(attributes, SSML_ATTRS.SPEED);\n const repeatCount = readAttribute(attributes, SSML_ATTRS.REPEAT_COUNT);\n const repeatDuration = readAttribute(attributes, SSML_ATTRS.REPEAT_DURATION);\n const soundLevel = readAttribute(attributes, SSML_ATTRS.SOUND_LEVEL);\n if (src !== undefined) element.src = src;\n if (desc !== undefined) element.desc = desc;\n if (clipBegin !== undefined) element.clipBegin = clipBegin;\n if (clipEnd !== undefined) element.clipEnd = clipEnd;\n if (speed !== undefined) element.speed = speed;\n if (repeatCount !== undefined) element.repeatCount = repeatCount;\n if (repeatDuration !== undefined) element.repeatDuration = repeatDuration;\n if (soundLevel !== undefined) element.soundLevel = soundLevel;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SUB: {\n const element: SubElement = { type: SSML_TAGS.SUB };\n const alias = readAttribute(attributes, SSML_ATTRS.ALIAS);\n if (alias !== undefined) element.alias = alias;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LANG: {\n const element: LangElement = { type: SSML_TAGS.LANG };\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (lang !== undefined) element.lang = lang;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MARK: {\n const element: MarkElement = { type: SSML_TAGS.MARK };\n const name = readAttribute(attributes, SSML_ATTRS.NAME);\n if (name !== undefined) element.name = name;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.BOOKMARK: {\n const element: BookmarkElement = { type: SSML_TAGS.BOOKMARK };\n const mark = readAttribute(attributes, SSML_ATTRS.MARK);\n if (mark !== undefined) element.mark = mark;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.LEXICON: {\n const element: LexiconElement = { type: SSML_TAGS.LEXICON };\n const uri = readAttribute(attributes, SSML_ATTRS.URI);\n if (uri !== undefined) element.uri = uri;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.PARAGRAPH: {\n const element: ParagraphElement = { type: SSML_TAGS.PARAGRAPH };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.SENTENCE: {\n const element: SentenceElement = { type: SSML_TAGS.SENTENCE };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.WORD: {\n const element: WordElement = { type: SSML_TAGS.WORD };\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_SILENCE:\n case SSML_TAGS.SILENCE: {\n const element: MsttsSilenceElement = {\n type: node.name === SSML_TAGS.MSTTS_SILENCE ? SSML_TAGS.MSTTS_SILENCE : SSML_TAGS.SILENCE,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n const value = readAttribute(attributes, SSML_ATTRS.VALUE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n if (value !== undefined) element.value = value;\n return finishElement(element, node, attributes);\n }\n case SSML_TAGS.MSTTS_VISEME:\n case SSML_TAGS.VISEME: {\n const element: MsttsVisemeElement = {\n type: node.name === SSML_TAGS.MSTTS_VISEME ? SSML_TAGS.MSTTS_VISEME : SSML_TAGS.VISEME,\n };\n const typeValue = readAttribute(attributes, SSML_ATTRS.TYPE);\n if (typeValue !== undefined) element.typeValue = typeValue;\n return finishElement(element, node, attributes);\n }\n default: {\n const element: CustomElement = {\n name: node.name,\n type: \"custom\",\n };\n return finishElement(element, node, attributes);\n }\n }\n}\n\nfunction convertNode(node: XmlNode): SsmlNode {\n return typeof node === \"string\" ? node : convertElement(node);\n}\n\nexport function parseSsml(xmlString: string): SsmlDocument {\n if (typeof xmlString !== \"string\") {\n throw new TypeError(\"SSML input must be a string\");\n }\n\n const root = new XmlParser(xmlString).parse();\n if (root.name !== SSML_TAGS.SPEAK) {\n throw new Error(`SSML root element must be <${SSML_TAGS.SPEAK}>, found <${root.name}>`);\n }\n\n const attributes: SsmlAttributes = { ...root.attributes };\n const version = readAttribute(attributes, SSML_ATTRS.VERSION);\n const lang = readAttribute(attributes, SSML_ATTRS.XML_LANG, SSML_ATTRS.LANG);\n if (version === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.VERSION}\" attribute`);\n }\n if (lang === undefined) {\n throw new Error(`SSML <${SSML_TAGS.SPEAK}> element is missing the \"${SSML_ATTRS.XML_LANG}\" attribute`);\n }\n\n removeStandardNamespaceAttributes(attributes);\n const document: SsmlDocument = {\n children: root.children.map(convertNode),\n lang,\n type: SSML_TAGS.SPEAK,\n version,\n };\n if (Object.keys(attributes).length > 0) {\n document.attributes = attributes;\n }\n return document;\n}\n","import { buildSsml } from \"./builder.ts\";\nimport {\n DEFAULT_SSML_LANGUAGE,\n DEFAULT_SSML_VERSION,\n SSML_ATTRS,\n SSML_TAGS,\n SYNTHESIS_NAMESPACE,\n} from \"./constants/ssml.ts\";\nimport { parseSsml } from \"./parser.ts\";\nimport type { ProsodyElement, SsmlAttributes, SsmlDocument, SsmlNode, VoiceElement } from \"./types.ts\";\n\nexport type SsmlPartialVoice = Pick<VoiceElement, \"name\" | \"effect\" | \"attributes\">;\n\nexport type SsmlPartialProsody = Pick<ProsodyElement, \"rate\" | \"pitch\" | \"volume\" | \"contour\" | \"range\" | \"attributes\">;\n\nexport interface SsmlPartialContext {\n /** SSML version used for the generated document. */\n version?: string;\n /** BCP-47 language tag used for the generated document. */\n lang?: string;\n /** Preferred voice name; a voice object takes precedence, while this overrides a string `voice` shorthand. */\n voiceName?: string;\n /** Optional Azure voice effect used with `voiceName` or a string `voice` shorthand. */\n voiceEffect?: string;\n /** A voice name shorthand or a voice object whose attributes are preserved. */\n voice?: string | SsmlPartialVoice;\n /** Optional prosody values applied around the partial text. */\n prosody?: SsmlPartialProsody;\n /** Additional attributes added to the generated `speak` element. */\n attributes?: SsmlAttributes;\n}\n\nexport interface BuildPartialSsmlOptions extends SsmlPartialContext {\n text: string;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction getPartialTextNodes(text: string, version: string, lang: string): SsmlNode[] {\n if (!text.includes(\"<\")) {\n return [text];\n }\n\n try {\n const openingTag = `<${SSML_TAGS.SPEAK} ${SSML_ATTRS.VERSION}=\"${escapeAttribute(version)}\" ${SSML_ATTRS.XMLNS}=\"${SYNTHESIS_NAMESPACE}\" ${SSML_ATTRS.XML_LANG}=\"${escapeAttribute(lang)}\">`;\n return parseSsml(`${openingTag}${text}</${SSML_TAGS.SPEAK}>`).children ?? [];\n } catch {\n return [{ type: \"text\", value: text }];\n }\n}\n\nfunction getVoiceContext(context: SsmlPartialContext): SsmlPartialVoice | undefined {\n const voice = context.voice;\n if (typeof voice === \"object\" && voice !== null) {\n return voice;\n }\n\n if (context.voiceName === undefined && context.voiceEffect === undefined && typeof voice !== \"string\") {\n return undefined;\n }\n\n return {\n name: context.voiceName ?? voice,\n effect: context.voiceEffect,\n };\n}\n\nfunction serializePartialSsml(text: string, context: SsmlPartialContext): string {\n const version = context.version ?? DEFAULT_SSML_VERSION;\n const lang = context.lang ?? DEFAULT_SSML_LANGUAGE;\n let children = getPartialTextNodes(text, version, lang);\n\n if (context.prosody) {\n children = [\n {\n type: SSML_TAGS.PROSODY,\n ...context.prosody,\n children,\n },\n ];\n }\n\n const voice = getVoiceContext(context);\n if (voice) {\n children = [\n {\n type: SSML_TAGS.VOICE,\n ...voice,\n children,\n },\n ];\n }\n\n const document: SsmlDocument = {\n type: SSML_TAGS.SPEAK,\n version,\n lang,\n attributes: context.attributes,\n children,\n };\n return buildSsml(document);\n}\n\nexport function buildPartialSsml(text: string, context?: SsmlPartialContext): string;\nexport function buildPartialSsml(options: BuildPartialSsmlOptions): string;\nexport function buildPartialSsml(\n textOrOptions: string | BuildPartialSsmlOptions,\n context?: SsmlPartialContext,\n): string {\n if (typeof textOrOptions === \"string\") {\n return serializePartialSsml(textOrOptions, context ?? {});\n }\n\n return serializePartialSsml(textOrOptions.text, textOrOptions);\n}\n","import { parseSsml } from \"./parser.ts\";\n\nconst PARSER_POSITION_SUFFIX = / at position (\\d+)$/;\n\nexport interface SsmlValidationError {\n message: string;\n position: number;\n}\n\nexport function validateSsml(xmlString: string): SsmlValidationError | null {\n try {\n parseSsml(xmlString);\n return null;\n } catch (error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const positionMatch = PARSER_POSITION_SUFFIX.exec(rawMessage);\n\n return {\n message: positionMatch ? rawMessage.slice(0, positionMatch.index) : rawMessage,\n position: positionMatch ? Number.parseInt(positionMatch[1], 10) : 0,\n };\n }\n}\n","export class AzureTtsError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly responseBody: string;\n readonly requestId: string | null;\n\n constructor(status: number, statusText: string, responseBody: string, requestId: string | null) {\n super(`Azure TTS request failed: ${status} ${statusText}`);\n this.name = \"AzureTtsError\";\n this.status = status;\n this.statusText = statusText;\n this.responseBody = responseBody;\n this.requestId = requestId;\n }\n}\n\nexport class AzureTtsSdkError extends AzureTtsError {\n readonly errorDetails: string;\n\n constructor(errorDetails: string) {\n super(0, \"Speech SDK\", errorDetails, null);\n this.name = \"AzureTtsSdkError\";\n this.message = `Azure TTS synthesis failed: ${errorDetails}`;\n this.errorDetails = errorDetails;\n }\n}\n\nexport function createSpeechSdkError(error: unknown): AzureTtsSdkError {\n const message = error instanceof Error ? error.message : String(error);\n return new AzureTtsSdkError(message);\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\nimport { createSpeechSdkError } from \"./errors.ts\";\nimport { createSpeechConfig } from \"./speechConfig.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nfunction closeSpeechResources(speechConfig: SpeechSDK.SpeechConfig, synthesizer: SpeechSDK.SpeechSynthesizer): void {\n try {\n synthesizer.close();\n } catch {}\n\n try {\n speechConfig.close();\n } catch {}\n}\n\nexport async function synthesizeSpeech(ssml: string, config: TtsConfig): Promise<ArrayBuffer> {\n const speechConfig = createSpeechConfig(config);\n const synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, null);\n\n return await new Promise<ArrayBuffer>((resolve, reject) => {\n let resourcesClosed = false;\n const closeResources = () => {\n if (resourcesClosed) return;\n resourcesClosed = true;\n closeSpeechResources(speechConfig, synthesizer);\n };\n const rejectWithError = (error: unknown) => {\n closeResources();\n reject(createSpeechSdkError(error));\n };\n\n const cb = (result: SpeechSDK.SpeechSynthesisResult) => {\n const { reason, errorDetails } = result;\n if (reason !== SpeechSDK.ResultReason.SynthesizingAudioCompleted) {\n const err = errorDetails || `Speech synthesis failed with reason ${reason}.`;\n rejectWithError(err);\n return;\n }\n closeResources();\n resolve(result.audioData);\n };\n\n try {\n synthesizer.speakSsmlAsync(ssml, cb, rejectWithError);\n } catch (error) {\n rejectWithError(error);\n }\n });\n}\n","import { SpeechConfig } from \"microsoft-cognitiveservices-speech-sdk\";\nimport { DEFAULT_OUTPUT_FORMAT, resolveOutputFormat } from \"./outputFormats.ts\";\nimport type { TtsConfig } from \"./types.ts\";\n\nexport function resolveEndpoint(config: TtsConfig): string {\n return config.endpoint.replace(/\\{region\\}/g, encodeURIComponent(config.region));\n}\n\nexport function createSpeechConfig(config: TtsConfig): SpeechConfig {\n const { outputFormat = DEFAULT_OUTPUT_FORMAT, subscriptionKey } = config;\n\n const endpoint = new URL(resolveEndpoint(config));\n const speechConfig = SpeechConfig.fromEndpoint(endpoint, subscriptionKey);\n speechConfig.speechSynthesisOutputFormat = resolveOutputFormat(outputFormat);\n return speechConfig;\n}\n","import * as SpeechSDK from \"microsoft-cognitiveservices-speech-sdk\";\n\nexport const DEFAULT_OUTPUT_FORMAT = \"audio-16khz-128kbitrate-mono-mp3\";\n\nconst OUTPUT_FORMATS: Record<string, SpeechSDK.SpeechSynthesisOutputFormat> = {\n \"raw-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoMULaw,\n \"riff-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16KbpsMonoSiren,\n \"audio-16khz-16kbps-mono-siren\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16KbpsMonoSiren,\n \"audio-16khz-32kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz32KBitRateMonoMp3,\n \"audio-16khz-128kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz128KBitRateMonoMp3,\n \"audio-16khz-64kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz64KBitRateMonoMp3,\n \"audio-24khz-48kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz48KBitRateMonoMp3,\n \"audio-24khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz96KBitRateMonoMp3,\n \"audio-24khz-160kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz160KBitRateMonoMp3,\n \"raw-16khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoTrueSilk,\n \"riff-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff16Khz16BitMonoPcm,\n \"riff-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz16BitMonoPcm,\n \"riff-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm,\n \"riff-8khz-8bit-mono-mulaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoMULaw,\n \"raw-16khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoPcm,\n \"raw-24khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoPcm,\n \"raw-8khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz16BitMonoPcm,\n \"ogg-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg16Khz16BitMonoOpus,\n \"ogg-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus,\n \"raw-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw48Khz16BitMonoPcm,\n \"riff-48khz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff48Khz16BitMonoPcm,\n \"audio-48khz-96kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz96KBitRateMonoMp3,\n \"audio-48khz-192kbitrate-mono-mp3\": SpeechSDK.SpeechSynthesisOutputFormat.Audio48Khz192KBitRateMonoMp3,\n \"ogg-48khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Ogg48Khz16BitMonoOpus,\n \"webm-16khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm16Khz16BitMonoOpus,\n \"webm-24khz-16bit-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16BitMonoOpus,\n \"webm-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Webm24Khz16Bit24KbpsMonoOpus,\n \"raw-24khz-16bit-mono-truesilk\": SpeechSDK.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoTrueSilk,\n \"raw-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Raw8Khz8BitMonoALaw,\n \"riff-8khz-8bit-mono-alaw\": SpeechSDK.SpeechSynthesisOutputFormat.Riff8Khz8BitMonoALaw,\n \"audio-16khz-16bit-32kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio16Khz16Bit32KbpsMonoOpus,\n \"audio-24khz-16bit-48kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit48KbpsMonoOpus,\n \"audio-24khz-16bit-24kbps-mono-opus\": SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz16Bit24KbpsMonoOpus,\n \"raw-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw22050Hz16BitMonoPcm,\n \"riff-22050hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff22050Hz16BitMonoPcm,\n \"raw-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Raw44100Hz16BitMonoPcm,\n \"riff-44100hz-16bit-mono-pcm\": SpeechSDK.SpeechSynthesisOutputFormat.Riff44100Hz16BitMonoPcm,\n \"amr-wb-16000hz\": SpeechSDK.SpeechSynthesisOutputFormat.AmrWb16000Hz,\n \"g722-16khz-64kbps\": SpeechSDK.SpeechSynthesisOutputFormat.G72216Khz64Kbps,\n};\n\nexport function resolveOutputFormat(outputFormat: string): SpeechSDK.SpeechSynthesisOutputFormat {\n const resolvedFormat = OUTPUT_FORMATS[outputFormat];\n if (resolvedFormat === undefined) {\n throw new Error(`Unsupported Azure Speech output format: ${outputFormat}`);\n }\n\n return resolvedFormat;\n}\n","import { synthesizeSpeech } from \"./synthesis.ts\";\nimport type { AzureTtsClientOptions } from \"./types.ts\";\n\nconst ENDPOINT_TEMPLATE = \"https://{region}.tts.speech.microsoft.com/cognitiveservices/v1\";\n\nexport class AzureTtsClient {\n readonly #options: AzureTtsClientOptions;\n\n constructor(options: AzureTtsClientOptions) {\n this.#options = options;\n }\n\n async synthesize(ssml: string): Promise<ArrayBuffer> {\n const { region, subscriptionKey, outputFormat } = this.#options;\n const endpoint = this.#options.endpoint ?? ENDPOINT_TEMPLATE.replace(\"{region}\", region);\n console.debug(\"Using Azure TTS endpoint:\", endpoint);\n\n const config = { endpoint, region, subscriptionKey, outputFormat };\n return synthesizeSpeech(ssml, config);\n }\n}\n"],"mappings":"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","names":["escapeAttribute","SpeechSDK"]}
package/dist/index.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  buildSsml,
4
4
  parseSsml,
5
5
  validateSsml
6
- } from "./chunk-I3GP7OJU.mjs";
6
+ } from "./chunk-PSN6XAFF.mjs";
7
7
  import {
8
8
  __privateAdd,
9
9
  __privateGet,
package/dist/react.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, CSSProperties } from 'react';
3
+ import { OnMount, Monaco } from '@monaco-editor/react';
3
4
 
4
5
  type SsmlAttributeValue = string | number;
5
6
  type SsmlAttributes = Record<string, SsmlAttributeValue>;
@@ -149,6 +150,11 @@ interface EditorCopy {
149
150
  previewSelection: string;
150
151
  previewSelectionTitle: string;
151
152
  noAvailableOptions: string;
153
+ styleNotSupported: string;
154
+ categoryEmotions: string;
155
+ categoryScenarios: string;
156
+ categoryMedia: string;
157
+ categoryOther: string;
152
158
  }
153
159
  interface InlineBadgeCopy {
154
160
  pause: string;
@@ -306,6 +312,8 @@ interface SsmlEditorProps {
306
312
  showToolbarLabels?: boolean;
307
313
  /** Whether inline SSML decorations are displayed. The toolbar switch can change this at runtime. */
308
314
  showDecorations?: boolean;
315
+ /** Whether SSML CodeLens quick controls are displayed. */
316
+ enableCodeLens?: boolean;
309
317
  /** Controls which editor action buttons are displayed. Unspecified buttons are shown. */
310
318
  buttonVisibility?: SsmlEditorButtonVisibility;
311
319
  /** Monaco editor settings. */
@@ -371,4 +379,25 @@ interface SsmlEditorRef {
371
379
  }
372
380
  declare const SsmlEditor: react.ForwardRefExoticComponent<SsmlEditorProps & react.RefAttributes<SsmlEditorRef>>;
373
381
 
374
- export { EDITOR_COPY, type EditorCopy, INLINE_BADGE_COPY, type InlineBadgeCopy, SSML_HOVER_COPY, SSML_INSERTIONS, type SelectionInfo, SsmlEditor, type SsmlEditorButton, type SsmlEditorButtonVisibility, type SsmlEditorCustomInsertion, type SsmlEditorCustomInsertionCollection, type SsmlEditorCustomInsertionDefinition, type SsmlEditorInsertionButton, type SsmlEditorInsertionDefinition, type SsmlEditorInsertionGroup, type SsmlEditorInsertionMode, type SsmlEditorInsertionOption, type SsmlEditorInsertionTemplate, type SsmlEditorLanguage, type SsmlEditorLineNumbers, type SsmlEditorLocale, type SsmlEditorLocalizedText, type SsmlEditorOptions, type SsmlEditorProps, type SsmlEditorRef, type SsmlEditorTheme, type SsmlEditorToolbarGroup, type SsmlEditorWordWrap, type SsmlHoverLocale, type SsmlHoverParameterCopy, type SsmlHoverTagCopy, type SsmlInsertionDefinition, type SsmlInsertionOption, type SsmlInsertionTemplate, createSsmlEditorInsertionDefinition };
382
+ type MonacoEditor = Parameters<OnMount>[0];
383
+
384
+ interface SsmlTagRange {
385
+ start: number;
386
+ end: number;
387
+ }
388
+ declare function updateTagAttribute(text: string, tagRange: SsmlTagRange, attributeName: string, newValue: string): string;
389
+
390
+ type SsmlCodeLensAction = {
391
+ type: "attribute";
392
+ insertionId: "rate" | "pitch" | "break";
393
+ attributeName: "rate" | "pitch" | "time";
394
+ tagRange: SsmlTagRange;
395
+ } | {
396
+ type: "unwrap" | "delete";
397
+ tagRange: SsmlTagRange;
398
+ elementRange: SsmlTagRange;
399
+ };
400
+ type SsmlCodeLensCallback = (action: SsmlCodeLensAction) => void;
401
+ declare function registerSsmlCodeLens(monaco: Monaco, editor: MonacoEditor, onOpenPopover: SsmlCodeLensCallback): ReturnType<Monaco["languages"]["registerCodeLensProvider"]>;
402
+
403
+ export { EDITOR_COPY, type EditorCopy, INLINE_BADGE_COPY, type InlineBadgeCopy, SSML_HOVER_COPY, SSML_INSERTIONS, type SelectionInfo, type SsmlCodeLensAction, type SsmlCodeLensCallback, SsmlEditor, type SsmlEditorButton, type SsmlEditorButtonVisibility, type SsmlEditorCustomInsertion, type SsmlEditorCustomInsertionCollection, type SsmlEditorCustomInsertionDefinition, type SsmlEditorInsertionButton, type SsmlEditorInsertionDefinition, type SsmlEditorInsertionGroup, type SsmlEditorInsertionMode, type SsmlEditorInsertionOption, type SsmlEditorInsertionTemplate, type SsmlEditorLanguage, type SsmlEditorLineNumbers, type SsmlEditorLocale, type SsmlEditorLocalizedText, type SsmlEditorOptions, type SsmlEditorProps, type SsmlEditorRef, type SsmlEditorTheme, type SsmlEditorToolbarGroup, type SsmlEditorWordWrap, type SsmlHoverLocale, type SsmlHoverParameterCopy, type SsmlHoverTagCopy, type SsmlInsertionDefinition, type SsmlInsertionOption, type SsmlInsertionTemplate, type SsmlTagRange, createSsmlEditorInsertionDefinition, registerSsmlCodeLens, updateTagAttribute };