@rohal12/twee-ts 1.13.0 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/twee-ts.js +10 -6
- package/dist/bin/twee-ts.js.map +1 -1
- package/dist/{chunk-ORMESTR7.js → chunk-EQAUFATA.js} +11 -7
- package/dist/{chunk-ORMESTR7.js.map → chunk-EQAUFATA.js.map} +1 -1
- package/dist/index.cjs +10 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/plugins/rollup.js +1 -1
- package/dist/plugins/vite.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/compiler.ts","../src/ifid.ts","../src/escape.ts","../src/passage.ts","../src/story.ts","../src/filesystem.ts","../src/media-types.ts","../src/formats.ts","../src/util.ts","../src/loader.ts","../src/types.ts","../src/lexer.ts","../src/twee2-compat.ts","../src/parser.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode-codepoint.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/decode-shared.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-html.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-xml.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/bin-trie-flags.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Tokenizer.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Parser.ts","../node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/esm/index.js","../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/node.js","../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/index.js","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-html.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-xml.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode_codepoint.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/encode-html.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/escape.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/index.ts","../node_modules/.pnpm/dom-serializer@2.0.0/node_modules/dom-serializer/lib/esm/foreignNames.js","https://raw.githubusercontent.com/fb55/domutils/0ab8bcf1ecfc70dfc93291a4cb2496578ac25e9c/src/helpers.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/index.ts","../src/html-parser.ts","../src/version.ts","../src/output-twine2.ts","../src/output-twine1.ts","../src/output-twee.ts","../src/modules.ts","../src/remote-formats.ts"],"sourcesContent":["/**\n * Main compiler orchestrator.\n * compile(), compileToFile(), watch().\n * Ported from tweego.go + config.go.\n */\nimport { writeFileSync } from 'node:fs';\nimport type {\n CompileOptions,\n CompileToFileOptions,\n WatchOptions,\n CompileResult,\n CompileStats,\n Diagnostic,\n Story,\n StoryFormatInfo,\n OutputMode,\n InlineSource,\n FileCacheEntry,\n} from './types.js';\nimport { createStory, storyHas, getStoryStats } from './story.js';\nimport { getFilenames, watchFilesystem } from './filesystem.js';\nimport { discoverFormats, getFormatSearchDirs, getFormatIdByNameAndVersion } from './formats.js';\nimport { loadSources, loadInlineSources, loadSourcesCached } from './loader.js';\nimport { applyTagAliases, hasTag } from './passage.js';\nimport { generateIFID } from './ifid.js';\nimport { toTwine2HTML, toTwine2Archive } from './output-twine2.js';\nimport { toTwine1HTML, toTwine1Archive } from './output-twine1.js';\nimport { toTwee } from './output-twee.js';\nimport { modifyHead } from './modules.js';\nimport { resolveRemoteFormat, clearIndexCache } from './remote-formats.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'Twee-ts';\n\nconst DEFAULT_FORMAT_ID = 'sugarcube-2';\nconst DEFAULT_START_NAME = 'Start';\n\nexport class TweeTsError extends Error {\n constructor(\n message: string,\n public diagnostics: Diagnostic[] = [],\n ) {\n super(message);\n this.name = 'TweeTsError';\n }\n}\n\n/**\n * Compile Twee sources to HTML, Twee, or JSON.\n */\nexport async function compile(options: CompileOptions): Promise<CompileResult> {\n return buildOutput(options);\n}\n\n/**\n * Compile and write to a file.\n */\nexport async function compileToFile(options: CompileToFileOptions): Promise<CompileResult> {\n const result = await compile(options);\n writeFileSync(options.outFile, result.output, 'utf-8');\n return result;\n}\n\n/**\n * Compile with incremental caching support.\n * Plugins and advanced users can manage their own cache and changed-file tracking.\n */\nexport async function compileIncremental(\n options: CompileOptions,\n cache: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): Promise<CompileResult> {\n return buildOutput(options, cache, changedFiles);\n}\n\n/**\n * Watch for file changes and recompile.\n */\nexport async function watch(options: WatchOptions): Promise<AbortController> {\n const controller = new AbortController();\n const cache = new Map<string, FileCacheEntry>();\n\n // Separate file paths from inline sources\n const filePaths = options.sources.filter((s): s is string => typeof s === 'string');\n const modulePaths = options.modules ?? [];\n const allPaths = [...filePaths, ...modulePaths];\n\n const handle = watchFilesystem(allPaths, options.outFile, (changedFiles) => {\n buildOutput(options, cache, changedFiles)\n .then((result) => {\n writeFileSync(options.outFile, result.output, 'utf-8');\n options.onBuild?.(result);\n })\n .catch((e) => {\n options.onError?.(e instanceof Error ? e : new Error(String(e)));\n });\n });\n\n controller.signal.addEventListener('abort', () => handle.close());\n return controller;\n}\n\nasync function buildOutput(\n options: CompileOptions,\n cache?: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): Promise<CompileResult> {\n const diagnostics: Diagnostic[] = [];\n const outputMode: OutputMode = options.outputMode ?? 'html';\n const trim = options.trim ?? true;\n const twee2Compat = options.twee2Compat ?? false;\n const testMode = options.testMode ?? false;\n const noRemote = options.noRemote ?? false;\n const sourceInfo = options.sourceInfo ?? false;\n\n // Clear per-compile index cache\n clearIndexCache();\n\n // Separate file paths from inline sources\n const filePaths: string[] = [];\n const inlineSources: InlineSource[] = [];\n for (const source of options.sources) {\n if (typeof source === 'string') {\n filePaths.push(source);\n } else {\n inlineSources.push(source);\n }\n }\n\n // Walk file paths to get all source filenames\n const sourceFilenames = getFilenames(filePaths);\n\n // Create story and load sources\n const story = createStory();\n const processedFiles = new Set<string>();\n\n if (cache) {\n loadSourcesCached(story, sourceFilenames, { trim, twee2Compat }, diagnostics, processedFiles, cache, changedFiles);\n } else {\n loadSources(story, sourceFilenames, { trim, twee2Compat }, diagnostics, processedFiles);\n }\n loadInlineSources(story, inlineSources, { trim, twee2Compat }, diagnostics);\n\n // Apply tag aliases (e.g. library → script)\n if (options.tagAliases) {\n story.passages = applyTagAliases(story.passages, options.tagAliases);\n }\n\n // Resolve format\n let format: StoryFormatInfo | undefined;\n let formatId = options.formatId ?? '';\n\n if (outputMode === 'html') {\n const formatSearchDirs = getFormatSearchDirs(options.formatPaths, options.useTweegoPath ?? true);\n const formats = discoverFormats(formatSearchDirs);\n\n if (!formatId && story.twine2.format) {\n formatId = getFormatIdByNameAndVersion(formats, story.twine2.format, story.twine2.formatVersion) ?? '';\n }\n if (!formatId) {\n formatId = DEFAULT_FORMAT_ID;\n }\n\n format = formats.get(formatId);\n\n // Remote format fallback\n if (!format && !noRemote) {\n // Determine the format name and version for remote lookup\n const remoteName = story.twine2.format || formatId;\n const remoteVersion = story.twine2.formatVersion || '';\n\n try {\n format = await resolveRemoteFormat(remoteName, remoteVersion, options.formatIndices, options.formatUrls);\n } catch (e) {\n diagnostics.push({\n level: 'warning',\n message: `Remote format fetch failed for \"${remoteName}\": ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n if (!format) {\n const reason = noRemote ? ' (remote fetching disabled)' : '';\n diagnostics.push({\n level: 'error',\n message: `Story format \"${formatId}\" is not available${reason}. Found: ${[...formats.keys()].join(', ') || 'none'}`,\n });\n }\n }\n\n // Merge config from StoryData: command-line > StoryData > default\n const startName = options.startPassage || story.twine2.start || DEFAULT_START_NAME;\n\n // Apply test mode\n if (testMode) {\n story.twine2.options.set('debug', true);\n }\n\n // Ensure IFID is set before output generation\n ensureIFID(story, diagnostics);\n\n // Generate output\n let output: string;\n\n switch (outputMode) {\n case 'twee3':\n case 'twee1':\n output = toTwee(story, outputMode);\n break;\n\n case 'twine2-archive':\n output = toTwine2Archive(story, startName, { sourceInfo });\n break;\n\n case 'twine1-archive':\n output = toTwine1Archive(story, startName);\n break;\n\n case 'json':\n output = storyToJSON(story);\n break;\n\n case 'html': {\n // Sanity checks for HTML mode\n if (!storyHas(story, startName)) {\n diagnostics.push({\n level: 'error',\n message: `Starting passage \"${startName}\" not found.`,\n });\n }\n\n if (!format) {\n throw new TweeTsError('No story format available for HTML output.', diagnostics);\n }\n\n if (format.isTwine2) {\n output = toTwine2HTML(story, format, startName, { sourceInfo });\n } else {\n if (story.name === '' && !storyHas(story, 'StoryTitle')) {\n diagnostics.push({\n level: 'error',\n message: 'Special passage \"StoryTitle\" not found.',\n });\n }\n output = toTwine1HTML(story, format, startName);\n }\n\n // Inject modules and head file\n const modulePaths = options.modules ? getFilenames(options.modules) : [];\n output = modifyHead(output, modulePaths, options.headFile, diagnostics);\n break;\n }\n\n default: {\n const _exhaustive: never = outputMode;\n throw new TweeTsError(`Unhandled output mode: ${_exhaustive as string}`, diagnostics);\n }\n }\n\n // Compute stats\n const stats: CompileStats = {\n ...getStoryStats(story, options.wordCountMethod),\n files: [...processedFiles],\n };\n\n return { output, story, format, diagnostics, stats };\n}\n\nfunction ensureIFID(story: Story, diagnostics: Diagnostic[]): void {\n if (story.ifid !== '') return;\n\n if (story.legacyIFID !== '') {\n story.ifid = story.legacyIFID;\n diagnostics.push({\n level: 'warning',\n message: 'Story IFID not found; reusing \"ifid\" entry from the \"StorySettings\" special passage.',\n });\n } else {\n const ifid = generateIFID();\n story.ifid = ifid;\n diagnostics.push({\n level: 'error',\n message: `Story IFID not found. Add an IFID to your story: {\"ifid\":\"${ifid}\"}`,\n });\n }\n}\n\n/**\n * Serialize a Story to JSON per the Twine 2 JSON Output Specification (v1.0):\n * https://github.com/iftechfoundation/twine-specs/blob/master/twine-2-jsonoutput-doc.md\n */\nfunction storyToJSON(story: Story): string {\n // Gather script and stylesheet content, excluding them from passages.\n const scripts: string[] = [];\n const stylesheets: string[] = [];\n const storyPassages: { name: string; tags: string[]; text: string; metadata?: Record<string, string> }[] = [];\n\n for (const p of story.passages) {\n if (p.name === 'StoryTitle' || p.name === 'StoryData') continue;\n if (hasTag(p, 'Twine.private')) continue;\n\n if (hasTag(p, 'script')) {\n scripts.push(p.text);\n } else if (hasTag(p, 'stylesheet')) {\n stylesheets.push(p.text);\n } else {\n const entry: { name: string; tags: string[]; text: string; metadata?: Record<string, string> } = {\n name: p.name,\n tags: p.tags,\n text: p.text,\n };\n if (p.metadata) {\n const meta: Record<string, string> = {};\n for (const [key, value] of Object.entries(p.metadata)) {\n if (typeof value === 'string') meta[key] = value;\n }\n if (Object.keys(meta).length > 0) {\n entry.metadata = meta;\n }\n }\n storyPassages.push(entry);\n }\n }\n\n const obj: Record<string, unknown> = {\n name: story.name,\n };\n\n if (story.ifid) obj.ifid = story.ifid;\n if (story.twine2.format) obj.format = story.twine2.format;\n if (story.twine2.formatVersion) obj['format-version'] = story.twine2.formatVersion;\n if (story.twine2.start) obj.start = story.twine2.start;\n if (story.twine2.tagColors.size > 0) obj['tag-colors'] = Object.fromEntries(story.twine2.tagColors);\n if (story.twine2.zoom !== 1) obj.zoom = story.twine2.zoom;\n obj.creator = CREATOR_NAME;\n obj['creator-version'] = VERSION;\n obj.style = stylesheets.join('\\n');\n obj.script = scripts.join('\\n');\n obj.passages = storyPassages;\n\n return JSON.stringify(obj, null, 2);\n}\n","/**\n * IFID (Interactive Fiction IDentifier) generation and validation.\n * Ported from ifid.go.\n */\nimport { randomUUID } from 'node:crypto';\nimport type { IFID } from './types.js';\n\n/** Generate a new IFID (UUID v4, uppercase). */\nexport function generateIFID(): IFID {\n return randomUUID().toUpperCase() as IFID;\n}\n\n/** Validate and brand an IFID string. Throws on invalid input. */\nexport function createIFID(value: string): IFID {\n const err = validateIFID(value);\n if (err) throw new Error(`Invalid IFID: ${err}`);\n return value.toUpperCase() as IFID;\n}\n\n/**\n * Validate an IFID string.\n * Accepts both bare UUIDs and UUID://...// wrapped format.\n * Returns null if valid, or an error message string.\n */\nexport function validateIFID(ifid: string): string | null {\n let uuid = ifid;\n\n switch (ifid.length) {\n case 36:\n break;\n case 45: {\n if (ifid.slice(0, 7).toUpperCase() !== 'UUID://' || ifid.slice(43) !== '//') {\n return 'invalid IFID UUID://...// format';\n }\n uuid = ifid.slice(7, 43);\n break;\n }\n default:\n return `invalid IFID length: ${ifid.length}`;\n }\n\n for (let i = 0; i < uuid.length; i++) {\n const ch = uuid[i]!;\n switch (i) {\n case 8:\n case 13:\n case 18:\n case 23:\n if (ch !== '-') {\n return `invalid IFID character '${ch}' at position ${i + 1}`;\n }\n break;\n case 14:\n if (ch < '1' || ch > '5') {\n return `invalid version '${ch}' at position ${i + 1}`;\n }\n break;\n case 19:\n if (!['8', '9', 'a', 'A', 'b', 'B'].includes(ch)) {\n return `invalid variant '${ch}' at position ${i + 1}`;\n }\n break;\n default:\n if (!/^[0-9a-fA-F]$/.test(ch)) {\n return `invalid IFID hex value '${ch}' at position ${i + 1}`;\n }\n break;\n }\n }\n\n return null;\n}\n","/**\n * HTML, attribute, tiddler, and twee escaping/unescaping utilities.\n * Ported from escaping.go.\n */\n\n/** Escape the minimum characters required for HTML attribute values. */\nexport function attrEscape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n/** Escape for HTML attribute values including < and > (for spec-compliant output). */\nexport function fullAttrEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Escape the minimum characters required for general HTML content. */\nexport function htmlEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Escape for Twine 1 tiddler format. */\nexport function tiddlerEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/\\\\/g, '\\\\s')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n');\n}\n\n/** Unescape from Twine 1 tiddler format. */\nexport function tiddlerUnescape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t').replace(/\\\\s/g, '\\\\');\n}\n\n/** Escape characters that are special in Twee passage names/tags. */\nexport function tweeEscape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/[\\\\[\\]{}]/g, (ch) => '\\\\' + ch);\n}\n\n/** Escape a string for safe inclusion in a JavaScript string literal. */\nexport function jsStringEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/** Sanitize a string for safe inclusion in a CSS or JS block comment. */\nexport function commentSanitize(s: string): string {\n return s.replace(/\\*\\//g, '* /');\n}\n\n/** Sanitize a string for safe inclusion in an HTML comment. */\nexport function htmlCommentSanitize(s: string): string {\n return s.replace(/-->/g, '-- >');\n}\n\n/** Apply ROT13 encoding to a string (only affects [A-Za-z]). */\nexport function rot13(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/[A-Za-z]/g, (ch) => {\n const base = ch <= 'Z' ? 65 : 97;\n return String.fromCharCode(((ch.charCodeAt(0) - base + 13) % 26) + base);\n });\n}\n\n/** Unescape backslash-escaped Twee characters. */\nexport function tweeUnescape(s: string): string {\n if (s.length === 0) return s;\n let result = '';\n for (let i = 0; i < s.length; i++) {\n if (s[i] === '\\\\') {\n i++;\n if (i >= s.length) {\n result += '\\\\';\n break;\n }\n }\n result += s[i];\n }\n return result;\n}\n","/**\n * Passage helpers and output methods.\n * Ported from passage.go / passagedata.go.\n */\nimport type { Passage, PassageMetadata, OutputMode, WordCountMethod } from './types.js';\nimport { attrEscape, fullAttrEscape, htmlEscape, tiddlerEscape, tweeEscape, rot13, commentSanitize } from './escape.js';\n\n// Info passages contain structural data, metadata, and code rather than story content.\nconst INFO_PASSAGE_NAMES = new Set([\n 'StoryAuthor',\n 'StoryInit',\n 'StoryMenu',\n 'StorySubtitle',\n 'StoryTitle',\n 'PassageReady',\n 'PassageDone',\n 'PassageHeader',\n 'PassageFooter',\n 'StoryBanner',\n 'StoryCaption',\n 'MenuOptions',\n 'MenuShare',\n 'MenuStory',\n 'StoryInterface',\n 'StoryShare',\n 'StorySettings',\n 'StoryData',\n 'StoryIncludes',\n]);\n\nconst INFO_TAGS = ['annotation', 'script', 'stylesheet', 'widget'];\n\nexport function hasTag(p: Passage, tag: string): boolean {\n return p.tags.includes(tag);\n}\n\nexport function hasAnyTag(p: Passage, ...tags: string[]): boolean {\n return p.tags.some((t) => tags.includes(t));\n}\n\nexport function hasTagStartingWith(p: Passage, prefix: string): boolean {\n return p.tags.some((t) => t.startsWith(prefix));\n}\n\nexport function hasInfoTags(p: Passage): boolean {\n return hasAnyTag(p, ...INFO_TAGS) || hasTagStartingWith(p, 'Twine.');\n}\n\nexport function hasInfoName(p: Passage): boolean {\n return INFO_PASSAGE_NAMES.has(p.name);\n}\n\nexport function isInfoPassage(p: Passage): boolean {\n return hasInfoName(p) || hasInfoTags(p);\n}\n\nexport function isStoryPassage(p: Passage): boolean {\n return !hasInfoName(p) && !hasInfoTags(p);\n}\n\nexport function hasMetadataPosition(p: Passage): boolean {\n return p.metadata != null && p.metadata.position != null && p.metadata.position !== '';\n}\n\nexport function hasMetadataSize(p: Passage): boolean {\n return p.metadata != null && p.metadata.size != null && p.metadata.size !== '';\n}\n\nexport function hasAnyMetadata(p: Passage): boolean {\n if (!p.metadata) return false;\n return Object.values(p.metadata).some((v) => v != null && v !== '');\n}\n\nexport function marshalMetadata(meta: PassageMetadata): string {\n const obj: Record<string, string> = {};\n for (const [key, value] of Object.entries(meta)) {\n if (typeof value === 'string' && value) obj[key] = value;\n }\n return JSON.stringify(obj);\n}\n\nexport function unmarshalMetadata(json: string): PassageMetadata {\n const raw: unknown = JSON.parse(json);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return {};\n }\n const parsed = raw as Record<string, unknown>;\n const meta: PassageMetadata = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'string') meta[key] = value;\n }\n return meta;\n}\n\n/** Convert passage to Twee source. */\nexport function passageToTwee(p: Passage, outMode: OutputMode): string {\n let output: string;\n if (outMode === 'twee3') {\n output = ':: ' + tweeEscape(p.name);\n if (p.tags.length > 0) {\n output += ' [' + tweeEscape(p.tags.join(' ')) + ']';\n }\n if (hasAnyMetadata(p) && p.metadata) {\n output += ' ' + marshalMetadata(p.metadata);\n }\n } else {\n output = ':: ' + p.name;\n if (p.tags.length > 0) {\n output += ' [' + p.tags.join(' ') + ']';\n }\n }\n output += '\\n';\n if (p.text.length > 0) {\n output += p.text + '\\n';\n }\n output += '\\n\\n';\n return output;\n}\n\n/** Generate `<tw-passagedata>` HTML for Twine 2. */\nexport function passageToPassagedata(p: Passage, pid: number, options?: { readonly sourceInfo?: boolean }): string {\n let position: string;\n let size: string;\n\n if (hasMetadataPosition(p)) {\n position = p.metadata?.position ?? '';\n } else {\n const x = pid % 10;\n const y = Math.floor(pid / 10);\n const xp = x === 0 ? 10 : x;\n const yp = x === 0 ? y : y + 1;\n position = `${xp * 125 - 25},${yp * 125 - 25}`;\n }\n\n if (hasMetadataSize(p)) {\n size = p.metadata?.size ?? '';\n } else {\n size = '100,100';\n }\n\n let attrs = `<tw-passagedata pid=\"${pid}\" name=${quote(fullAttrEscape(p.name))} tags=${quote(attrEscape(p.tags.join(' ')))} position=${quote(attrEscape(position))} size=${quote(attrEscape(size))}`;\n if (options?.sourceInfo && p.source) {\n attrs += ` data-source-file=${quote(attrEscape(p.source.file))} data-source-line=\"${p.source.line}\"`;\n }\n return `${attrs}>${htmlEscape(p.text)}</tw-passagedata>`;\n}\n\n/** Generate `<div tiddler>` HTML for Twine 1. */\nexport function passageToTiddler(p: Passage, pid: number, obfuscateRot13 = false): string {\n let position: string;\n\n if (hasMetadataPosition(p)) {\n position = p.metadata?.position ?? '';\n } else {\n const x = pid % 10;\n const y = Math.floor(pid / 10);\n const xp = x === 0 ? 10 : x;\n const yp = x === 0 ? y : y + 1;\n position = `${xp * 140 - 130},${yp * 140 - 130}`;\n }\n\n const created = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 12);\n const content = obfuscateRot13 && p.name !== 'StorySettings' ? tiddlerEscape(rot13(p.text)) : tiddlerEscape(p.text);\n const nameComment = obfuscateRot13 ? `<!-- ${commentSanitize(p.name)} -->` : '';\n return `<div tiddler=${quote(attrEscape(p.name))} tags=${quote(attrEscape(p.tags.join(' ')))} created=${quote(created)} modifier=${quote('twee')} twine-position=${quote(attrEscape(position))}>${nameComment}${content}</div>`;\n}\n\n/**\n * Count words in a passage.\n *\n * - `'tweego'` (default): Strip newlines, strip comments, count NFKD-normalized characters, divide by 5.\n * - `'whitespace'`: Strip comments and markup, split on whitespace, count tokens.\n */\nexport function countWords(p: Passage, method: WordCountMethod = 'tweego'): number {\n switch (method) {\n case 'tweego': {\n let text = p.text;\n text = text.replace(/\\n/g, '');\n text = text.replace(/(?:\\/%.+?%\\/|\\/\\*.+?\\*\\/|<!--.+?-->)/gs, '');\n const normalized = text.normalize('NFKD');\n const count = [...normalized].length;\n if (count === 0) return 0;\n const words = Math.floor(count / 5);\n return count % 5 > 0 ? words + 1 : words;\n }\n case 'whitespace': {\n let text = p.text;\n // Strip comments\n text = text.replace(/(?:\\/%.+?%\\/|\\/\\*.+?\\*\\/|<!--.+?-->)/gs, '');\n // Strip Twine macros <<...>>\n text = text.replace(/<<[^>]*>>/g, '');\n // Strip Twine links [[...]] — keep display text\n text = text.replace(/\\[\\[([^\\]|]*?)(?:\\|[^\\]]*?)?\\]\\]/g, '$1');\n // Strip HTML tags\n text = text.replace(/<[^>]+>/g, '');\n const tokens = text.split(/\\s+/).filter((t) => t.length > 0);\n return tokens.length;\n }\n default: {\n const _exhaustive: never = method;\n throw new Error(`Unhandled word count method: ${_exhaustive as string}`);\n }\n }\n}\n\n/**\n * Apply tag aliases: for each passage carrying an alias tag, add the canonical\n * tag if not already present. Returns new passage objects where tags changed;\n * unchanged passages are returned as-is. Idempotent — safe to call multiple times.\n */\nexport function applyTagAliases(passages: readonly Passage[], aliases: Record<string, string>): Passage[] {\n const entries = Object.entries(aliases);\n if (entries.length === 0) return [...passages];\n return passages.map((p) => {\n const original = p.tags;\n const added: string[] = [];\n for (const [alias, canonical] of entries) {\n if (original.includes(alias) && !original.includes(canonical) && !added.includes(canonical)) {\n added.push(canonical);\n }\n }\n return added.length > 0 ? { ...p, tags: [...original, ...added] } : p;\n });\n}\n\nfunction quote(s: string): string {\n return `\"${s}\"`;\n}\n","/**\n * Story model + StoryData JSON marshal/unmarshal.\n * Ported from story.go + storydata.go.\n */\nimport type { Story, ReadonlyStory, Passage, Diagnostic, WordCountMethod, IFID } from './types.js';\nimport { validateIFID } from './ifid.js';\nimport { isStoryPassage, countWords } from './passage.js';\n\n/** Module-level index: maps passage names to their array indices for O(1) lookups. */\nconst passageIndex = new WeakMap<Story, Map<string, number>>();\n\nfunction getIndex(story: Story): Map<string, number> {\n let index = passageIndex.get(story);\n if (!index) {\n // Rebuild for stories not created via createStory() (e.g., tests, external code)\n index = new Map();\n for (let i = 0; i < story.passages.length; i++) {\n const passage = story.passages[i];\n if (passage) index.set(passage.name, i);\n }\n passageIndex.set(story, index);\n }\n return index;\n}\n\nexport function createStory(): Story {\n const story: Story = {\n name: '',\n ifid: '' as IFID,\n passages: [],\n legacyIFID: '' as IFID,\n twine1: { settings: new Map() },\n twine2: {\n format: '',\n formatVersion: '',\n options: new Map(),\n start: '',\n tags: '',\n tagColors: new Map(),\n zoom: 1,\n },\n };\n passageIndex.set(story, new Map());\n return story;\n}\n\nexport function storyHas(story: Story, name: string): boolean {\n return getIndex(story).has(name);\n}\n\nexport function storyIndex(story: Story, name: string): number {\n return getIndex(story).get(name) ?? -1;\n}\n\nexport function storyGet(story: Story, name: string): Passage | undefined {\n const i = storyIndex(story, name);\n return i === -1 ? undefined : story.passages[i];\n}\n\nexport function storyAppend(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n const index = getIndex(story);\n const i = index.get(p.name) ?? -1;\n if (i === -1) {\n index.set(p.name, story.passages.length);\n story.passages.push(p);\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Replacing existing passage \"${p.name}\" with duplicate.`,\n });\n story.passages[i] = p;\n }\n}\n\nexport function storyPrepend(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n const index = getIndex(story);\n const i = index.get(p.name) ?? -1;\n if (i === -1) {\n story.passages.unshift(p);\n // Rebuild index: unshift shifts all existing indices by 1\n index.clear();\n for (let j = 0; j < story.passages.length; j++) {\n const passage = story.passages[j];\n if (passage) index.set(passage.name, j);\n }\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Replacing existing passage \"${p.name}\" with duplicate.`,\n });\n story.passages[i] = p;\n }\n}\n\n// --- StoryData JSON ---\n\ninterface StoryDataJSON {\n ifid?: string;\n format?: string;\n 'format-version'?: string;\n options?: string[];\n start?: string;\n tags?: string;\n 'tag-colors'?: Record<string, string>;\n zoom?: number;\n}\n\nexport function marshalStoryData(story: Story): string {\n const data: StoryDataJSON = {};\n if (story.ifid) data.ifid = story.ifid;\n if (story.twine2.format) data.format = story.twine2.format;\n if (story.twine2.formatVersion) data['format-version'] = story.twine2.formatVersion;\n\n const options: string[] = [];\n for (const [opt, val] of story.twine2.options) {\n if (val) options.push(opt);\n }\n if (options.length > 0) data.options = options;\n\n if (story.twine2.start) data.start = story.twine2.start;\n if (story.twine2.tags) data.tags = story.twine2.tags;\n\n if (story.twine2.tagColors.size > 0) {\n data['tag-colors'] = Object.fromEntries(story.twine2.tagColors);\n }\n if (story.twine2.zoom !== 1) data.zoom = story.twine2.zoom;\n\n return JSON.stringify(data, null, '\\t');\n}\n\nexport function unmarshalStoryData(story: Story, json: string): string | null {\n let raw: unknown;\n try {\n raw = JSON.parse(json) as unknown;\n } catch (e) {\n return `Cannot unmarshal \"StoryData\"; ${e instanceof Error ? e.message : String(e)}`;\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return 'Cannot unmarshal \"StoryData\"; expected a JSON object';\n }\n const data = raw as StoryDataJSON;\n\n if (typeof data.ifid === 'string' && data.ifid) story.ifid = data.ifid.toUpperCase() as IFID;\n if (typeof data.format === 'string' && data.format) story.twine2.format = data.format;\n if (typeof data['format-version'] === 'string' && data['format-version'])\n story.twine2.formatVersion = data['format-version'];\n if (Array.isArray(data.options)) {\n for (const opt of data.options) {\n if (typeof opt === 'string') story.twine2.options.set(opt, true);\n }\n }\n if (typeof data.start === 'string' && data.start) story.twine2.start = data.start;\n if (typeof data.tags === 'string') story.twine2.tags = data.tags;\n if (typeof data['tag-colors'] === 'object' && data['tag-colors'] !== null && !Array.isArray(data['tag-colors'])) {\n for (const [tag, color] of Object.entries(data['tag-colors'])) {\n if (typeof color === 'string') story.twine2.tagColors.set(tag, color);\n }\n }\n if (typeof data.zoom === 'number' && data.zoom !== 0) story.twine2.zoom = data.zoom;\n\n return null;\n}\n\n// --- StorySettings (legacy) ---\n\nexport function unmarshalStorySettings(story: Story, text: string, diagnostics: Diagnostic[]): void {\n const obsolete: string[] = [];\n\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.trim();\n if (line.length === 0) continue;\n\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) {\n diagnostics.push({\n level: 'warning',\n message: `Malformed \"StorySettings\" entry; skipping \"${line}\".`,\n });\n continue;\n }\n\n const key = line.slice(0, colonIdx).trim().toLowerCase();\n const val = line\n .slice(colonIdx + 1)\n .trim()\n .toLowerCase();\n\n switch (key) {\n case 'ifid': {\n const err = validateIFID(val);\n if (err === null) {\n story.legacyIFID = val.toUpperCase() as IFID;\n }\n obsolete.push('\"ifid\"');\n continue;\n }\n case 'zoom':\n obsolete.push('\"zoom\"');\n continue;\n }\n\n story.twine1.settings.set(key, val);\n }\n\n if (obsolete.length > 0) {\n const entries = obsolete.length === 1 ? 'entry' : 'entries';\n const pronoun = obsolete.length === 1 ? 'it' : 'them';\n diagnostics.push({\n level: 'warning',\n message:\n `Detected obsolete \"StorySettings\" ${entries}: ${obsolete.join(', ')}. ` +\n `Please remove ${pronoun} from the \"StorySettings\" special passage.`,\n });\n }\n}\n\n/**\n * Process a passage and add it to the story, handling special passages.\n * Creates new passage objects where text is modified rather than mutating the input.\n */\nexport function storyAdd(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n let processed = p;\n\n switch (p.name) {\n case 'StoryIncludes':\n diagnostics.push({\n level: 'warning',\n message:\n 'Ignoring \"StoryIncludes\" compiler special passage; twee-ts allows you to specify project files and/or directories to recursively search.',\n });\n break;\n\n case 'StoryData': {\n const err = unmarshalStoryData(story, p.text);\n if (err === null) {\n // Validate the IFID if present.\n if (story.ifid.length > 0) {\n const vErr = validateIFID(story.ifid);\n if (vErr !== null) {\n diagnostics.push({\n level: 'error',\n message: `Cannot validate IFID; ${vErr}.`,\n });\n }\n }\n // Rebuild passage contents to normalize.\n processed = { ...p, text: marshalStoryData(story) };\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Cannot unmarshal \"StoryData\" compiler special passage; ${err}.`,\n });\n }\n break;\n }\n\n case 'StorySettings':\n unmarshalStorySettings(story, p.text, diagnostics);\n break;\n\n case 'StoryTitle': {\n const trimmed = p.text.trim();\n processed = { ...p, text: trimmed };\n story.name = trimmed;\n break;\n }\n }\n\n storyAppend(story, processed, diagnostics);\n}\n\n/** Get story passage count and word count stats. */\nexport function getStoryStats(\n story: Story,\n wordCountMethod: WordCountMethod = 'tweego',\n): { passages: number; storyPassages: number; words: number } {\n let storyPassages = 0;\n let words = 0;\n for (const p of story.passages) {\n if (isStoryPassage(p)) {\n storyPassages++;\n words += countWords(p, wordCountMethod);\n }\n }\n return { passages: story.passages.length, storyPassages, words };\n}\n\n/**\n * Builder that separates the mutable construction phase from the immutable consumption phase.\n * During construction, the internal `Story` is mutable via `add()` and direct access.\n * After `build()`, the story is returned as `ReadonlyStory`.\n */\nexport class StoryBuilder {\n /** The mutable story, accessible during construction for loader functions. */\n readonly story: Story;\n\n constructor() {\n this.story = createStory();\n }\n\n /** Add a passage, handling special passages (StoryData, StoryTitle, etc.). */\n add(passage: Passage, diagnostics: Diagnostic[]): void {\n storyAdd(this.story, passage, diagnostics);\n }\n\n /** Check if a passage name exists. */\n has(name: string): boolean {\n return storyHas(this.story, name);\n }\n\n /** Finalize and return the story as read-only. */\n build(): ReadonlyStory {\n return this.story;\n }\n}\n","/**\n * File system utilities: path walking, file type detection, watch mode.\n * Ported from filesystem.go.\n */\nimport { readdirSync, statSync, watch as fsWatch } from 'node:fs';\nimport { resolve, relative, join } from 'node:path';\nimport { isKnownFileType } from './media-types.js';\n\n/**\n * Recursively walk directories, collecting regular file paths.\n * Filters out the output file to prevent circular compilation.\n */\nexport function getFilenames(pathnames: string[], outFilename?: string): string[] {\n const filenames: string[] = [];\n const absOutFile = outFilename ? resolve(outFilename) : '';\n\n function walk(pathname: string): void {\n let stat;\n try {\n stat = statSync(pathname);\n } catch {\n return;\n }\n\n if (stat.isFile()) {\n const abs = resolve(pathname);\n if (abs === absOutFile) return;\n const rel = relative(process.cwd(), abs);\n filenames.push(rel || abs);\n } else if (stat.isDirectory()) {\n let entries;\n try {\n entries = readdirSync(pathname);\n } catch {\n return;\n }\n for (const entry of entries) {\n walk(join(pathname, entry));\n }\n }\n }\n\n for (const pathname of pathnames) {\n walk(pathname);\n }\n\n return filenames;\n}\n\nexport interface WatchHandle {\n close(): void;\n}\n\n/**\n * Watch paths for changes, calling the build callback on known file type changes.\n * Uses debouncing to avoid rapid rebuilds.\n */\nexport function watchFilesystem(\n pathnames: string[],\n outFilename: string,\n callback: (changedFiles?: ReadonlySet<string>) => void,\n): WatchHandle {\n const absOutFile = resolve(outFilename);\n const watchers: ReturnType<typeof fsWatch>[] = [];\n let buildTimer: ReturnType<typeof setTimeout> | null = null;\n const BUILD_DEBOUNCE = 500;\n const pendingFiles = new Set<string>();\n\n function scheduleBuild(changedFile?: string): void {\n if (changedFile) pendingFiles.add(changedFile);\n if (buildTimer) clearTimeout(buildTimer);\n buildTimer = setTimeout(() => {\n buildTimer = null;\n const files = pendingFiles.size > 0 ? new Set(pendingFiles) : undefined;\n pendingFiles.clear();\n callback(files);\n }, BUILD_DEBOUNCE);\n }\n\n for (const pathname of pathnames) {\n try {\n const watcher = fsWatch(pathname, { recursive: true }, (_event, filename) => {\n if (!filename) return;\n const abs = resolve(pathname, filename);\n if (abs === absOutFile) return;\n if (isKnownFileType(filename)) {\n const rel = relative(process.cwd(), abs);\n scheduleBuild(rel || abs);\n }\n });\n watchers.push(watcher);\n } catch {\n // Ignore inaccessible paths\n }\n }\n\n // Build once initially (no changedFiles = full build).\n callback();\n\n return {\n close() {\n if (buildTimer) clearTimeout(buildTimer);\n for (const w of watchers) w.close();\n },\n };\n}\n","/**\n * Extension → MIME type mapping.\n * Ported from util.go:mediaTypeFromExt().\n */\n\nimport { extname } from 'node:path';\n\nconst MEDIA_TYPE_MAP: Record<string, string> = {\n // Audio\n aac: 'audio/aac',\n flac: 'audio/flac',\n ogg: 'audio/ogg',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n m4a: 'audio/mp4',\n oga: 'audio/ogg',\n opus: 'audio/ogg',\n wave: 'audio/wav',\n weba: 'audio/webm',\n\n // Fonts\n otf: 'font/otf',\n ttf: 'font/ttf',\n woff: 'font/woff',\n woff2: 'font/woff2',\n\n // Images\n gif: 'image/gif',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n svg: 'image/svg+xml',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n webp: 'image/webp',\n\n // Metadata\n vtt: 'text/vtt',\n\n // Video\n mp4: 'video/mp4',\n ogv: 'video/ogg',\n webm: 'video/webm',\n};\n\nexport function mediaTypeFromExt(ext: string): string {\n return MEDIA_TYPE_MAP[ext] ?? 'application/octet-stream';\n}\n\nexport function mediaTypeFromFilename(filename: string): string {\n return mediaTypeFromExt(normalizedFileExt(filename));\n}\n\nexport function normalizedFileExt(filename: string): string {\n const ext = extname(filename);\n if (!ext) return '';\n return ext.slice(1).toLowerCase();\n}\n\n/** Slugify a string for safe use as a DOM ID. */\nexport function slugify(original: string): string {\n return original.replace(/[\\x00-\\x20!-/:-@[-^`{-\\x9f]+/g, '_');\n}\n\n/** Check if a file has a known type that should be processed. */\nexport function isKnownFileType(filename: string): boolean {\n const ext = normalizedFileExt(filename);\n return KNOWN_EXTENSIONS.has(ext);\n}\n\nconst KNOWN_EXTENSIONS = new Set([\n 'tw',\n 'twee',\n 'tw2',\n 'twee2',\n 'htm',\n 'html',\n 'css',\n 'js',\n 'otf',\n 'ttf',\n 'woff',\n 'woff2',\n 'gif',\n 'jpeg',\n 'jpg',\n 'png',\n 'svg',\n 'tif',\n 'tiff',\n 'webp',\n 'aac',\n 'flac',\n 'm4a',\n 'mp3',\n 'oga',\n 'ogg',\n 'opus',\n 'wav',\n 'wave',\n 'weba',\n 'mp4',\n 'ogv',\n 'webm',\n 'vtt',\n]);\n\n/** Font format hint for @font-face. */\nexport function fontFormatHint(ext: string): string {\n switch (ext) {\n case 'ttf':\n return 'truetype';\n case 'otf':\n return 'opentype';\n default:\n return ext;\n }\n}\n","/**\n * Story format discovery, loading, and SemVer matching.\n * Ported from formats.go + config.go.\n */\nimport { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { StoryFormatInfo, Twine2FormatJSON } from './types.js';\nimport { readUTF8 } from './util.js';\n\n/**\n * Attempt to fix non-strict JSON (trailing commas, single quotes, unquoted keys).\n */\nfunction relaxedJSONParse(json: string): unknown {\n // First try standard parse\n try {\n return JSON.parse(json);\n } catch {\n // fall through to relaxed parsing\n }\n\n let fixed = json;\n\n // Replace single-quoted string values with double-quoted\n // Match single-quoted strings: 'value' -> \"value\"\n fixed = fixed.replace(/'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g, '\"$1\"');\n\n // Add quotes around unquoted property names\n // Match word chars before a colon that aren't already quoted\n fixed = fixed.replace(/(?<=^|[{,]\\s*)([A-Za-z_$][A-Za-z0-9_$]*)\\s*:/gm, '\"$1\":');\n\n // Remove trailing commas before } or ]\n fixed = fixed.replace(/,\\s*([}\\]])/g, '$1');\n\n return JSON.parse(fixed);\n}\n\n/**\n * Parse the Twine 2 format.js JSON chunk.\n * Handles Harlowe's malformed JSON by stripping the \"setup\" function property.\n * Per spec, the name key is Optional.\n */\nexport function parseFormatJSON(source: string, formatId: string): Twine2FormatJSON | null {\n const first = source.indexOf('{');\n const last = source.lastIndexOf('}');\n if (first === -1 || last === -1) return null;\n\n let chunk = source.slice(first, last + 1);\n\n const parse = (json: string): Twine2FormatJSON | null => {\n const raw: unknown = relaxedJSONParse(json);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return null;\n const obj = raw as Record<string, unknown>;\n // version and source are required; name is optional per spec\n if (typeof obj.version !== 'string' || typeof obj.source !== 'string') return null;\n // Validate version is semver\n if (!parseSemver(obj.version)) return null;\n const name = typeof obj.name === 'string' ? obj.name : 'Untitled Story Format';\n const result: Twine2FormatJSON = {\n name,\n version: obj.version,\n source: obj.source,\n proofing: obj.proofing === true,\n };\n if (typeof obj.author === 'string') result.author = obj.author;\n if (typeof obj.description === 'string') result.description = obj.description;\n if (typeof obj.image === 'string') result.image = obj.image;\n if (typeof obj.url === 'string') result.url = obj.url;\n if (typeof obj.license === 'string') result.license = obj.license;\n return result;\n };\n\n try {\n return parse(chunk);\n } catch {\n // Harlowe workaround: strip the \"setup\" function property\n if (formatId.toLowerCase().startsWith('harlowe')) {\n const setupIdx = chunk.lastIndexOf(',\"setup\": function');\n if (setupIdx !== -1) {\n chunk = chunk.slice(0, setupIdx) + '}';\n try {\n return parse(chunk);\n } catch {\n // fall through\n }\n }\n }\n return null;\n }\n}\n\n/**\n * Discover all story formats in the given search directories.\n * Implements SemVer-based version pruning: within each (name, major) group,\n * only the highest minor.patch survives.\n */\nexport function discoverFormats(searchDirs: string[]): Map<string, StoryFormatInfo> {\n const formats = new Map<string, StoryFormatInfo>();\n const baseFilenames = ['format.js', 'header.html'];\n\n for (const searchDir of searchDirs) {\n try {\n const stat = statSync(searchDir);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n let entries;\n try {\n entries = readdirSync(searchDir);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const formatDir = join(searchDir, entry);\n try {\n if (!statSync(formatDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n for (const baseFilename of baseFilenames) {\n const formatFilename = join(formatDir, baseFilename);\n try {\n const stat = statSync(formatFilename);\n if (!stat.isFile()) continue;\n } catch {\n continue;\n }\n\n const isTwine2 = baseFilename === 'format.js';\n const format: StoryFormatInfo = {\n id: entry,\n filename: formatFilename,\n isTwine2,\n name: '',\n version: '',\n proofing: false,\n };\n\n if (isTwine2) {\n try {\n const source = readUTF8(formatFilename);\n const data = parseFormatJSON(source, entry);\n if (!data) continue;\n format.name = data.name;\n format.version = data.version;\n format.proofing = data.proofing ?? false;\n if (data.author) format.author = data.author;\n if (data.description) format.description = data.description;\n if (data.image) format.image = data.image;\n if (data.url) format.url = data.url;\n if (data.license) format.license = data.license;\n } catch {\n continue;\n }\n } else {\n // Twine 1 format: use folder name as default name\n format.name = entry;\n }\n\n formats.set(entry, format);\n break; // Found format file for this directory\n }\n }\n }\n\n // SemVer pruning: for formats with the same name, within each major version\n // keep only the highest minor.patch. Also, same name+version from different\n // directories: keep the first one found.\n pruneFormats(formats);\n\n return formats;\n}\n\n/**\n * Prune formats by SemVer: within each (name, major) group,\n * keep only the highest version. First-found wins for same name+version.\n */\nfunction pruneFormats(formats: Map<string, StoryFormatInfo>): void {\n // Group by (name, major) -> best entry\n const bestByNameMajor = new Map<string, { id: string; version: [number, number, number] }>();\n // Track seen name+version combos (first wins)\n const seenNameVersion = new Set<string>();\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || !f.name || !f.version) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n\n const nameVersionKey = `${f.name}@${f.version}`;\n if (seenNameVersion.has(nameVersionKey)) {\n // Duplicate name+version: remove the later one\n formats.delete(id);\n continue;\n }\n seenNameVersion.add(nameVersionKey);\n\n const groupKey = `${f.name}@${v[0]}`;\n const existing = bestByNameMajor.get(groupKey);\n if (!existing || semverCompare(v, existing.version) > 0) {\n bestByNameMajor.set(groupKey, { id, version: v });\n }\n }\n\n // Remove all non-best entries within each group\n for (const [id, f] of [...formats]) {\n if (!f.isTwine2 || !f.name || !f.version) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n\n const groupKey = `${f.name}@${v[0]}`;\n const best = bestByNameMajor.get(groupKey);\n if (best && best.id !== id) {\n formats.delete(id);\n }\n }\n}\n\n/**\n * Get the default format search directories.\n */\nexport function getFormatSearchDirs(extraPaths: string[] = [], useTweegoPath = true): string[] {\n const subdirNames = ['storyformats', '.storyformats', 'story-formats', 'storyFormats', 'targets'];\n const basePaths = new Set<string>();\n\n // Home directory\n try {\n basePaths.add(homedir());\n } catch {\n // ignore\n }\n\n // Working directory\n basePaths.add(process.cwd());\n\n const dirs: string[] = [];\n for (const base of basePaths) {\n for (const sub of subdirNames) {\n const dir = join(base, sub);\n try {\n if (statSync(dir).isDirectory()) {\n dirs.push(dir);\n }\n } catch {\n // skip\n }\n }\n }\n\n // Extra user-provided paths\n dirs.push(...extraPaths);\n\n // TWEEGO_PATH environment variable\n if (useTweegoPath) {\n const tweegoPath = process.env.TWEEGO_PATH;\n if (tweegoPath) {\n dirs.push(...tweegoPath.split(process.platform === 'win32' ? ';' : ':'));\n }\n }\n\n return dirs;\n}\n\n/** Parse a simple semver string into [major, minor, patch]. */\nexport function parseSemver(v: string): [number, number, number] | null {\n const m = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(v);\n if (!m) return null;\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\nexport function semverCompare(a: [number, number, number], b: [number, number, number]): number {\n const [aMajor, aMinor, aPatch] = a;\n const [bMajor, bMinor, bPatch] = b;\n if (aMajor !== bMajor) return aMajor - bMajor;\n if (aMinor !== bMinor) return aMinor - bMinor;\n if (aPatch !== bPatch) return aPatch - bPatch;\n return 0;\n}\n\n/** Get format ID from Twine 2 name, picking the greatest version. */\nexport function getFormatIdByName(formats: Map<string, StoryFormatInfo>, name: string): string | undefined {\n let bestVersion: [number, number, number] | null = null;\n let bestId: string | undefined;\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || f.name !== name) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n if (!bestVersion || semverCompare(v, bestVersion) > 0) {\n bestVersion = v;\n bestId = id;\n }\n }\n\n return bestId;\n}\n\n/** Get format ID from Twine 2 name and version, using SemVer major matching. */\nexport function getFormatIdByNameAndVersion(\n formats: Map<string, StoryFormatInfo>,\n name: string,\n version: string,\n): string | undefined {\n const wanted = parseSemver(version);\n let bestVersion: [number, number, number] | null = null;\n let bestId: string | undefined;\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || f.name !== name) continue;\n const have = parseSemver(f.version);\n if (!have) continue;\n\n if (wanted === null || (have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n if (!bestVersion || semverCompare(have, bestVersion) > 0) {\n bestVersion = have;\n bestId = id;\n }\n }\n }\n\n return bestId;\n}\n\n/** Read the story format source (for Twine 2, extract the `source` property from JSON). */\nexport function readFormatSource(format: StoryFormatInfo): string {\n const source = readUTF8(format.filename);\n if (format.isTwine2) {\n const data = parseFormatJSON(source, format.id);\n if (!data) throw new Error(`Cannot parse format ${format.id} JSON`);\n return data.source;\n }\n return source;\n}\n\n/** Read a file as UTF-8 (re-exported for loader use). */\nexport { readUTF8 as readFileUTF8 } from './util.js';\n","/**\n * Shared file I/O utilities.\n */\nimport { readFileSync } from 'node:fs';\nimport { parse as parsePath } from 'node:path';\n\n/** Read a file as UTF-8 with BOM stripping and line ending normalization. */\nexport function readUTF8(filename: string): string {\n let content = readFileSync(filename, 'utf-8');\n if (content.charCodeAt(0) === 0xfeff) content = content.slice(1);\n content = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return content;\n}\n\n/** Read a file as base64. */\nexport function readBase64(filename: string): string {\n return readFileSync(filename).toString('base64');\n}\n\n/** Get the filename without extension, falling back to the full basename for dotfiles. */\nexport function baseNameWithoutExt(filename: string): string {\n const { name, ext } = parsePath(filename);\n return name || ext;\n}\n","/**\n * File loading: dispatch by file extension.\n * Ported from storyload.go.\n */\nimport { basename } from 'node:path';\nimport { statSync } from 'node:fs';\nimport type { Story, Diagnostic, InlineSource, Passage, FileCacheEntry } from './types.js';\nimport { normalizedFileExt, mediaTypeFromFilename, mediaTypeFromExt, fontFormatHint } from './media-types.js';\nimport { storyAdd, storyPrepend } from './story.js';\nimport { parseTwee } from './parser.js';\nimport { decompileHTML } from './html-parser.js';\nimport { readUTF8, readBase64, baseNameWithoutExt } from './util.js';\n\ninterface LoadOptions {\n trim?: boolean;\n twee2Compat?: boolean;\n}\n\n/**\n * Load all source files into a story.\n */\nexport function loadSources(\n story: Story,\n filenames: string[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n processedFiles: Set<string>,\n): void {\n for (const filename of filenames) {\n if (processedFiles.has(filename)) {\n diagnostics.push({ level: 'warning', message: `load ${filename}: Skipping duplicate.` });\n continue;\n }\n\n const ext = normalizedFileExt(filename);\n try {\n switch (ext) {\n case 'tw':\n case 'twee':\n loadTwee(story, filename, opts, diagnostics);\n break;\n case 'tw2':\n case 'twee2':\n loadTwee(story, filename, { ...opts, twee2Compat: true }, diagnostics);\n break;\n case 'htm':\n case 'html':\n loadHTML(story, filename, diagnostics);\n break;\n case 'css':\n loadTagged(story, 'stylesheet', filename, diagnostics);\n break;\n case 'js':\n loadTagged(story, 'script', filename, diagnostics);\n break;\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n loadFont(story, filename, diagnostics);\n break;\n case 'gif':\n case 'jpeg':\n case 'jpg':\n case 'png':\n case 'svg':\n case 'tif':\n case 'tiff':\n case 'webp':\n loadMedia(story, 'Twine.image', filename, diagnostics);\n break;\n case 'aac':\n case 'flac':\n case 'm4a':\n case 'mp3':\n case 'oga':\n case 'ogg':\n case 'opus':\n case 'wav':\n case 'wave':\n case 'weba':\n loadMedia(story, 'Twine.audio', filename, diagnostics);\n break;\n case 'mp4':\n case 'ogv':\n case 'webm':\n loadMedia(story, 'Twine.video', filename, diagnostics);\n break;\n case 'vtt':\n loadMedia(story, 'Twine.vtt', filename, diagnostics);\n break;\n default:\n continue;\n }\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `load ${filename}: ${e instanceof Error ? e.message : String(e)}`,\n file: filename,\n });\n continue;\n }\n processedFiles.add(filename);\n }\n\n // Prepend StoryTitle if we have a name but no StoryTitle passage.\n if (story.name !== '' && !story.passages.some((p) => p.name === 'StoryTitle')) {\n storyPrepend(story, { name: 'StoryTitle', tags: [], text: story.name }, diagnostics);\n }\n}\n\n/**\n * Load inline sources (string content or InlineSource objects).\n */\nexport function loadInlineSources(\n story: Story,\n sources: (string | InlineSource)[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n): void {\n for (const source of sources) {\n if (typeof source === 'string') {\n // Treat as a file path — handled externally\n continue;\n }\n const content = typeof source.content === 'string' ? source.content : source.content.toString('utf-8');\n\n const ext = normalizedFileExt(source.filename);\n if (ext === 'tw' || ext === 'twee' || ext === 'tw2' || ext === 'twee2' || !ext) {\n const twee2 = ext === 'tw2' || ext === 'twee2' || opts.twee2Compat;\n const result = parseTwee(content, {\n filename: source.filename,\n trim: opts.trim ?? true,\n twee2Compat: twee2,\n });\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n }\n }\n}\n\ninterface ParseResult {\n passages: Passage[];\n diagnostics: Diagnostic[];\n}\n\nfunction parseTweeFile(filename: string, opts: LoadOptions): ParseResult {\n const source = readUTF8(filename);\n const result = parseTwee(source, {\n filename,\n trim: opts.trim ?? true,\n twee2Compat: opts.twee2Compat ?? false,\n });\n return { passages: result.passages, diagnostics: [...result.diagnostics] };\n}\n\nfunction parseTaggedFile(tag: string, filename: string): ParseResult {\n const source = readUTF8(filename);\n return { passages: [{ name: basename(filename), tags: [tag], text: source }], diagnostics: [] };\n}\n\nfunction parseMediaFile(tag: string, filename: string): ParseResult {\n const source = readBase64(filename);\n const name = baseNameWithoutExt(filename);\n return {\n passages: [{ name, tags: [tag], text: `data:${mediaTypeFromFilename(filename)};base64,${source}` }],\n diagnostics: [],\n };\n}\n\nfunction parseFontFile(filename: string): ParseResult {\n const source = readBase64(filename);\n const name = basename(filename);\n const family = baseNameWithoutExt(filename);\n const ext = normalizedFileExt(filename);\n const mediaType = mediaTypeFromExt(ext);\n const hint = fontFormatHint(ext);\n return {\n passages: [\n {\n name,\n tags: ['stylesheet'],\n text: `@font-face {\\n\\tfont-family: \"${family}\";\\n\\tsrc: url(\"data:${mediaType};base64,${source}\") format(\"${hint}\");\\n}`,\n },\n ],\n diagnostics: [],\n };\n}\n\nfunction parseHTMLFile(filename: string): ParseResult {\n const source = readUTF8(filename);\n const result = decompileHTML(source);\n return { passages: result.story.passages, diagnostics: [...result.diagnostics] };\n}\n\nfunction parseFile(filename: string, opts: LoadOptions): ParseResult | undefined {\n const ext = normalizedFileExt(filename);\n switch (ext) {\n case 'tw':\n case 'twee':\n return parseTweeFile(filename, opts);\n case 'tw2':\n case 'twee2':\n return parseTweeFile(filename, { ...opts, twee2Compat: true });\n case 'htm':\n case 'html':\n return parseHTMLFile(filename);\n case 'css':\n return parseTaggedFile('stylesheet', filename);\n case 'js':\n return parseTaggedFile('script', filename);\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n return parseFontFile(filename);\n case 'gif':\n case 'jpeg':\n case 'jpg':\n case 'png':\n case 'svg':\n case 'tif':\n case 'tiff':\n case 'webp':\n return parseMediaFile('Twine.image', filename);\n case 'aac':\n case 'flac':\n case 'm4a':\n case 'mp3':\n case 'oga':\n case 'ogg':\n case 'opus':\n case 'wav':\n case 'wave':\n case 'weba':\n return parseMediaFile('Twine.audio', filename);\n case 'mp4':\n case 'ogv':\n case 'webm':\n return parseMediaFile('Twine.video', filename);\n case 'vtt':\n return parseMediaFile('Twine.vtt', filename);\n default:\n return undefined;\n }\n}\n\nfunction loadHTML(story: Story, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseHTMLFile(filename);\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadTwee(story: Story, filename: string, opts: LoadOptions, diagnostics: Diagnostic[]): void {\n const result = parseTweeFile(filename, opts);\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadTagged(story: Story, tag: string, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseTaggedFile(tag, filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadMedia(story: Story, tag: string, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseMediaFile(tag, filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadFont(story: Story, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseFontFile(filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\n/**\n * Load sources with mtime-based caching for incremental rebuilds.\n * Always creates a fresh Story; cached passages are replayed via storyAdd().\n */\nexport function loadSourcesCached(\n story: Story,\n filenames: string[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n processedFiles: Set<string>,\n cache: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): void {\n const currentFiles = new Set<string>();\n\n for (const filename of filenames) {\n if (processedFiles.has(filename)) {\n diagnostics.push({ level: 'warning', message: `load ${filename}: Skipping duplicate.` });\n continue;\n }\n\n currentFiles.add(filename);\n const cached = cache.get(filename);\n\n // If changedFiles is provided and this file isn't changed and we have a cache hit, skip stat\n if (changedFiles && cached && !changedFiles.has(filename)) {\n diagnostics.push(...cached.diagnostics);\n for (const p of cached.passages) {\n storyAdd(story, p, diagnostics);\n }\n processedFiles.add(filename);\n continue;\n }\n\n // stat the file to check mtime\n let mtimeMs: number;\n try {\n mtimeMs = statSync(filename).mtimeMs;\n } catch {\n // File may have been deleted between getFilenames and here\n continue;\n }\n\n // Cache hit with matching mtime: replay\n if (cached && cached.mtimeMs === mtimeMs) {\n diagnostics.push(...cached.diagnostics);\n for (const p of cached.passages) {\n storyAdd(story, p, diagnostics);\n }\n processedFiles.add(filename);\n continue;\n }\n\n // Cache miss: parse and store\n try {\n const result = parseFile(filename, opts);\n if (!result) continue;\n\n cache.set(filename, {\n mtimeMs,\n passages: result.passages,\n diagnostics: result.diagnostics,\n });\n\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `load ${filename}: ${e instanceof Error ? e.message : String(e)}`,\n file: filename,\n });\n continue;\n }\n processedFiles.add(filename);\n }\n\n // Purge cache entries for deleted files\n for (const key of cache.keys()) {\n if (!currentFiles.has(key)) {\n cache.delete(key);\n }\n }\n\n // Prepend StoryTitle if we have a name but no StoryTitle passage.\n if (story.name !== '' && !story.passages.some((p) => p.name === 'StoryTitle')) {\n storyPrepend(story, { name: 'StoryTitle', tags: [], text: story.name }, diagnostics);\n }\n}\n","/**\n * All public interfaces for twee-ts.\n */\n\n// --- Output modes ---\n\nexport type OutputMode = 'html' | 'twee3' | 'twee1' | 'twine2-archive' | 'twine1-archive' | 'json';\n\n// --- Word count ---\n\nexport type WordCountMethod = 'tweego' | 'whitespace';\n\n// --- Source input ---\n\nexport type InlineSource = { filename: string; content: string | Buffer };\nexport type SourceInput = string | InlineSource;\n\n// --- Compile options ---\n\nexport interface CompileOptions {\n /** Files, directories, or inline sources to compile. */\n sources: SourceInput[];\n /** Output mode. Default: 'html'. */\n outputMode?: OutputMode;\n /** Story format directory ID (e.g. 'sugarcube-2'). */\n formatId?: string;\n /** Name of the starting passage. Default: 'Start'. */\n startPassage?: string;\n /** Extra directories to search for story formats. */\n formatPaths?: string[];\n /** Also search TWEEGO_PATH env for formats. Default: true. */\n useTweegoPath?: boolean;\n /** Module files to inject into <head>. */\n modules?: string[];\n /** Raw HTML file to append to <head>. */\n headFile?: string;\n /** Trim passage whitespace. Default: true. */\n trim?: boolean;\n /** Twee2 compatibility mode. Default: false. */\n twee2Compat?: boolean;\n /** Enable debug/test mode option. Default: false. */\n testMode?: boolean;\n /** URLs to SFA-compatible index.json files for remote format lookup. */\n formatIndices?: string[];\n /** Direct URLs to format.js files. */\n formatUrls?: string[];\n /** Disable remote format fetching. Default: false. */\n noRemote?: boolean;\n /** Map alias tags to canonical special tags (e.g. { library: 'script' }). */\n tagAliases?: Record<string, string>;\n /** Emit source file and line as data- attributes on passage elements. Default: false. */\n sourceInfo?: boolean;\n /** Word counting method. Default: 'tweego'. */\n wordCountMethod?: WordCountMethod;\n}\n\nexport interface CompileToFileOptions extends CompileOptions {\n /** Output file path. */\n outFile: string;\n}\n\nexport interface WatchOptions extends CompileToFileOptions {\n /** Called after each successful rebuild. */\n onBuild?: (result: CompileResult) => void;\n /** Called on build errors. */\n onError?: (error: Error) => void;\n}\n\n// --- Compile result ---\n\nexport type Diagnostic =\n | { level: 'warning'; message: string; file?: string; line?: number }\n | { level: 'error'; message: string; file?: string; line?: number; fatal?: boolean };\n\nexport interface CompileResult {\n /** The compiled output string (HTML, Twee, JSON, etc.). */\n output: string;\n /** The parsed story model (read-only after compilation). */\n story: ReadonlyStory;\n /** The format used for compilation (undefined for non-HTML modes). */\n format?: StoryFormatInfo;\n /** Collected diagnostics. */\n diagnostics: Diagnostic[];\n /** Compilation statistics. */\n stats: CompileStats;\n}\n\nexport interface CompileStats {\n passages: number;\n storyPassages: number;\n words: number;\n files: string[];\n}\n\n// --- Passage ---\n\nexport interface SourceLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface PassageMetadata {\n position?: string;\n size?: string;\n [key: string]: string | undefined;\n}\n\nexport interface Passage {\n name: string;\n tags: string[];\n text: string;\n metadata?: PassageMetadata;\n source?: SourceLocation;\n}\n\n// --- Branded types ---\n\nexport type IFID = string & { readonly __brand: 'IFID' };\n\n// --- Story ---\n\nexport interface Twine1Metadata {\n settings: Map<string, string>;\n}\n\nexport interface Twine2Metadata {\n format: string;\n formatVersion: string;\n options: Map<string, boolean>;\n start: string;\n tags: string;\n tagColors: Map<string, string>;\n zoom: number;\n}\n\nexport interface Story {\n name: string;\n ifid: IFID;\n passages: Passage[];\n legacyIFID: IFID;\n twine1: Twine1Metadata;\n twine2: Twine2Metadata;\n}\n\n// --- Readonly story (post-construction) ---\n\nexport type ReadonlyPassage = Readonly<Passage> & {\n readonly tags: readonly string[];\n};\n\nexport type ReadonlyStory = Readonly<Omit<Story, 'passages' | 'twine1' | 'twine2'>> & {\n readonly passages: readonly ReadonlyPassage[];\n readonly twine1: Readonly<Omit<Twine1Metadata, 'settings'>> & {\n readonly settings: ReadonlyMap<string, string>;\n };\n readonly twine2: Readonly<Omit<Twine2Metadata, 'options' | 'tagColors'>> & {\n readonly options: ReadonlyMap<string, boolean>;\n readonly tagColors: ReadonlyMap<string, string>;\n };\n};\n\n// --- Story format ---\n\nexport interface StoryFormatInfo {\n id: string;\n filename: string;\n isTwine2: boolean;\n name: string;\n version: string;\n proofing: boolean;\n author?: string;\n description?: string;\n image?: string;\n url?: string;\n license?: string;\n}\n\nexport interface Twine2FormatJSON {\n name: string;\n version: string;\n proofing?: boolean;\n source: string;\n author?: string;\n description?: string;\n image?: string;\n url?: string;\n license?: string;\n}\n\n// --- Lexer ---\n\nexport const ItemType = {\n Error: 0,\n EOF: 1,\n Header: 2,\n Name: 3,\n Tags: 4,\n Metadata: 5,\n Content: 6,\n} as const;\nexport type ItemType = (typeof ItemType)[keyof typeof ItemType];\n\nexport interface LexerItem {\n type: ItemType;\n line: number;\n pos: number;\n val: string;\n}\n\n// --- Story Format Archive (SFA) ---\n\nexport interface SFAIndexEntry {\n name: string;\n version: string;\n proofing: boolean;\n files: string[];\n checksums: Record<string, string>;\n}\n\nexport interface SFAIndex {\n twine1: SFAIndexEntry[];\n twine2: SFAIndexEntry[];\n}\n\n// --- Incremental compilation cache ---\n\nexport interface FileCacheEntry {\n readonly mtimeMs: number;\n readonly passages: readonly Passage[];\n readonly diagnostics: readonly Diagnostic[];\n}\n\n// --- Config file ---\n\nexport interface TweeTsConfig {\n sources?: string[];\n output?: string;\n outputMode?: OutputMode;\n formatId?: string;\n startPassage?: string;\n formatPaths?: string[];\n formatIndices?: string[];\n formatUrls?: string[];\n useTweegoPath?: boolean;\n modules?: string[];\n headFile?: string;\n trim?: boolean;\n twee2Compat?: boolean;\n testMode?: boolean;\n noRemote?: boolean;\n tagAliases?: Record<string, string>;\n sourceInfo?: boolean;\n wordCountMethod?: WordCountMethod;\n}\n","/**\n * Twee 3 state-machine lexer implemented as a synchronous generator.\n * Ported from tweelexer.go — Go channels become `yield`.\n */\nimport type { LexerItem } from './types.js';\nimport { ItemType } from './types.js';\n\nconst EOF = -1;\nconst HEADER_DELIM = '::';\nconst NEWLINE_HEADER_DELIM = '\\n::';\n\ntype StateFn = ((ctx: LexerContext) => StateFn | null) | null;\n\nclass LexerContext {\n readonly input: string;\n line = 1;\n start = 0;\n pos = 0;\n private items: LexerItem[] = [];\n\n constructor(input: string) {\n this.input = input;\n }\n\n next(): number {\n if (this.pos >= this.input.length) return EOF;\n const ch = this.input.charCodeAt(this.pos);\n this.pos++;\n if (ch === 0x0a) this.line++;\n return ch;\n }\n\n peek(): number {\n if (this.pos >= this.input.length) return EOF;\n return this.input.charCodeAt(this.pos);\n }\n\n backup(): void {\n if (this.pos > this.start) {\n this.pos--;\n if (this.input.charCodeAt(this.pos) === 0x0a) this.line--;\n } else {\n throw new Error('backup would leave pos < start');\n }\n }\n\n // Line-counting invariant: next() increments this.line for each newline during\n // character-by-character scanning. However, Content items are produced by jumping\n // this.pos directly (e.g. via indexOf) without calling next(), so those newlines\n // haven't been counted yet. emit() re-counts newlines in [start, pos) for Content\n // items to compensate. This is safe because this.start is reset to this.pos after\n // every emit(), so no range is ever counted twice.\n emit(type: ItemType): void {\n const val = this.input.slice(this.start, this.pos);\n this.items.push({ type, line: this.line, pos: this.start, val });\n if (type === ItemType.Content) {\n for (let i = this.start; i < this.pos; i++) {\n if (this.input.charCodeAt(i) === 0x0a) this.line++;\n }\n }\n this.start = this.pos;\n }\n\n ignore(): void {\n for (let i = this.start; i < this.pos; i++) {\n if (this.input.charCodeAt(i) === 0x0a) this.line++;\n }\n this.start = this.pos;\n }\n\n acceptRun(valid: string): void {\n let ch: number;\n for (ch = this.next(); ch !== EOF && valid.includes(String.fromCharCode(ch)); ch = this.next()) {\n // consume\n }\n if (ch !== EOF) this.backup();\n }\n\n errorf(message: string): null {\n this.items.push({\n type: ItemType.Error,\n line: this.line,\n pos: this.start,\n val: message,\n });\n return null;\n }\n\n /** Drain all pending items and return them. */\n drainItems(): LexerItem[] {\n const result = this.items;\n this.items = [];\n return result;\n }\n}\n\nfunction acceptQuoted(ctx: LexerContext, quote: number): string | null {\n for (;;) {\n const ch = ctx.next();\n switch (ch) {\n case 0x5c: {\n // backslash\n const r = ctx.next();\n if (r !== 0x0a && r !== EOF) break;\n // fall through\n }\n // falls through\n case 0x0a:\n case EOF:\n return 'unterminated quoted string';\n default:\n if (ch === quote) return null;\n break;\n }\n }\n}\n\n// --- State functions ---\n\nfunction lexProlog(ctx: LexerContext): StateFn {\n if (ctx.input.startsWith(HEADER_DELIM, ctx.pos)) {\n return lexHeaderDelim;\n }\n const i = ctx.input.indexOf(NEWLINE_HEADER_DELIM, ctx.pos);\n if (i > -1) {\n ctx.pos = i + 1; // skip to the newline, then past it\n ctx.ignore();\n return lexHeaderDelim;\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexContent(ctx: LexerContext): StateFn {\n if (ctx.input.startsWith(HEADER_DELIM, ctx.pos)) {\n return lexHeaderDelim;\n }\n const i = ctx.input.indexOf(NEWLINE_HEADER_DELIM, ctx.pos);\n if (i > -1) {\n ctx.pos = i + 1;\n ctx.emit(ItemType.Content);\n return lexHeaderDelim;\n }\n ctx.pos = ctx.input.length;\n if (ctx.pos > ctx.start) {\n ctx.emit(ItemType.Content);\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexHeaderDelim(ctx: LexerContext): StateFn {\n ctx.pos += HEADER_DELIM.length;\n ctx.emit(ItemType.Header);\n return lexName;\n}\n\nfunction lexName(ctx: LexerContext): StateFn {\n let r: number;\n outer: for (;;) {\n r = ctx.next();\n switch (r) {\n case 0x5c: {\n // backslash\n const next = ctx.next();\n if (next !== 0x0a && next !== EOF) break;\n // fall through to terminators\n r = next;\n }\n // falls through\n case 0x5b: // [\n case 0x5d: // ]\n case 0x7b: // {\n case 0x7d: // }\n case 0x0a: // \\n\n case EOF:\n if (r !== EOF) ctx.backup();\n break outer;\n }\n }\n // Always emit a name item, even if empty.\n ctx.emit(ItemType.Name);\n\n switch (r) {\n case 0x5b:\n return lexTags; // [\n case 0x5d:\n return ctx.errorf(`unexpected right square bracket ']'`);\n case 0x7b:\n return lexMetadata; // {\n case 0x7d:\n return ctx.errorf(`unexpected right curly brace '}'`);\n case 0x0a: // newline\n ctx.pos++;\n ctx.ignore();\n return lexContent;\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexNextOptionalBlock(ctx: LexerContext): StateFn {\n // Consume whitespace.\n ctx.acceptRun(' \\t');\n ctx.ignore();\n\n const r = ctx.peek();\n switch (r) {\n case 0x5b:\n return lexTags; // [\n case 0x5d:\n return ctx.errorf(`unexpected right square bracket ']'`);\n case 0x7b:\n return lexMetadata; // {\n case 0x7d:\n return ctx.errorf(`unexpected right curly brace '}'`);\n case 0x0a: // newline\n ctx.pos++;\n ctx.ignore();\n return lexContent;\n case EOF:\n ctx.emit(ItemType.EOF);\n return null;\n }\n return ctx.errorf(`illegal character '${String.fromCharCode(r)}' amid the optional blocks`);\n}\n\nfunction lexTags(ctx: LexerContext): StateFn {\n // Consume the left delimiter '['.\n ctx.pos++;\n\n for (;;) {\n const r = ctx.next();\n switch (r) {\n case 0x5c: {\n // backslash\n const next = ctx.next();\n if (next !== 0x0a && next !== EOF) break;\n // fall through\n }\n // falls through\n case 0x0a:\n case EOF:\n if (r === 0x0a) ctx.backup();\n return ctx.errorf('unterminated tag block');\n case 0x5d: // ]\n if (ctx.pos > ctx.start) ctx.emit(ItemType.Tags);\n return lexNextOptionalBlock;\n case 0x5b: // [\n return ctx.errorf(`unexpected left square bracket '['`);\n case 0x7b: // {\n return ctx.errorf(`unexpected left curly brace '{'`);\n case 0x7d: // }\n return ctx.errorf(`unexpected right curly brace '}'`);\n }\n }\n}\n\nfunction lexMetadata(ctx: LexerContext): StateFn {\n // Consume the left delimiter '{'.\n ctx.pos++;\n\n let depth = 1;\n for (;;) {\n const r = ctx.next();\n switch (r) {\n case 0x22: {\n // double quote\n const err = acceptQuoted(ctx, 0x22);\n if (err) return ctx.errorf(err);\n break;\n }\n case 0x0a: // newline\n ctx.backup();\n // falls through\n case EOF:\n return ctx.errorf('unterminated metadata block');\n case 0x7b: // {\n depth++;\n break;\n case 0x7d: // }\n depth--;\n if (depth === 0) {\n if (ctx.pos > ctx.start) ctx.emit(ItemType.Metadata);\n return lexNextOptionalBlock;\n }\n break;\n }\n }\n}\n\n/**\n * Twee 3 lexer — yields LexerItem tokens from Twee source text.\n *\n * In the Go reference, this uses goroutines and channels.\n * Here we use a synchronous generator that accumulates items per state step.\n */\nexport function* tweeLexer(input: string): Generator<LexerItem, void, undefined> {\n const ctx = new LexerContext(input);\n let state: StateFn = lexProlog;\n while (state !== null) {\n state = state(ctx);\n const items = ctx.drainItems();\n for (const item of items) {\n yield item;\n }\n }\n // Drain any remaining items.\n const remaining = ctx.drainItems();\n for (const item of remaining) {\n yield item;\n }\n}\n\n/** Convenience class wrapper for the lexer generator. */\nexport class TweeLexer {\n private gen: Generator<LexerItem, void, undefined>;\n\n constructor(input: string) {\n this.gen = tweeLexer(input);\n }\n\n nextItem(): { item: LexerItem; done: boolean } {\n const result = this.gen.next();\n if (result.done) {\n return { item: { type: ItemType.EOF, line: 0, pos: 0, val: '' }, done: true };\n }\n return { item: result.value, done: false };\n }\n\n *[Symbol.iterator](): Generator<LexerItem, void, undefined> {\n yield* this.gen;\n }\n}\n","/**\n * Twee2 to Twee3 header syntax conversion.\n * Ported from twee2compat.go.\n */\n\nconst twee2DetectRe = /^:: *[^[]*?(?: *\\[.*?\\])? *<(.*?)> *$/m;\nconst twee2HeaderRe = /^(:: *[^[]*?)( *\\[.*?\\])?(?: *<(.*?)>)? *$/gm;\nconst twee2BadPosRe = /^(::.*?) *\\{\"position\":\" *\"\\}$/gm;\n\nfunction hasTwee2Syntax(s: string): boolean {\n return twee2DetectRe.test(s);\n}\n\n/**\n * Convert Twee2-style position blocks `<x,y>` to Twee3 metadata blocks `{\"position\":\"x,y\"}`.\n */\nexport function twee2ToV3(s: string): string {\n if (!hasTwee2Syntax(s)) return s;\n let result = s.replace(twee2HeaderRe, (_, p1: string, p2: string | undefined, p3: string | undefined) => {\n const tags = p2 ?? '';\n const pos = p3 ?? '';\n return `${p1}${tags} {\"position\":\"${pos}\"}`;\n });\n result = result.replace(twee2BadPosRe, '$1');\n return result;\n}\n","/**\n * Parse lexer items into Passage[].\n * Ported from storyload.go:loadTwee().\n */\nimport type { Passage, PassageMetadata, Diagnostic } from './types.js';\nimport { ItemType } from './types.js';\nimport { tweeLexer } from './lexer.js';\nimport { tweeUnescape } from './escape.js';\nimport { twee2ToV3 } from './twee2-compat.js';\n\nexport interface ParseOptions {\n /** Filename for diagnostics. */\n filename?: string;\n /** Trim whitespace from passage content. Default: true. */\n trim?: boolean;\n /** Enable Twee2 compatibility. Default: false. */\n twee2Compat?: boolean;\n}\n\nexport interface ParseResult {\n passages: Passage[];\n diagnostics: Diagnostic[];\n}\n\n/**\n * Parse Twee source text into passages.\n */\nexport function parseTwee(source: string, options: ParseOptions = {}): ParseResult {\n const { filename = '<inline>', trim = true, twee2Compat = false } = options;\n const diagnostics: Diagnostic[] = [];\n\n if (twee2Compat) {\n source = twee2ToV3(source);\n }\n\n const passages: Passage[] = [];\n let current: Passage | null = null;\n let pCount = 0;\n let lastType: ItemType = ItemType.EOF;\n\n for (const item of tweeLexer(source)) {\n switch (item.type) {\n case ItemType.Error:\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; ${item.val}.`,\n file: filename,\n line: item.line,\n });\n // Fatal: return what we have\n return { passages, diagnostics };\n\n case ItemType.EOF:\n if (pCount > 0 && current) {\n passages.push(current);\n }\n return { passages, diagnostics };\n\n case ItemType.Header:\n pCount++;\n if (pCount > 1 && current) {\n passages.push(current);\n }\n current = { name: '', tags: [], text: '', source: { file: filename, line: item.line } };\n break;\n\n case ItemType.Name: {\n if (!current) break;\n const name = tweeUnescape(item.val).trim();\n if (name.length === 0) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; passage with no name.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n current.name = name;\n break;\n }\n\n case ItemType.Tags: {\n if (!current) break;\n if (lastType !== ItemType.Name) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; optional tags block must immediately follow the passage name.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n // Strip the surrounding [ and ]\n const inner = item.val.slice(1, -1);\n current.tags = tweeUnescape(inner).split(/\\s+/).filter(Boolean);\n break;\n }\n\n case ItemType.Metadata: {\n if (!current) break;\n if (lastType !== ItemType.Name && lastType !== ItemType.Tags) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; optional metadata block must immediately follow the passage name or tags block.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n try {\n const raw: unknown = JSON.parse(item.val);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('expected a JSON object');\n }\n const parsed = raw as Record<string, unknown>;\n const meta: PassageMetadata = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'string') {\n meta[key] = value;\n }\n }\n current.metadata = meta;\n } catch (e) {\n diagnostics.push({\n level: 'warning',\n message: `load ${filename}: line ${item.line}: Malformed twee source; could not decode metadata (reason: ${e instanceof Error ? e.message : String(e)}).`,\n file: filename,\n line: item.line,\n });\n }\n break;\n }\n\n case ItemType.Content: {\n if (!current) break;\n if (trim) {\n current.text = item.val.trim();\n } else {\n // Per spec: trailing blank lines MUST be stripped regardless of trim option\n current.text = item.val.replace(/\\n\\s*$/, '');\n }\n break;\n }\n\n default: {\n const _exhaustive: never = item.type;\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Unhandled lexer item type: ${_exhaustive}.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n }\n\n lastType = item.type;\n }\n\n // Shouldn't reach here (EOF is always emitted), but just in case:\n if (pCount > 0 && current) {\n passages.push(current);\n }\n return { passages, diagnostics };\n}\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\n\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n\n/**\n * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.\n */\nexport const fromCodePoint: (...codePoints: number[]) => string =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins\n String.fromCodePoint ??\n ((codePoint: number): string => {\n let output = \"\";\n\n if (codePoint > 0xff_ff) {\n codePoint -= 0x1_00_00;\n output += String.fromCharCode(\n ((codePoint >>> 10) & 0x3_ff) | 0xd8_00,\n );\n codePoint = 0xdc_00 | (codePoint & 0x3_ff);\n }\n\n output += String.fromCharCode(codePoint);\n return output;\n });\n\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n */\nexport function replaceCodePoint(codePoint: number): number {\n if (\n (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff\n ) {\n return 0xff_fd;\n }\n\n return decodeMap.get(codePoint) ?? codePoint;\n}\n\n/**\n * Replace the code point if relevant, then convert it to a string.\n *\n * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.\n * @param codePoint The code point to decode.\n * @returns The decoded code point.\n */\nexport function decodeCodePoint(codePoint: number): string {\n return fromCodePoint(replaceCodePoint(codePoint));\n}\n","/*\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n */\nexport function decodeBase64(input: string): Uint16Array {\n const binary: string =\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n typeof atob === \"function\"\n ? // Browser (and Node >=16)\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n atob(input)\n : // Older Node versions (<16)\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n typeof Buffer.from === \"function\"\n ? // eslint-disable-next-line n/no-unsupported-features/node-builtins\n Buffer.from(input, \"base64\").toString(\"binary\")\n : // eslint-disable-next-line unicorn/no-new-buffer, n/no-deprecated-api\n new Buffer(input, \"base64\").toString(\"binary\");\n\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n\n return out;\n}\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const htmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n \"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\",\n);\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const xmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n \"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\",\n);\n","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport enum BinTrieFlags {\n VALUE_LENGTH = 0b1100_0000_0000_0000,\n FLAG13 = 0b0010_0000_0000_0000,\n BRANCH_LENGTH = 0b0001_1111_1000_0000,\n JUMP_TABLE = 0b0000_0000_0111_1111,\n}\n","import { fromCodePoint, replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\n\nconst enum CharCodes {\n NUM = 35, // \"#\"\n SEMI = 59, // \";\"\n EQUALS = 61, // \"=\"\n ZERO = 48, // \"0\"\n NINE = 57, // \"9\"\n LOWER_A = 97, // \"a\"\n LOWER_F = 102, // \"f\"\n LOWER_X = 120, // \"x\"\n LOWER_Z = 122, // \"z\"\n UPPER_A = 65, // \"A\"\n UPPER_F = 70, // \"F\"\n UPPER_Z = 90, // \"Z\"\n}\n\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\n\nfunction isNumber(code: number): boolean {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\n\nfunction isHexadecimalCharacter(code: number): boolean {\n return (\n (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F)\n );\n}\n\nfunction isAsciiAlphaNumeric(code: number): boolean {\n return (\n (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code)\n );\n}\n\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n */\nfunction isEntityInAttributeInvalidEnd(code: number): boolean {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\n\nconst enum EntityDecoderState {\n EntityStart,\n NumericStart,\n NumericDecimal,\n NumericHex,\n NamedEntity,\n}\n\nexport enum DecodingMode {\n /** Entities in text nodes that can end with any character. */\n Legacy = 0,\n /** Only allow entities terminated with a semicolon. */\n Strict = 1,\n /** Entities in attributes have limitations on ending characters. */\n Attribute = 2,\n}\n\n/**\n * Producers for character reference errors as defined in the HTML spec.\n */\nexport interface EntityErrorProducer {\n missingSemicolonAfterCharacterReference(): void;\n absenceOfDigitsInNumericCharacterReference(\n consumedCharacters: number,\n ): void;\n validateNumericCharacterReference(code: number): void;\n}\n\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n private readonly decodeTree: Uint16Array,\n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n *\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n private readonly emitCodePoint: (cp: number, consumed: number) => void,\n /** An object that is used to produce errors. */\n private readonly errors?: EntityErrorProducer | undefined,\n ) {}\n\n /** The current state of the decoder. */\n private state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n private consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n private result = 0;\n\n /** The current index in the decode tree. */\n private treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n private excess = 1;\n /** The mode in which the decoder is operating. */\n private decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n private runConsumed = 0;\n\n /** Resets the instance to make it reusable. */\n startEntity(decodeMode: DecodingMode): void {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input: string, offset: number): number {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericStart(input: string, offset: number): number {\n if (offset >= input.length) {\n return -1;\n }\n\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericHex(input: string, offset: number): number {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit =\n char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n } else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericDecimal(input: string, offset: number): number {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n } else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n *\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n private emitNumericEntity(lastCp: number, expectedLength: number): number {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n } else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n\n this.errors.validateNumericCharacterReference(this.result);\n }\n\n return this.consumed;\n }\n\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNamedEntity(input: string, offset: number): number {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength =\n (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord =\n decodeTree[\n this.treeIndex + 1 + (charIndexInPacked >> 1)\n ];\n const expectedChar =\n charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n\n if (offset >= input.length) break;\n\n const char = input.charCodeAt(offset);\n\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (\n char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0\n ) {\n return this.emitNamedEntityData(\n this.treeIndex,\n valueLength,\n this.consumed + this.excess,\n );\n }\n\n this.treeIndex = determineBranch(\n decodeTree,\n current,\n this.treeIndex + Math.max(1, valueLength),\n char,\n );\n\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(\n this.treeIndex,\n valueLength,\n this.consumed + this.excess,\n );\n }\n\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (\n this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0\n ) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n\n return -1;\n }\n\n /**\n * Emit a named entity that was not terminated with a semicolon.\n *\n * @returns The number of characters consumed.\n */\n private emitNotTerminatedNamedEntity(): number {\n const { result, decodeTree } = this;\n\n const valueLength =\n (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n\n return this.consumed;\n }\n\n /**\n * Emit a named entity.\n *\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n *\n * @returns The number of characters consumed.\n */\n private emitNamedEntityData(\n result: number,\n valueLength: number,\n consumed: number,\n ): number {\n const { decodeTree } = this;\n\n this.emitCodePoint(\n valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1],\n consumed,\n );\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n\n return consumed;\n }\n\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n *\n * @returns The number of characters consumed.\n */\n end(): number {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n\n/**\n * Creates a function that decodes entities in a string.\n *\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree: Uint16Array) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(\n decodeTree,\n (data) => (returnValue += fromCodePoint(data)),\n );\n\n return function decodeWithTrie(\n input: string,\n decodeMode: DecodingMode,\n ): string {\n let lastIndex = 0;\n let offset = 0;\n\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n\n decoder.startEntity(decodeMode);\n\n const length = decoder.write(\n input,\n // Skip the \"&\"\n offset + 1,\n );\n\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n\n const result = returnValue + input.slice(lastIndex);\n\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n\n return result;\n };\n}\n\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIdx The index right after the current node and its value.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(\n decodeTree: Uint16Array,\n current: number,\n nodeIndex: number,\n char: number,\n): number {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n\n if (midKey < char) {\n lo = mid + 1;\n } else if (midKey > char) {\n hi = mid - 1;\n } else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n\n return -1;\n}\n\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n\n/**\n * Decodes an HTML string.\n *\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(\n htmlString: string,\n mode: DecodingMode = DecodingMode.Legacy,\n): string {\n return htmlDecoder(htmlString, mode);\n}\n\n/**\n * Decodes an HTML string in an attribute.\n *\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute: string): string {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n *\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString: string): string {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString: string): string {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\n\nexport {\n decodeCodePoint,\n fromCodePoint,\n replaceCodePoint,\n} from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n","import {\n EntityDecoder,\n DecodingMode,\n htmlDecodeTree,\n xmlDecodeTree,\n} from \"entities/decode\";\n\nconst enum CharCodes {\n Tab = 0x9, // \"\\t\"\n NewLine = 0xa, // \"\\n\"\n FormFeed = 0xc, // \"\\f\"\n CarriageReturn = 0xd, // \"\\r\"\n Space = 0x20, // \" \"\n ExclamationMark = 0x21, // \"!\"\n Number = 0x23, // \"#\"\n Amp = 0x26, // \"&\"\n SingleQuote = 0x27, // \"'\"\n DoubleQuote = 0x22, // '\"'\n Dash = 0x2d, // \"-\"\n Slash = 0x2f, // \"/\"\n Zero = 0x30, // \"0\"\n Nine = 0x39, // \"9\"\n Semi = 0x3b, // \";\"\n Lt = 0x3c, // \"<\"\n Eq = 0x3d, // \"=\"\n Gt = 0x3e, // \">\"\n Questionmark = 0x3f, // \"?\"\n UpperA = 0x41, // \"A\"\n LowerA = 0x61, // \"a\"\n UpperF = 0x46, // \"F\"\n LowerF = 0x66, // \"f\"\n UpperZ = 0x5a, // \"Z\"\n LowerZ = 0x7a, // \"z\"\n LowerX = 0x78, // \"x\"\n OpeningSquareBracket = 0x5b, // \"[\"\n}\n\n/** All the states the tokenizer can be in. */\nconst enum State {\n Text = 1,\n BeforeTagName, // After <\n InTagName,\n InSelfClosingTag,\n BeforeClosingTagName,\n InClosingTagName,\n AfterClosingTagName,\n\n // Attributes\n BeforeAttributeName,\n InAttributeName,\n AfterAttributeName,\n BeforeAttributeValue,\n InAttributeValueDq, // \"\n InAttributeValueSq, // '\n InAttributeValueNq,\n\n // Declarations\n BeforeDeclaration, // !\n InDeclaration,\n\n // Processing instructions\n InProcessingInstruction, // ?\n\n // Comments & CDATA\n BeforeComment,\n CDATASequence,\n InSpecialComment,\n InCommentLike,\n\n // Special tags\n BeforeSpecialS, // Decide if we deal with `<script` or `<style`\n BeforeSpecialT, // Decide if we deal with `<title` or `<textarea`\n SpecialStartSequence,\n InSpecialTag,\n\n InEntity,\n}\n\nfunction isWhitespace(c: number): boolean {\n return (\n c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn\n );\n}\n\nfunction isEndOfTagSection(c: number): boolean {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\n\nfunction isASCIIAlpha(c: number): boolean {\n return (\n (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)\n );\n}\n\nexport enum QuoteType {\n NoValue = 0,\n Unquoted = 1,\n Single = 2,\n Double = 3,\n}\n\nexport interface Callbacks {\n onattribdata(start: number, endIndex: number): void;\n onattribentity(codepoint: number): void;\n onattribend(quote: QuoteType, endIndex: number): void;\n onattribname(start: number, endIndex: number): void;\n oncdata(start: number, endIndex: number, endOffset: number): void;\n onclosetag(start: number, endIndex: number): void;\n oncomment(start: number, endIndex: number, endOffset: number): void;\n ondeclaration(start: number, endIndex: number): void;\n onend(): void;\n onopentagend(endIndex: number): void;\n onopentagname(start: number, endIndex: number): void;\n onprocessinginstruction(start: number, endIndex: number): void;\n onselfclosingtag(endIndex: number): void;\n ontext(start: number, endIndex: number): void;\n ontextentity(codepoint: number, endIndex: number): void;\n}\n\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x3e]), // `-->`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n\nexport default class Tokenizer {\n /** The current state the tokenizer is in. */\n private state = State.Text;\n /** The read buffer. */\n private buffer = \"\";\n /** The beginning of the section that is currently being read. */\n private sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n private index = 0;\n /** The start of the last entity. */\n private entityStart = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n private baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n private isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n public running = true;\n /** The offset of the current buffer. */\n private offset = 0;\n\n private readonly xmlMode: boolean;\n private readonly decodeEntities: boolean;\n private readonly entityDecoder: EntityDecoder;\n\n constructor(\n {\n xmlMode = false,\n decodeEntities = true,\n }: { xmlMode?: boolean; decodeEntities?: boolean },\n private readonly cbs: Callbacks,\n ) {\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.entityDecoder = new EntityDecoder(\n xmlMode ? xmlDecodeTree : htmlDecodeTree,\n (cp, consumed) => this.emitCodePoint(cp, consumed),\n );\n }\n\n public reset(): void {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.currentSequence = undefined!;\n this.running = true;\n this.offset = 0;\n }\n\n public write(chunk: string): void {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n\n public end(): void {\n if (this.running) this.finish();\n }\n\n public pause(): void {\n this.running = false;\n }\n\n public resume(): void {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n\n private stateText(c: number): void {\n if (\n c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))\n ) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n\n private currentSequence: Uint8Array = undefined!;\n private sequenceIndex = 0;\n private stateSpecialStartSequence(c: number): void {\n const isEnd = this.sequenceIndex === this.currentSequence.length;\n const isMatch = isEnd\n ? // If we are at the end of the sequence, make sure the tag name has ended\n isEndOfTagSection(c)\n : // Otherwise, do a case-insensitive comparison\n (c | 0x20) === this.currentSequence[this.sequenceIndex];\n\n if (!isMatch) {\n this.isSpecial = false;\n } else if (!isEnd) {\n this.sequenceIndex++;\n return;\n }\n\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n\n /** Look for an end tag. For <title> tags, also decode entities. */\n private stateInSpecialTag(c: number): void {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (c === CharCodes.Gt || isWhitespace(c)) {\n const endOfText = this.index - this.currentSequence.length;\n\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n\n this.sequenceIndex = 0;\n }\n\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n } else if (this.sequenceIndex === 0) {\n if (this.currentSequence === Sequences.TitleEnd) {\n // We have to parse entities in <title> tags.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n } else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of <title> tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n } else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n\n private stateCDATASequence(c: number): void {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n } else {\n this.sequenceIndex = 0;\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n }\n\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n *\n * @returns Whether the character was found.\n */\n private fastForwardTo(c: number): boolean {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n\n return false;\n }\n\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n */\n private stateInCommentLike(c: number): void {\n if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n } else {\n this.cbs.oncomment(this.sectionStart, this.index, 2);\n }\n\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n } else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n */\n private isTagStartChar(c: number) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n\n private startSpecial(sequence: Uint8Array, offset: number) {\n this.isSpecial = true;\n this.currentSequence = sequence;\n this.sequenceIndex = offset;\n this.state = State.SpecialStartSequence;\n }\n\n private stateBeforeTagName(c: number): void {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Questionmark) {\n this.state = State.InProcessingInstruction;\n this.sectionStart = this.index + 1;\n } else if (this.isTagStartChar(c)) {\n const lower = c | 0x20;\n this.sectionStart = this.index;\n if (this.xmlMode) {\n this.state = State.InTagName;\n } else if (lower === Sequences.ScriptEnd[2]) {\n this.state = State.BeforeSpecialS;\n } else if (\n lower === Sequences.TitleEnd[2] ||\n lower === Sequences.XmpEnd[2]\n ) {\n this.state = State.BeforeSpecialT;\n } else {\n this.state = State.InTagName;\n }\n } else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n } else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n private stateInTagName(c: number): void {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateBeforeClosingTagName(c: number): void {\n if (isWhitespace(c)) {\n // Ignore\n } else if (c === CharCodes.Gt) {\n this.state = State.Text;\n } else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n private stateInClosingTagName(c: number): void {\n if (c === CharCodes.Gt || isWhitespace(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n private stateAfterClosingTagName(c: number): void {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeAttributeName(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n } else {\n this.state = State.Text;\n }\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n } else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n private stateInSelfClosingTag(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n } else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateInAttributeName(c: number): void {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n private stateAfterAttributeName(c: number): void {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n } else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n private stateBeforeAttributeValue(c: number): void {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n } else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n private handleInAttributeValue(c: number, quote: number) {\n if (\n c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(\n quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single,\n this.index + 1,\n );\n this.state = State.BeforeAttributeName;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n private stateInAttributeValueDoubleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n private stateInAttributeValueSingleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n private stateInAttributeValueNoQuotes(c: number): void {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n private stateBeforeDeclaration(c: number): void {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n } else {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n }\n private stateInDeclaration(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateInProcessingInstruction(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeComment(c: number): void {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n // Allow short comments (eg. <!-->)\n this.sequenceIndex = 2;\n this.sectionStart = this.index + 1;\n } else {\n this.state = State.InDeclaration;\n }\n }\n private stateInSpecialComment(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeSpecialS(c: number): void {\n const lower = c | 0x20;\n if (lower === Sequences.ScriptEnd[3]) {\n this.startSpecial(Sequences.ScriptEnd, 4);\n } else if (lower === Sequences.StyleEnd[3]) {\n this.startSpecial(Sequences.StyleEnd, 4);\n } else {\n this.state = State.InTagName;\n this.stateInTagName(c); // Consume the token again\n }\n }\n\n private stateBeforeSpecialT(c: number): void {\n const lower = c | 0x20;\n switch (lower) {\n case Sequences.TitleEnd[3]: {\n this.startSpecial(Sequences.TitleEnd, 4);\n\n break;\n }\n case Sequences.TextareaEnd[3]: {\n this.startSpecial(Sequences.TextareaEnd, 4);\n\n break;\n }\n case Sequences.XmpEnd[3]: {\n this.startSpecial(Sequences.XmpEnd, 4);\n\n break;\n }\n default: {\n this.state = State.InTagName;\n this.stateInTagName(c); // Consume the token again\n }\n }\n }\n\n private startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(\n this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute,\n );\n }\n\n private stateInEntity(): void {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n\n if (length === 0) {\n this.index -= 1;\n }\n } else {\n if (\n indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp\n ) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n\n /**\n * Remove data that has already been consumed from the buffer.\n */\n private cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (\n this.state === State.Text ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)\n ) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n } else if (\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n\n private shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n private parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.BeforeSpecialS: {\n this.stateBeforeSpecialS(c);\n break;\n }\n case State.BeforeSpecialT: {\n this.stateBeforeSpecialT(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n\n private finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n\n this.handleTrailingData();\n\n this.cbs.onend();\n }\n\n /** Handle any trailing data. */\n private handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n\n if (this.state === State.InCommentLike) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n } else {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n } else if (\n this.state === State.InTagName ||\n this.state === State.BeforeAttributeName ||\n this.state === State.BeforeAttributeValue ||\n this.state === State.AfterAttributeName ||\n this.state === State.InAttributeName ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueNq ||\n this.state === State.InClosingTagName\n ) {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n } else {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n\n private emitCodePoint(cp: number, consumed: number): void {\n if (\n this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag\n ) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.onattribentity(cp);\n } else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n","import Tokenizer, { type Callbacks, QuoteType } from \"./Tokenizer.js\";\nimport { fromCodePoint } from \"entities/decode\";\n\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\n\nconst openImpliesClose = new Map<string, Set<string>>([\n [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n [\"th\", new Set([\"th\"])],\n [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n [\"body\", new Set([\"head\", \"link\", \"script\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", pTag],\n [\"h2\", pTag],\n [\"h3\", pTag],\n [\"h4\", pTag],\n [\"h5\", pTag],\n [\"h6\", pTag],\n [\"select\", formTags],\n [\"input\", formTags],\n [\"output\", formTags],\n [\"button\", formTags],\n [\"datalist\", formTags],\n [\"textarea\", formTags],\n [\"option\", new Set([\"option\"])],\n [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n [\"dd\", ddtTags],\n [\"dt\", ddtTags],\n [\"address\", pTag],\n [\"article\", pTag],\n [\"aside\", pTag],\n [\"blockquote\", pTag],\n [\"details\", pTag],\n [\"div\", pTag],\n [\"dl\", pTag],\n [\"fieldset\", pTag],\n [\"figcaption\", pTag],\n [\"figure\", pTag],\n [\"footer\", pTag],\n [\"form\", pTag],\n [\"header\", pTag],\n [\"hr\", pTag],\n [\"main\", pTag],\n [\"nav\", pTag],\n [\"ol\", pTag],\n [\"pre\", pTag],\n [\"section\", pTag],\n [\"table\", pTag],\n [\"ul\", pTag],\n [\"rt\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\n\nconst voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignobject\",\n \"desc\",\n \"title\",\n]);\n\nexport interface ParserOptions {\n /**\n * Indicates whether special tags (`<script>`, `<style>`, and `<title>`) should get special treatment\n * and if \"empty\" tags (eg. `<br>`) can have children. If `false`, the content of special tags\n * will be text only. For feeds and other XML content (documents that don't consist of HTML),\n * set this to `true`.\n *\n * @default false\n */\n xmlMode?: boolean;\n\n /**\n * Decode entities within the document.\n *\n * @default true\n */\n decodeEntities?: boolean;\n\n /**\n * If set to true, all tags will be lowercased.\n *\n * @default !xmlMode\n */\n lowerCaseTags?: boolean;\n\n /**\n * If set to `true`, all attribute names will be lowercased. This has noticeable impact on speed.\n *\n * @default !xmlMode\n */\n lowerCaseAttributeNames?: boolean;\n\n /**\n * If set to true, CDATA sections will be recognized as text even if the xmlMode option is not enabled.\n * NOTE: If xmlMode is set to `true` then CDATA sections will always be recognized as text.\n *\n * @default xmlMode\n */\n recognizeCDATA?: boolean;\n\n /**\n * If set to `true`, self-closing tags will trigger the onclosetag event even if xmlMode is not set to `true`.\n * NOTE: If xmlMode is set to `true` then self-closing tags will always be recognized.\n *\n * @default xmlMode\n */\n recognizeSelfClosing?: boolean;\n\n /**\n * Allows the default tokenizer to be overwritten.\n */\n Tokenizer?: typeof Tokenizer;\n}\n\nexport interface Handler {\n onparserinit(parser: Parser): void;\n\n /**\n * Resets the handler back to starting state\n */\n onreset(): void;\n\n /**\n * Signals the handler that parsing is done\n */\n onend(): void;\n onerror(error: Error): void;\n onclosetag(name: string, isImplied: boolean): void;\n onopentagname(name: string): void;\n /**\n *\n * @param name Name of the attribute\n * @param value Value of the attribute.\n * @param quote Quotes used around the attribute. `null` if the attribute has no quotes around the value, `undefined` if the attribute has no value.\n */\n onattribute(\n name: string,\n value: string,\n quote?: string | undefined | null,\n ): void;\n onopentag(\n name: string,\n attribs: { [s: string]: string },\n isImplied: boolean,\n ): void;\n ontext(data: string): void;\n oncomment(data: string): void;\n oncdatastart(): void;\n oncdataend(): void;\n oncommentend(): void;\n onprocessinginstruction(name: string, data: string): void;\n}\n\nconst reNameEnd = /\\s|\\//;\n\nexport class Parser implements Callbacks {\n /** The start index of the last event. */\n public startIndex = 0;\n /** The end index of the last event. */\n public endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n private openTagStart = 0;\n\n private tagname = \"\";\n private attribname = \"\";\n private attribvalue = \"\";\n private attribs: null | { [key: string]: string } = null;\n private readonly stack: string[] = [];\n /** Determines whether self-closing tags are recognized. */\n private readonly foreignContext: boolean[];\n private readonly cbs: Partial<Handler>;\n private readonly lowerCaseTagNames: boolean;\n private readonly lowerCaseAttributeNames: boolean;\n private readonly recognizeSelfClosing: boolean;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n private readonly htmlMode: boolean;\n private readonly tokenizer: Tokenizer;\n\n private readonly buffers: string[] = [];\n private bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n private writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n private ended = false;\n\n constructor(\n cbs?: Partial<Handler> | null,\n private readonly options: ParserOptions = {},\n ) {\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(\n this.options,\n this,\n );\n this.foreignContext = [!this.htmlMode];\n this.cbs.onparserinit?.(this);\n }\n\n // Tokenizer event handlers\n\n /** @internal */\n ontext(start: number, endIndex: number): void {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n\n /** @internal */\n ontextentity(cp: number, endIndex: number): void {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n */\n protected isVoidElement(name: string): boolean {\n return this.htmlMode && voidElements.has(name);\n }\n\n /** @internal */\n onopentagname(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n\n let name = this.getSlice(start, endIndex);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n this.emitOpenTag(name);\n }\n\n private emitOpenTag(name: string) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n const element = this.stack.shift()!;\n this.cbs.onclosetag?.(element, true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n\n if (this.htmlMode) {\n if (foreignContextElements.has(name)) {\n this.foreignContext.unshift(true);\n } else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(false);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag) this.attribs = {};\n }\n\n private endOpenTag(isImplied: boolean) {\n this.startIndex = this.openTagStart;\n\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n\n this.tagname = \"\";\n }\n\n /** @internal */\n onopentagend(endIndex: number): void {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onclosetag(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n\n let name = this.getSlice(start, endIndex);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n if (\n this.htmlMode &&\n (foreignContextElements.has(name) ||\n htmlIntegrationElements.has(name))\n ) {\n this.foreignContext.shift();\n }\n\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index <= pos; index++) {\n const element = this.stack.shift()!;\n // We know the stack has sufficient elements.\n this.cbs.onclosetag?.(element, index !== pos);\n }\n } else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n } else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onselfclosingtag(endIndex: number): void {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.foreignContext[0]) {\n this.closeCurrentTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n } else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n\n private closeCurrentTag(isOpenImplied: boolean) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n // If the opening tag isn't implied, the closing tag has to be implied.\n this.cbs.onclosetag?.(name, !isOpenImplied);\n this.stack.shift();\n }\n }\n\n /** @internal */\n onattribname(start: number, endIndex: number): void {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n\n /** @internal */\n onattribdata(start: number, endIndex: number): void {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n\n /** @internal */\n onattribentity(cp: number): void {\n this.attribvalue += fromCodePoint(cp);\n }\n\n /** @internal */\n onattribend(quote: QuoteType, endIndex: number): void {\n this.endIndex = endIndex;\n\n this.cbs.onattribute?.(\n this.attribname,\n this.attribvalue,\n quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null,\n );\n\n if (\n this.attribs &&\n !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname)\n ) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n\n private getInstructionName(value: string) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n return name;\n }\n\n /** @internal */\n ondeclaration(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onprocessinginstruction(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n oncomment(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n oncdata(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n } else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onend(): void {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n public reset(): void {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(!this.htmlMode);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n *\n * @param data Document to parse.\n */\n public parseComplete(data: string): void {\n this.reset();\n this.end(data);\n }\n\n private getSlice(start: number, end: number) {\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n\n let slice = this.buffers[0].slice(\n start - this.bufferOffset,\n end - this.bufferOffset,\n );\n\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n\n return slice;\n }\n\n private shiftBuffer(): void {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n *\n * @param chunk Chunk to parse.\n */\n public write(chunk: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n *\n * @param chunk Optional final chunk to parse.\n */\n public end(chunk?: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n\n if (chunk) this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n public pause(): void {\n this.tokenizer.pause();\n }\n\n /**\n * Resumes parsing after `pause` was called.\n */\n public resume(): void {\n this.tokenizer.resume();\n\n while (\n this.tokenizer.running &&\n this.writeIndex < this.buffers.length\n ) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n\n if (this.ended) this.tokenizer.end();\n }\n\n /**\n * Alias of `write`, for backwards compatibility.\n *\n * @param chunk Chunk to parse.\n * @deprecated\n */\n public parseChunk(chunk: string): void {\n this.write(chunk);\n }\n /**\n * Alias of `end`, for backwards compatibility.\n *\n * @param chunk Optional final chunk to parse.\n * @deprecated\n */\n public done(chunk?: string): void {\n this.end(chunk);\n }\n}\n","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for <? ... ?> */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for <!-- ... --> */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for <script> tags */\n ElementType[\"Script\"] = \"script\";\n /** Type for <style> tags */\n ElementType[\"Style\"] = \"style\";\n /** Type for Any tag */\n ElementType[\"Tag\"] = \"tag\";\n /** Type for <![CDATA[ ... ]]> */\n ElementType[\"CDATA\"] = \"cdata\";\n /** Type for <!doctype ...> */\n ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nexport function isTag(elem) {\n return (elem.type === ElementType.Tag ||\n elem.type === ElementType.Script ||\n elem.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\nexport const Root = ElementType.Root;\n/** Type for Text */\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\nexport const Style = ElementType.Style;\n/** Type for Any tag */\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n constructor() {\n /** Parent of the node */\n this.parent = null;\n /** Previous sibling */\n this.prev = null;\n /** Next sibling */\n this.next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n this.startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n this.endIndex = null;\n }\n // Read-write aliases for properties\n /**\n * Same as {@link parent}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get parentNode() {\n return this.parent;\n }\n set parentNode(parent) {\n this.parent = parent;\n }\n /**\n * Same as {@link prev}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get previousSibling() {\n return this.prev;\n }\n set previousSibling(prev) {\n this.prev = prev;\n }\n /**\n * Same as {@link next}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nextSibling() {\n return this.next;\n }\n set nextSibling(next) {\n this.next = next;\n }\n /**\n * Clone this node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\n cloneNode(recursive = false) {\n return cloneNode(this, recursive);\n }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n /**\n * @param data The content of the data node\n */\n constructor(data) {\n super();\n this.data = data;\n }\n /**\n * Same as {@link data}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nodeValue() {\n return this.data;\n }\n set nodeValue(data) {\n this.data = data;\n }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n constructor() {\n super(...arguments);\n this.type = ElementType.Text;\n }\n get nodeType() {\n return 3;\n }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n constructor() {\n super(...arguments);\n this.type = ElementType.Comment;\n }\n get nodeType() {\n return 8;\n }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n constructor(name, data) {\n super(data);\n this.name = name;\n this.type = ElementType.Directive;\n }\n get nodeType() {\n return 1;\n }\n}\n/**\n * A `Node` that can have children.\n */\nexport class NodeWithChildren extends Node {\n /**\n * @param children Children of the node. Only certain node types can have children.\n */\n constructor(children) {\n super();\n this.children = children;\n }\n // Aliases\n /** First child of the node. */\n get firstChild() {\n var _a;\n return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;\n }\n /** Last child of the node. */\n get lastChild() {\n return this.children.length > 0\n ? this.children[this.children.length - 1]\n : null;\n }\n /**\n * Same as {@link children}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get childNodes() {\n return this.children;\n }\n set childNodes(children) {\n this.children = children;\n }\n}\nexport class CDATA extends NodeWithChildren {\n constructor() {\n super(...arguments);\n this.type = ElementType.CDATA;\n }\n get nodeType() {\n return 4;\n }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n constructor() {\n super(...arguments);\n this.type = ElementType.Root;\n }\n get nodeType() {\n return 9;\n }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n /**\n * @param name Name of the tag, eg. `div`, `span`.\n * @param attribs Object mapping attribute names to attribute values.\n * @param children Children of the node.\n */\n constructor(name, attribs, children = [], type = name === \"script\"\n ? ElementType.Script\n : name === \"style\"\n ? ElementType.Style\n : ElementType.Tag) {\n super(children);\n this.name = name;\n this.attribs = attribs;\n this.type = type;\n }\n get nodeType() {\n return 1;\n }\n // DOM Level 1 aliases\n /**\n * Same as {@link name}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get tagName() {\n return this.name;\n }\n set tagName(name) {\n this.name = name;\n }\n get attributes() {\n return Object.keys(this.attribs).map((name) => {\n var _a, _b;\n return ({\n name,\n value: this.attribs[name],\n namespace: (_a = this[\"x-attribsNamespace\"]) === null || _a === void 0 ? void 0 : _a[name],\n prefix: (_b = this[\"x-attribsPrefix\"]) === null || _b === void 0 ? void 0 : _b[name],\n });\n });\n }\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `Element`, `false` otherwise.\n */\nexport function isTag(node) {\n return isTagRaw(node);\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `CDATA`, `false` otherwise.\n */\nexport function isCDATA(node) {\n return node.type === ElementType.CDATA;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Text`, `false` otherwise.\n */\nexport function isText(node) {\n return node.type === ElementType.Text;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Comment`, `false` otherwise.\n */\nexport function isComment(node) {\n return node.type === ElementType.Comment;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nexport function isDirective(node) {\n return node.type === ElementType.Directive;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nexport function isDocument(node) {\n return node.type === ElementType.Root;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\nexport function hasChildren(node) {\n return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n let result;\n if (isText(node)) {\n result = new Text(node.data);\n }\n else if (isComment(node)) {\n result = new Comment(node.data);\n }\n else if (isTag(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Element(node.name, { ...node.attribs }, children);\n children.forEach((child) => (child.parent = clone));\n if (node.namespace != null) {\n clone.namespace = node.namespace;\n }\n if (node[\"x-attribsNamespace\"]) {\n clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n }\n if (node[\"x-attribsPrefix\"]) {\n clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n }\n result = clone;\n }\n else if (isCDATA(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new CDATA(children);\n children.forEach((child) => (child.parent = clone));\n result = clone;\n }\n else if (isDocument(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Document(children);\n children.forEach((child) => (child.parent = clone));\n if (node[\"x-mode\"]) {\n clone[\"x-mode\"] = node[\"x-mode\"];\n }\n result = clone;\n }\n else if (isDirective(node)) {\n const instruction = new ProcessingInstruction(node.name, node.data);\n if (node[\"x-name\"] != null) {\n instruction[\"x-name\"] = node[\"x-name\"];\n instruction[\"x-publicId\"] = node[\"x-publicId\"];\n instruction[\"x-systemId\"] = node[\"x-systemId\"];\n }\n result = instruction;\n }\n else {\n throw new Error(`Not implemented yet: ${node.type}`);\n }\n result.startIndex = node.startIndex;\n result.endIndex = node.endIndex;\n if (node.sourceCodeLocation != null) {\n result.sourceCodeLocation = node.sourceCodeLocation;\n }\n return result;\n}\nfunction cloneChildren(childs) {\n const children = childs.map((child) => cloneNode(child, true));\n for (let i = 1; i < children.length; i++) {\n children[i].prev = children[i - 1];\n children[i - 1].next = children[i];\n }\n return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { Element, Text, Comment, CDATA, Document, ProcessingInstruction, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOpts = {\n withStartIndices: false,\n withEndIndices: false,\n xmlMode: false,\n};\nexport class DomHandler {\n /**\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n constructor(callback, options, elementCB) {\n /** The elements of the DOM */\n this.dom = [];\n /** The root element for the DOM */\n this.root = new Document(this.dom);\n /** Indicated whether parsing has been completed. */\n this.done = false;\n /** Stack of open tags. */\n this.tagStack = [this.root];\n /** A data node that is still being written to. */\n this.lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n this.parser = null;\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOpts;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this.callback = callback !== null && callback !== void 0 ? callback : null;\n this.options = options !== null && options !== void 0 ? options : defaultOpts;\n this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;\n }\n onparserinit(parser) {\n this.parser = parser;\n }\n // Resets the handler back to starting state\n onreset() {\n this.dom = [];\n this.root = new Document(this.dom);\n this.done = false;\n this.tagStack = [this.root];\n this.lastNode = null;\n this.parser = null;\n }\n // Signals the handler that parsing is done\n onend() {\n if (this.done)\n return;\n this.done = true;\n this.parser = null;\n this.handleCallback(null);\n }\n onerror(error) {\n this.handleCallback(error);\n }\n onclosetag() {\n this.lastNode = null;\n const elem = this.tagStack.pop();\n if (this.options.withEndIndices) {\n elem.endIndex = this.parser.endIndex;\n }\n if (this.elementCB)\n this.elementCB(elem);\n }\n onopentag(name, attribs) {\n const type = this.options.xmlMode ? ElementType.Tag : undefined;\n const element = new Element(name, attribs, undefined, type);\n this.addNode(element);\n this.tagStack.push(element);\n }\n ontext(data) {\n const { lastNode } = this;\n if (lastNode && lastNode.type === ElementType.Text) {\n lastNode.data += data;\n if (this.options.withEndIndices) {\n lastNode.endIndex = this.parser.endIndex;\n }\n }\n else {\n const node = new Text(data);\n this.addNode(node);\n this.lastNode = node;\n }\n }\n oncomment(data) {\n if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n this.lastNode.data += data;\n return;\n }\n const node = new Comment(data);\n this.addNode(node);\n this.lastNode = node;\n }\n oncommentend() {\n this.lastNode = null;\n }\n oncdatastart() {\n const text = new Text(\"\");\n const node = new CDATA([text]);\n this.addNode(node);\n text.parent = node;\n this.lastNode = text;\n }\n oncdataend() {\n this.lastNode = null;\n }\n onprocessinginstruction(name, data) {\n const node = new ProcessingInstruction(name, data);\n this.addNode(node);\n }\n handleCallback(error) {\n if (typeof this.callback === \"function\") {\n this.callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n }\n addNode(node) {\n const parent = this.tagStack[this.tagStack.length - 1];\n const previousSibling = parent.children[parent.children.length - 1];\n if (this.options.withStartIndices) {\n node.startIndex = this.parser.startIndex;\n }\n if (this.options.withEndIndices) {\n node.endIndex = this.parser.endIndex;\n }\n parent.children.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n node.parent = parent;\n this.lastNode = null;\n }\n}\nexport default DomHandler;\n",null,null,null,null,null,null,null,"export const elementNames = new Map([\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"clipPath\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"foreignObject\",\n \"glyphRef\",\n \"linearGradient\",\n \"radialGradient\",\n \"textPath\",\n].map((val) => [val.toLowerCase(), val]));\nexport const attributeNames = new Map([\n \"definitionURL\",\n \"attributeName\",\n \"attributeType\",\n \"baseFrequency\",\n \"baseProfile\",\n \"calcMode\",\n \"clipPathUnits\",\n \"diffuseConstant\",\n \"edgeMode\",\n \"filterUnits\",\n \"glyphRef\",\n \"gradientTransform\",\n \"gradientUnits\",\n \"kernelMatrix\",\n \"kernelUnitLength\",\n \"keyPoints\",\n \"keySplines\",\n \"keyTimes\",\n \"lengthAdjust\",\n \"limitingConeAngle\",\n \"markerHeight\",\n \"markerUnits\",\n \"markerWidth\",\n \"maskContentUnits\",\n \"maskUnits\",\n \"numOctaves\",\n \"pathLength\",\n \"patternContentUnits\",\n \"patternTransform\",\n \"patternUnits\",\n \"pointsAtX\",\n \"pointsAtY\",\n \"pointsAtZ\",\n \"preserveAlpha\",\n \"preserveAspectRatio\",\n \"primitiveUnits\",\n \"refX\",\n \"refY\",\n \"repeatCount\",\n \"repeatDur\",\n \"requiredExtensions\",\n \"requiredFeatures\",\n \"specularConstant\",\n \"specularExponent\",\n \"spreadMethod\",\n \"startOffset\",\n \"stdDeviation\",\n \"stitchTiles\",\n \"surfaceScale\",\n \"systemLanguage\",\n \"tableValues\",\n \"targetX\",\n \"targetY\",\n \"textLength\",\n \"viewBox\",\n \"viewTarget\",\n \"xChannelSelector\",\n \"yChannelSelector\",\n \"zoomAndPan\",\n].map((val) => [val.toLowerCase(), val]));\n",null,"import { Parser, type ParserOptions } from \"./Parser.js\";\nexport type { Handler, ParserOptions } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\n\nimport {\n DomHandler,\n type DomHandlerOptions,\n type ChildNode,\n type Element,\n type Document,\n} from \"domhandler\";\n\nexport {\n DomHandler,\n // Old name for DomHandler\n DomHandler as DefaultHandler,\n type DomHandlerOptions,\n} from \"domhandler\";\n\nexport type Options = ParserOptions & DomHandlerOptions;\n\n// Helper methods\n\n/**\n * Parses the data, returns the resulting document.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data: string, options?: Options): Document {\n const handler = new DomHandler(undefined, options);\n new Parser(handler, options).end(data);\n return handler.root;\n}\n/**\n * Parses data, returns an array of the root nodes.\n *\n * Note that the root nodes still have a `Document` node as their parent.\n * Use `parseDocument` to get the `Document` node instead.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n * @deprecated Use `parseDocument` instead.\n */\nexport function parseDOM(data: string, options?: Options): ChildNode[] {\n return parseDocument(data, options).children;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(\n callback: (error: Error | null, document: Document) => void,\n options?: Options,\n elementCallback?: (element: Element) => void,\n): Parser {\n const handler: DomHandler = new DomHandler(\n (error: Error | null) => callback(error, handler.root),\n options,\n elementCallback,\n );\n return new Parser(handler, options);\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with an array of root nodes.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n * @deprecated Use `createDocumentStream` instead.\n */\nexport function createDomStream(\n callback: (error: Error | null, dom: ChildNode[]) => void,\n options?: Options,\n elementCallback?: (element: Element) => void,\n): Parser {\n const handler = new DomHandler(callback, options, elementCallback);\n return new Parser(handler, options);\n}\n\nexport {\n default as Tokenizer,\n type Callbacks as TokenizerCallbacks,\n QuoteType,\n} from \"./Tokenizer.js\";\n\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\n\nimport { getFeed, type Feed } from \"domutils\";\n\nexport { getFeed, type Feed } from \"domutils\";\n\nconst parseFeedDefaultOptions = { xmlMode: true };\n\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(\n feed: string,\n options: Options = parseFeedDefaultOptions,\n): Feed | null {\n return getFeed(parseDOM(feed, options));\n}\n\nexport * as DomUtils from \"domutils\";\n","/**\n * Twine HTML decompiler: parse compiled Twine 2 or Twine 1 HTML back into a Story model.\n * Ported from storyload.go:loadHTML().\n */\nimport { parseDocument } from 'htmlparser2';\nimport type { Passage, PassageMetadata, Diagnostic, IFID } from './types.js';\nimport { createStory, storyAdd, storyPrepend, marshalStoryData } from './story.js';\nimport { tiddlerUnescape } from './escape.js';\n\nexport interface DecompileResult {\n story: import('./types.js').Story;\n diagnostics: Diagnostic[];\n}\n\n// Structural types matching domhandler's API (avoids direct import of domhandler).\ninterface HtmlNode {\n type: string;\n name?: string;\n attribs?: Record<string, string>;\n children?: HtmlNode[];\n data?: string;\n}\n\n/**\n * Parse a Twine 2 or Twine 1 compiled HTML file back into a Story model.\n */\nexport function decompileHTML(html: string): DecompileResult {\n const diagnostics: Diagnostic[] = [];\n const story = createStory();\n\n const doc = parseDocument(html) as unknown as HtmlNode;\n\n // Try Twine 2 first (<tw-storydata>), then Twine 1 (<div id=\"store-area\"> or <div id=\"storeArea\">).\n const twine2Data = findElement(doc, 'tw-storydata');\n if (twine2Data) {\n decompileTwine2(twine2Data, story, diagnostics);\n return { story, diagnostics };\n }\n\n const twine1Data = findElementByIdPattern(doc, /^store(?:-a|A)rea$/);\n if (twine1Data) {\n decompileTwine1(twine1Data, story, diagnostics);\n return { story, diagnostics };\n }\n\n diagnostics.push({ level: 'error', message: 'Malformed HTML source; story data not found.' });\n return { story, diagnostics };\n}\n\nfunction decompileTwine2(storyData: HtmlNode, story: import('./types.js').Story, diagnostics: Diagnostic[]): void {\n // Parse tw-storydata attributes.\n let startnode = 0;\n const attrs = storyData.attribs ?? {};\n\n if (attrs['name']) story.name = attrs['name'];\n if (attrs['startnode']) {\n const parsed = parseInt(attrs['startnode'], 10);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-storydata\" content attribute \"startnode\" as an integer; value \"${attrs['startnode']}\".`,\n });\n } else {\n startnode = parsed;\n }\n }\n if (attrs['ifid']) story.ifid = attrs['ifid'].toUpperCase() as IFID;\n if (attrs['zoom']) {\n const parsed = parseFloat(attrs['zoom']);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-storydata\" content attribute \"zoom\" as a float; value \"${attrs['zoom']}\".`,\n });\n } else {\n story.twine2.zoom = parsed;\n }\n }\n if (attrs['format']) story.twine2.format = attrs['format'];\n if (attrs['format-version']) story.twine2.formatVersion = attrs['format-version'];\n if (attrs['options']) {\n for (const opt of attrs['options'].split(/\\s+/).filter((s: string) => s.length > 0)) {\n story.twine2.options.set(opt, true);\n }\n }\n\n // Process child elements.\n // htmlparser2 uses type 'style'/'script' for those elements instead of 'tag'.\n for (const node of storyData.children ?? []) {\n if (node.type !== 'tag' && node.type !== 'style' && node.type !== 'script') continue;\n\n switch (node.name) {\n case 'style':\n case 'script': {\n const text = getTextContent(node).trim();\n if (text.length === 0) continue;\n const name = node.name === 'style' ? 'Story Stylesheet' : 'Story JavaScript';\n const tags = node.name === 'style' ? ['stylesheet'] : ['script'];\n storyAdd(story, { name, tags, text }, diagnostics);\n break;\n }\n\n case 'tw-tag': {\n const tagAttrs = node.attribs ?? {};\n const tagName = tagAttrs['name'] ?? '';\n const tagColor = tagAttrs['color'] ?? '';\n if (tagName) story.twine2.tagColors.set(tagName, tagColor);\n break;\n }\n\n case 'tw-passagedata': {\n let pid = 0;\n const pAttrs = node.attribs ?? {};\n const name = pAttrs['name'] ?? '';\n const tags = pAttrs['tags'] ? pAttrs['tags'].split(/\\s+/).filter((s: string) => s.length > 0) : [];\n const metadata: PassageMetadata = {};\n\n if (pAttrs['pid']) {\n const parsed = parseInt(pAttrs['pid'], 10);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-passagedata\" content attribute \"pid\" as an integer; value \"${pAttrs['pid']}\".`,\n });\n } else {\n pid = parsed;\n }\n }\n\n if (pAttrs['position']) metadata.position = pAttrs['position'];\n if (pAttrs['size']) metadata.size = pAttrs['size'];\n\n if (pid === startnode && pid !== 0) {\n story.twine2.start = name;\n }\n\n const text = getTextContent(node).trim();\n const passage: Passage = { name, tags, text };\n if (metadata.position || metadata.size) {\n passage.metadata = metadata;\n }\n storyAdd(story, passage, diagnostics);\n break;\n }\n }\n }\n\n // Prepend StoryData passage with serialized metadata.\n storyPrepend(story, { name: 'StoryData', tags: [], text: marshalStoryData(story) }, diagnostics);\n}\n\nfunction decompileTwine1(storeArea: HtmlNode, story: import('./types.js').Story, diagnostics: Diagnostic[]): void {\n for (const node of storeArea.children ?? []) {\n if (node.type !== 'tag' || node.name !== 'div') continue;\n const nodeAttrs = node.attribs ?? {};\n if (!('tiddler' in nodeAttrs)) continue;\n\n const name = nodeAttrs['tiddler'] ?? '';\n const tags = nodeAttrs['tags'] ? nodeAttrs['tags'].split(/\\s+/).filter((s: string) => s.length > 0) : [];\n const metadata: PassageMetadata = {};\n\n if (nodeAttrs['twine-position']) metadata.position = nodeAttrs['twine-position'];\n\n const rawContent = getTextContent(node);\n const text = tiddlerUnescape(rawContent).trim();\n\n const passage: Passage = { name, tags, text };\n if (metadata.position) {\n passage.metadata = metadata;\n }\n storyAdd(story, passage, diagnostics);\n }\n}\n\nfunction findElement(node: HtmlNode, tagName: string): HtmlNode | undefined {\n if (node.type === 'tag' && node.name === tagName) return node;\n for (const child of node.children ?? []) {\n const found = findElement(child, tagName);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction findElementByIdPattern(node: HtmlNode, idPattern: RegExp): HtmlNode | undefined {\n if (node.type === 'tag' && node.attribs?.['id'] && idPattern.test(node.attribs['id'])) return node;\n for (const child of node.children ?? []) {\n const found = findElementByIdPattern(child, idPattern);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction getTextContent(el: HtmlNode): string {\n let text = '';\n for (const child of el.children ?? []) {\n if (child.type === 'text' && child.data) {\n text += child.data;\n }\n }\n return text;\n}\n","/** Single source of truth for the twee-ts version. Update here when releasing. */\nexport const VERSION = '1.2.0';\n","/**\n * Twine 2 HTML and archive output.\n * Ported from storyout.go.\n */\nimport type { ReadonlyStory, ReadonlyPassage, StoryFormatInfo } from './types.js';\nimport { attrEscape, htmlEscape, commentSanitize, htmlCommentSanitize } from './escape.js';\nimport { passageToPassagedata, hasTag, hasAnyTag } from './passage.js';\nimport { readFormatSource } from './formats.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'Twee-ts';\n\nexport function toTwine2Archive(\n story: ReadonlyStory,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n return getTwine2DataChunk(story, startName, options) + '\\n';\n}\n\nexport function toTwine2HTML(\n story: ReadonlyStory,\n format: StoryFormatInfo,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n let template = readFormatSource(format);\n\n if (template.includes('{{STORY_NAME}}')) {\n template = template.replaceAll('{{STORY_NAME}}', htmlEscape(story.name));\n }\n if (template.includes('{{STORY_DATA}}')) {\n template = template.replace('{{STORY_DATA}}', getTwine2DataChunk(story, startName, options));\n }\n\n return template;\n}\n\nfunction getTwine2DataChunk(\n story: ReadonlyStory,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n const parts: string[] = [];\n let startID = '';\n let pid = 0;\n\n // Gather script and stylesheet passages.\n const scripts: ReadonlyPassage[] = [];\n const stylesheets: ReadonlyPassage[] = [];\n for (const p of story.passages) {\n if (hasTag(p, 'Twine.private')) continue;\n if (hasTag(p, 'script')) scripts.push(p);\n else if (hasTag(p, 'stylesheet')) stylesheets.push(p);\n }\n\n // Style element\n let styleContent = '';\n if (stylesheets.length === 1) {\n styleContent = stylesheets[0]?.text ?? '';\n } else if (stylesheets.length > 1) {\n let pidS = 1;\n for (const p of stylesheets) {\n if (pidS > 1 && !styleContent.endsWith('\\n')) styleContent += '\\n';\n styleContent += `/* twine-user-stylesheet #${pidS}: \"${commentSanitize(p.name)}\" */\\n`;\n styleContent += p.text;\n pidS++;\n }\n }\n parts.push(`<style role=\"stylesheet\" id=\"twine-user-stylesheet\" type=\"text/twine-css\">${styleContent}</style>`);\n\n // Script element\n let scriptContent = '';\n if (scripts.length === 1) {\n scriptContent = scripts[0]?.text ?? '';\n } else if (scripts.length > 1) {\n let pidS = 1;\n for (const p of scripts) {\n if (pidS > 1 && !scriptContent.endsWith('\\n')) scriptContent += '\\n';\n scriptContent += `/* twine-user-script #${pidS}: \"${commentSanitize(p.name)}\" */\\n`;\n scriptContent += p.text;\n pidS++;\n }\n }\n parts.push(`<script role=\"script\" id=\"twine-user-script\" type=\"text/twine-javascript\">${scriptContent}</script>`);\n\n // Tag color elements (only spec-valid colors: 7 named colors or hex values)\n const validTagColors = new Set(['gray', 'red', 'orange', 'yellow', 'green', 'blue', 'purple']);\n const hexColorPattern = /^#[0-9a-fA-F]{3,8}$/;\n for (const [tag, color] of story.twine2.tagColors) {\n if (validTagColors.has(color) || hexColorPattern.test(color)) {\n parts.push(`<tw-tag name=\"${attrEscape(tag)}\" color=\"${attrEscape(color)}\"></tw-tag>`);\n }\n }\n\n // Normal passage elements\n pid = 1;\n for (const p of story.passages) {\n if (p.name === 'StoryTitle' || p.name === 'StoryData' || hasAnyTag(p, 'script', 'stylesheet', 'Twine.private')) {\n continue;\n }\n // Drop empty StorySettings\n if (p.name === 'StorySettings' && story.twine1.settings.size === 0) {\n continue;\n }\n\n parts.push(passageToPassagedata(p, pid, options));\n if (startName === p.name) {\n startID = String(pid);\n }\n pid++;\n }\n\n // Build options string\n const opts: string[] = [];\n for (const [opt, val] of story.twine2.options) {\n if (val) opts.push(opt);\n }\n const optionsStr = opts.join(' ');\n\n // Wrap in tw-storydata\n const zoom = String(story.twine2.zoom);\n\n const wrapper =\n `<!-- UUID://${htmlCommentSanitize(story.ifid)}// -->` +\n `<tw-storydata name=\"${attrEscape(story.name)}\" startnode=\"${attrEscape(startID)}\" ` +\n `creator=\"${attrEscape(CREATOR_NAME)}\" creator-version=\"${attrEscape(VERSION)}\" ` +\n `ifid=\"${attrEscape(story.ifid)}\" zoom=\"${attrEscape(zoom)}\" ` +\n `format=\"${attrEscape(story.twine2.format)}\" ` +\n `format-version=\"${attrEscape(story.twine2.formatVersion)}\" ` +\n `options=\"${attrEscape(optionsStr)}\" tags=\"${attrEscape(story.twine2.tags)}\" hidden>`;\n\n return wrapper + parts.join('') + '</tw-storydata>';\n}\n","/**\n * Twine 1 HTML and archive output.\n * Ported from storyout.go.\n */\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { ReadonlyStory, StoryFormatInfo } from './types.js';\nimport { hasTag, passageToTiddler } from './passage.js';\nimport { readFormatSource } from './formats.js';\nimport { jsStringEscape, htmlCommentSanitize } from './escape.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'twee-ts';\n\nexport function toTwine1Archive(story: ReadonlyStory, _startName: string): string {\n const { data, count } = getTwine1PassageChunk(story);\n return `<div id=\"storeArea\" data-size=\"${count}\">${data}</div>\\n`;\n}\n\nexport function toTwine1HTML(story: ReadonlyStory, format: StoryFormatInfo, startName: string): string {\n const formatDir = dirname(format.filename);\n const parentDir = dirname(formatDir);\n let template = readFormatSource(format);\n const { data, count } = getTwine1PassageChunk(story);\n\n // Component replacements\n template = tryReplaceComponent(template, '\"USER_LIB\"', join(formatDir, 'userlib.js'), false);\n template = tryReplaceComponent(template, '\"ENGINE\"', join(parentDir, 'engine.js'), true);\n template = tryReplaceComponent(template, '\"SUGARCANE\"', join(formatDir, 'code.js'), true);\n template = tryReplaceComponent(template, '\"JONAH\"', join(formatDir, 'code.js'), true);\n\n if (story.twine1.settings.get('jquery') === 'on') {\n template = tryReplaceComponent(template, '\"JQUERY\"', join(parentDir, 'jquery.js'), true);\n }\n if (story.twine1.settings.get('modernizr') === 'on') {\n template = tryReplaceComponent(template, '\"MODERNIZR\"', join(parentDir, 'modernizr.js'), true);\n }\n\n // Story instance replacements\n const displayStart = startName === 'Start' ? '' : startName;\n template = template.replace('\"VERSION\"', `Compiled with ${CREATOR_NAME}, ${VERSION}`);\n template = template.replace('\"TIME\"', `Built on ${new Date().toUTCString()}`);\n template = template.replace('\"START_AT\"', `\"${jsStringEscape(displayStart)}\"`);\n template = template.replace('\"STORY_SIZE\"', `\"${count}\"`);\n\n if (template.includes('\"STORY\"')) {\n template = template.replace('\"STORY\"', data);\n } else {\n // Pre-1.4 format: append data + footer\n let footer: string;\n try {\n footer = readFileSync(join(formatDir, 'footer.html'), 'utf-8');\n } catch {\n footer = '</div>\\n</body>\\n</html>\\n';\n }\n template += data + footer;\n }\n\n // IFID replacement\n if (story.ifid) {\n const safeIfid = htmlCommentSanitize(story.ifid);\n if (template.includes('<div id=\"store-area\"')) {\n template = template.replace('<div id=\"store-area\"', `<!-- UUID://${safeIfid}// --><div id=\"store-area\"`);\n } else {\n template = template.replace('<div id=\"storeArea\"', `<!-- UUID://${safeIfid}// --><div id=\"storeArea\"`);\n }\n }\n\n return template;\n}\n\nfunction getTwine1PassageChunk(story: ReadonlyStory): { data: string; count: number } {\n const obfuscateRot13 = story.twine1.settings.get('obfuscate') === 'rot13';\n let data = '';\n let count = 0;\n\n for (const p of story.passages) {\n if (hasTag(p, 'Twine.private')) continue;\n count++;\n data += passageToTiddler(p, count, obfuscateRot13);\n }\n\n return { data, count };\n}\n\nfunction tryReplaceComponent(template: string, placeholder: string, componentPath: string, required: boolean): string {\n if (!template.includes(placeholder)) return template;\n try {\n let content = readFileSync(componentPath, 'utf-8');\n if (content.charCodeAt(0) === 0xfeff) content = content.slice(1);\n return template.replace(placeholder, content);\n } catch (e) {\n if (required) {\n throw new Error(\n `Required format component not found: ${componentPath}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n return template;\n }\n}\n","/**\n * Twee 3/1 decompile output.\n * Ported from storyout.go.\n */\nimport type { ReadonlyStory, OutputMode } from './types.js';\nimport { passageToTwee } from './passage.js';\n\nexport function toTwee(story: ReadonlyStory, outMode: OutputMode): string {\n let data = '';\n for (const p of story.passages) {\n data += passageToTwee(p, outMode);\n }\n return data;\n}\n","/**\n * Module/head injection into <head>.\n * Ported from module.go + io.go:modifyHead().\n */\nimport type { Diagnostic } from './types.js';\nimport { normalizedFileExt, mediaTypeFromExt, fontFormatHint, slugify } from './media-types.js';\nimport { readUTF8, readBase64, baseNameWithoutExt } from './util.js';\n\n/**\n * Load modules and return HTML tags to inject before </head>.\n */\nexport function loadModules(filenames: string[]): string {\n const processed = new Set<string>();\n const headTags: string[] = [];\n\n for (const filename of filenames) {\n if (processed.has(filename)) continue;\n\n const ext = normalizedFileExt(filename);\n let tag: string | null = null;\n\n switch (ext) {\n case 'css':\n tag = loadModuleTagged('style', filename);\n break;\n case 'js':\n tag = loadModuleTagged('script', filename);\n break;\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n tag = loadModuleFont(filename);\n break;\n default:\n continue;\n }\n\n if (tag) headTags.push(tag);\n processed.add(filename);\n }\n\n return headTags.join('\\n');\n}\n\nfunction loadModuleTagged(tag: string, filename: string): string | null {\n const source = readUTF8(filename).trim();\n if (source.length === 0) return null;\n\n const family = baseNameWithoutExt(filename);\n const idSlug = `${tag}-module-${slugify(family)}`;\n const mimeType = tag === 'script' ? 'text/javascript' : 'text/css';\n\n return `<${tag} id=\"${idSlug}\" type=\"${mimeType}\">${source}</${tag}>`;\n}\n\nfunction loadModuleFont(filename: string): string | null {\n const source = readBase64(filename);\n const family = baseNameWithoutExt(filename);\n const idSlug = `style-module-${slugify(family)}`;\n const ext = normalizedFileExt(filename);\n const mediaType = mediaTypeFromExt(ext);\n const hint = fontFormatHint(ext);\n\n return `<style id=\"${idSlug}\" type=\"text/css\">@font-face {\\n\\tfont-family: \"${family}\";\\n\\tsrc: url(\"data:${mediaType};base64,${source}\") format(\"${hint}\");\\n}</style>`;\n}\n\n/**\n * Inject modules and head file content before </head>.\n */\nexport function modifyHead(html: string, modulePaths: string[], headFile?: string, diagnostics?: Diagnostic[]): string {\n const parts: string[] = [];\n\n if (modulePaths.length > 0) {\n const modules = loadModules(modulePaths).trim();\n if (modules.length > 0) parts.push(modules);\n }\n\n if (headFile) {\n try {\n const source = readUTF8(headFile).trim();\n if (source.length > 0) parts.push(source);\n } catch (e) {\n diagnostics?.push({\n level: 'warning',\n message: `Failed to read head file \"${headFile}\": ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n if (parts.length > 0) {\n parts.push('</head>');\n return html.replace('</head>', parts.join('\\n'));\n }\n return html;\n}\n","/**\n * Remote story format fetching, caching, and checksum verification.\n * Uses the Story Formats Archive (SFA) as the default source.\n */\nimport { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, statSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { SFAIndex, SFAIndexEntry, StoryFormatInfo } from './types.js';\nimport { parseSemver, semverCompare, parseFormatJSON } from './formats.js';\n\nconst DEFAULT_SFA_INDICES = [\n 'https://videlais.github.io/story-formats-archive/official/index.json',\n 'https://videlais.github.io/story-formats-archive/unofficial/index.json',\n];\n\n/** Get the cache directory for downloaded story formats. */\nexport function getCacheDir(): string {\n const xdg = process.env['XDG_CACHE_HOME'];\n const base = xdg || join(homedir(), '.cache');\n return join(base, 'twee-ts', 'storyformats');\n}\n\n/** In-memory index cache, keyed by URL. Cleared each compile. */\nconst indexCache = new Map<string, SFAIndex>();\n\n/** Clear the in-memory index cache. */\nexport function clearIndexCache(): void {\n indexCache.clear();\n}\n\n/** Validate that a JSON value is a valid SFAIndexEntry. */\nfunction isValidEntry(val: unknown): val is SFAIndexEntry {\n if (typeof val !== 'object' || val === null || Array.isArray(val)) return false;\n const obj = val as Record<string, unknown>;\n return (\n typeof obj.name === 'string' &&\n typeof obj.version === 'string' &&\n typeof obj.checksums === 'object' &&\n obj.checksums !== null &&\n !Array.isArray(obj.checksums)\n );\n}\n\n/** Validate that a JSON value conforms to the SFAIndex shape. */\nfunction validateSFAIndex(json: unknown): SFAIndex {\n if (typeof json !== 'object' || json === null) {\n throw new Error('SFA index is not an object');\n }\n const obj = json as Record<string, unknown>;\n const twine1 = Array.isArray(obj['twine1']) ? (obj['twine1'] as unknown[]).filter(isValidEntry) : [];\n const twine2 = Array.isArray(obj['twine2']) ? (obj['twine2'] as unknown[]).filter(isValidEntry) : [];\n return { twine1, twine2 };\n}\n\n/** Generate a format ID from name and version. */\nfunction makeFormatId(name: string, version: string): string {\n const major = parseSemver(version)?.[0] ?? '0';\n return `${name.toLowerCase().replace(/\\s+/g, '-')}-${major}`;\n}\n\n/** Fetch and parse an SFA index.json, with in-memory caching. */\nexport async function fetchIndex(url: string): Promise<SFAIndex> {\n const cached = indexCache.get(url);\n if (cached) return cached;\n\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch format index from ${url}: ${res.status} ${res.statusText}`);\n }\n const data = validateSFAIndex(await res.json());\n indexCache.set(url, data);\n return data;\n}\n\ninterface FindEntryResult {\n entry: SFAIndexEntry;\n formatType: 'twine1' | 'twine2';\n}\n\n/**\n * Find the best matching entry in an SFA index.\n * Exact version preferred, then highest version with same major.\n */\nexport function findEntry(index: SFAIndex, name: string, version: string): FindEntryResult | undefined {\n const wanted = parseSemver(version);\n\n const searchArrays: Array<{ entries: SFAIndexEntry[]; formatType: 'twine1' | 'twine2' }> = [\n { entries: index.twine2 ?? [], formatType: 'twine2' },\n { entries: index.twine1 ?? [], formatType: 'twine1' },\n ];\n\n let bestResult: FindEntryResult | undefined;\n let bestVersion: [number, number, number] | null = null;\n\n for (const { entries, formatType } of searchArrays) {\n for (const entry of entries) {\n if (entry.name.toLowerCase() !== name.toLowerCase()) continue;\n const have = parseSemver(entry.version);\n if (!have) continue;\n\n // Exact match — return immediately\n if (wanted && semverCompare(have, wanted) === 0) return { entry, formatType };\n\n // Same-major, highest version\n if (wanted === null || (have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n if (!bestVersion || semverCompare(have, bestVersion) > 0) {\n bestVersion = have;\n bestResult = { entry, formatType };\n }\n }\n }\n }\n\n return bestResult;\n}\n\n/** Verify SHA-256 checksum using Web Crypto API (Node 22 built-in). */\nexport async function verifySHA256(content: Uint8Array<ArrayBuffer>, expectedHex: string): Promise<boolean> {\n const digest = await crypto.subtle.digest('SHA-256', content);\n const hex = Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hex === expectedHex.toLowerCase();\n}\n\n/** Derive the download URL for a format.js from the index URL and entry. */\nfunction getDownloadUrl(indexUrl: string, entry: SFAIndexEntry, formatType: 'twine1' | 'twine2'): string {\n const base = indexUrl.replace(/\\/index\\.json$/, '');\n return `${base}/${formatType}/${entry.name}/${entry.version}/format.js`;\n}\n\n/** Download a format, verify its checksum, write to cache, and return StoryFormatInfo. */\nexport async function fetchAndCacheFormat(entry: SFAIndexEntry, downloadUrl: string): Promise<StoryFormatInfo> {\n const res = await fetch(downloadUrl);\n if (!res.ok) {\n throw new Error(`Failed to download format from ${downloadUrl}: ${res.status} ${res.statusText}`);\n }\n const text = await res.text();\n\n // Verify checksum if available\n const checksumKey = Object.keys(entry.checksums ?? {}).find((k) => k.endsWith('format.js'));\n if (checksumKey) {\n const expected = entry.checksums[checksumKey];\n if (!expected) throw new Error(`Missing checksum value for key \"${checksumKey}\"`);\n const encoder = new TextEncoder();\n const valid = await verifySHA256(encoder.encode(text), expected);\n if (!valid) {\n throw new Error(`Checksum verification failed for ${entry.name} ${entry.version}`);\n }\n }\n\n // Parse format JSON to extract name/version/source\n const id = makeFormatId(entry.name, entry.version);\n const data = parseFormatJSON(text, id);\n if (!data) {\n throw new Error(`Failed to parse format JSON from ${downloadUrl}`);\n }\n\n // Write to cache\n const cacheDir = getCacheDir();\n const formatDir = join(cacheDir, entry.name, entry.version);\n mkdirSync(formatDir, { recursive: true });\n const formatPath = join(formatDir, 'format.js');\n writeFileSync(formatPath, text, 'utf-8');\n\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n}\n\n/** Download a direct format.js URL, parse its JSON, cache it, and return StoryFormatInfo. */\nexport async function fetchDirectFormat(url: string): Promise<StoryFormatInfo> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to download format from ${url}: ${res.status} ${res.statusText}`);\n }\n const text = await res.text();\n\n const tempId = 'direct-url';\n const data = parseFormatJSON(text, tempId);\n if (!data) {\n throw new Error(`Failed to parse format JSON from ${url}`);\n }\n\n const id = makeFormatId(data.name, data.version);\n\n // Write to cache\n const cacheDir = getCacheDir();\n const formatDir = join(cacheDir, data.name, data.version);\n mkdirSync(formatDir, { recursive: true });\n const formatPath = join(formatDir, 'format.js');\n writeFileSync(formatPath, text, 'utf-8');\n\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n}\n\n/**\n * Try to resolve a remote story format by name and version.\n * 1. Try direct format URLs\n * 2. Try custom index URLs\n * 3. Try default SFA indices\n */\nexport async function resolveRemoteFormat(\n name: string,\n version: string,\n indices?: string[],\n urls?: string[],\n): Promise<StoryFormatInfo | undefined> {\n let lastError: Error | undefined;\n\n // 1. Try direct URLs — check if any match by name\n if (urls) {\n for (const url of urls) {\n try {\n const info = await fetchDirectFormat(url);\n if (info.name.toLowerCase() === name.toLowerCase()) {\n const wanted = parseSemver(version);\n const have = parseSemver(info.version);\n if (!wanted || (have && have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n return info;\n }\n }\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n }\n\n // 2. Try custom indices, then default SFA indices\n const allIndices = [...(indices ?? []), ...DEFAULT_SFA_INDICES];\n for (const indexUrl of allIndices) {\n try {\n const index = await fetchIndex(indexUrl);\n const result = findEntry(index, name, version);\n if (result) {\n // Check cache first\n const cached = getCachedFormat(result.entry.name, result.entry.version);\n if (cached) return cached;\n\n const downloadUrl = getDownloadUrl(indexUrl, result.entry, result.formatType);\n return await fetchAndCacheFormat(result.entry, downloadUrl);\n }\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n // If all sources failed with errors, propagate the last one\n if (lastError) throw lastError;\n return undefined;\n}\n\n/** Check if a format is already in the local cache. */\nfunction getCachedFormat(name: string, version: string): StoryFormatInfo | undefined {\n const formatPath = join(getCacheDir(), name, version, 'format.js');\n try {\n if (!existsSync(formatPath)) return undefined;\n const source = readFileSync(formatPath, 'utf-8');\n const id = makeFormatId(name, version);\n const data = parseFormatJSON(source, id);\n if (!data) return undefined;\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n } catch {\n return undefined;\n }\n}\n\n/** Discover all cached remote formats. Returns a Map like discoverFormats(). */\nexport function discoverCachedFormats(): Map<string, StoryFormatInfo> {\n const formats = new Map<string, StoryFormatInfo>();\n const cacheDir = getCacheDir();\n\n try {\n if (!existsSync(cacheDir)) return formats;\n } catch {\n return formats;\n }\n\n let names: string[];\n try {\n names = readdirSync(cacheDir);\n } catch {\n return formats;\n }\n\n for (const name of names) {\n const nameDir = join(cacheDir, name);\n try {\n if (!statSync(nameDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n continue;\n }\n\n for (const version of versions) {\n const info = getCachedFormat(name, version);\n if (info) {\n formats.set(`${info.id}-${version}`, info);\n }\n }\n }\n\n return formats;\n}\n\n/** Info about a cached format entry with size and modification date. */\nexport interface CachedFormatEntry {\n readonly name: string;\n readonly version: string;\n readonly sizeBytes: number;\n readonly modifiedAt: Date;\n}\n\n/** List all cached formats with size and modification date. */\nexport function listCachedFormats(): readonly CachedFormatEntry[] {\n const cacheDir = getCacheDir();\n const entries: CachedFormatEntry[] = [];\n\n try {\n if (!existsSync(cacheDir)) return entries;\n } catch {\n return entries;\n }\n\n let names: string[];\n try {\n names = readdirSync(cacheDir);\n } catch {\n return entries;\n }\n\n for (const name of names) {\n const nameDir = join(cacheDir, name);\n try {\n if (!statSync(nameDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n continue;\n }\n\n for (const version of versions) {\n const formatPath = join(nameDir, version, 'format.js');\n try {\n const stat = statSync(formatPath);\n entries.push({\n name,\n version,\n sizeBytes: stat.size,\n modifiedAt: stat.mtime,\n });\n } catch {\n // Skip entries without a valid format.js\n }\n }\n }\n\n return entries;\n}\n\n/** Clear all cached formats, or only those matching a given name. Returns the number of entries removed. */\nexport function clearCachedFormats(name?: string): number {\n const cacheDir = getCacheDir();\n if (!existsSync(cacheDir)) return 0;\n\n if (!name) {\n const entries = listCachedFormats();\n const count = entries.length;\n rmSync(cacheDir, { recursive: true, force: true });\n return count;\n }\n\n const nameDir = join(cacheDir, name);\n if (!existsSync(nameDir)) return 0;\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n return 0;\n }\n const count = versions.length;\n rmSync(nameDir, { recursive: true, force: true });\n return count;\n}\n\n/** Get total cache size in bytes and format count. */\nexport function getCacheSize(): { totalBytes: number; count: number } {\n const entries = listCachedFormats();\n const totalBytes = entries.reduce((sum, e) => sum + e.sizeBytes, 0);\n return { totalBytes, count: entries.length };\n}\n"],"mappings":"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AAO,GAAE,CAAC,GAAE,aAAa,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,aAAa,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,S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AE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GA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AAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,gBAAgB,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,EAAC,GAAE,qBAAoB,GAAE,KAAI,GAAE,uBAAsB,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,sBAAqB,GAAE,KAAI,GAAE,wBAAuB,CAAC,GAAE,CAAC,IAAG,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,gBAAgB,GAAE,CAAC,GAAE,eAAe,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,aAAa,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,IAAG,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,MAAM,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,EAAC,GAAE,aAAY,GAAE,KAAI,GAAE,aAAY,CAAC,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,EAAC,GAAE,SAAQ,GAAE,KAAI,GAAE,SAAQ,CAAC,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,EAAC,GAAE,cAAa,GAAE,KAAI,GAAE,cAAa,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,cAAa,GAAE,KAAI,GAAE,cAAa,CAAC,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,MAAM,GAAE,CAAC,GAAE,MAAM,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,EAAC,GAAE,cAAa,GAAE,KAAI,GAAE,sBAAqB,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,oBAAmB,GAAE,KAAI,GAAE,4BAA2B,CAAC,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,EAAC,GAAE,UAAS,GAAE,OAAM,GAAE,UAAS,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,UAAS,GAAE,OAAM,GAAE,UAAS,CAAC,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,EAAC,GAAE,mBAAkB,GAAE,KAAI,GAAE,qBAAoB,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,SAAQ,GAAE,KAAI,GAAE,qBAAoB,CAAC,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,eAAe,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,MAAM,GAAE,CAAC,GAAE,MAAM,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,EAAC,GAAE,UAAS,GAAE,KAAI,GAAE,UAAS,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,UAAS,GAAE,KAAI,GAAE,UAAS,CAAC,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,EAAC,GAAE,WAAU,GAAE,OAAM,GAAE,kBAAiB,CAAC,GAAE,CAAC,GAAE,EAAC,GAAE,WAAU,GAAE,OAAM,GAAE,kBAAiB,CAAC,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,EAAC,GAAE,WAAU,GAAE,MAAK,GAAE,WAAU,CAAC,GAAE,CAAC,OAAM,EAAC,GAAE,IAAI,IAAkC,4BAAY,CAAC,CAAC,OAAM,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,IAAG,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,C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","names":["writeFileSync","readdirSync","statSync","join","statSync","readdirSync","join","statSync","quote","_a","BinTrieFlags","CharCodes","EntityDecoderState","DecodingMode","_a","CharCodes","State","QuoteType","quote","_a","quote","ElementType","Text","Comment","_a","CDATA","isTag","Text","Comment","isTag","CDATA","Text","Comment","CDATA","decodeMap","fromCodePoint","_a","replaceCodePoint","CharCodes","TO_LOWER_BIT","BinTrieFlags","isNumber","isHexadecimalCharacter","isAsciiAlphaNumeric","isEntityInAttributeInvalidEnd","EntityDecoderState","DecodingMode","EntityDecoder","_a","replaceCodePoint","determineBranch","fromCodePoint","escape","EntityLevel","EncodingMode","DocumentPosition","statSync","readFileSync","join","CREATOR_NAME","join","readFileSync","readFileSync","readdirSync","statSync","join","homedir","join","homedir","readFileSync","CREATOR_NAME","CREATOR_NAME"]}
|
|
1
|
+
{"version":3,"sources":["../src/compiler.ts","../src/ifid.ts","../src/escape.ts","../src/passage.ts","../src/story.ts","../src/filesystem.ts","../src/media-types.ts","../src/formats.ts","../src/util.ts","../src/loader.ts","../src/types.ts","../src/lexer.ts","../src/twee2-compat.ts","../src/parser.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode-codepoint.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/decode-shared.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-html.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/generated/decode-data-xml.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/internal/bin-trie-flags.ts","../node_modules/.pnpm/entities@7.0.1/node_modules/entities/src/decode.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Tokenizer.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/Parser.ts","../node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/esm/index.js","../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/node.js","../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/index.js","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-html.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/decode-data-xml.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode_codepoint.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/decode.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/generated/encode-html.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/escape.ts","https://raw.githubusercontent.com/fb55/entities/61afd4701eaa736978b13c7351cd3de9a96b04bc/src/index.ts","../node_modules/.pnpm/dom-serializer@2.0.0/node_modules/dom-serializer/lib/esm/foreignNames.js","https://raw.githubusercontent.com/fb55/domutils/0ab8bcf1ecfc70dfc93291a4cb2496578ac25e9c/src/helpers.ts","../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/src/index.ts","../src/html-parser.ts","../src/version.ts","../src/output-twine2.ts","../src/output-twine1.ts","../src/output-twee.ts","../src/modules.ts","../src/remote-formats.ts"],"sourcesContent":["/**\n * Main compiler orchestrator.\n * compile(), compileToFile(), watch().\n * Ported from tweego.go + config.go.\n */\nimport { writeFileSync } from 'node:fs';\nimport type {\n CompileOptions,\n CompileToFileOptions,\n WatchOptions,\n CompileResult,\n CompileStats,\n Diagnostic,\n Story,\n StoryFormatInfo,\n OutputMode,\n InlineSource,\n FileCacheEntry,\n} from './types.js';\nimport { createStory, storyHas, getStoryStats } from './story.js';\nimport { getFilenames, watchFilesystem } from './filesystem.js';\nimport { discoverFormats, getFormatSearchDirs, getFormatIdByNameAndVersion } from './formats.js';\nimport { loadSources, loadInlineSources, loadSourcesCached } from './loader.js';\nimport { applyTagAliases, hasTag } from './passage.js';\nimport { generateIFID } from './ifid.js';\nimport { toTwine2HTML, toTwine2Archive } from './output-twine2.js';\nimport { toTwine1HTML, toTwine1Archive } from './output-twine1.js';\nimport { toTwee } from './output-twee.js';\nimport { modifyHead } from './modules.js';\nimport { resolveRemoteFormat, clearIndexCache } from './remote-formats.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'Twee-ts';\n\nconst DEFAULT_FORMAT_ID = 'sugarcube-2';\nconst DEFAULT_START_NAME = 'Start';\n\nexport class TweeTsError extends Error {\n constructor(\n message: string,\n public diagnostics: Diagnostic[] = [],\n ) {\n super(message);\n this.name = 'TweeTsError';\n }\n}\n\n/**\n * Compile Twee sources to HTML, Twee, or JSON.\n */\nexport async function compile(options: CompileOptions): Promise<CompileResult> {\n return buildOutput(options);\n}\n\n/**\n * Compile and write to a file.\n */\nexport async function compileToFile(options: CompileToFileOptions): Promise<CompileResult> {\n const result = await compile(options);\n writeFileSync(options.outFile, result.output, 'utf-8');\n return result;\n}\n\n/**\n * Compile with incremental caching support.\n * Plugins and advanced users can manage their own cache and changed-file tracking.\n */\nexport async function compileIncremental(\n options: CompileOptions,\n cache: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): Promise<CompileResult> {\n return buildOutput(options, cache, changedFiles);\n}\n\n/**\n * Watch for file changes and recompile.\n */\nexport async function watch(options: WatchOptions): Promise<AbortController> {\n const controller = new AbortController();\n const cache = new Map<string, FileCacheEntry>();\n\n // Separate file paths from inline sources\n const filePaths = options.sources.filter((s): s is string => typeof s === 'string');\n const modulePaths = options.modules ?? [];\n const allPaths = [...filePaths, ...modulePaths];\n\n const handle = watchFilesystem(allPaths, options.outFile, (changedFiles) => {\n buildOutput(options, cache, changedFiles)\n .then((result) => {\n writeFileSync(options.outFile, result.output, 'utf-8');\n options.onBuild?.(result);\n })\n .catch((e) => {\n options.onError?.(e instanceof Error ? e : new Error(String(e)));\n });\n });\n\n controller.signal.addEventListener('abort', () => handle.close());\n return controller;\n}\n\nasync function buildOutput(\n options: CompileOptions,\n cache?: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): Promise<CompileResult> {\n const diagnostics: Diagnostic[] = [];\n const outputMode: OutputMode = options.outputMode ?? 'html';\n const trim = options.trim ?? true;\n const twee2Compat = options.twee2Compat ?? false;\n const testMode = options.testMode ?? false;\n const noRemote = options.noRemote ?? false;\n const sourceInfo = options.sourceInfo ?? false;\n\n // Clear per-compile index cache\n clearIndexCache();\n\n // Separate file paths from inline sources\n const filePaths: string[] = [];\n const inlineSources: InlineSource[] = [];\n for (const source of options.sources) {\n if (typeof source === 'string') {\n filePaths.push(source);\n } else {\n inlineSources.push(source);\n }\n }\n\n // Walk file paths to get all source filenames\n const sourceFilenames = getFilenames(filePaths);\n\n // Create story and load sources\n const story = createStory();\n const processedFiles = new Set<string>();\n\n if (cache) {\n loadSourcesCached(story, sourceFilenames, { trim, twee2Compat }, diagnostics, processedFiles, cache, changedFiles);\n } else {\n loadSources(story, sourceFilenames, { trim, twee2Compat }, diagnostics, processedFiles);\n }\n loadInlineSources(story, inlineSources, { trim, twee2Compat }, diagnostics);\n\n // Apply tag aliases (e.g. library → script)\n if (options.tagAliases) {\n story.passages = applyTagAliases(story.passages, options.tagAliases);\n }\n\n // Resolve format\n let format: StoryFormatInfo | undefined;\n let formatId = options.formatId ?? '';\n\n if (outputMode === 'html') {\n const formatSearchDirs = getFormatSearchDirs(options.formatPaths, options.useTweegoPath ?? true);\n const formats = discoverFormats(formatSearchDirs);\n\n if (!formatId && story.twine2.format) {\n formatId = getFormatIdByNameAndVersion(formats, story.twine2.format, story.twine2.formatVersion) ?? '';\n }\n if (!formatId) {\n formatId = DEFAULT_FORMAT_ID;\n }\n\n format = formats.get(formatId);\n\n // Remote format fallback\n if (!format && !noRemote) {\n // Determine the format name and version for remote lookup\n const remoteName = story.twine2.format || formatId;\n const remoteVersion = story.twine2.formatVersion || '';\n\n try {\n format = await resolveRemoteFormat(remoteName, remoteVersion, options.formatIndices, options.formatUrls);\n } catch (e) {\n diagnostics.push({\n level: 'warning',\n message: `Remote format fetch failed for \"${remoteName}\": ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n if (!format) {\n const reason = noRemote ? ' (remote fetching disabled)' : '';\n diagnostics.push({\n level: 'error',\n message: `Story format \"${formatId}\" is not available${reason}. Found: ${[...formats.keys()].join(', ') || 'none'}`,\n });\n }\n }\n\n // Merge config from StoryData: command-line > StoryData > default\n const startName = options.startPassage || story.twine2.start || DEFAULT_START_NAME;\n\n // Apply test mode\n if (testMode) {\n story.twine2.options.set('debug', true);\n }\n\n // Ensure IFID is set before output generation\n ensureIFID(story, diagnostics);\n\n // Generate output\n let output: string;\n\n switch (outputMode) {\n case 'twee3':\n case 'twee1':\n output = toTwee(story, outputMode);\n break;\n\n case 'twine2-archive':\n output = toTwine2Archive(story, startName, { sourceInfo });\n break;\n\n case 'twine1-archive':\n output = toTwine1Archive(story, startName);\n break;\n\n case 'json':\n output = storyToJSON(story);\n break;\n\n case 'html': {\n // Sanity checks for HTML mode\n if (!storyHas(story, startName)) {\n diagnostics.push({\n level: 'error',\n message: `Starting passage \"${startName}\" not found.`,\n });\n }\n\n if (!format) {\n throw new TweeTsError('No story format available for HTML output.', diagnostics);\n }\n\n if (format.isTwine2) {\n output = toTwine2HTML(story, format, startName, { sourceInfo });\n } else {\n if (story.name === '' && !storyHas(story, 'StoryTitle')) {\n diagnostics.push({\n level: 'error',\n message: 'Special passage \"StoryTitle\" not found.',\n });\n }\n output = toTwine1HTML(story, format, startName);\n }\n\n // Inject modules and head file\n const modulePaths = options.modules ? getFilenames(options.modules) : [];\n output = modifyHead(output, modulePaths, options.headFile, diagnostics);\n break;\n }\n\n default: {\n const _exhaustive: never = outputMode;\n throw new TweeTsError(`Unhandled output mode: ${_exhaustive as string}`, diagnostics);\n }\n }\n\n // Compute stats\n const stats: CompileStats = {\n ...getStoryStats(story, options.wordCountMethod),\n files: [...processedFiles],\n };\n\n return { output, story, format, diagnostics, stats };\n}\n\nfunction ensureIFID(story: Story, diagnostics: Diagnostic[]): void {\n if (story.ifid !== '') return;\n\n if (story.legacyIFID !== '') {\n story.ifid = story.legacyIFID;\n diagnostics.push({\n level: 'warning',\n message: 'Story IFID not found; reusing \"ifid\" entry from the \"StorySettings\" special passage.',\n });\n } else {\n const ifid = generateIFID();\n story.ifid = ifid;\n diagnostics.push({\n level: 'error',\n message: `Story IFID not found. Add an IFID to your story: {\"ifid\":\"${ifid}\"}`,\n });\n }\n}\n\n/**\n * Serialize a Story to JSON per the Twine 2 JSON Output Specification (v1.0):\n * https://github.com/iftechfoundation/twine-specs/blob/master/twine-2-jsonoutput-doc.md\n */\nfunction storyToJSON(story: Story): string {\n // Gather script and stylesheet content, excluding them from passages.\n const scripts: string[] = [];\n const stylesheets: string[] = [];\n const storyPassages: { name: string; tags: string[]; text: string; metadata?: Record<string, string> }[] = [];\n\n for (const p of story.passages) {\n if (p.name === 'StoryTitle' || p.name === 'StoryData') continue;\n if (hasTag(p, 'Twine.private')) continue;\n\n if (hasTag(p, 'script')) {\n scripts.push(p.text);\n } else if (hasTag(p, 'stylesheet')) {\n stylesheets.push(p.text);\n } else {\n const entry: { name: string; tags: string[]; text: string; metadata?: Record<string, string> } = {\n name: p.name,\n tags: p.tags,\n text: p.text,\n };\n if (p.metadata) {\n const meta: Record<string, string> = {};\n for (const [key, value] of Object.entries(p.metadata)) {\n if (typeof value === 'string') meta[key] = value;\n }\n if (Object.keys(meta).length > 0) {\n entry.metadata = meta;\n }\n }\n storyPassages.push(entry);\n }\n }\n\n const obj: Record<string, unknown> = {\n name: story.name,\n };\n\n if (story.ifid) obj.ifid = story.ifid;\n if (story.twine2.format) obj.format = story.twine2.format;\n if (story.twine2.formatVersion) obj['format-version'] = story.twine2.formatVersion;\n if (story.twine2.start) obj.start = story.twine2.start;\n if (story.twine2.tagColors.size > 0) obj['tag-colors'] = Object.fromEntries(story.twine2.tagColors);\n if (story.twine2.zoom !== 1) obj.zoom = story.twine2.zoom;\n obj.creator = CREATOR_NAME;\n obj['creator-version'] = VERSION;\n obj.style = stylesheets.join('\\n');\n obj.script = scripts.join('\\n');\n obj.passages = storyPassages;\n\n return JSON.stringify(obj, null, 2);\n}\n","/**\n * IFID (Interactive Fiction IDentifier) generation and validation.\n * Ported from ifid.go.\n */\nimport { randomUUID } from 'node:crypto';\nimport type { IFID } from './types.js';\n\n/** Generate a new IFID (UUID v4, uppercase). */\nexport function generateIFID(): IFID {\n return randomUUID().toUpperCase() as IFID;\n}\n\n/** Validate and brand an IFID string. Throws on invalid input. */\nexport function createIFID(value: string): IFID {\n const err = validateIFID(value);\n if (err) throw new Error(`Invalid IFID: ${err}`);\n return value.toUpperCase() as IFID;\n}\n\n/**\n * Validate an IFID string.\n * Accepts both bare UUIDs and UUID://...// wrapped format.\n * Returns null if valid, or an error message string.\n */\nexport function validateIFID(ifid: string): string | null {\n let uuid = ifid;\n\n switch (ifid.length) {\n case 36:\n break;\n case 45: {\n if (ifid.slice(0, 7).toUpperCase() !== 'UUID://' || ifid.slice(43) !== '//') {\n return 'invalid IFID UUID://...// format';\n }\n uuid = ifid.slice(7, 43);\n break;\n }\n default:\n return `invalid IFID length: ${ifid.length}`;\n }\n\n for (let i = 0; i < uuid.length; i++) {\n const ch = uuid[i]!;\n switch (i) {\n case 8:\n case 13:\n case 18:\n case 23:\n if (ch !== '-') {\n return `invalid IFID character '${ch}' at position ${i + 1}`;\n }\n break;\n case 14:\n if (ch < '1' || ch > '5') {\n return `invalid version '${ch}' at position ${i + 1}`;\n }\n break;\n case 19:\n if (!['8', '9', 'a', 'A', 'b', 'B'].includes(ch)) {\n return `invalid variant '${ch}' at position ${i + 1}`;\n }\n break;\n default:\n if (!/^[0-9a-fA-F]$/.test(ch)) {\n return `invalid IFID hex value '${ch}' at position ${i + 1}`;\n }\n break;\n }\n }\n\n return null;\n}\n","/**\n * HTML, attribute, tiddler, and twee escaping/unescaping utilities.\n * Ported from escaping.go.\n */\n\n/** Escape the minimum characters required for HTML attribute values. */\nexport function attrEscape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n/** Escape for HTML attribute values including < and > (for spec-compliant output). */\nexport function fullAttrEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Escape the minimum characters required for general HTML content. */\nexport function htmlEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Escape for Twine 1 tiddler format. */\nexport function tiddlerEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/\\\\/g, '\\\\s')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n');\n}\n\n/** Unescape from Twine 1 tiddler format. */\nexport function tiddlerUnescape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/\\\\n/g, '\\n').replace(/\\\\t/g, '\\t').replace(/\\\\s/g, '\\\\');\n}\n\n/** Escape characters that are special in Twee passage names/tags. */\nexport function tweeEscape(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/[\\\\[\\]{}]/g, (ch) => '\\\\' + ch);\n}\n\n/** Escape a string for safe inclusion in a JavaScript string literal. */\nexport function jsStringEscape(s: string): string {\n if (s.length === 0) return s;\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t');\n}\n\n/** Sanitize a string for safe inclusion in a CSS or JS block comment. */\nexport function commentSanitize(s: string): string {\n return s.replace(/\\*\\//g, '* /');\n}\n\n/** Sanitize a string for safe inclusion in an HTML comment. */\nexport function htmlCommentSanitize(s: string): string {\n return s.replace(/-->/g, '-- >');\n}\n\n/** Apply ROT13 encoding to a string (only affects [A-Za-z]). */\nexport function rot13(s: string): string {\n if (s.length === 0) return s;\n return s.replace(/[A-Za-z]/g, (ch) => {\n const base = ch <= 'Z' ? 65 : 97;\n return String.fromCharCode(((ch.charCodeAt(0) - base + 13) % 26) + base);\n });\n}\n\n/** Unescape backslash-escaped Twee characters. */\nexport function tweeUnescape(s: string): string {\n if (s.length === 0) return s;\n let result = '';\n for (let i = 0; i < s.length; i++) {\n if (s[i] === '\\\\') {\n i++;\n if (i >= s.length) {\n result += '\\\\';\n break;\n }\n }\n result += s[i];\n }\n return result;\n}\n","/**\n * Passage helpers and output methods.\n * Ported from passage.go / passagedata.go.\n */\nimport type { Passage, PassageMetadata, OutputMode, WordCountMethod } from './types.js';\nimport { attrEscape, fullAttrEscape, htmlEscape, tiddlerEscape, tweeEscape, rot13, commentSanitize } from './escape.js';\n\n// Info passages contain structural data, metadata, and code rather than story content.\nconst INFO_PASSAGE_NAMES = new Set([\n 'StoryAuthor',\n 'StoryInit',\n 'StoryMenu',\n 'StorySubtitle',\n 'StoryTitle',\n 'PassageReady',\n 'PassageDone',\n 'PassageHeader',\n 'PassageFooter',\n 'StoryBanner',\n 'StoryCaption',\n 'MenuOptions',\n 'MenuShare',\n 'MenuStory',\n 'StoryInterface',\n 'StoryShare',\n 'StorySettings',\n 'StoryData',\n 'StoryIncludes',\n]);\n\nconst INFO_TAGS = ['annotation', 'script', 'stylesheet', 'widget'];\n\nexport function hasTag(p: Passage, tag: string): boolean {\n return p.tags.includes(tag);\n}\n\nexport function hasAnyTag(p: Passage, ...tags: string[]): boolean {\n return p.tags.some((t) => tags.includes(t));\n}\n\nexport function hasTagStartingWith(p: Passage, prefix: string): boolean {\n return p.tags.some((t) => t.startsWith(prefix));\n}\n\nexport function hasInfoTags(p: Passage): boolean {\n return hasAnyTag(p, ...INFO_TAGS) || hasTagStartingWith(p, 'Twine.');\n}\n\nexport function hasInfoName(p: Passage): boolean {\n return INFO_PASSAGE_NAMES.has(p.name);\n}\n\nexport function isInfoPassage(p: Passage): boolean {\n return hasInfoName(p) || hasInfoTags(p);\n}\n\nexport function isStoryPassage(p: Passage): boolean {\n return !hasInfoName(p) && !hasInfoTags(p);\n}\n\nexport function hasMetadataPosition(p: Passage): boolean {\n return p.metadata != null && p.metadata.position != null && p.metadata.position !== '';\n}\n\nexport function hasMetadataSize(p: Passage): boolean {\n return p.metadata != null && p.metadata.size != null && p.metadata.size !== '';\n}\n\nexport function hasAnyMetadata(p: Passage): boolean {\n if (!p.metadata) return false;\n return Object.values(p.metadata).some((v) => v != null && v !== '');\n}\n\nexport function marshalMetadata(meta: PassageMetadata): string {\n const obj: Record<string, string> = {};\n for (const [key, value] of Object.entries(meta)) {\n if (typeof value === 'string' && value) obj[key] = value;\n }\n return JSON.stringify(obj);\n}\n\nexport function unmarshalMetadata(json: string): PassageMetadata {\n const raw: unknown = JSON.parse(json);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return {};\n }\n const parsed = raw as Record<string, unknown>;\n const meta: PassageMetadata = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'string') meta[key] = value;\n }\n return meta;\n}\n\n/** Convert passage to Twee source. */\nexport function passageToTwee(p: Passage, outMode: OutputMode): string {\n let output: string;\n if (outMode === 'twee3') {\n output = ':: ' + tweeEscape(p.name);\n if (p.tags.length > 0) {\n output += ' [' + tweeEscape(p.tags.join(' ')) + ']';\n }\n if (hasAnyMetadata(p) && p.metadata) {\n output += ' ' + marshalMetadata(p.metadata);\n }\n } else {\n output = ':: ' + p.name;\n if (p.tags.length > 0) {\n output += ' [' + p.tags.join(' ') + ']';\n }\n }\n output += '\\n';\n if (p.text.length > 0) {\n output += p.text + '\\n';\n }\n output += '\\n\\n';\n return output;\n}\n\n/** Generate `<tw-passagedata>` HTML for Twine 2. */\nexport function passageToPassagedata(p: Passage, pid: number, options?: { readonly sourceInfo?: boolean }): string {\n let position: string;\n let size: string;\n\n if (hasMetadataPosition(p)) {\n position = p.metadata?.position ?? '';\n } else {\n const x = pid % 10;\n const y = Math.floor(pid / 10);\n const xp = x === 0 ? 10 : x;\n const yp = x === 0 ? y : y + 1;\n position = `${xp * 125 - 25},${yp * 125 - 25}`;\n }\n\n if (hasMetadataSize(p)) {\n size = p.metadata?.size ?? '';\n } else {\n size = '100,100';\n }\n\n let attrs = `<tw-passagedata pid=\"${pid}\" name=${quote(fullAttrEscape(p.name))} tags=${quote(attrEscape(p.tags.join(' ')))} position=${quote(attrEscape(position))} size=${quote(attrEscape(size))}`;\n if (options?.sourceInfo && p.source) {\n attrs += ` data-source-file=${quote(attrEscape(p.source.file))} data-source-line=\"${p.source.line}\"`;\n }\n return `${attrs}>${htmlEscape(p.text)}</tw-passagedata>`;\n}\n\n/** Generate `<div tiddler>` HTML for Twine 1. */\nexport function passageToTiddler(p: Passage, pid: number, obfuscateRot13 = false): string {\n let position: string;\n\n if (hasMetadataPosition(p)) {\n position = p.metadata?.position ?? '';\n } else {\n const x = pid % 10;\n const y = Math.floor(pid / 10);\n const xp = x === 0 ? 10 : x;\n const yp = x === 0 ? y : y + 1;\n position = `${xp * 140 - 130},${yp * 140 - 130}`;\n }\n\n const created = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 12);\n const content = obfuscateRot13 && p.name !== 'StorySettings' ? tiddlerEscape(rot13(p.text)) : tiddlerEscape(p.text);\n const nameComment = obfuscateRot13 ? `<!-- ${commentSanitize(p.name)} -->` : '';\n return `<div tiddler=${quote(attrEscape(p.name))} tags=${quote(attrEscape(p.tags.join(' ')))} created=${quote(created)} modifier=${quote('twee')} twine-position=${quote(attrEscape(position))}>${nameComment}${content}</div>`;\n}\n\n/**\n * Count words in a passage.\n *\n * - `'tweego'` (default): Strip newlines, strip comments, count NFKD-normalized characters, divide by 5.\n * - `'whitespace'`: Strip comments and markup, split on whitespace, count tokens.\n */\nexport function countWords(p: Passage, method: WordCountMethod = 'tweego'): number {\n switch (method) {\n case 'tweego': {\n let text = p.text;\n text = text.replace(/\\n/g, '');\n text = text.replace(/(?:\\/%.+?%\\/|\\/\\*.+?\\*\\/|<!--.+?-->)/gs, '');\n const normalized = text.normalize('NFKD');\n const count = [...normalized].length;\n if (count === 0) return 0;\n const words = Math.floor(count / 5);\n return count % 5 > 0 ? words + 1 : words;\n }\n case 'whitespace': {\n let text = p.text;\n // Strip comments\n text = text.replace(/(?:\\/%.+?%\\/|\\/\\*.+?\\*\\/|<!--.+?-->)/gs, '');\n // Strip Twine macros <<...>>\n text = text.replace(/<<[^>]*>>/g, '');\n // Strip Twine links [[...]] — keep display text\n text = text.replace(/\\[\\[([^\\]|]*?)(?:\\|[^\\]]*?)?\\]\\]/g, '$1');\n // Strip HTML tags\n text = text.replace(/<[^>]+>/g, '');\n const tokens = text.split(/\\s+/).filter((t) => t.length > 0);\n return tokens.length;\n }\n default: {\n const _exhaustive: never = method;\n throw new Error(`Unhandled word count method: ${_exhaustive as string}`);\n }\n }\n}\n\n/**\n * Apply tag aliases: for each passage carrying an alias tag, add the canonical\n * tag if not already present. Returns new passage objects where tags changed;\n * unchanged passages are returned as-is. Idempotent — safe to call multiple times.\n */\nexport function applyTagAliases(passages: readonly Passage[], aliases: Record<string, string>): Passage[] {\n const entries = Object.entries(aliases);\n if (entries.length === 0) return [...passages];\n return passages.map((p) => {\n const original = p.tags;\n const added: string[] = [];\n for (const [alias, canonical] of entries) {\n if (original.includes(alias) && !original.includes(canonical) && !added.includes(canonical)) {\n added.push(canonical);\n }\n }\n return added.length > 0 ? { ...p, tags: [...original, ...added] } : p;\n });\n}\n\nfunction quote(s: string): string {\n return `\"${s}\"`;\n}\n","/**\n * Story model + StoryData JSON marshal/unmarshal.\n * Ported from story.go + storydata.go.\n */\nimport type { Story, ReadonlyStory, Passage, Diagnostic, WordCountMethod, IFID } from './types.js';\nimport { validateIFID } from './ifid.js';\nimport { isStoryPassage, countWords } from './passage.js';\n\n/** Module-level index: maps passage names to their array indices for O(1) lookups. */\nconst passageIndex = new WeakMap<Story, Map<string, number>>();\n\nfunction getIndex(story: Story): Map<string, number> {\n let index = passageIndex.get(story);\n if (!index) {\n // Rebuild for stories not created via createStory() (e.g., tests, external code)\n index = new Map();\n for (let i = 0; i < story.passages.length; i++) {\n const passage = story.passages[i];\n if (passage) index.set(passage.name, i);\n }\n passageIndex.set(story, index);\n }\n return index;\n}\n\nexport function createStory(): Story {\n const story: Story = {\n name: '',\n ifid: '' as IFID,\n passages: [],\n legacyIFID: '' as IFID,\n twine1: { settings: new Map() },\n twine2: {\n format: '',\n formatVersion: '',\n options: new Map(),\n start: '',\n tags: '',\n tagColors: new Map(),\n zoom: 1,\n },\n };\n passageIndex.set(story, new Map());\n return story;\n}\n\nexport function storyHas(story: Story, name: string): boolean {\n return getIndex(story).has(name);\n}\n\nexport function storyIndex(story: Story, name: string): number {\n return getIndex(story).get(name) ?? -1;\n}\n\nexport function storyGet(story: Story, name: string): Passage | undefined {\n const i = storyIndex(story, name);\n return i === -1 ? undefined : story.passages[i];\n}\n\nexport function storyAppend(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n const index = getIndex(story);\n const i = index.get(p.name) ?? -1;\n if (i === -1) {\n index.set(p.name, story.passages.length);\n story.passages.push(p);\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Replacing existing passage \"${p.name}\" with duplicate.`,\n });\n story.passages[i] = p;\n }\n}\n\nexport function storyPrepend(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n const index = getIndex(story);\n const i = index.get(p.name) ?? -1;\n if (i === -1) {\n story.passages.unshift(p);\n // Rebuild index: unshift shifts all existing indices by 1\n index.clear();\n for (let j = 0; j < story.passages.length; j++) {\n const passage = story.passages[j];\n if (passage) index.set(passage.name, j);\n }\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Replacing existing passage \"${p.name}\" with duplicate.`,\n });\n story.passages[i] = p;\n }\n}\n\n// --- StoryData JSON ---\n\ninterface StoryDataJSON {\n ifid?: string;\n format?: string;\n 'format-version'?: string;\n options?: string[];\n start?: string;\n tags?: string;\n 'tag-colors'?: Record<string, string>;\n zoom?: number;\n}\n\nexport function marshalStoryData(story: Story): string {\n const data: StoryDataJSON = {};\n if (story.ifid) data.ifid = story.ifid;\n if (story.twine2.format) data.format = story.twine2.format;\n if (story.twine2.formatVersion) data['format-version'] = story.twine2.formatVersion;\n\n const options: string[] = [];\n for (const [opt, val] of story.twine2.options) {\n if (val) options.push(opt);\n }\n if (options.length > 0) data.options = options;\n\n if (story.twine2.start) data.start = story.twine2.start;\n if (story.twine2.tags) data.tags = story.twine2.tags;\n\n if (story.twine2.tagColors.size > 0) {\n data['tag-colors'] = Object.fromEntries(story.twine2.tagColors);\n }\n if (story.twine2.zoom !== 1) data.zoom = story.twine2.zoom;\n\n return JSON.stringify(data, null, '\\t');\n}\n\nexport function unmarshalStoryData(story: Story, json: string): string | null {\n let raw: unknown;\n try {\n raw = JSON.parse(json) as unknown;\n } catch (e) {\n return `Cannot unmarshal \"StoryData\"; ${e instanceof Error ? e.message : String(e)}`;\n }\n\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n return 'Cannot unmarshal \"StoryData\"; expected a JSON object';\n }\n const data = raw as StoryDataJSON;\n\n if (typeof data.ifid === 'string' && data.ifid) story.ifid = data.ifid.toUpperCase() as IFID;\n if (typeof data.format === 'string' && data.format) story.twine2.format = data.format;\n if (typeof data['format-version'] === 'string' && data['format-version'])\n story.twine2.formatVersion = data['format-version'];\n if (Array.isArray(data.options)) {\n for (const opt of data.options) {\n if (typeof opt === 'string') story.twine2.options.set(opt, true);\n }\n }\n if (typeof data.start === 'string' && data.start) story.twine2.start = data.start;\n if (typeof data.tags === 'string') story.twine2.tags = data.tags;\n if (typeof data['tag-colors'] === 'object' && data['tag-colors'] !== null && !Array.isArray(data['tag-colors'])) {\n for (const [tag, color] of Object.entries(data['tag-colors'])) {\n if (typeof color === 'string') story.twine2.tagColors.set(tag, color);\n }\n }\n if (typeof data.zoom === 'number' && data.zoom !== 0) story.twine2.zoom = data.zoom;\n\n return null;\n}\n\n// --- StorySettings (legacy) ---\n\nexport function unmarshalStorySettings(story: Story, text: string, diagnostics: Diagnostic[]): void {\n const obsolete: string[] = [];\n\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.trim();\n if (line.length === 0) continue;\n\n const colonIdx = line.indexOf(':');\n if (colonIdx === -1) {\n diagnostics.push({\n level: 'warning',\n message: `Malformed \"StorySettings\" entry; skipping \"${line}\".`,\n });\n continue;\n }\n\n const key = line.slice(0, colonIdx).trim().toLowerCase();\n const val = line\n .slice(colonIdx + 1)\n .trim()\n .toLowerCase();\n\n switch (key) {\n case 'ifid': {\n const err = validateIFID(val);\n if (err === null) {\n story.legacyIFID = val.toUpperCase() as IFID;\n }\n obsolete.push('\"ifid\"');\n continue;\n }\n case 'zoom':\n obsolete.push('\"zoom\"');\n continue;\n }\n\n story.twine1.settings.set(key, val);\n }\n\n if (obsolete.length > 0) {\n const entries = obsolete.length === 1 ? 'entry' : 'entries';\n const pronoun = obsolete.length === 1 ? 'it' : 'them';\n diagnostics.push({\n level: 'warning',\n message:\n `Detected obsolete \"StorySettings\" ${entries}: ${obsolete.join(', ')}. ` +\n `Please remove ${pronoun} from the \"StorySettings\" special passage.`,\n });\n }\n}\n\n/**\n * Process a passage and add it to the story, handling special passages.\n * Creates new passage objects where text is modified rather than mutating the input.\n */\nexport function storyAdd(story: Story, p: Passage, diagnostics: Diagnostic[]): void {\n let processed = p;\n\n switch (p.name) {\n case 'StoryIncludes':\n diagnostics.push({\n level: 'warning',\n message:\n 'Ignoring \"StoryIncludes\" compiler special passage; twee-ts allows you to specify project files and/or directories to recursively search.',\n });\n break;\n\n case 'StoryData': {\n const err = unmarshalStoryData(story, p.text);\n if (err === null) {\n // Validate the IFID if present.\n if (story.ifid.length > 0) {\n const vErr = validateIFID(story.ifid);\n if (vErr !== null) {\n diagnostics.push({\n level: 'error',\n message: `Cannot validate IFID; ${vErr}.`,\n });\n }\n }\n // Rebuild passage contents to normalize.\n processed = { ...p, text: marshalStoryData(story) };\n } else {\n diagnostics.push({\n level: 'warning',\n message: `Cannot unmarshal \"StoryData\" compiler special passage; ${err}.`,\n });\n }\n break;\n }\n\n case 'StorySettings':\n unmarshalStorySettings(story, p.text, diagnostics);\n break;\n\n case 'StoryTitle': {\n const trimmed = p.text.trim();\n processed = { ...p, text: trimmed };\n story.name = trimmed;\n break;\n }\n }\n\n storyAppend(story, processed, diagnostics);\n}\n\n/** Get story passage count and word count stats. */\nexport function getStoryStats(\n story: Story,\n wordCountMethod: WordCountMethod = 'tweego',\n): { passages: number; storyPassages: number; words: number } {\n let storyPassages = 0;\n let words = 0;\n for (const p of story.passages) {\n if (isStoryPassage(p)) {\n storyPassages++;\n words += countWords(p, wordCountMethod);\n }\n }\n return { passages: story.passages.length, storyPassages, words };\n}\n\n/**\n * Builder that separates the mutable construction phase from the immutable consumption phase.\n * During construction, the internal `Story` is mutable via `add()` and direct access.\n * After `build()`, the story is returned as `ReadonlyStory`.\n */\nexport class StoryBuilder {\n /** The mutable story, accessible during construction for loader functions. */\n readonly story: Story;\n\n constructor() {\n this.story = createStory();\n }\n\n /** Add a passage, handling special passages (StoryData, StoryTitle, etc.). */\n add(passage: Passage, diagnostics: Diagnostic[]): void {\n storyAdd(this.story, passage, diagnostics);\n }\n\n /** Check if a passage name exists. */\n has(name: string): boolean {\n return storyHas(this.story, name);\n }\n\n /** Finalize and return the story as read-only. */\n build(): ReadonlyStory {\n return this.story;\n }\n}\n","/**\n * File system utilities: path walking, file type detection, watch mode.\n * Ported from filesystem.go.\n */\nimport { readdirSync, statSync, watch as fsWatch } from 'node:fs';\nimport { resolve, relative, join } from 'node:path';\nimport { isKnownFileType } from './media-types.js';\n\n/**\n * Recursively walk directories, collecting regular file paths.\n * Filters out the output file to prevent circular compilation.\n */\nexport function getFilenames(pathnames: string[], outFilename?: string): string[] {\n const filenames: string[] = [];\n const absOutFile = outFilename ? resolve(outFilename) : '';\n\n function walk(pathname: string): void {\n let stat;\n try {\n stat = statSync(pathname);\n } catch {\n return;\n }\n\n if (stat.isFile()) {\n const abs = resolve(pathname);\n if (abs === absOutFile) return;\n const rel = relative(process.cwd(), abs);\n filenames.push(rel || abs);\n } else if (stat.isDirectory()) {\n let entries;\n try {\n entries = readdirSync(pathname);\n } catch {\n return;\n }\n for (const entry of entries) {\n walk(join(pathname, entry));\n }\n }\n }\n\n for (const pathname of pathnames) {\n walk(pathname);\n }\n\n return filenames;\n}\n\nexport interface WatchHandle {\n close(): void;\n}\n\n/**\n * Watch paths for changes, calling the build callback on known file type changes.\n * Uses debouncing to avoid rapid rebuilds.\n */\nexport function watchFilesystem(\n pathnames: string[],\n outFilename: string,\n callback: (changedFiles?: ReadonlySet<string>) => void,\n): WatchHandle {\n const absOutFile = resolve(outFilename);\n const watchers: ReturnType<typeof fsWatch>[] = [];\n let buildTimer: ReturnType<typeof setTimeout> | null = null;\n const BUILD_DEBOUNCE = 500;\n const pendingFiles = new Set<string>();\n\n function scheduleBuild(changedFile?: string): void {\n if (changedFile) pendingFiles.add(changedFile);\n if (buildTimer) clearTimeout(buildTimer);\n buildTimer = setTimeout(() => {\n buildTimer = null;\n const files = pendingFiles.size > 0 ? new Set(pendingFiles) : undefined;\n pendingFiles.clear();\n callback(files);\n }, BUILD_DEBOUNCE);\n }\n\n for (const pathname of pathnames) {\n try {\n const watcher = fsWatch(pathname, { recursive: true }, (_event, filename) => {\n if (!filename) return;\n const abs = resolve(pathname, filename);\n if (abs === absOutFile) return;\n if (isKnownFileType(filename)) {\n const rel = relative(process.cwd(), abs);\n scheduleBuild(rel || abs);\n }\n });\n watchers.push(watcher);\n } catch {\n // Ignore inaccessible paths\n }\n }\n\n // Build once initially (no changedFiles = full build).\n callback();\n\n return {\n close() {\n if (buildTimer) clearTimeout(buildTimer);\n for (const w of watchers) w.close();\n },\n };\n}\n","/**\n * Extension → MIME type mapping.\n * Ported from util.go:mediaTypeFromExt().\n */\n\nimport { extname } from 'node:path';\n\nconst MEDIA_TYPE_MAP: Record<string, string> = {\n // Audio\n aac: 'audio/aac',\n flac: 'audio/flac',\n ogg: 'audio/ogg',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n m4a: 'audio/mp4',\n oga: 'audio/ogg',\n opus: 'audio/ogg',\n wave: 'audio/wav',\n weba: 'audio/webm',\n\n // Fonts\n otf: 'font/otf',\n ttf: 'font/ttf',\n woff: 'font/woff',\n woff2: 'font/woff2',\n\n // Images\n gif: 'image/gif',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n svg: 'image/svg+xml',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n webp: 'image/webp',\n\n // Metadata\n vtt: 'text/vtt',\n\n // Video\n mp4: 'video/mp4',\n ogv: 'video/ogg',\n webm: 'video/webm',\n};\n\nexport function mediaTypeFromExt(ext: string): string {\n return MEDIA_TYPE_MAP[ext] ?? 'application/octet-stream';\n}\n\nexport function mediaTypeFromFilename(filename: string): string {\n return mediaTypeFromExt(normalizedFileExt(filename));\n}\n\nexport function normalizedFileExt(filename: string): string {\n const ext = extname(filename);\n if (!ext) return '';\n return ext.slice(1).toLowerCase();\n}\n\n/** Slugify a string for safe use as a DOM ID. */\nexport function slugify(original: string): string {\n return original.replace(/[\\x00-\\x20!-/:-@[-^`{-\\x9f]+/g, '_');\n}\n\n/** Check if a file has a known type that should be processed. */\nexport function isKnownFileType(filename: string): boolean {\n const ext = normalizedFileExt(filename);\n return KNOWN_EXTENSIONS.has(ext);\n}\n\nconst KNOWN_EXTENSIONS = new Set([\n 'tw',\n 'twee',\n 'tw2',\n 'twee2',\n 'htm',\n 'html',\n 'css',\n 'js',\n 'otf',\n 'ttf',\n 'woff',\n 'woff2',\n 'gif',\n 'jpeg',\n 'jpg',\n 'png',\n 'svg',\n 'tif',\n 'tiff',\n 'webp',\n 'aac',\n 'flac',\n 'm4a',\n 'mp3',\n 'oga',\n 'ogg',\n 'opus',\n 'wav',\n 'wave',\n 'weba',\n 'mp4',\n 'ogv',\n 'webm',\n 'vtt',\n]);\n\n/** Font format hint for @font-face. */\nexport function fontFormatHint(ext: string): string {\n switch (ext) {\n case 'ttf':\n return 'truetype';\n case 'otf':\n return 'opentype';\n default:\n return ext;\n }\n}\n","/**\n * Story format discovery, loading, and SemVer matching.\n * Ported from formats.go + config.go.\n */\nimport { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { StoryFormatInfo, Twine2FormatJSON } from './types.js';\nimport { readUTF8 } from './util.js';\n\n/**\n * Attempt to fix non-strict JSON (trailing commas, single quotes, unquoted keys).\n */\nfunction relaxedJSONParse(json: string): unknown {\n // First try standard parse\n try {\n return JSON.parse(json);\n } catch {\n // fall through to relaxed parsing\n }\n\n let fixed = json;\n\n // Replace single-quoted string values with double-quoted\n // Match single-quoted strings: 'value' -> \"value\"\n fixed = fixed.replace(/'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g, '\"$1\"');\n\n // Add quotes around unquoted property names\n // Match word chars before a colon that aren't already quoted\n fixed = fixed.replace(/(?<=^|[{,]\\s*)([A-Za-z_$][A-Za-z0-9_$]*)\\s*:/gm, '\"$1\":');\n\n // Remove trailing commas before } or ]\n fixed = fixed.replace(/,\\s*([}\\]])/g, '$1');\n\n return JSON.parse(fixed);\n}\n\n/**\n * Parse the Twine 2 format.js JSON chunk.\n * Handles Harlowe's malformed JSON by stripping the \"setup\" function property.\n * Per spec, the name key is Optional.\n */\nexport function parseFormatJSON(source: string, formatId: string): Twine2FormatJSON | null {\n const first = source.indexOf('{');\n const last = source.lastIndexOf('}');\n if (first === -1 || last === -1) return null;\n\n let chunk = source.slice(first, last + 1);\n\n const parse = (json: string): Twine2FormatJSON | null => {\n const raw: unknown = relaxedJSONParse(json);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return null;\n const obj = raw as Record<string, unknown>;\n // version and source are required; name is optional per spec\n if (typeof obj.version !== 'string' || typeof obj.source !== 'string') return null;\n // Validate version is semver\n if (!parseSemver(obj.version)) return null;\n const name = typeof obj.name === 'string' ? obj.name : 'Untitled Story Format';\n const result: Twine2FormatJSON = {\n name,\n version: obj.version,\n source: obj.source,\n proofing: obj.proofing === true,\n };\n if (typeof obj.author === 'string') result.author = obj.author;\n if (typeof obj.description === 'string') result.description = obj.description;\n if (typeof obj.image === 'string') result.image = obj.image;\n if (typeof obj.url === 'string') result.url = obj.url;\n if (typeof obj.license === 'string') result.license = obj.license;\n return result;\n };\n\n try {\n return parse(chunk);\n } catch {\n // Harlowe workaround: strip the \"setup\" function property\n if (formatId.toLowerCase().startsWith('harlowe')) {\n const setupIdx = chunk.lastIndexOf(',\"setup\": function');\n if (setupIdx !== -1) {\n chunk = chunk.slice(0, setupIdx) + '}';\n try {\n return parse(chunk);\n } catch {\n // fall through\n }\n }\n }\n return null;\n }\n}\n\n/**\n * Discover all story formats in the given search directories.\n * Implements SemVer-based version pruning: within each (name, major) group,\n * only the highest minor.patch survives.\n */\nexport function discoverFormats(searchDirs: string[]): Map<string, StoryFormatInfo> {\n const formats = new Map<string, StoryFormatInfo>();\n const baseFilenames = ['format.js', 'header.html'];\n\n for (const searchDir of searchDirs) {\n try {\n const stat = statSync(searchDir);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n\n let entries;\n try {\n entries = readdirSync(searchDir);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const formatDir = join(searchDir, entry);\n try {\n if (!statSync(formatDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n for (const baseFilename of baseFilenames) {\n const formatFilename = join(formatDir, baseFilename);\n try {\n const stat = statSync(formatFilename);\n if (!stat.isFile()) continue;\n } catch {\n continue;\n }\n\n const isTwine2 = baseFilename === 'format.js';\n const format: StoryFormatInfo = {\n id: entry,\n filename: formatFilename,\n isTwine2,\n name: '',\n version: '',\n proofing: false,\n };\n\n if (isTwine2) {\n try {\n const source = readUTF8(formatFilename);\n const data = parseFormatJSON(source, entry);\n if (!data) continue;\n format.name = data.name;\n format.version = data.version;\n format.proofing = data.proofing ?? false;\n if (data.author) format.author = data.author;\n if (data.description) format.description = data.description;\n if (data.image) format.image = data.image;\n if (data.url) format.url = data.url;\n if (data.license) format.license = data.license;\n } catch {\n continue;\n }\n } else {\n // Twine 1 format: use folder name as default name\n format.name = entry;\n }\n\n formats.set(entry, format);\n break; // Found format file for this directory\n }\n }\n }\n\n // SemVer pruning: for formats with the same name, within each major version\n // keep only the highest minor.patch. Also, same name+version from different\n // directories: keep the first one found.\n pruneFormats(formats);\n\n return formats;\n}\n\n/**\n * Prune formats by SemVer: within each (name, major) group,\n * keep only the highest version. First-found wins for same name+version.\n */\nfunction pruneFormats(formats: Map<string, StoryFormatInfo>): void {\n // Group by (name, major) -> best entry\n const bestByNameMajor = new Map<string, { id: string; version: [number, number, number] }>();\n // Track seen name+version combos (first wins)\n const seenNameVersion = new Set<string>();\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || !f.name || !f.version) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n\n const nameVersionKey = `${f.name}@${f.version}`;\n if (seenNameVersion.has(nameVersionKey)) {\n // Duplicate name+version: remove the later one\n formats.delete(id);\n continue;\n }\n seenNameVersion.add(nameVersionKey);\n\n const groupKey = `${f.name}@${v[0]}`;\n const existing = bestByNameMajor.get(groupKey);\n if (!existing || semverCompare(v, existing.version) > 0) {\n bestByNameMajor.set(groupKey, { id, version: v });\n }\n }\n\n // Remove all non-best entries within each group\n for (const [id, f] of [...formats]) {\n if (!f.isTwine2 || !f.name || !f.version) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n\n const groupKey = `${f.name}@${v[0]}`;\n const best = bestByNameMajor.get(groupKey);\n if (best && best.id !== id) {\n formats.delete(id);\n }\n }\n}\n\n/**\n * Get the default format search directories.\n */\nexport function getFormatSearchDirs(extraPaths: string[] = [], useTweegoPath = true): string[] {\n const subdirNames = ['storyformats', '.storyformats', 'story-formats', 'storyFormats', 'targets'];\n const basePaths = new Set<string>();\n\n // Home directory\n try {\n basePaths.add(homedir());\n } catch {\n // ignore\n }\n\n // Working directory\n basePaths.add(process.cwd());\n\n const dirs: string[] = [];\n for (const base of basePaths) {\n for (const sub of subdirNames) {\n const dir = join(base, sub);\n try {\n if (statSync(dir).isDirectory()) {\n dirs.push(dir);\n }\n } catch {\n // skip\n }\n }\n }\n\n // Extra user-provided paths\n dirs.push(...extraPaths);\n\n // TWEEGO_PATH environment variable\n if (useTweegoPath) {\n const tweegoPath = process.env.TWEEGO_PATH;\n if (tweegoPath) {\n dirs.push(...tweegoPath.split(process.platform === 'win32' ? ';' : ':'));\n }\n }\n\n return dirs;\n}\n\n/** Parse a simple semver string into [major, minor, patch]. */\nexport function parseSemver(v: string): [number, number, number] | null {\n const m = /^(\\d+)\\.(\\d+)\\.(\\d+)/.exec(v);\n if (!m) return null;\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\nexport function semverCompare(a: [number, number, number], b: [number, number, number]): number {\n const [aMajor, aMinor, aPatch] = a;\n const [bMajor, bMinor, bPatch] = b;\n if (aMajor !== bMajor) return aMajor - bMajor;\n if (aMinor !== bMinor) return aMinor - bMinor;\n if (aPatch !== bPatch) return aPatch - bPatch;\n return 0;\n}\n\n/** Get format ID from Twine 2 name, picking the greatest version. */\nexport function getFormatIdByName(formats: Map<string, StoryFormatInfo>, name: string): string | undefined {\n let bestVersion: [number, number, number] | null = null;\n let bestId: string | undefined;\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || f.name !== name) continue;\n const v = parseSemver(f.version);\n if (!v) continue;\n if (!bestVersion || semverCompare(v, bestVersion) > 0) {\n bestVersion = v;\n bestId = id;\n }\n }\n\n return bestId;\n}\n\n/** Get format ID from Twine 2 name and version, using SemVer major matching. */\nexport function getFormatIdByNameAndVersion(\n formats: Map<string, StoryFormatInfo>,\n name: string,\n version: string,\n): string | undefined {\n const wanted = parseSemver(version);\n let bestVersion: [number, number, number] | null = null;\n let bestId: string | undefined;\n\n for (const [id, f] of formats) {\n if (!f.isTwine2 || f.name !== name) continue;\n const have = parseSemver(f.version);\n if (!have) continue;\n\n if (wanted === null || (have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n if (!bestVersion || semverCompare(have, bestVersion) > 0) {\n bestVersion = have;\n bestId = id;\n }\n }\n }\n\n return bestId;\n}\n\n/** Read the story format source (for Twine 2, extract the `source` property from JSON). */\nexport function readFormatSource(format: StoryFormatInfo): string {\n const source = readUTF8(format.filename);\n if (format.isTwine2) {\n const data = parseFormatJSON(source, format.id);\n if (!data) throw new Error(`Cannot parse format ${format.id} JSON`);\n return data.source;\n }\n return source;\n}\n\n/** Read a file as UTF-8 (re-exported for loader use). */\nexport { readUTF8 as readFileUTF8 } from './util.js';\n","/**\n * Shared file I/O utilities.\n */\nimport { readFileSync } from 'node:fs';\nimport { parse as parsePath } from 'node:path';\n\n/** Read a file as UTF-8 with BOM stripping and line ending normalization. */\nexport function readUTF8(filename: string): string {\n let content = readFileSync(filename, 'utf-8');\n if (content.charCodeAt(0) === 0xfeff) content = content.slice(1);\n content = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return content;\n}\n\n/** Read a file as base64. */\nexport function readBase64(filename: string): string {\n return readFileSync(filename).toString('base64');\n}\n\n/** Get the filename without extension, falling back to the full basename for dotfiles. */\nexport function baseNameWithoutExt(filename: string): string {\n const { name, ext } = parsePath(filename);\n return name || ext;\n}\n","/**\n * File loading: dispatch by file extension.\n * Ported from storyload.go.\n */\nimport { basename } from 'node:path';\nimport { statSync } from 'node:fs';\nimport type { Story, Diagnostic, InlineSource, Passage, FileCacheEntry } from './types.js';\nimport { normalizedFileExt, mediaTypeFromFilename, mediaTypeFromExt, fontFormatHint } from './media-types.js';\nimport { storyAdd, storyPrepend } from './story.js';\nimport { parseTwee } from './parser.js';\nimport { decompileHTML } from './html-parser.js';\nimport { readUTF8, readBase64, baseNameWithoutExt } from './util.js';\n\ninterface LoadOptions {\n trim?: boolean;\n twee2Compat?: boolean;\n}\n\n/**\n * Load all source files into a story.\n */\nexport function loadSources(\n story: Story,\n filenames: string[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n processedFiles: Set<string>,\n): void {\n for (const filename of filenames) {\n if (processedFiles.has(filename)) {\n diagnostics.push({ level: 'warning', message: `load ${filename}: Skipping duplicate.` });\n continue;\n }\n\n const ext = normalizedFileExt(filename);\n try {\n switch (ext) {\n case 'tw':\n case 'twee':\n loadTwee(story, filename, opts, diagnostics);\n break;\n case 'tw2':\n case 'twee2':\n loadTwee(story, filename, { ...opts, twee2Compat: true }, diagnostics);\n break;\n case 'htm':\n case 'html':\n loadHTML(story, filename, diagnostics);\n break;\n case 'css':\n loadTagged(story, 'stylesheet', filename, diagnostics);\n break;\n case 'js':\n loadTagged(story, 'script', filename, diagnostics);\n break;\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n loadFont(story, filename, diagnostics);\n break;\n case 'gif':\n case 'jpeg':\n case 'jpg':\n case 'png':\n case 'svg':\n case 'tif':\n case 'tiff':\n case 'webp':\n loadMedia(story, 'Twine.image', filename, diagnostics);\n break;\n case 'aac':\n case 'flac':\n case 'm4a':\n case 'mp3':\n case 'oga':\n case 'ogg':\n case 'opus':\n case 'wav':\n case 'wave':\n case 'weba':\n loadMedia(story, 'Twine.audio', filename, diagnostics);\n break;\n case 'mp4':\n case 'ogv':\n case 'webm':\n loadMedia(story, 'Twine.video', filename, diagnostics);\n break;\n case 'vtt':\n loadMedia(story, 'Twine.vtt', filename, diagnostics);\n break;\n default:\n continue;\n }\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `load ${filename}: ${e instanceof Error ? e.message : String(e)}`,\n file: filename,\n });\n continue;\n }\n processedFiles.add(filename);\n }\n\n // Prepend StoryTitle if we have a name but no StoryTitle passage.\n if (story.name !== '' && !story.passages.some((p) => p.name === 'StoryTitle')) {\n storyPrepend(story, { name: 'StoryTitle', tags: [], text: story.name }, diagnostics);\n }\n}\n\n/**\n * Load inline sources (string content or InlineSource objects).\n */\nexport function loadInlineSources(\n story: Story,\n sources: (string | InlineSource)[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n): void {\n for (const source of sources) {\n if (typeof source === 'string') {\n // Treat as a file path — handled externally\n continue;\n }\n const content = typeof source.content === 'string' ? source.content : source.content.toString('utf-8');\n\n const ext = normalizedFileExt(source.filename);\n if (ext === 'tw' || ext === 'twee' || ext === 'tw2' || ext === 'twee2' || !ext) {\n const twee2 = ext === 'tw2' || ext === 'twee2' || opts.twee2Compat;\n const result = parseTwee(content, {\n filename: source.filename,\n trim: opts.trim ?? true,\n twee2Compat: twee2,\n });\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n }\n }\n}\n\ninterface ParseResult {\n passages: Passage[];\n diagnostics: Diagnostic[];\n}\n\nfunction parseTweeFile(filename: string, opts: LoadOptions): ParseResult {\n const source = readUTF8(filename);\n const result = parseTwee(source, {\n filename,\n trim: opts.trim ?? true,\n twee2Compat: opts.twee2Compat ?? false,\n });\n return { passages: result.passages, diagnostics: [...result.diagnostics] };\n}\n\nfunction parseTaggedFile(tag: string, filename: string): ParseResult {\n const source = readUTF8(filename);\n return { passages: [{ name: basename(filename), tags: [tag], text: source }], diagnostics: [] };\n}\n\nfunction parseMediaFile(tag: string, filename: string): ParseResult {\n const source = readBase64(filename);\n const name = baseNameWithoutExt(filename);\n return {\n passages: [{ name, tags: [tag], text: `data:${mediaTypeFromFilename(filename)};base64,${source}` }],\n diagnostics: [],\n };\n}\n\nfunction parseFontFile(filename: string): ParseResult {\n const source = readBase64(filename);\n const name = basename(filename);\n const family = baseNameWithoutExt(filename);\n const ext = normalizedFileExt(filename);\n const mediaType = mediaTypeFromExt(ext);\n const hint = fontFormatHint(ext);\n return {\n passages: [\n {\n name,\n tags: ['stylesheet'],\n text: `@font-face {\\n\\tfont-family: \"${family}\";\\n\\tsrc: url(\"data:${mediaType};base64,${source}\") format(\"${hint}\");\\n}`,\n },\n ],\n diagnostics: [],\n };\n}\n\nfunction parseHTMLFile(filename: string): ParseResult {\n const source = readUTF8(filename);\n const result = decompileHTML(source);\n return { passages: result.story.passages, diagnostics: [...result.diagnostics] };\n}\n\nfunction parseFile(filename: string, opts: LoadOptions): ParseResult | undefined {\n const ext = normalizedFileExt(filename);\n switch (ext) {\n case 'tw':\n case 'twee':\n return parseTweeFile(filename, opts);\n case 'tw2':\n case 'twee2':\n return parseTweeFile(filename, { ...opts, twee2Compat: true });\n case 'htm':\n case 'html':\n return parseHTMLFile(filename);\n case 'css':\n return parseTaggedFile('stylesheet', filename);\n case 'js':\n return parseTaggedFile('script', filename);\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n return parseFontFile(filename);\n case 'gif':\n case 'jpeg':\n case 'jpg':\n case 'png':\n case 'svg':\n case 'tif':\n case 'tiff':\n case 'webp':\n return parseMediaFile('Twine.image', filename);\n case 'aac':\n case 'flac':\n case 'm4a':\n case 'mp3':\n case 'oga':\n case 'ogg':\n case 'opus':\n case 'wav':\n case 'wave':\n case 'weba':\n return parseMediaFile('Twine.audio', filename);\n case 'mp4':\n case 'ogv':\n case 'webm':\n return parseMediaFile('Twine.video', filename);\n case 'vtt':\n return parseMediaFile('Twine.vtt', filename);\n default:\n return undefined;\n }\n}\n\nfunction loadHTML(story: Story, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseHTMLFile(filename);\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadTwee(story: Story, filename: string, opts: LoadOptions, diagnostics: Diagnostic[]): void {\n const result = parseTweeFile(filename, opts);\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadTagged(story: Story, tag: string, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseTaggedFile(tag, filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadMedia(story: Story, tag: string, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseMediaFile(tag, filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\nfunction loadFont(story: Story, filename: string, diagnostics: Diagnostic[]): void {\n const result = parseFontFile(filename);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n}\n\n/**\n * Load sources with mtime-based caching for incremental rebuilds.\n * Always creates a fresh Story; cached passages are replayed via storyAdd().\n */\nexport function loadSourcesCached(\n story: Story,\n filenames: string[],\n opts: LoadOptions,\n diagnostics: Diagnostic[],\n processedFiles: Set<string>,\n cache: Map<string, FileCacheEntry>,\n changedFiles?: ReadonlySet<string>,\n): void {\n const currentFiles = new Set<string>();\n\n for (const filename of filenames) {\n if (processedFiles.has(filename)) {\n diagnostics.push({ level: 'warning', message: `load ${filename}: Skipping duplicate.` });\n continue;\n }\n\n currentFiles.add(filename);\n const cached = cache.get(filename);\n\n // If changedFiles is provided and this file isn't changed and we have a cache hit, skip stat\n if (changedFiles && cached && !changedFiles.has(filename)) {\n diagnostics.push(...cached.diagnostics);\n for (const p of cached.passages) {\n storyAdd(story, p, diagnostics);\n }\n processedFiles.add(filename);\n continue;\n }\n\n // stat the file to check mtime\n let mtimeMs: number;\n try {\n mtimeMs = statSync(filename).mtimeMs;\n } catch {\n // File may have been deleted between getFilenames and here\n continue;\n }\n\n // Cache hit with matching mtime: replay\n if (cached && cached.mtimeMs === mtimeMs) {\n diagnostics.push(...cached.diagnostics);\n for (const p of cached.passages) {\n storyAdd(story, p, diagnostics);\n }\n processedFiles.add(filename);\n continue;\n }\n\n // Cache miss: parse and store\n try {\n const result = parseFile(filename, opts);\n if (!result) continue;\n\n cache.set(filename, {\n mtimeMs,\n passages: result.passages,\n diagnostics: result.diagnostics,\n });\n\n diagnostics.push(...result.diagnostics);\n for (const p of result.passages) {\n storyAdd(story, p, diagnostics);\n }\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `load ${filename}: ${e instanceof Error ? e.message : String(e)}`,\n file: filename,\n });\n continue;\n }\n processedFiles.add(filename);\n }\n\n // Purge cache entries for deleted files\n for (const key of cache.keys()) {\n if (!currentFiles.has(key)) {\n cache.delete(key);\n }\n }\n\n // Prepend StoryTitle if we have a name but no StoryTitle passage.\n if (story.name !== '' && !story.passages.some((p) => p.name === 'StoryTitle')) {\n storyPrepend(story, { name: 'StoryTitle', tags: [], text: story.name }, diagnostics);\n }\n}\n","/**\n * All public interfaces for twee-ts.\n */\n\n// --- Output modes ---\n\nexport type OutputMode = 'html' | 'twee3' | 'twee1' | 'twine2-archive' | 'twine1-archive' | 'json';\n\n// --- Word count ---\n\nexport type WordCountMethod = 'tweego' | 'whitespace';\n\n// --- Source input ---\n\nexport type InlineSource = { filename: string; content: string | Buffer };\nexport type SourceInput = string | InlineSource;\n\n// --- Compile options ---\n\nexport interface CompileOptions {\n /** Files, directories, or inline sources to compile. */\n sources: SourceInput[];\n /** Output mode. Default: 'html'. */\n outputMode?: OutputMode;\n /** Story format directory ID (e.g. 'sugarcube-2'). */\n formatId?: string;\n /** Name of the starting passage. Default: 'Start'. */\n startPassage?: string;\n /** Extra directories to search for story formats. */\n formatPaths?: string[];\n /** Also search TWEEGO_PATH env for formats. Default: true. */\n useTweegoPath?: boolean;\n /** Module files to inject into <head>. */\n modules?: string[];\n /** Raw HTML file to append to <head>. */\n headFile?: string;\n /** Trim passage whitespace. Default: true. */\n trim?: boolean;\n /** Twee2 compatibility mode. Default: false. */\n twee2Compat?: boolean;\n /** Enable debug/test mode option. Default: false. */\n testMode?: boolean;\n /** URLs to SFA-compatible index.json files for remote format lookup. */\n formatIndices?: string[];\n /** Direct URLs to format.js files. */\n formatUrls?: string[];\n /** Disable remote format fetching. Default: false. */\n noRemote?: boolean;\n /** Map alias tags to canonical special tags (e.g. { library: 'script' }). */\n tagAliases?: Record<string, string>;\n /** Emit source file and line as data- attributes on passage elements. Default: false. */\n sourceInfo?: boolean;\n /** Word counting method. Default: 'tweego'. */\n wordCountMethod?: WordCountMethod;\n}\n\nexport interface CompileToFileOptions extends CompileOptions {\n /** Output file path. */\n outFile: string;\n}\n\nexport interface WatchOptions extends CompileToFileOptions {\n /** Called after each successful rebuild. */\n onBuild?: (result: CompileResult) => void;\n /** Called on build errors. */\n onError?: (error: Error) => void;\n}\n\n// --- Compile result ---\n\nexport type Diagnostic =\n | { level: 'warning'; message: string; file?: string; line?: number }\n | { level: 'error'; message: string; file?: string; line?: number; fatal?: boolean };\n\nexport interface CompileResult {\n /** The compiled output string (HTML, Twee, JSON, etc.). */\n output: string;\n /** The parsed story model (read-only after compilation). */\n story: ReadonlyStory;\n /** The format used for compilation (undefined for non-HTML modes). */\n format?: StoryFormatInfo;\n /** Collected diagnostics. */\n diagnostics: Diagnostic[];\n /** Compilation statistics. */\n stats: CompileStats;\n}\n\nexport interface CompileStats {\n passages: number;\n storyPassages: number;\n words: number;\n files: string[];\n}\n\n// --- Passage ---\n\nexport interface SourceLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface PassageMetadata {\n position?: string;\n size?: string;\n [key: string]: string | undefined;\n}\n\nexport interface Passage {\n name: string;\n tags: string[];\n text: string;\n metadata?: PassageMetadata;\n source?: SourceLocation;\n}\n\n// --- Branded types ---\n\nexport type IFID = string & { readonly __brand: 'IFID' };\n\n// --- Story ---\n\nexport interface Twine1Metadata {\n settings: Map<string, string>;\n}\n\nexport interface Twine2Metadata {\n format: string;\n formatVersion: string;\n options: Map<string, boolean>;\n start: string;\n tags: string;\n tagColors: Map<string, string>;\n zoom: number;\n}\n\nexport interface Story {\n name: string;\n ifid: IFID;\n passages: Passage[];\n legacyIFID: IFID;\n twine1: Twine1Metadata;\n twine2: Twine2Metadata;\n}\n\n// --- Readonly story (post-construction) ---\n\nexport type ReadonlyPassage = Readonly<Passage> & {\n readonly tags: readonly string[];\n};\n\nexport type ReadonlyStory = Readonly<Omit<Story, 'passages' | 'twine1' | 'twine2'>> & {\n readonly passages: readonly ReadonlyPassage[];\n readonly twine1: Readonly<Omit<Twine1Metadata, 'settings'>> & {\n readonly settings: ReadonlyMap<string, string>;\n };\n readonly twine2: Readonly<Omit<Twine2Metadata, 'options' | 'tagColors'>> & {\n readonly options: ReadonlyMap<string, boolean>;\n readonly tagColors: ReadonlyMap<string, string>;\n };\n};\n\n// --- Story format ---\n\nexport interface StoryFormatInfo {\n id: string;\n filename: string;\n isTwine2: boolean;\n name: string;\n version: string;\n proofing: boolean;\n author?: string;\n description?: string;\n image?: string;\n url?: string;\n license?: string;\n}\n\nexport interface Twine2FormatJSON {\n name: string;\n version: string;\n proofing?: boolean;\n source: string;\n author?: string;\n description?: string;\n image?: string;\n url?: string;\n license?: string;\n}\n\n// --- Lexer ---\n\nexport const ItemType = {\n Error: 0,\n EOF: 1,\n Header: 2,\n Name: 3,\n Tags: 4,\n Metadata: 5,\n Content: 6,\n} as const;\nexport type ItemType = (typeof ItemType)[keyof typeof ItemType];\n\nexport interface LexerItem {\n type: ItemType;\n line: number;\n pos: number;\n val: string;\n}\n\n// --- Story Format Archive (SFA) ---\n\nexport interface SFAIndexEntry {\n name: string;\n version: string;\n proofing: boolean;\n files: string[];\n checksums: Record<string, string>;\n}\n\nexport interface SFAIndex {\n twine1: SFAIndexEntry[];\n twine2: SFAIndexEntry[];\n}\n\n// --- Incremental compilation cache ---\n\nexport interface FileCacheEntry {\n readonly mtimeMs: number;\n readonly passages: readonly Passage[];\n readonly diagnostics: readonly Diagnostic[];\n}\n\n// --- Config file ---\n\nexport interface TweeTsConfig {\n sources?: string[];\n output?: string;\n outputMode?: OutputMode;\n formatId?: string;\n startPassage?: string;\n formatPaths?: string[];\n formatIndices?: string[];\n formatUrls?: string[];\n useTweegoPath?: boolean;\n modules?: string[];\n headFile?: string;\n trim?: boolean;\n twee2Compat?: boolean;\n testMode?: boolean;\n noRemote?: boolean;\n tagAliases?: Record<string, string>;\n sourceInfo?: boolean;\n wordCountMethod?: WordCountMethod;\n}\n","/**\n * Twee 3 state-machine lexer implemented as a synchronous generator.\n * Ported from tweelexer.go — Go channels become `yield`.\n */\nimport type { LexerItem } from './types.js';\nimport { ItemType } from './types.js';\n\nconst EOF = -1;\nconst HEADER_DELIM = '::';\nconst NEWLINE_HEADER_DELIM = '\\n::';\n\ntype StateFn = ((ctx: LexerContext) => StateFn | null) | null;\n\nclass LexerContext {\n readonly input: string;\n line = 1;\n start = 0;\n pos = 0;\n private items: LexerItem[] = [];\n\n constructor(input: string) {\n this.input = input;\n }\n\n next(): number {\n if (this.pos >= this.input.length) return EOF;\n const ch = this.input.charCodeAt(this.pos);\n this.pos++;\n if (ch === 0x0a) this.line++;\n return ch;\n }\n\n peek(): number {\n if (this.pos >= this.input.length) return EOF;\n return this.input.charCodeAt(this.pos);\n }\n\n backup(): void {\n if (this.pos > this.start) {\n this.pos--;\n if (this.input.charCodeAt(this.pos) === 0x0a) this.line--;\n } else {\n throw new Error('backup would leave pos < start');\n }\n }\n\n // Line-counting invariant: next() increments this.line for each newline during\n // character-by-character scanning. However, Content items are produced by jumping\n // this.pos directly (e.g. via indexOf) without calling next(), so those newlines\n // haven't been counted yet. emit() re-counts newlines in [start, pos) for Content\n // items to compensate. This is safe because this.start is reset to this.pos after\n // every emit(), so no range is ever counted twice.\n emit(type: ItemType): void {\n const val = this.input.slice(this.start, this.pos);\n this.items.push({ type, line: this.line, pos: this.start, val });\n if (type === ItemType.Content) {\n for (let i = this.start; i < this.pos; i++) {\n if (this.input.charCodeAt(i) === 0x0a) this.line++;\n }\n }\n this.start = this.pos;\n }\n\n ignore(): void {\n for (let i = this.start; i < this.pos; i++) {\n if (this.input.charCodeAt(i) === 0x0a) this.line++;\n }\n this.start = this.pos;\n }\n\n acceptRun(valid: string): void {\n let ch: number;\n for (ch = this.next(); ch !== EOF && valid.includes(String.fromCharCode(ch)); ch = this.next()) {\n // consume\n }\n if (ch !== EOF) this.backup();\n }\n\n errorf(message: string): null {\n this.items.push({\n type: ItemType.Error,\n line: this.line,\n pos: this.start,\n val: message,\n });\n return null;\n }\n\n /** Drain all pending items and return them. */\n drainItems(): LexerItem[] {\n const result = this.items;\n this.items = [];\n return result;\n }\n}\n\nfunction acceptQuoted(ctx: LexerContext, quote: number): string | null {\n for (;;) {\n const ch = ctx.next();\n switch (ch) {\n case 0x5c: {\n // backslash\n const r = ctx.next();\n if (r !== 0x0a && r !== EOF) break;\n // fall through\n }\n // falls through\n case 0x0a:\n case EOF:\n return 'unterminated quoted string';\n default:\n if (ch === quote) return null;\n break;\n }\n }\n}\n\n// --- State functions ---\n\nfunction lexProlog(ctx: LexerContext): StateFn {\n if (ctx.input.startsWith(HEADER_DELIM, ctx.pos)) {\n return lexHeaderDelim;\n }\n const i = ctx.input.indexOf(NEWLINE_HEADER_DELIM, ctx.pos);\n if (i > -1) {\n ctx.pos = i + 1; // skip to the newline, then past it\n ctx.ignore();\n return lexHeaderDelim;\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexContent(ctx: LexerContext): StateFn {\n if (ctx.input.startsWith(HEADER_DELIM, ctx.pos)) {\n return lexHeaderDelim;\n }\n const i = ctx.input.indexOf(NEWLINE_HEADER_DELIM, ctx.pos);\n if (i > -1) {\n ctx.pos = i + 1;\n ctx.emit(ItemType.Content);\n return lexHeaderDelim;\n }\n ctx.pos = ctx.input.length;\n if (ctx.pos > ctx.start) {\n ctx.emit(ItemType.Content);\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexHeaderDelim(ctx: LexerContext): StateFn {\n ctx.pos += HEADER_DELIM.length;\n ctx.emit(ItemType.Header);\n return lexName;\n}\n\nfunction lexName(ctx: LexerContext): StateFn {\n let r: number;\n outer: for (;;) {\n r = ctx.next();\n switch (r) {\n case 0x5c: {\n // backslash\n const next = ctx.next();\n if (next !== 0x0a && next !== EOF) break;\n // fall through to terminators\n r = next;\n }\n // falls through\n case 0x5b: // [\n case 0x5d: // ]\n case 0x7b: // {\n case 0x7d: // }\n case 0x0a: // \\n\n case EOF:\n if (r !== EOF) ctx.backup();\n break outer;\n }\n }\n // Always emit a name item, even if empty.\n ctx.emit(ItemType.Name);\n\n switch (r) {\n case 0x5b:\n return lexTags; // [\n case 0x5d:\n return ctx.errorf(`unexpected right square bracket ']'`);\n case 0x7b:\n return lexMetadata; // {\n case 0x7d:\n return ctx.errorf(`unexpected right curly brace '}'`);\n case 0x0a: // newline\n ctx.pos++;\n ctx.ignore();\n return lexContent;\n }\n ctx.emit(ItemType.EOF);\n return null;\n}\n\nfunction lexNextOptionalBlock(ctx: LexerContext): StateFn {\n // Consume whitespace.\n ctx.acceptRun(' \\t');\n ctx.ignore();\n\n const r = ctx.peek();\n switch (r) {\n case 0x5b:\n return lexTags; // [\n case 0x5d:\n return ctx.errorf(`unexpected right square bracket ']'`);\n case 0x7b:\n return lexMetadata; // {\n case 0x7d:\n return ctx.errorf(`unexpected right curly brace '}'`);\n case 0x0a: // newline\n ctx.pos++;\n ctx.ignore();\n return lexContent;\n case EOF:\n ctx.emit(ItemType.EOF);\n return null;\n }\n return ctx.errorf(`illegal character '${String.fromCharCode(r)}' amid the optional blocks`);\n}\n\nfunction lexTags(ctx: LexerContext): StateFn {\n // Consume the left delimiter '['.\n ctx.pos++;\n\n for (;;) {\n const r = ctx.next();\n switch (r) {\n case 0x5c: {\n // backslash\n const next = ctx.next();\n if (next !== 0x0a && next !== EOF) break;\n // fall through\n }\n // falls through\n case 0x0a:\n case EOF:\n if (r === 0x0a) ctx.backup();\n return ctx.errorf('unterminated tag block');\n case 0x5d: // ]\n if (ctx.pos > ctx.start) ctx.emit(ItemType.Tags);\n return lexNextOptionalBlock;\n case 0x5b: // [\n return ctx.errorf(`unexpected left square bracket '['`);\n case 0x7b: // {\n return ctx.errorf(`unexpected left curly brace '{'`);\n case 0x7d: // }\n return ctx.errorf(`unexpected right curly brace '}'`);\n }\n }\n}\n\nfunction lexMetadata(ctx: LexerContext): StateFn {\n // Consume the left delimiter '{'.\n ctx.pos++;\n\n let depth = 1;\n for (;;) {\n const r = ctx.next();\n switch (r) {\n case 0x22: {\n // double quote\n const err = acceptQuoted(ctx, 0x22);\n if (err) return ctx.errorf(err);\n break;\n }\n case 0x0a: // newline\n ctx.backup();\n // falls through\n case EOF:\n return ctx.errorf('unterminated metadata block');\n case 0x7b: // {\n depth++;\n break;\n case 0x7d: // }\n depth--;\n if (depth === 0) {\n if (ctx.pos > ctx.start) ctx.emit(ItemType.Metadata);\n return lexNextOptionalBlock;\n }\n break;\n }\n }\n}\n\n/**\n * Twee 3 lexer — yields LexerItem tokens from Twee source text.\n *\n * In the Go reference, this uses goroutines and channels.\n * Here we use a synchronous generator that accumulates items per state step.\n */\nexport function* tweeLexer(input: string): Generator<LexerItem, void, undefined> {\n const ctx = new LexerContext(input);\n let state: StateFn = lexProlog;\n while (state !== null) {\n state = state(ctx);\n const items = ctx.drainItems();\n for (const item of items) {\n yield item;\n }\n }\n // Drain any remaining items.\n const remaining = ctx.drainItems();\n for (const item of remaining) {\n yield item;\n }\n}\n\n/** Convenience class wrapper for the lexer generator. */\nexport class TweeLexer {\n private gen: Generator<LexerItem, void, undefined>;\n\n constructor(input: string) {\n this.gen = tweeLexer(input);\n }\n\n nextItem(): { item: LexerItem; done: boolean } {\n const result = this.gen.next();\n if (result.done) {\n return { item: { type: ItemType.EOF, line: 0, pos: 0, val: '' }, done: true };\n }\n return { item: result.value, done: false };\n }\n\n *[Symbol.iterator](): Generator<LexerItem, void, undefined> {\n yield* this.gen;\n }\n}\n","/**\n * Twee2 to Twee3 header syntax conversion.\n * Ported from twee2compat.go.\n */\n\nconst twee2DetectRe = /^:: *[^[]*?(?: *\\[.*?\\])? *<(.*?)> *$/m;\nconst twee2HeaderRe = /^(:: *[^[]*?)( *\\[.*?\\])?(?: *<(.*?)>)? *$/gm;\nconst twee2BadPosRe = /^(::.*?) *\\{\"position\":\" *\"\\}$/gm;\n\nfunction hasTwee2Syntax(s: string): boolean {\n return twee2DetectRe.test(s);\n}\n\n/**\n * Convert Twee2-style position blocks `<x,y>` to Twee3 metadata blocks `{\"position\":\"x,y\"}`.\n */\nexport function twee2ToV3(s: string): string {\n if (!hasTwee2Syntax(s)) return s;\n let result = s.replace(twee2HeaderRe, (_, p1: string, p2: string | undefined, p3: string | undefined) => {\n const tags = p2 ?? '';\n const pos = p3 ?? '';\n return `${p1}${tags} {\"position\":\"${pos}\"}`;\n });\n result = result.replace(twee2BadPosRe, '$1');\n return result;\n}\n","/**\n * Parse lexer items into Passage[].\n * Ported from storyload.go:loadTwee().\n */\nimport type { Passage, PassageMetadata, Diagnostic } from './types.js';\nimport { ItemType } from './types.js';\nimport { tweeLexer } from './lexer.js';\nimport { tweeUnescape } from './escape.js';\nimport { twee2ToV3 } from './twee2-compat.js';\n\nexport interface ParseOptions {\n /** Filename for diagnostics. */\n filename?: string;\n /** Trim whitespace from passage content. Default: true. */\n trim?: boolean;\n /** Enable Twee2 compatibility. Default: false. */\n twee2Compat?: boolean;\n}\n\nexport interface ParseResult {\n passages: Passage[];\n diagnostics: Diagnostic[];\n}\n\n/**\n * Parse Twee source text into passages.\n */\nexport function parseTwee(source: string, options: ParseOptions = {}): ParseResult {\n const { filename = '<inline>', trim = true, twee2Compat = false } = options;\n const diagnostics: Diagnostic[] = [];\n\n if (twee2Compat) {\n source = twee2ToV3(source);\n }\n\n const passages: Passage[] = [];\n let current: Passage | null = null;\n let pCount = 0;\n let lastType: ItemType = ItemType.EOF;\n\n for (const item of tweeLexer(source)) {\n switch (item.type) {\n case ItemType.Error:\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; ${item.val}.`,\n file: filename,\n line: item.line,\n });\n // Fatal: return what we have\n return { passages, diagnostics };\n\n case ItemType.EOF:\n if (pCount > 0 && current) {\n passages.push(current);\n }\n return { passages, diagnostics };\n\n case ItemType.Header:\n pCount++;\n if (pCount > 1 && current) {\n passages.push(current);\n }\n current = { name: '', tags: [], text: '', source: { file: filename, line: item.line } };\n break;\n\n case ItemType.Name: {\n if (!current) break;\n const name = tweeUnescape(item.val).trim();\n if (name.length === 0) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; passage with no name.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n current.name = name;\n break;\n }\n\n case ItemType.Tags: {\n if (!current) break;\n if (lastType !== ItemType.Name) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; optional tags block must immediately follow the passage name.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n // Strip the surrounding [ and ]\n const inner = item.val.slice(1, -1);\n current.tags = tweeUnescape(inner).split(/\\s+/).filter(Boolean);\n break;\n }\n\n case ItemType.Metadata: {\n if (!current) break;\n if (lastType !== ItemType.Name && lastType !== ItemType.Tags) {\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Malformed twee source; optional metadata block must immediately follow the passage name or tags block.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n try {\n const raw: unknown = JSON.parse(item.val);\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {\n throw new Error('expected a JSON object');\n }\n const parsed = raw as Record<string, unknown>;\n const meta: PassageMetadata = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'string') {\n meta[key] = value;\n }\n }\n current.metadata = meta;\n } catch (e) {\n diagnostics.push({\n level: 'warning',\n message: `load ${filename}: line ${item.line}: Malformed twee source; could not decode metadata (reason: ${e instanceof Error ? e.message : String(e)}).`,\n file: filename,\n line: item.line,\n });\n }\n break;\n }\n\n case ItemType.Content: {\n if (!current) break;\n if (trim) {\n current.text = item.val.trim();\n } else {\n // Per spec: trailing blank lines MUST be stripped regardless of trim option\n current.text = item.val.replace(/\\n\\s*$/, '');\n }\n break;\n }\n\n default: {\n const _exhaustive: never = item.type;\n diagnostics.push({\n level: 'error',\n message: `line ${item.line}: Unhandled lexer item type: ${_exhaustive}.`,\n file: filename,\n line: item.line,\n });\n return { passages, diagnostics };\n }\n }\n\n lastType = item.type;\n }\n\n // Shouldn't reach here (EOF is always emitted), but just in case:\n if (pCount > 0 && current) {\n passages.push(current);\n }\n return { passages, diagnostics };\n}\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\n\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n\n/**\n * Polyfill for `String.fromCodePoint`. It is used to create a string from a Unicode code point.\n */\nexport const fromCodePoint: (...codePoints: number[]) => string =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins\n String.fromCodePoint ??\n ((codePoint: number): string => {\n let output = \"\";\n\n if (codePoint > 0xff_ff) {\n codePoint -= 0x1_00_00;\n output += String.fromCharCode(\n ((codePoint >>> 10) & 0x3_ff) | 0xd8_00,\n );\n codePoint = 0xdc_00 | (codePoint & 0x3_ff);\n }\n\n output += String.fromCharCode(codePoint);\n return output;\n });\n\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n */\nexport function replaceCodePoint(codePoint: number): number {\n if (\n (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff\n ) {\n return 0xff_fd;\n }\n\n return decodeMap.get(codePoint) ?? codePoint;\n}\n\n/**\n * Replace the code point if relevant, then convert it to a string.\n *\n * @deprecated Use `fromCodePoint(replaceCodePoint(codePoint))` instead.\n * @param codePoint The code point to decode.\n * @returns The decoded code point.\n */\nexport function decodeCodePoint(codePoint: number): string {\n return fromCodePoint(replaceCodePoint(codePoint));\n}\n","/*\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n */\nexport function decodeBase64(input: string): Uint16Array {\n const binary: string =\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n typeof atob === \"function\"\n ? // Browser (and Node >=16)\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n atob(input)\n : // Older Node versions (<16)\n // eslint-disable-next-line n/no-unsupported-features/node-builtins\n typeof Buffer.from === \"function\"\n ? // eslint-disable-next-line n/no-unsupported-features/node-builtins\n Buffer.from(input, \"base64\").toString(\"binary\")\n : // eslint-disable-next-line unicorn/no-new-buffer, n/no-deprecated-api\n new Buffer(input, \"base64\").toString(\"binary\");\n\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n\n return out;\n}\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const htmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n \"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\",\n);\n","// Generated using scripts/write-decode-map.ts\n\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\nexport const xmlDecodeTree: Uint16Array = /* #__PURE__ */ decodeBase64(\n \"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\",\n);\n","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport enum BinTrieFlags {\n VALUE_LENGTH = 0b1100_0000_0000_0000,\n FLAG13 = 0b0010_0000_0000_0000,\n BRANCH_LENGTH = 0b0001_1111_1000_0000,\n JUMP_TABLE = 0b0000_0000_0111_1111,\n}\n","import { fromCodePoint, replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\n\nconst enum CharCodes {\n NUM = 35, // \"#\"\n SEMI = 59, // \";\"\n EQUALS = 61, // \"=\"\n ZERO = 48, // \"0\"\n NINE = 57, // \"9\"\n LOWER_A = 97, // \"a\"\n LOWER_F = 102, // \"f\"\n LOWER_X = 120, // \"x\"\n LOWER_Z = 122, // \"z\"\n UPPER_A = 65, // \"A\"\n UPPER_F = 70, // \"F\"\n UPPER_Z = 90, // \"Z\"\n}\n\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\n\nfunction isNumber(code: number): boolean {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\n\nfunction isHexadecimalCharacter(code: number): boolean {\n return (\n (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F)\n );\n}\n\nfunction isAsciiAlphaNumeric(code: number): boolean {\n return (\n (code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code)\n );\n}\n\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n */\nfunction isEntityInAttributeInvalidEnd(code: number): boolean {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\n\nconst enum EntityDecoderState {\n EntityStart,\n NumericStart,\n NumericDecimal,\n NumericHex,\n NamedEntity,\n}\n\nexport enum DecodingMode {\n /** Entities in text nodes that can end with any character. */\n Legacy = 0,\n /** Only allow entities terminated with a semicolon. */\n Strict = 1,\n /** Entities in attributes have limitations on ending characters. */\n Attribute = 2,\n}\n\n/**\n * Producers for character reference errors as defined in the HTML spec.\n */\nexport interface EntityErrorProducer {\n missingSemicolonAfterCharacterReference(): void;\n absenceOfDigitsInNumericCharacterReference(\n consumedCharacters: number,\n ): void;\n validateNumericCharacterReference(code: number): void;\n}\n\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n private readonly decodeTree: Uint16Array,\n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n *\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n private readonly emitCodePoint: (cp: number, consumed: number) => void,\n /** An object that is used to produce errors. */\n private readonly errors?: EntityErrorProducer | undefined,\n ) {}\n\n /** The current state of the decoder. */\n private state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n private consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n private result = 0;\n\n /** The current index in the decode tree. */\n private treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n private excess = 1;\n /** The mode in which the decoder is operating. */\n private decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n private runConsumed = 0;\n\n /** Resets the instance to make it reusable. */\n startEntity(decodeMode: DecodingMode): void {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input: string, offset: number): number {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericStart(input: string, offset: number): number {\n if (offset >= input.length) {\n return -1;\n }\n\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericHex(input: string, offset: number): number {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit =\n char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n } else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNumericDecimal(input: string, offset: number): number {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n } else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n *\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n private emitNumericEntity(lastCp: number, expectedLength: number): number {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n } else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n\n this.errors.validateNumericCharacterReference(this.result);\n }\n\n return this.consumed;\n }\n\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n *\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n private stateNamedEntity(input: string, offset: number): number {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength =\n (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord =\n decodeTree[\n this.treeIndex + 1 + (charIndexInPacked >> 1)\n ];\n const expectedChar =\n charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n\n if (offset >= input.length) break;\n\n const char = input.charCodeAt(offset);\n\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (\n char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0\n ) {\n return this.emitNamedEntityData(\n this.treeIndex,\n valueLength,\n this.consumed + this.excess,\n );\n }\n\n this.treeIndex = determineBranch(\n decodeTree,\n current,\n this.treeIndex + Math.max(1, valueLength),\n char,\n );\n\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(\n this.treeIndex,\n valueLength,\n this.consumed + this.excess,\n );\n }\n\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (\n this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0\n ) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n\n return -1;\n }\n\n /**\n * Emit a named entity that was not terminated with a semicolon.\n *\n * @returns The number of characters consumed.\n */\n private emitNotTerminatedNamedEntity(): number {\n const { result, decodeTree } = this;\n\n const valueLength =\n (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n\n return this.consumed;\n }\n\n /**\n * Emit a named entity.\n *\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n *\n * @returns The number of characters consumed.\n */\n private emitNamedEntityData(\n result: number,\n valueLength: number,\n consumed: number,\n ): number {\n const { decodeTree } = this;\n\n this.emitCodePoint(\n valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1],\n consumed,\n );\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n\n return consumed;\n }\n\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n *\n * @returns The number of characters consumed.\n */\n end(): number {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(\n this.consumed,\n );\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n\n/**\n * Creates a function that decodes entities in a string.\n *\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree: Uint16Array) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(\n decodeTree,\n (data) => (returnValue += fromCodePoint(data)),\n );\n\n return function decodeWithTrie(\n input: string,\n decodeMode: DecodingMode,\n ): string {\n let lastIndex = 0;\n let offset = 0;\n\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n\n decoder.startEntity(decodeMode);\n\n const length = decoder.write(\n input,\n // Skip the \"&\"\n offset + 1,\n );\n\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n\n const result = returnValue + input.slice(lastIndex);\n\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n\n return result;\n };\n}\n\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n *\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIdx The index right after the current node and its value.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(\n decodeTree: Uint16Array,\n current: number,\n nodeIndex: number,\n char: number,\n): number {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n\n if (midKey < char) {\n lo = mid + 1;\n } else if (midKey > char) {\n hi = mid - 1;\n } else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n\n return -1;\n}\n\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n\n/**\n * Decodes an HTML string.\n *\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(\n htmlString: string,\n mode: DecodingMode = DecodingMode.Legacy,\n): string {\n return htmlDecoder(htmlString, mode);\n}\n\n/**\n * Decodes an HTML string in an attribute.\n *\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute: string): string {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n *\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString: string): string {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n *\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString: string): string {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\n\nexport {\n decodeCodePoint,\n fromCodePoint,\n replaceCodePoint,\n} from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n","import {\n EntityDecoder,\n DecodingMode,\n htmlDecodeTree,\n xmlDecodeTree,\n} from \"entities/decode\";\n\nconst enum CharCodes {\n Tab = 0x9, // \"\\t\"\n NewLine = 0xa, // \"\\n\"\n FormFeed = 0xc, // \"\\f\"\n CarriageReturn = 0xd, // \"\\r\"\n Space = 0x20, // \" \"\n ExclamationMark = 0x21, // \"!\"\n Number = 0x23, // \"#\"\n Amp = 0x26, // \"&\"\n SingleQuote = 0x27, // \"'\"\n DoubleQuote = 0x22, // '\"'\n Dash = 0x2d, // \"-\"\n Slash = 0x2f, // \"/\"\n Zero = 0x30, // \"0\"\n Nine = 0x39, // \"9\"\n Semi = 0x3b, // \";\"\n Lt = 0x3c, // \"<\"\n Eq = 0x3d, // \"=\"\n Gt = 0x3e, // \">\"\n Questionmark = 0x3f, // \"?\"\n UpperA = 0x41, // \"A\"\n LowerA = 0x61, // \"a\"\n UpperF = 0x46, // \"F\"\n LowerF = 0x66, // \"f\"\n UpperZ = 0x5a, // \"Z\"\n LowerZ = 0x7a, // \"z\"\n LowerX = 0x78, // \"x\"\n OpeningSquareBracket = 0x5b, // \"[\"\n}\n\n/** All the states the tokenizer can be in. */\nconst enum State {\n Text = 1,\n BeforeTagName, // After <\n InTagName,\n InSelfClosingTag,\n BeforeClosingTagName,\n InClosingTagName,\n AfterClosingTagName,\n\n // Attributes\n BeforeAttributeName,\n InAttributeName,\n AfterAttributeName,\n BeforeAttributeValue,\n InAttributeValueDq, // \"\n InAttributeValueSq, // '\n InAttributeValueNq,\n\n // Declarations\n BeforeDeclaration, // !\n InDeclaration,\n\n // Processing instructions\n InProcessingInstruction, // ?\n\n // Comments & CDATA\n BeforeComment,\n CDATASequence,\n InSpecialComment,\n InCommentLike,\n\n // Special tags\n BeforeSpecialS, // Decide if we deal with `<script` or `<style`\n BeforeSpecialT, // Decide if we deal with `<title` or `<textarea`\n SpecialStartSequence,\n InSpecialTag,\n\n InEntity,\n}\n\nfunction isWhitespace(c: number): boolean {\n return (\n c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn\n );\n}\n\nfunction isEndOfTagSection(c: number): boolean {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\n\nfunction isASCIIAlpha(c: number): boolean {\n return (\n (c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ)\n );\n}\n\nexport enum QuoteType {\n NoValue = 0,\n Unquoted = 1,\n Single = 2,\n Double = 3,\n}\n\nexport interface Callbacks {\n onattribdata(start: number, endIndex: number): void;\n onattribentity(codepoint: number): void;\n onattribend(quote: QuoteType, endIndex: number): void;\n onattribname(start: number, endIndex: number): void;\n oncdata(start: number, endIndex: number, endOffset: number): void;\n onclosetag(start: number, endIndex: number): void;\n oncomment(start: number, endIndex: number, endOffset: number): void;\n ondeclaration(start: number, endIndex: number): void;\n onend(): void;\n onopentagend(endIndex: number): void;\n onopentagname(start: number, endIndex: number): void;\n onprocessinginstruction(start: number, endIndex: number): void;\n onselfclosingtag(endIndex: number): void;\n ontext(start: number, endIndex: number): void;\n ontextentity(codepoint: number, endIndex: number): void;\n}\n\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x3e]), // `-->`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n\nexport default class Tokenizer {\n /** The current state the tokenizer is in. */\n private state = State.Text;\n /** The read buffer. */\n private buffer = \"\";\n /** The beginning of the section that is currently being read. */\n private sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n private index = 0;\n /** The start of the last entity. */\n private entityStart = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n private baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n private isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n public running = true;\n /** The offset of the current buffer. */\n private offset = 0;\n\n private readonly xmlMode: boolean;\n private readonly decodeEntities: boolean;\n private readonly entityDecoder: EntityDecoder;\n\n constructor(\n {\n xmlMode = false,\n decodeEntities = true,\n }: { xmlMode?: boolean; decodeEntities?: boolean },\n private readonly cbs: Callbacks,\n ) {\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.entityDecoder = new EntityDecoder(\n xmlMode ? xmlDecodeTree : htmlDecodeTree,\n (cp, consumed) => this.emitCodePoint(cp, consumed),\n );\n }\n\n public reset(): void {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.currentSequence = undefined!;\n this.running = true;\n this.offset = 0;\n }\n\n public write(chunk: string): void {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n\n public end(): void {\n if (this.running) this.finish();\n }\n\n public pause(): void {\n this.running = false;\n }\n\n public resume(): void {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n\n private stateText(c: number): void {\n if (\n c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))\n ) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n\n private currentSequence: Uint8Array = undefined!;\n private sequenceIndex = 0;\n private stateSpecialStartSequence(c: number): void {\n const isEnd = this.sequenceIndex === this.currentSequence.length;\n const isMatch = isEnd\n ? // If we are at the end of the sequence, make sure the tag name has ended\n isEndOfTagSection(c)\n : // Otherwise, do a case-insensitive comparison\n (c | 0x20) === this.currentSequence[this.sequenceIndex];\n\n if (!isMatch) {\n this.isSpecial = false;\n } else if (!isEnd) {\n this.sequenceIndex++;\n return;\n }\n\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n\n /** Look for an end tag. For <title> tags, also decode entities. */\n private stateInSpecialTag(c: number): void {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (c === CharCodes.Gt || isWhitespace(c)) {\n const endOfText = this.index - this.currentSequence.length;\n\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n\n this.sequenceIndex = 0;\n }\n\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n } else if (this.sequenceIndex === 0) {\n if (this.currentSequence === Sequences.TitleEnd) {\n // We have to parse entities in <title> tags.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n } else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of <title> tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n } else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n\n private stateCDATASequence(c: number): void {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n } else {\n this.sequenceIndex = 0;\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n }\n\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n *\n * @returns Whether the character was found.\n */\n private fastForwardTo(c: number): boolean {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n\n return false;\n }\n\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n */\n private stateInCommentLike(c: number): void {\n if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n } else {\n this.cbs.oncomment(this.sectionStart, this.index, 2);\n }\n\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n } else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n } else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n */\n private isTagStartChar(c: number) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n\n private startSpecial(sequence: Uint8Array, offset: number) {\n this.isSpecial = true;\n this.currentSequence = sequence;\n this.sequenceIndex = offset;\n this.state = State.SpecialStartSequence;\n }\n\n private stateBeforeTagName(c: number): void {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Questionmark) {\n this.state = State.InProcessingInstruction;\n this.sectionStart = this.index + 1;\n } else if (this.isTagStartChar(c)) {\n const lower = c | 0x20;\n this.sectionStart = this.index;\n if (this.xmlMode) {\n this.state = State.InTagName;\n } else if (lower === Sequences.ScriptEnd[2]) {\n this.state = State.BeforeSpecialS;\n } else if (\n lower === Sequences.TitleEnd[2] ||\n lower === Sequences.XmpEnd[2]\n ) {\n this.state = State.BeforeSpecialT;\n } else {\n this.state = State.InTagName;\n }\n } else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n } else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n private stateInTagName(c: number): void {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateBeforeClosingTagName(c: number): void {\n if (isWhitespace(c)) {\n // Ignore\n } else if (c === CharCodes.Gt) {\n this.state = State.Text;\n } else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n private stateInClosingTagName(c: number): void {\n if (c === CharCodes.Gt || isWhitespace(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n private stateAfterClosingTagName(c: number): void {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeAttributeName(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n } else {\n this.state = State.Text;\n }\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n } else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n private stateInSelfClosingTag(c: number): void {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n } else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n private stateInAttributeName(c: number): void {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n private stateAfterAttributeName(c: number): void {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n } else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n private stateBeforeAttributeValue(c: number): void {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n } else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n } else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n private handleInAttributeValue(c: number, quote: number) {\n if (\n c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(\n quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single,\n this.index + 1,\n );\n this.state = State.BeforeAttributeName;\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n private stateInAttributeValueDoubleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n private stateInAttributeValueSingleQuotes(c: number): void {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n private stateInAttributeValueNoQuotes(c: number): void {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n } else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n private stateBeforeDeclaration(c: number): void {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n } else {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n }\n private stateInDeclaration(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateInProcessingInstruction(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeComment(c: number): void {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n // Allow short comments (eg. <!-->)\n this.sequenceIndex = 2;\n this.sectionStart = this.index + 1;\n } else {\n this.state = State.InDeclaration;\n }\n }\n private stateInSpecialComment(c: number): void {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n private stateBeforeSpecialS(c: number): void {\n const lower = c | 0x20;\n if (lower === Sequences.ScriptEnd[3]) {\n this.startSpecial(Sequences.ScriptEnd, 4);\n } else if (lower === Sequences.StyleEnd[3]) {\n this.startSpecial(Sequences.StyleEnd, 4);\n } else {\n this.state = State.InTagName;\n this.stateInTagName(c); // Consume the token again\n }\n }\n\n private stateBeforeSpecialT(c: number): void {\n const lower = c | 0x20;\n switch (lower) {\n case Sequences.TitleEnd[3]: {\n this.startSpecial(Sequences.TitleEnd, 4);\n\n break;\n }\n case Sequences.TextareaEnd[3]: {\n this.startSpecial(Sequences.TextareaEnd, 4);\n\n break;\n }\n case Sequences.XmpEnd[3]: {\n this.startSpecial(Sequences.XmpEnd, 4);\n\n break;\n }\n default: {\n this.state = State.InTagName;\n this.stateInTagName(c); // Consume the token again\n }\n }\n }\n\n private startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(\n this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute,\n );\n }\n\n private stateInEntity(): void {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n\n if (length === 0) {\n this.index -= 1;\n }\n } else {\n if (\n indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp\n ) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n\n /**\n * Remove data that has already been consumed from the buffer.\n */\n private cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (\n this.state === State.Text ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)\n ) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n } else if (\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq\n ) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n\n private shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n private parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.BeforeSpecialS: {\n this.stateBeforeSpecialS(c);\n break;\n }\n case State.BeforeSpecialT: {\n this.stateBeforeSpecialT(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n\n private finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n\n this.handleTrailingData();\n\n this.cbs.onend();\n }\n\n /** Handle any trailing data. */\n private handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n\n if (this.state === State.InCommentLike) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n } else {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n } else if (\n this.state === State.InTagName ||\n this.state === State.BeforeAttributeName ||\n this.state === State.BeforeAttributeValue ||\n this.state === State.AfterAttributeName ||\n this.state === State.InAttributeName ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueNq ||\n this.state === State.InClosingTagName\n ) {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n } else {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n\n private emitCodePoint(cp: number, consumed: number): void {\n if (\n this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag\n ) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.onattribentity(cp);\n } else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n","import Tokenizer, { type Callbacks, QuoteType } from \"./Tokenizer.js\";\nimport { fromCodePoint } from \"entities/decode\";\n\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\n\nconst openImpliesClose = new Map<string, Set<string>>([\n [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n [\"th\", new Set([\"th\"])],\n [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n [\"body\", new Set([\"head\", \"link\", \"script\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", pTag],\n [\"h2\", pTag],\n [\"h3\", pTag],\n [\"h4\", pTag],\n [\"h5\", pTag],\n [\"h6\", pTag],\n [\"select\", formTags],\n [\"input\", formTags],\n [\"output\", formTags],\n [\"button\", formTags],\n [\"datalist\", formTags],\n [\"textarea\", formTags],\n [\"option\", new Set([\"option\"])],\n [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n [\"dd\", ddtTags],\n [\"dt\", ddtTags],\n [\"address\", pTag],\n [\"article\", pTag],\n [\"aside\", pTag],\n [\"blockquote\", pTag],\n [\"details\", pTag],\n [\"div\", pTag],\n [\"dl\", pTag],\n [\"fieldset\", pTag],\n [\"figcaption\", pTag],\n [\"figure\", pTag],\n [\"footer\", pTag],\n [\"form\", pTag],\n [\"header\", pTag],\n [\"hr\", pTag],\n [\"main\", pTag],\n [\"nav\", pTag],\n [\"ol\", pTag],\n [\"pre\", pTag],\n [\"section\", pTag],\n [\"table\", pTag],\n [\"ul\", pTag],\n [\"rt\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\n\nconst voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignobject\",\n \"desc\",\n \"title\",\n]);\n\nexport interface ParserOptions {\n /**\n * Indicates whether special tags (`<script>`, `<style>`, and `<title>`) should get special treatment\n * and if \"empty\" tags (eg. `<br>`) can have children. If `false`, the content of special tags\n * will be text only. For feeds and other XML content (documents that don't consist of HTML),\n * set this to `true`.\n *\n * @default false\n */\n xmlMode?: boolean;\n\n /**\n * Decode entities within the document.\n *\n * @default true\n */\n decodeEntities?: boolean;\n\n /**\n * If set to true, all tags will be lowercased.\n *\n * @default !xmlMode\n */\n lowerCaseTags?: boolean;\n\n /**\n * If set to `true`, all attribute names will be lowercased. This has noticeable impact on speed.\n *\n * @default !xmlMode\n */\n lowerCaseAttributeNames?: boolean;\n\n /**\n * If set to true, CDATA sections will be recognized as text even if the xmlMode option is not enabled.\n * NOTE: If xmlMode is set to `true` then CDATA sections will always be recognized as text.\n *\n * @default xmlMode\n */\n recognizeCDATA?: boolean;\n\n /**\n * If set to `true`, self-closing tags will trigger the onclosetag event even if xmlMode is not set to `true`.\n * NOTE: If xmlMode is set to `true` then self-closing tags will always be recognized.\n *\n * @default xmlMode\n */\n recognizeSelfClosing?: boolean;\n\n /**\n * Allows the default tokenizer to be overwritten.\n */\n Tokenizer?: typeof Tokenizer;\n}\n\nexport interface Handler {\n onparserinit(parser: Parser): void;\n\n /**\n * Resets the handler back to starting state\n */\n onreset(): void;\n\n /**\n * Signals the handler that parsing is done\n */\n onend(): void;\n onerror(error: Error): void;\n onclosetag(name: string, isImplied: boolean): void;\n onopentagname(name: string): void;\n /**\n *\n * @param name Name of the attribute\n * @param value Value of the attribute.\n * @param quote Quotes used around the attribute. `null` if the attribute has no quotes around the value, `undefined` if the attribute has no value.\n */\n onattribute(\n name: string,\n value: string,\n quote?: string | undefined | null,\n ): void;\n onopentag(\n name: string,\n attribs: { [s: string]: string },\n isImplied: boolean,\n ): void;\n ontext(data: string): void;\n oncomment(data: string): void;\n oncdatastart(): void;\n oncdataend(): void;\n oncommentend(): void;\n onprocessinginstruction(name: string, data: string): void;\n}\n\nconst reNameEnd = /\\s|\\//;\n\nexport class Parser implements Callbacks {\n /** The start index of the last event. */\n public startIndex = 0;\n /** The end index of the last event. */\n public endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n private openTagStart = 0;\n\n private tagname = \"\";\n private attribname = \"\";\n private attribvalue = \"\";\n private attribs: null | { [key: string]: string } = null;\n private readonly stack: string[] = [];\n /** Determines whether self-closing tags are recognized. */\n private readonly foreignContext: boolean[];\n private readonly cbs: Partial<Handler>;\n private readonly lowerCaseTagNames: boolean;\n private readonly lowerCaseAttributeNames: boolean;\n private readonly recognizeSelfClosing: boolean;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n private readonly htmlMode: boolean;\n private readonly tokenizer: Tokenizer;\n\n private readonly buffers: string[] = [];\n private bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n private writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n private ended = false;\n\n constructor(\n cbs?: Partial<Handler> | null,\n private readonly options: ParserOptions = {},\n ) {\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(\n this.options,\n this,\n );\n this.foreignContext = [!this.htmlMode];\n this.cbs.onparserinit?.(this);\n }\n\n // Tokenizer event handlers\n\n /** @internal */\n ontext(start: number, endIndex: number): void {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n\n /** @internal */\n ontextentity(cp: number, endIndex: number): void {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n */\n protected isVoidElement(name: string): boolean {\n return this.htmlMode && voidElements.has(name);\n }\n\n /** @internal */\n onopentagname(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n\n let name = this.getSlice(start, endIndex);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n this.emitOpenTag(name);\n }\n\n private emitOpenTag(name: string) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n const element = this.stack.shift()!;\n this.cbs.onclosetag?.(element, true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n\n if (this.htmlMode) {\n if (foreignContextElements.has(name)) {\n this.foreignContext.unshift(true);\n } else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(false);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag) this.attribs = {};\n }\n\n private endOpenTag(isImplied: boolean) {\n this.startIndex = this.openTagStart;\n\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n\n this.tagname = \"\";\n }\n\n /** @internal */\n onopentagend(endIndex: number): void {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onclosetag(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n\n let name = this.getSlice(start, endIndex);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n if (\n this.htmlMode &&\n (foreignContextElements.has(name) ||\n htmlIntegrationElements.has(name))\n ) {\n this.foreignContext.shift();\n }\n\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index <= pos; index++) {\n const element = this.stack.shift()!;\n // We know the stack has sufficient elements.\n this.cbs.onclosetag?.(element, index !== pos);\n }\n } else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n } else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onselfclosingtag(endIndex: number): void {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.foreignContext[0]) {\n this.closeCurrentTag(false);\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n } else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n\n private closeCurrentTag(isOpenImplied: boolean) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n // If the opening tag isn't implied, the closing tag has to be implied.\n this.cbs.onclosetag?.(name, !isOpenImplied);\n this.stack.shift();\n }\n }\n\n /** @internal */\n onattribname(start: number, endIndex: number): void {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n\n /** @internal */\n onattribdata(start: number, endIndex: number): void {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n\n /** @internal */\n onattribentity(cp: number): void {\n this.attribvalue += fromCodePoint(cp);\n }\n\n /** @internal */\n onattribend(quote: QuoteType, endIndex: number): void {\n this.endIndex = endIndex;\n\n this.cbs.onattribute?.(\n this.attribname,\n this.attribvalue,\n quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null,\n );\n\n if (\n this.attribs &&\n !Object.prototype.hasOwnProperty.call(this.attribs, this.attribname)\n ) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n\n private getInstructionName(value: string) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n\n return name;\n }\n\n /** @internal */\n ondeclaration(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onprocessinginstruction(start: number, endIndex: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n oncomment(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n oncdata(start: number, endIndex: number, offset: number): void {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n } else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n\n /** @internal */\n onend(): void {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n public reset(): void {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(!this.htmlMode);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n *\n * @param data Document to parse.\n */\n public parseComplete(data: string): void {\n this.reset();\n this.end(data);\n }\n\n private getSlice(start: number, end: number) {\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n\n let slice = this.buffers[0].slice(\n start - this.bufferOffset,\n end - this.bufferOffset,\n );\n\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n\n return slice;\n }\n\n private shiftBuffer(): void {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n *\n * @param chunk Chunk to parse.\n */\n public write(chunk: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n *\n * @param chunk Optional final chunk to parse.\n */\n public end(chunk?: string): void {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n\n if (chunk) this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n public pause(): void {\n this.tokenizer.pause();\n }\n\n /**\n * Resumes parsing after `pause` was called.\n */\n public resume(): void {\n this.tokenizer.resume();\n\n while (\n this.tokenizer.running &&\n this.writeIndex < this.buffers.length\n ) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n\n if (this.ended) this.tokenizer.end();\n }\n\n /**\n * Alias of `write`, for backwards compatibility.\n *\n * @param chunk Chunk to parse.\n * @deprecated\n */\n public parseChunk(chunk: string): void {\n this.write(chunk);\n }\n /**\n * Alias of `end`, for backwards compatibility.\n *\n * @param chunk Optional final chunk to parse.\n * @deprecated\n */\n public done(chunk?: string): void {\n this.end(chunk);\n }\n}\n","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for <? ... ?> */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for <!-- ... --> */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for <script> tags */\n ElementType[\"Script\"] = \"script\";\n /** Type for <style> tags */\n ElementType[\"Style\"] = \"style\";\n /** Type for Any tag */\n ElementType[\"Tag\"] = \"tag\";\n /** Type for <![CDATA[ ... ]]> */\n ElementType[\"CDATA\"] = \"cdata\";\n /** Type for <!doctype ...> */\n ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n *\n * @param elem Element to test\n */\nexport function isTag(elem) {\n return (elem.type === ElementType.Tag ||\n elem.type === ElementType.Script ||\n elem.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\nexport const Root = ElementType.Root;\n/** Type for Text */\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\nexport const Style = ElementType.Style;\n/** Type for Any tag */\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n constructor() {\n /** Parent of the node */\n this.parent = null;\n /** Previous sibling */\n this.prev = null;\n /** Next sibling */\n this.next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n this.startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n this.endIndex = null;\n }\n // Read-write aliases for properties\n /**\n * Same as {@link parent}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get parentNode() {\n return this.parent;\n }\n set parentNode(parent) {\n this.parent = parent;\n }\n /**\n * Same as {@link prev}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get previousSibling() {\n return this.prev;\n }\n set previousSibling(prev) {\n this.prev = prev;\n }\n /**\n * Same as {@link next}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nextSibling() {\n return this.next;\n }\n set nextSibling(next) {\n this.next = next;\n }\n /**\n * Clone this node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\n cloneNode(recursive = false) {\n return cloneNode(this, recursive);\n }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n /**\n * @param data The content of the data node\n */\n constructor(data) {\n super();\n this.data = data;\n }\n /**\n * Same as {@link data}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nodeValue() {\n return this.data;\n }\n set nodeValue(data) {\n this.data = data;\n }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n constructor() {\n super(...arguments);\n this.type = ElementType.Text;\n }\n get nodeType() {\n return 3;\n }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n constructor() {\n super(...arguments);\n this.type = ElementType.Comment;\n }\n get nodeType() {\n return 8;\n }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n constructor(name, data) {\n super(data);\n this.name = name;\n this.type = ElementType.Directive;\n }\n get nodeType() {\n return 1;\n }\n}\n/**\n * A `Node` that can have children.\n */\nexport class NodeWithChildren extends Node {\n /**\n * @param children Children of the node. Only certain node types can have children.\n */\n constructor(children) {\n super();\n this.children = children;\n }\n // Aliases\n /** First child of the node. */\n get firstChild() {\n var _a;\n return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;\n }\n /** Last child of the node. */\n get lastChild() {\n return this.children.length > 0\n ? this.children[this.children.length - 1]\n : null;\n }\n /**\n * Same as {@link children}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get childNodes() {\n return this.children;\n }\n set childNodes(children) {\n this.children = children;\n }\n}\nexport class CDATA extends NodeWithChildren {\n constructor() {\n super(...arguments);\n this.type = ElementType.CDATA;\n }\n get nodeType() {\n return 4;\n }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n constructor() {\n super(...arguments);\n this.type = ElementType.Root;\n }\n get nodeType() {\n return 9;\n }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n /**\n * @param name Name of the tag, eg. `div`, `span`.\n * @param attribs Object mapping attribute names to attribute values.\n * @param children Children of the node.\n */\n constructor(name, attribs, children = [], type = name === \"script\"\n ? ElementType.Script\n : name === \"style\"\n ? ElementType.Style\n : ElementType.Tag) {\n super(children);\n this.name = name;\n this.attribs = attribs;\n this.type = type;\n }\n get nodeType() {\n return 1;\n }\n // DOM Level 1 aliases\n /**\n * Same as {@link name}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get tagName() {\n return this.name;\n }\n set tagName(name) {\n this.name = name;\n }\n get attributes() {\n return Object.keys(this.attribs).map((name) => {\n var _a, _b;\n return ({\n name,\n value: this.attribs[name],\n namespace: (_a = this[\"x-attribsNamespace\"]) === null || _a === void 0 ? void 0 : _a[name],\n prefix: (_b = this[\"x-attribsPrefix\"]) === null || _b === void 0 ? void 0 : _b[name],\n });\n });\n }\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node is a `Element`, `false` otherwise.\n */\nexport function isTag(node) {\n return isTagRaw(node);\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `CDATA`, `false` otherwise.\n */\nexport function isCDATA(node) {\n return node.type === ElementType.CDATA;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Text`, `false` otherwise.\n */\nexport function isText(node) {\n return node.type === ElementType.Text;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `Comment`, `false` otherwise.\n */\nexport function isComment(node) {\n return node.type === ElementType.Comment;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nexport function isDirective(node) {\n return node.type === ElementType.Directive;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.\n */\nexport function isDocument(node) {\n return node.type === ElementType.Root;\n}\n/**\n * @param node Node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\nexport function hasChildren(node) {\n return Object.prototype.hasOwnProperty.call(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n *\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n let result;\n if (isText(node)) {\n result = new Text(node.data);\n }\n else if (isComment(node)) {\n result = new Comment(node.data);\n }\n else if (isTag(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Element(node.name, { ...node.attribs }, children);\n children.forEach((child) => (child.parent = clone));\n if (node.namespace != null) {\n clone.namespace = node.namespace;\n }\n if (node[\"x-attribsNamespace\"]) {\n clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n }\n if (node[\"x-attribsPrefix\"]) {\n clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n }\n result = clone;\n }\n else if (isCDATA(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new CDATA(children);\n children.forEach((child) => (child.parent = clone));\n result = clone;\n }\n else if (isDocument(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Document(children);\n children.forEach((child) => (child.parent = clone));\n if (node[\"x-mode\"]) {\n clone[\"x-mode\"] = node[\"x-mode\"];\n }\n result = clone;\n }\n else if (isDirective(node)) {\n const instruction = new ProcessingInstruction(node.name, node.data);\n if (node[\"x-name\"] != null) {\n instruction[\"x-name\"] = node[\"x-name\"];\n instruction[\"x-publicId\"] = node[\"x-publicId\"];\n instruction[\"x-systemId\"] = node[\"x-systemId\"];\n }\n result = instruction;\n }\n else {\n throw new Error(`Not implemented yet: ${node.type}`);\n }\n result.startIndex = node.startIndex;\n result.endIndex = node.endIndex;\n if (node.sourceCodeLocation != null) {\n result.sourceCodeLocation = node.sourceCodeLocation;\n }\n return result;\n}\nfunction cloneChildren(childs) {\n const children = childs.map((child) => cloneNode(child, true));\n for (let i = 1; i < children.length; i++) {\n children[i].prev = children[i - 1];\n children[i - 1].next = children[i];\n }\n return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { Element, Text, Comment, CDATA, Document, ProcessingInstruction, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOpts = {\n withStartIndices: false,\n withEndIndices: false,\n xmlMode: false,\n};\nexport class DomHandler {\n /**\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n constructor(callback, options, elementCB) {\n /** The elements of the DOM */\n this.dom = [];\n /** The root element for the DOM */\n this.root = new Document(this.dom);\n /** Indicated whether parsing has been completed. */\n this.done = false;\n /** Stack of open tags. */\n this.tagStack = [this.root];\n /** A data node that is still being written to. */\n this.lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n this.parser = null;\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOpts;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this.callback = callback !== null && callback !== void 0 ? callback : null;\n this.options = options !== null && options !== void 0 ? options : defaultOpts;\n this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;\n }\n onparserinit(parser) {\n this.parser = parser;\n }\n // Resets the handler back to starting state\n onreset() {\n this.dom = [];\n this.root = new Document(this.dom);\n this.done = false;\n this.tagStack = [this.root];\n this.lastNode = null;\n this.parser = null;\n }\n // Signals the handler that parsing is done\n onend() {\n if (this.done)\n return;\n this.done = true;\n this.parser = null;\n this.handleCallback(null);\n }\n onerror(error) {\n this.handleCallback(error);\n }\n onclosetag() {\n this.lastNode = null;\n const elem = this.tagStack.pop();\n if (this.options.withEndIndices) {\n elem.endIndex = this.parser.endIndex;\n }\n if (this.elementCB)\n this.elementCB(elem);\n }\n onopentag(name, attribs) {\n const type = this.options.xmlMode ? ElementType.Tag : undefined;\n const element = new Element(name, attribs, undefined, type);\n this.addNode(element);\n this.tagStack.push(element);\n }\n ontext(data) {\n const { lastNode } = this;\n if (lastNode && lastNode.type === ElementType.Text) {\n lastNode.data += data;\n if (this.options.withEndIndices) {\n lastNode.endIndex = this.parser.endIndex;\n }\n }\n else {\n const node = new Text(data);\n this.addNode(node);\n this.lastNode = node;\n }\n }\n oncomment(data) {\n if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n this.lastNode.data += data;\n return;\n }\n const node = new Comment(data);\n this.addNode(node);\n this.lastNode = node;\n }\n oncommentend() {\n this.lastNode = null;\n }\n oncdatastart() {\n const text = new Text(\"\");\n const node = new CDATA([text]);\n this.addNode(node);\n text.parent = node;\n this.lastNode = text;\n }\n oncdataend() {\n this.lastNode = null;\n }\n onprocessinginstruction(name, data) {\n const node = new ProcessingInstruction(name, data);\n this.addNode(node);\n }\n handleCallback(error) {\n if (typeof this.callback === \"function\") {\n this.callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n }\n addNode(node) {\n const parent = this.tagStack[this.tagStack.length - 1];\n const previousSibling = parent.children[parent.children.length - 1];\n if (this.options.withStartIndices) {\n node.startIndex = this.parser.startIndex;\n }\n if (this.options.withEndIndices) {\n node.endIndex = this.parser.endIndex;\n }\n parent.children.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n node.parent = parent;\n this.lastNode = null;\n }\n}\nexport default DomHandler;\n",null,null,null,null,null,null,null,"export const elementNames = new Map([\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"clipPath\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"foreignObject\",\n \"glyphRef\",\n \"linearGradient\",\n \"radialGradient\",\n \"textPath\",\n].map((val) => [val.toLowerCase(), val]));\nexport const attributeNames = new Map([\n \"definitionURL\",\n \"attributeName\",\n \"attributeType\",\n \"baseFrequency\",\n \"baseProfile\",\n \"calcMode\",\n \"clipPathUnits\",\n \"diffuseConstant\",\n \"edgeMode\",\n \"filterUnits\",\n \"glyphRef\",\n \"gradientTransform\",\n \"gradientUnits\",\n \"kernelMatrix\",\n \"kernelUnitLength\",\n \"keyPoints\",\n \"keySplines\",\n \"keyTimes\",\n \"lengthAdjust\",\n \"limitingConeAngle\",\n \"markerHeight\",\n \"markerUnits\",\n \"markerWidth\",\n \"maskContentUnits\",\n \"maskUnits\",\n \"numOctaves\",\n \"pathLength\",\n \"patternContentUnits\",\n \"patternTransform\",\n \"patternUnits\",\n \"pointsAtX\",\n \"pointsAtY\",\n \"pointsAtZ\",\n \"preserveAlpha\",\n \"preserveAspectRatio\",\n \"primitiveUnits\",\n \"refX\",\n \"refY\",\n \"repeatCount\",\n \"repeatDur\",\n \"requiredExtensions\",\n \"requiredFeatures\",\n \"specularConstant\",\n \"specularExponent\",\n \"spreadMethod\",\n \"startOffset\",\n \"stdDeviation\",\n \"stitchTiles\",\n \"surfaceScale\",\n \"systemLanguage\",\n \"tableValues\",\n \"targetX\",\n \"targetY\",\n \"textLength\",\n \"viewBox\",\n \"viewTarget\",\n \"xChannelSelector\",\n \"yChannelSelector\",\n \"zoomAndPan\",\n].map((val) => [val.toLowerCase(), val]));\n",null,"import { Parser, type ParserOptions } from \"./Parser.js\";\nexport type { Handler, ParserOptions } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\n\nimport {\n DomHandler,\n type DomHandlerOptions,\n type ChildNode,\n type Element,\n type Document,\n} from \"domhandler\";\n\nexport {\n DomHandler,\n // Old name for DomHandler\n DomHandler as DefaultHandler,\n type DomHandlerOptions,\n} from \"domhandler\";\n\nexport type Options = ParserOptions & DomHandlerOptions;\n\n// Helper methods\n\n/**\n * Parses the data, returns the resulting document.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data: string, options?: Options): Document {\n const handler = new DomHandler(undefined, options);\n new Parser(handler, options).end(data);\n return handler.root;\n}\n/**\n * Parses data, returns an array of the root nodes.\n *\n * Note that the root nodes still have a `Document` node as their parent.\n * Use `parseDocument` to get the `Document` node instead.\n *\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n * @deprecated Use `parseDocument` instead.\n */\nexport function parseDOM(data: string, options?: Options): ChildNode[] {\n return parseDocument(data, options).children;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(\n callback: (error: Error | null, document: Document) => void,\n options?: Options,\n elementCallback?: (element: Element) => void,\n): Parser {\n const handler: DomHandler = new DomHandler(\n (error: Error | null) => callback(error, handler.root),\n options,\n elementCallback,\n );\n return new Parser(handler, options);\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n *\n * @param callback A callback that will be called once parsing has been completed, with an array of root nodes.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n * @deprecated Use `createDocumentStream` instead.\n */\nexport function createDomStream(\n callback: (error: Error | null, dom: ChildNode[]) => void,\n options?: Options,\n elementCallback?: (element: Element) => void,\n): Parser {\n const handler = new DomHandler(callback, options, elementCallback);\n return new Parser(handler, options);\n}\n\nexport {\n default as Tokenizer,\n type Callbacks as TokenizerCallbacks,\n QuoteType,\n} from \"./Tokenizer.js\";\n\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\n\nimport { getFeed, type Feed } from \"domutils\";\n\nexport { getFeed, type Feed } from \"domutils\";\n\nconst parseFeedDefaultOptions = { xmlMode: true };\n\n/**\n * Parse a feed.\n *\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(\n feed: string,\n options: Options = parseFeedDefaultOptions,\n): Feed | null {\n return getFeed(parseDOM(feed, options));\n}\n\nexport * as DomUtils from \"domutils\";\n","/**\n * Twine HTML decompiler: parse compiled Twine 2 or Twine 1 HTML back into a Story model.\n * Ported from storyload.go:loadHTML().\n */\nimport { parseDocument } from 'htmlparser2';\nimport type { Passage, PassageMetadata, Diagnostic, IFID } from './types.js';\nimport { createStory, storyAdd, storyPrepend, marshalStoryData } from './story.js';\nimport { tiddlerUnescape } from './escape.js';\n\nexport interface DecompileResult {\n story: import('./types.js').Story;\n diagnostics: Diagnostic[];\n}\n\n// Structural types matching domhandler's API (avoids direct import of domhandler).\ninterface HtmlNode {\n type: string;\n name?: string;\n attribs?: Record<string, string>;\n children?: HtmlNode[];\n data?: string;\n}\n\n/**\n * Parse a Twine 2 or Twine 1 compiled HTML file back into a Story model.\n */\nexport function decompileHTML(html: string): DecompileResult {\n const diagnostics: Diagnostic[] = [];\n const story = createStory();\n\n const doc = parseDocument(html) as unknown as HtmlNode;\n\n // Try Twine 2 first (<tw-storydata>), then Twine 1 (<div id=\"store-area\"> or <div id=\"storeArea\">).\n const twine2Data = findElement(doc, 'tw-storydata');\n if (twine2Data) {\n decompileTwine2(twine2Data, story, diagnostics);\n return { story, diagnostics };\n }\n\n const twine1Data = findElementByIdPattern(doc, /^store(?:-a|A)rea$/);\n if (twine1Data) {\n decompileTwine1(twine1Data, story, diagnostics);\n return { story, diagnostics };\n }\n\n diagnostics.push({ level: 'error', message: 'Malformed HTML source; story data not found.' });\n return { story, diagnostics };\n}\n\nfunction decompileTwine2(storyData: HtmlNode, story: import('./types.js').Story, diagnostics: Diagnostic[]): void {\n // Parse tw-storydata attributes.\n let startnode = 0;\n const attrs = storyData.attribs ?? {};\n\n if (attrs['name']) story.name = attrs['name'];\n if (attrs['startnode']) {\n const parsed = parseInt(attrs['startnode'], 10);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-storydata\" content attribute \"startnode\" as an integer; value \"${attrs['startnode']}\".`,\n });\n } else {\n startnode = parsed;\n }\n }\n if (attrs['ifid']) story.ifid = attrs['ifid'].toUpperCase() as IFID;\n if (attrs['zoom']) {\n const parsed = parseFloat(attrs['zoom']);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-storydata\" content attribute \"zoom\" as a float; value \"${attrs['zoom']}\".`,\n });\n } else {\n story.twine2.zoom = parsed;\n }\n }\n if (attrs['format']) story.twine2.format = attrs['format'];\n if (attrs['format-version']) story.twine2.formatVersion = attrs['format-version'];\n if (attrs['options']) {\n for (const opt of attrs['options'].split(/\\s+/).filter((s: string) => s.length > 0)) {\n story.twine2.options.set(opt, true);\n }\n }\n\n // Process child elements.\n // htmlparser2 uses type 'style'/'script' for those elements instead of 'tag'.\n for (const node of storyData.children ?? []) {\n if (node.type !== 'tag' && node.type !== 'style' && node.type !== 'script') continue;\n\n switch (node.name) {\n case 'style':\n case 'script': {\n const text = getTextContent(node).trim();\n if (text.length === 0) continue;\n const name = node.name === 'style' ? 'Story Stylesheet' : 'Story JavaScript';\n const tags = node.name === 'style' ? ['stylesheet'] : ['script'];\n storyAdd(story, { name, tags, text }, diagnostics);\n break;\n }\n\n case 'tw-tag': {\n const tagAttrs = node.attribs ?? {};\n const tagName = tagAttrs['name'] ?? '';\n const tagColor = tagAttrs['color'] ?? '';\n if (tagName) story.twine2.tagColors.set(tagName, tagColor);\n break;\n }\n\n case 'tw-passagedata': {\n let pid = 0;\n const pAttrs = node.attribs ?? {};\n const name = pAttrs['name'] ?? '';\n const tags = pAttrs['tags'] ? pAttrs['tags'].split(/\\s+/).filter((s: string) => s.length > 0) : [];\n const metadata: PassageMetadata = {};\n\n if (pAttrs['pid']) {\n const parsed = parseInt(pAttrs['pid'], 10);\n if (Number.isNaN(parsed)) {\n diagnostics.push({\n level: 'warning',\n message: `Cannot parse \"tw-passagedata\" content attribute \"pid\" as an integer; value \"${pAttrs['pid']}\".`,\n });\n } else {\n pid = parsed;\n }\n }\n\n if (pAttrs['position']) metadata.position = pAttrs['position'];\n if (pAttrs['size']) metadata.size = pAttrs['size'];\n\n if (pid === startnode && pid !== 0) {\n story.twine2.start = name;\n }\n\n const text = getTextContent(node).trim();\n const passage: Passage = { name, tags, text };\n if (metadata.position || metadata.size) {\n passage.metadata = metadata;\n }\n storyAdd(story, passage, diagnostics);\n break;\n }\n }\n }\n\n // Prepend StoryData passage with serialized metadata.\n storyPrepend(story, { name: 'StoryData', tags: [], text: marshalStoryData(story) }, diagnostics);\n}\n\nfunction decompileTwine1(storeArea: HtmlNode, story: import('./types.js').Story, diagnostics: Diagnostic[]): void {\n for (const node of storeArea.children ?? []) {\n if (node.type !== 'tag' || node.name !== 'div') continue;\n const nodeAttrs = node.attribs ?? {};\n if (!('tiddler' in nodeAttrs)) continue;\n\n const name = nodeAttrs['tiddler'] ?? '';\n const tags = nodeAttrs['tags'] ? nodeAttrs['tags'].split(/\\s+/).filter((s: string) => s.length > 0) : [];\n const metadata: PassageMetadata = {};\n\n if (nodeAttrs['twine-position']) metadata.position = nodeAttrs['twine-position'];\n\n const rawContent = getTextContent(node);\n const text = tiddlerUnescape(rawContent).trim();\n\n const passage: Passage = { name, tags, text };\n if (metadata.position) {\n passage.metadata = metadata;\n }\n storyAdd(story, passage, diagnostics);\n }\n}\n\nfunction findElement(node: HtmlNode, tagName: string): HtmlNode | undefined {\n if (node.type === 'tag' && node.name === tagName) return node;\n for (const child of node.children ?? []) {\n const found = findElement(child, tagName);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction findElementByIdPattern(node: HtmlNode, idPattern: RegExp): HtmlNode | undefined {\n if (node.type === 'tag' && node.attribs?.['id'] && idPattern.test(node.attribs['id'])) return node;\n for (const child of node.children ?? []) {\n const found = findElementByIdPattern(child, idPattern);\n if (found) return found;\n }\n return undefined;\n}\n\nfunction getTextContent(el: HtmlNode): string {\n let text = '';\n for (const child of el.children ?? []) {\n if (child.type === 'text' && child.data) {\n text += child.data;\n }\n }\n return text;\n}\n","/** Single source of truth for the twee-ts version. Update here when releasing. */\nexport const VERSION = '1.2.0';\n","/**\n * Twine 2 HTML and archive output.\n * Ported from storyout.go.\n */\nimport type { ReadonlyStory, ReadonlyPassage, StoryFormatInfo } from './types.js';\nimport { attrEscape, htmlEscape, commentSanitize, htmlCommentSanitize } from './escape.js';\nimport { passageToPassagedata, hasTag, hasAnyTag } from './passage.js';\nimport { readFormatSource } from './formats.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'Twee-ts';\n\nexport function toTwine2Archive(\n story: ReadonlyStory,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n return getTwine2DataChunk(story, startName, options) + '\\n';\n}\n\nexport function toTwine2HTML(\n story: ReadonlyStory,\n format: StoryFormatInfo,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n let template = readFormatSource(format);\n\n if (template.includes('{{STORY_NAME}}')) {\n const name = htmlEscape(story.name);\n template = template.replaceAll('{{STORY_NAME}}', () => name);\n }\n if (template.includes('{{STORY_DATA}}')) {\n const data = getTwine2DataChunk(story, startName, options);\n template = template.replace('{{STORY_DATA}}', () => data);\n }\n\n return template;\n}\n\nfunction getTwine2DataChunk(\n story: ReadonlyStory,\n startName: string,\n options?: { readonly sourceInfo?: boolean },\n): string {\n const parts: string[] = [];\n let startID = '';\n let pid = 0;\n\n // Gather script and stylesheet passages.\n const scripts: ReadonlyPassage[] = [];\n const stylesheets: ReadonlyPassage[] = [];\n for (const p of story.passages) {\n if (hasTag(p, 'Twine.private')) continue;\n if (hasTag(p, 'script')) scripts.push(p);\n else if (hasTag(p, 'stylesheet')) stylesheets.push(p);\n }\n\n // Style element\n let styleContent = '';\n if (stylesheets.length === 1) {\n styleContent = stylesheets[0]?.text ?? '';\n } else if (stylesheets.length > 1) {\n let pidS = 1;\n for (const p of stylesheets) {\n if (pidS > 1 && !styleContent.endsWith('\\n')) styleContent += '\\n';\n styleContent += `/* twine-user-stylesheet #${pidS}: \"${commentSanitize(p.name)}\" */\\n`;\n styleContent += p.text;\n pidS++;\n }\n }\n parts.push(`<style role=\"stylesheet\" id=\"twine-user-stylesheet\" type=\"text/twine-css\">${styleContent}</style>`);\n\n // Script element\n let scriptContent = '';\n if (scripts.length === 1) {\n scriptContent = scripts[0]?.text ?? '';\n } else if (scripts.length > 1) {\n let pidS = 1;\n for (const p of scripts) {\n if (pidS > 1 && !scriptContent.endsWith('\\n')) scriptContent += '\\n';\n scriptContent += `/* twine-user-script #${pidS}: \"${commentSanitize(p.name)}\" */\\n`;\n scriptContent += p.text;\n pidS++;\n }\n }\n parts.push(`<script role=\"script\" id=\"twine-user-script\" type=\"text/twine-javascript\">${scriptContent}</script>`);\n\n // Tag color elements (only spec-valid colors: 7 named colors or hex values)\n const validTagColors = new Set(['gray', 'red', 'orange', 'yellow', 'green', 'blue', 'purple']);\n const hexColorPattern = /^#[0-9a-fA-F]{3,8}$/;\n for (const [tag, color] of story.twine2.tagColors) {\n if (validTagColors.has(color) || hexColorPattern.test(color)) {\n parts.push(`<tw-tag name=\"${attrEscape(tag)}\" color=\"${attrEscape(color)}\"></tw-tag>`);\n }\n }\n\n // Normal passage elements\n pid = 1;\n for (const p of story.passages) {\n if (p.name === 'StoryTitle' || p.name === 'StoryData' || hasAnyTag(p, 'script', 'stylesheet', 'Twine.private')) {\n continue;\n }\n // Drop empty StorySettings\n if (p.name === 'StorySettings' && story.twine1.settings.size === 0) {\n continue;\n }\n\n parts.push(passageToPassagedata(p, pid, options));\n if (startName === p.name) {\n startID = String(pid);\n }\n pid++;\n }\n\n // Build options string\n const opts: string[] = [];\n for (const [opt, val] of story.twine2.options) {\n if (val) opts.push(opt);\n }\n const optionsStr = opts.join(' ');\n\n // Wrap in tw-storydata\n const zoom = String(story.twine2.zoom);\n\n const wrapper =\n `<!-- UUID://${htmlCommentSanitize(story.ifid)}// -->` +\n `<tw-storydata name=\"${attrEscape(story.name)}\" startnode=\"${attrEscape(startID)}\" ` +\n `creator=\"${attrEscape(CREATOR_NAME)}\" creator-version=\"${attrEscape(VERSION)}\" ` +\n `ifid=\"${attrEscape(story.ifid)}\" zoom=\"${attrEscape(zoom)}\" ` +\n `format=\"${attrEscape(story.twine2.format)}\" ` +\n `format-version=\"${attrEscape(story.twine2.formatVersion)}\" ` +\n `options=\"${attrEscape(optionsStr)}\" tags=\"${attrEscape(story.twine2.tags)}\" hidden>`;\n\n return wrapper + parts.join('') + '</tw-storydata>';\n}\n","/**\n * Twine 1 HTML and archive output.\n * Ported from storyout.go.\n */\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { ReadonlyStory, StoryFormatInfo } from './types.js';\nimport { hasTag, passageToTiddler } from './passage.js';\nimport { readFormatSource } from './formats.js';\nimport { jsStringEscape, htmlCommentSanitize } from './escape.js';\nimport { VERSION } from './version.js';\n\nconst CREATOR_NAME = 'twee-ts';\n\nexport function toTwine1Archive(story: ReadonlyStory, _startName: string): string {\n const { data, count } = getTwine1PassageChunk(story);\n return `<div id=\"storeArea\" data-size=\"${count}\">${data}</div>\\n`;\n}\n\nexport function toTwine1HTML(story: ReadonlyStory, format: StoryFormatInfo, startName: string): string {\n const formatDir = dirname(format.filename);\n const parentDir = dirname(formatDir);\n let template = readFormatSource(format);\n const { data, count } = getTwine1PassageChunk(story);\n\n // Component replacements\n template = tryReplaceComponent(template, '\"USER_LIB\"', join(formatDir, 'userlib.js'), false);\n template = tryReplaceComponent(template, '\"ENGINE\"', join(parentDir, 'engine.js'), true);\n template = tryReplaceComponent(template, '\"SUGARCANE\"', join(formatDir, 'code.js'), true);\n template = tryReplaceComponent(template, '\"JONAH\"', join(formatDir, 'code.js'), true);\n\n if (story.twine1.settings.get('jquery') === 'on') {\n template = tryReplaceComponent(template, '\"JQUERY\"', join(parentDir, 'jquery.js'), true);\n }\n if (story.twine1.settings.get('modernizr') === 'on') {\n template = tryReplaceComponent(template, '\"MODERNIZR\"', join(parentDir, 'modernizr.js'), true);\n }\n\n // Story instance replacements\n const displayStart = startName === 'Start' ? '' : startName;\n template = template.replace('\"VERSION\"', `Compiled with ${CREATOR_NAME}, ${VERSION}`);\n template = template.replace('\"TIME\"', `Built on ${new Date().toUTCString()}`);\n const startAtValue = `\"${jsStringEscape(displayStart)}\"`;\n template = template.replace('\"START_AT\"', () => startAtValue);\n template = template.replace('\"STORY_SIZE\"', `\"${count}\"`);\n\n if (template.includes('\"STORY\"')) {\n template = template.replace('\"STORY\"', () => data);\n } else {\n // Pre-1.4 format: append data + footer\n let footer: string;\n try {\n footer = readFileSync(join(formatDir, 'footer.html'), 'utf-8');\n } catch {\n footer = '</div>\\n</body>\\n</html>\\n';\n }\n template += data + footer;\n }\n\n // IFID replacement\n if (story.ifid) {\n const safeIfid = htmlCommentSanitize(story.ifid);\n if (template.includes('<div id=\"store-area\"')) {\n template = template.replace('<div id=\"store-area\"', `<!-- UUID://${safeIfid}// --><div id=\"store-area\"`);\n } else {\n template = template.replace('<div id=\"storeArea\"', `<!-- UUID://${safeIfid}// --><div id=\"storeArea\"`);\n }\n }\n\n return template;\n}\n\nfunction getTwine1PassageChunk(story: ReadonlyStory): { data: string; count: number } {\n const obfuscateRot13 = story.twine1.settings.get('obfuscate') === 'rot13';\n let data = '';\n let count = 0;\n\n for (const p of story.passages) {\n if (hasTag(p, 'Twine.private')) continue;\n count++;\n data += passageToTiddler(p, count, obfuscateRot13);\n }\n\n return { data, count };\n}\n\nfunction tryReplaceComponent(template: string, placeholder: string, componentPath: string, required: boolean): string {\n if (!template.includes(placeholder)) return template;\n try {\n let content = readFileSync(componentPath, 'utf-8');\n if (content.charCodeAt(0) === 0xfeff) content = content.slice(1);\n return template.replace(placeholder, () => content);\n } catch (e) {\n if (required) {\n throw new Error(\n `Required format component not found: ${componentPath}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n return template;\n }\n}\n","/**\n * Twee 3/1 decompile output.\n * Ported from storyout.go.\n */\nimport type { ReadonlyStory, OutputMode } from './types.js';\nimport { passageToTwee } from './passage.js';\n\nexport function toTwee(story: ReadonlyStory, outMode: OutputMode): string {\n let data = '';\n for (const p of story.passages) {\n data += passageToTwee(p, outMode);\n }\n return data;\n}\n","/**\n * Module/head injection into <head>.\n * Ported from module.go + io.go:modifyHead().\n */\nimport type { Diagnostic } from './types.js';\nimport { normalizedFileExt, mediaTypeFromExt, fontFormatHint, slugify } from './media-types.js';\nimport { readUTF8, readBase64, baseNameWithoutExt } from './util.js';\n\n/**\n * Load modules and return HTML tags to inject before </head>.\n */\nexport function loadModules(filenames: string[]): string {\n const processed = new Set<string>();\n const headTags: string[] = [];\n\n for (const filename of filenames) {\n if (processed.has(filename)) continue;\n\n const ext = normalizedFileExt(filename);\n let tag: string | null = null;\n\n switch (ext) {\n case 'css':\n tag = loadModuleTagged('style', filename);\n break;\n case 'js':\n tag = loadModuleTagged('script', filename);\n break;\n case 'otf':\n case 'ttf':\n case 'woff':\n case 'woff2':\n tag = loadModuleFont(filename);\n break;\n default:\n continue;\n }\n\n if (tag) headTags.push(tag);\n processed.add(filename);\n }\n\n return headTags.join('\\n');\n}\n\nfunction loadModuleTagged(tag: string, filename: string): string | null {\n const source = readUTF8(filename).trim();\n if (source.length === 0) return null;\n\n const family = baseNameWithoutExt(filename);\n const idSlug = `${tag}-module-${slugify(family)}`;\n const mimeType = tag === 'script' ? 'text/javascript' : 'text/css';\n\n return `<${tag} id=\"${idSlug}\" type=\"${mimeType}\">${source}</${tag}>`;\n}\n\nfunction loadModuleFont(filename: string): string | null {\n const source = readBase64(filename);\n const family = baseNameWithoutExt(filename);\n const idSlug = `style-module-${slugify(family)}`;\n const ext = normalizedFileExt(filename);\n const mediaType = mediaTypeFromExt(ext);\n const hint = fontFormatHint(ext);\n\n return `<style id=\"${idSlug}\" type=\"text/css\">@font-face {\\n\\tfont-family: \"${family}\";\\n\\tsrc: url(\"data:${mediaType};base64,${source}\") format(\"${hint}\");\\n}</style>`;\n}\n\n/**\n * Inject modules and head file content before </head>.\n */\nexport function modifyHead(html: string, modulePaths: string[], headFile?: string, diagnostics?: Diagnostic[]): string {\n const parts: string[] = [];\n\n if (modulePaths.length > 0) {\n const modules = loadModules(modulePaths).trim();\n if (modules.length > 0) parts.push(modules);\n }\n\n if (headFile) {\n try {\n const source = readUTF8(headFile).trim();\n if (source.length > 0) parts.push(source);\n } catch (e) {\n diagnostics?.push({\n level: 'warning',\n message: `Failed to read head file \"${headFile}\": ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n\n if (parts.length > 0) {\n parts.push('</head>');\n const replacement = parts.join('\\n');\n return html.replace('</head>', () => replacement);\n }\n return html;\n}\n","/**\n * Remote story format fetching, caching, and checksum verification.\n * Uses the Story Formats Archive (SFA) as the default source.\n */\nimport { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, statSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { SFAIndex, SFAIndexEntry, StoryFormatInfo } from './types.js';\nimport { parseSemver, semverCompare, parseFormatJSON } from './formats.js';\n\nconst DEFAULT_SFA_INDICES = [\n 'https://videlais.github.io/story-formats-archive/official/index.json',\n 'https://videlais.github.io/story-formats-archive/unofficial/index.json',\n];\n\n/** Get the cache directory for downloaded story formats. */\nexport function getCacheDir(): string {\n const xdg = process.env['XDG_CACHE_HOME'];\n const base = xdg || join(homedir(), '.cache');\n return join(base, 'twee-ts', 'storyformats');\n}\n\n/** In-memory index cache, keyed by URL. Cleared each compile. */\nconst indexCache = new Map<string, SFAIndex>();\n\n/** Clear the in-memory index cache. */\nexport function clearIndexCache(): void {\n indexCache.clear();\n}\n\n/** Validate that a JSON value is a valid SFAIndexEntry. */\nfunction isValidEntry(val: unknown): val is SFAIndexEntry {\n if (typeof val !== 'object' || val === null || Array.isArray(val)) return false;\n const obj = val as Record<string, unknown>;\n return (\n typeof obj.name === 'string' &&\n typeof obj.version === 'string' &&\n typeof obj.checksums === 'object' &&\n obj.checksums !== null &&\n !Array.isArray(obj.checksums)\n );\n}\n\n/** Validate that a JSON value conforms to the SFAIndex shape. */\nfunction validateSFAIndex(json: unknown): SFAIndex {\n if (typeof json !== 'object' || json === null) {\n throw new Error('SFA index is not an object');\n }\n const obj = json as Record<string, unknown>;\n const twine1 = Array.isArray(obj['twine1']) ? (obj['twine1'] as unknown[]).filter(isValidEntry) : [];\n const twine2 = Array.isArray(obj['twine2']) ? (obj['twine2'] as unknown[]).filter(isValidEntry) : [];\n return { twine1, twine2 };\n}\n\n/** Generate a format ID from name and version. */\nfunction makeFormatId(name: string, version: string): string {\n const major = parseSemver(version)?.[0] ?? '0';\n return `${name.toLowerCase().replace(/\\s+/g, '-')}-${major}`;\n}\n\n/** Fetch and parse an SFA index.json, with in-memory caching. */\nexport async function fetchIndex(url: string): Promise<SFAIndex> {\n const cached = indexCache.get(url);\n if (cached) return cached;\n\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch format index from ${url}: ${res.status} ${res.statusText}`);\n }\n const data = validateSFAIndex(await res.json());\n indexCache.set(url, data);\n return data;\n}\n\ninterface FindEntryResult {\n entry: SFAIndexEntry;\n formatType: 'twine1' | 'twine2';\n}\n\n/**\n * Find the best matching entry in an SFA index.\n * Exact version preferred, then highest version with same major.\n */\nexport function findEntry(index: SFAIndex, name: string, version: string): FindEntryResult | undefined {\n const wanted = parseSemver(version);\n\n const searchArrays: Array<{ entries: SFAIndexEntry[]; formatType: 'twine1' | 'twine2' }> = [\n { entries: index.twine2 ?? [], formatType: 'twine2' },\n { entries: index.twine1 ?? [], formatType: 'twine1' },\n ];\n\n let bestResult: FindEntryResult | undefined;\n let bestVersion: [number, number, number] | null = null;\n\n for (const { entries, formatType } of searchArrays) {\n for (const entry of entries) {\n if (entry.name.toLowerCase() !== name.toLowerCase()) continue;\n const have = parseSemver(entry.version);\n if (!have) continue;\n\n // Exact match — return immediately\n if (wanted && semverCompare(have, wanted) === 0) return { entry, formatType };\n\n // Same-major, highest version\n if (wanted === null || (have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n if (!bestVersion || semverCompare(have, bestVersion) > 0) {\n bestVersion = have;\n bestResult = { entry, formatType };\n }\n }\n }\n }\n\n return bestResult;\n}\n\n/** Verify SHA-256 checksum using Web Crypto API (Node 22 built-in). */\nexport async function verifySHA256(content: Uint8Array<ArrayBuffer>, expectedHex: string): Promise<boolean> {\n const digest = await crypto.subtle.digest('SHA-256', content);\n const hex = Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hex === expectedHex.toLowerCase();\n}\n\n/** Derive the download URL for a format.js from the index URL and entry. */\nfunction getDownloadUrl(indexUrl: string, entry: SFAIndexEntry, formatType: 'twine1' | 'twine2'): string {\n const base = indexUrl.replace(/\\/index\\.json$/, '');\n return `${base}/${formatType}/${entry.name}/${entry.version}/format.js`;\n}\n\n/** Download a format, verify its checksum, write to cache, and return StoryFormatInfo. */\nexport async function fetchAndCacheFormat(entry: SFAIndexEntry, downloadUrl: string): Promise<StoryFormatInfo> {\n const res = await fetch(downloadUrl);\n if (!res.ok) {\n throw new Error(`Failed to download format from ${downloadUrl}: ${res.status} ${res.statusText}`);\n }\n const text = await res.text();\n\n // Verify checksum if available\n const checksumKey = Object.keys(entry.checksums ?? {}).find((k) => k.endsWith('format.js'));\n if (checksumKey) {\n const expected = entry.checksums[checksumKey];\n if (!expected) throw new Error(`Missing checksum value for key \"${checksumKey}\"`);\n const encoder = new TextEncoder();\n const valid = await verifySHA256(encoder.encode(text), expected);\n if (!valid) {\n throw new Error(`Checksum verification failed for ${entry.name} ${entry.version}`);\n }\n }\n\n // Parse format JSON to extract name/version/source\n const id = makeFormatId(entry.name, entry.version);\n const data = parseFormatJSON(text, id);\n if (!data) {\n throw new Error(`Failed to parse format JSON from ${downloadUrl}`);\n }\n\n // Write to cache\n const cacheDir = getCacheDir();\n const formatDir = join(cacheDir, entry.name, entry.version);\n mkdirSync(formatDir, { recursive: true });\n const formatPath = join(formatDir, 'format.js');\n writeFileSync(formatPath, text, 'utf-8');\n\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n}\n\n/** Download a direct format.js URL, parse its JSON, cache it, and return StoryFormatInfo. */\nexport async function fetchDirectFormat(url: string): Promise<StoryFormatInfo> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to download format from ${url}: ${res.status} ${res.statusText}`);\n }\n const text = await res.text();\n\n const tempId = 'direct-url';\n const data = parseFormatJSON(text, tempId);\n if (!data) {\n throw new Error(`Failed to parse format JSON from ${url}`);\n }\n\n const id = makeFormatId(data.name, data.version);\n\n // Write to cache\n const cacheDir = getCacheDir();\n const formatDir = join(cacheDir, data.name, data.version);\n mkdirSync(formatDir, { recursive: true });\n const formatPath = join(formatDir, 'format.js');\n writeFileSync(formatPath, text, 'utf-8');\n\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n}\n\n/**\n * Try to resolve a remote story format by name and version.\n * 1. Try direct format URLs\n * 2. Try custom index URLs\n * 3. Try default SFA indices\n */\nexport async function resolveRemoteFormat(\n name: string,\n version: string,\n indices?: string[],\n urls?: string[],\n): Promise<StoryFormatInfo | undefined> {\n let lastError: Error | undefined;\n\n // 1. Try direct URLs — check if any match by name\n if (urls) {\n for (const url of urls) {\n try {\n const info = await fetchDirectFormat(url);\n if (info.name.toLowerCase() === name.toLowerCase()) {\n const wanted = parseSemver(version);\n const have = parseSemver(info.version);\n if (!wanted || (have && have[0] === wanted[0] && semverCompare(have, wanted) >= 0)) {\n return info;\n }\n }\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n }\n\n // 2. Try custom indices, then default SFA indices\n const allIndices = [...(indices ?? []), ...DEFAULT_SFA_INDICES];\n for (const indexUrl of allIndices) {\n try {\n const index = await fetchIndex(indexUrl);\n const result = findEntry(index, name, version);\n if (result) {\n // Check cache first\n const cached = getCachedFormat(result.entry.name, result.entry.version);\n if (cached) return cached;\n\n const downloadUrl = getDownloadUrl(indexUrl, result.entry, result.formatType);\n return await fetchAndCacheFormat(result.entry, downloadUrl);\n }\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n // If all sources failed with errors, propagate the last one\n if (lastError) throw lastError;\n return undefined;\n}\n\n/** Check if a format is already in the local cache. */\nfunction getCachedFormat(name: string, version: string): StoryFormatInfo | undefined {\n const formatPath = join(getCacheDir(), name, version, 'format.js');\n try {\n if (!existsSync(formatPath)) return undefined;\n const source = readFileSync(formatPath, 'utf-8');\n const id = makeFormatId(name, version);\n const data = parseFormatJSON(source, id);\n if (!data) return undefined;\n return {\n id,\n filename: formatPath,\n isTwine2: true,\n name: data.name,\n version: data.version,\n proofing: data.proofing ?? false,\n };\n } catch {\n return undefined;\n }\n}\n\n/** Discover all cached remote formats. Returns a Map like discoverFormats(). */\nexport function discoverCachedFormats(): Map<string, StoryFormatInfo> {\n const formats = new Map<string, StoryFormatInfo>();\n const cacheDir = getCacheDir();\n\n try {\n if (!existsSync(cacheDir)) return formats;\n } catch {\n return formats;\n }\n\n let names: string[];\n try {\n names = readdirSync(cacheDir);\n } catch {\n return formats;\n }\n\n for (const name of names) {\n const nameDir = join(cacheDir, name);\n try {\n if (!statSync(nameDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n continue;\n }\n\n for (const version of versions) {\n const info = getCachedFormat(name, version);\n if (info) {\n formats.set(`${info.id}-${version}`, info);\n }\n }\n }\n\n return formats;\n}\n\n/** Info about a cached format entry with size and modification date. */\nexport interface CachedFormatEntry {\n readonly name: string;\n readonly version: string;\n readonly sizeBytes: number;\n readonly modifiedAt: Date;\n}\n\n/** List all cached formats with size and modification date. */\nexport function listCachedFormats(): readonly CachedFormatEntry[] {\n const cacheDir = getCacheDir();\n const entries: CachedFormatEntry[] = [];\n\n try {\n if (!existsSync(cacheDir)) return entries;\n } catch {\n return entries;\n }\n\n let names: string[];\n try {\n names = readdirSync(cacheDir);\n } catch {\n return entries;\n }\n\n for (const name of names) {\n const nameDir = join(cacheDir, name);\n try {\n if (!statSync(nameDir).isDirectory()) continue;\n } catch {\n continue;\n }\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n continue;\n }\n\n for (const version of versions) {\n const formatPath = join(nameDir, version, 'format.js');\n try {\n const stat = statSync(formatPath);\n entries.push({\n name,\n version,\n sizeBytes: stat.size,\n modifiedAt: stat.mtime,\n });\n } catch {\n // Skip entries without a valid format.js\n }\n }\n }\n\n return entries;\n}\n\n/** Clear all cached formats, or only those matching a given name. Returns the number of entries removed. */\nexport function clearCachedFormats(name?: string): number {\n const cacheDir = getCacheDir();\n if (!existsSync(cacheDir)) return 0;\n\n if (!name) {\n const entries = listCachedFormats();\n const count = entries.length;\n rmSync(cacheDir, { recursive: true, force: true });\n return count;\n }\n\n const nameDir = join(cacheDir, name);\n if (!existsSync(nameDir)) return 0;\n\n let versions: string[];\n try {\n versions = readdirSync(nameDir);\n } catch {\n return 0;\n }\n const count = versions.length;\n rmSync(nameDir, { recursive: true, force: true });\n return count;\n}\n\n/** Get total cache size in bytes and format count. */\nexport function getCacheSize(): { totalBytes: number; count: number } {\n const entries = listCachedFormats();\n const totalBytes = entries.reduce((sum, e) => sum + e.sizeBytes, 0);\n return { totalBytes, count: entries.length };\n}\n"],"mappings":"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AAO,GAAE,CAAC,GAAE,aAAa,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,aAAa,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,S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AE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GA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AAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,gBAAgB,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,UAAU,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,SAAS,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,WAAW,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC,GAAE,YAAY,GAAE,CAAC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AAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,OAAO,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,CAAC,GAAE,QAAQ,GAAE,C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","names":["writeFileSync","readdirSync","statSync","join","statSync","readdirSync","join","statSync","quote","_a","BinTrieFlags","CharCodes","EntityDecoderState","DecodingMode","_a","CharCodes","State","QuoteType","quote","_a","quote","ElementType","Text","Comment","_a","CDATA","isTag","Text","Comment","isTag","CDATA","Text","Comment","CDATA","decodeMap","fromCodePoint","_a","replaceCodePoint","CharCodes","TO_LOWER_BIT","BinTrieFlags","isNumber","isHexadecimalCharacter","isAsciiAlphaNumeric","isEntityInAttributeInvalidEnd","EntityDecoderState","DecodingMode","EntityDecoder","_a","replaceCodePoint","determineBranch","fromCodePoint","escape","EntityLevel","EncodingMode","DocumentPosition","statSync","readFileSync","join","CREATOR_NAME","join","readFileSync","readFileSync","readdirSync","statSync","join","homedir","join","homedir","readFileSync","CREATOR_NAME","CREATOR_NAME"]}
|