@f-o-t/markdown 1.0.3 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils.ts", "../src/inline-parser.ts", "../src/block-parser.ts", "../src/schemas.ts", "../src/parser.ts", "../src/generator.ts", "../src/html-renderer.ts", "../src/html-parser.ts", "../src/stream.ts"],
4
+ "sourcesContent": [
5
+ "import type { EncodingInfo, LineInfo } from \"./types\";\n\n// =============================================================================\n// Encoding Detection\n// =============================================================================\n\n/**\n * Detects if the buffer starts with a BOM and returns the encoding.\n *\n * @param buffer - The buffer to check\n * @returns The encoding info with BOM length\n */\nexport function detectEncoding(buffer: Uint8Array): EncodingInfo {\n // UTF-8 BOM: EF BB BF\n if (\n buffer.length >= 3 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ) {\n return { encoding: \"utf-8\", bomLength: 3 };\n }\n\n // UTF-16 LE BOM: FF FE\n if (buffer.length >= 2 && buffer[0] === 0xff && buffer[1] === 0xfe) {\n return { encoding: \"utf-16le\", bomLength: 2 };\n }\n\n // UTF-16 BE BOM: FE FF\n if (buffer.length >= 2 && buffer[0] === 0xfe && buffer[1] === 0xff) {\n return { encoding: \"utf-16be\", bomLength: 2 };\n }\n\n // Default to UTF-8\n return { encoding: \"utf-8\", bomLength: 0 };\n}\n\n/**\n * Decodes a buffer to string with the appropriate encoding.\n *\n * @param buffer - The buffer to decode\n * @returns The decoded string\n */\nexport function decodeBuffer(buffer: Uint8Array): string {\n const { encoding, bomLength } = detectEncoding(buffer);\n const data = bomLength > 0 ? buffer.slice(bomLength) : buffer;\n // TextDecoder accepts utf-8, utf-16le, and utf-16be at runtime\n // biome-ignore lint/suspicious/noExplicitAny: TextDecoder runtime supports more encodings than TypeScript types\n const decoder = new TextDecoder(encoding as any);\n return decoder.decode(data);\n}\n\n// =============================================================================\n// Line Ending Detection\n// =============================================================================\n\n/**\n * Detects the line ending style used in the content.\n *\n * @param content - The content to analyze\n * @returns The detected line ending\n */\nexport function detectLineEnding(content: string): \"\\n\" | \"\\r\\n\" {\n const crlfIndex = content.indexOf(\"\\r\\n\");\n const lfIndex = content.indexOf(\"\\n\");\n\n // If CRLF is found and appears before or at same position as LF\n if (crlfIndex !== -1 && (lfIndex === -1 || crlfIndex <= lfIndex)) {\n return \"\\r\\n\";\n }\n\n return \"\\n\";\n}\n\n/**\n * Normalizes line endings to LF.\n *\n * @param content - The content to normalize\n * @returns The content with normalized line endings\n */\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n?/g, \"\\n\");\n}\n\n/**\n * Normalizes escaped newline sequences to actual newlines.\n * Handles AI-generated content that may contain literal \\n strings\n * instead of actual newline characters.\n *\n * @param content - The content to normalize\n * @returns The content with escaped newlines converted to actual newlines\n */\nexport function normalizeEscapedNewlines(content: string): string {\n // Replace literal \\n sequences with actual newlines\n // Process double-escaped first, then single-escaped\n return content\n .replace(/\\\\\\\\n/g, \"\\n\") // Double-escaped \\\\n -> newline\n .replace(/\\\\n/g, \"\\n\"); // Single-escaped \\n -> newline\n}\n\n// =============================================================================\n// Line Parsing\n// =============================================================================\n\n/**\n * Splits content into lines with metadata.\n *\n * @param content - The content to split\n * @returns Array of line info objects\n */\nexport function splitLines(content: string): LineInfo[] {\n const normalized = normalizeLineEndings(content);\n const rawLines = normalized.split(\"\\n\");\n\n let offset = 0;\n return rawLines.map((raw, index) => {\n const indent = countIndent(raw);\n const lineContent = raw.slice(indent);\n const lineOffset = offset;\n\n // Update offset for next line (+1 for newline character)\n offset += raw.length + 1;\n\n return {\n raw,\n content: lineContent,\n indent,\n lineNumber: index + 1,\n isBlank: lineContent.length === 0,\n offset: lineOffset,\n };\n });\n}\n\n/**\n * Counts the number of leading spaces in a string.\n * Tabs are expanded to 4 spaces.\n *\n * @param line - The line to check\n * @returns The indent level (in spaces)\n */\nexport function countIndent(line: string): number {\n let indent = 0;\n for (const char of line) {\n if (char === \" \") {\n indent++;\n } else if (char === \"\\t\") {\n // Tab stops at multiples of 4\n indent = Math.ceil((indent + 1) / 4) * 4;\n } else {\n break;\n }\n }\n return indent;\n}\n\n/**\n * Removes a specific amount of indentation from a line.\n *\n * @param line - The line to process\n * @param amount - The amount of indentation to remove\n * @returns The line with indentation removed\n */\nexport function removeIndent(line: string, amount: number): string {\n let removed = 0;\n let i = 0;\n\n while (i < line.length && removed < amount) {\n const char = line[i];\n if (char === \" \") {\n removed++;\n i++;\n } else if (char === \"\\t\") {\n const tabWidth = 4 - (removed % 4);\n if (removed + tabWidth <= amount) {\n removed += tabWidth;\n i++;\n } else {\n // Partial tab - add spaces to make up the difference\n const spaces = amount - removed;\n return \" \".repeat(tabWidth - spaces) + line.slice(i + 1);\n }\n } else {\n break;\n }\n }\n\n return line.slice(i);\n}\n\n/**\n * Checks if a line is blank (only whitespace).\n *\n * @param line - The line to check\n * @returns True if the line is blank\n */\nexport function isBlankLine(line: string): boolean {\n return line.trim().length === 0;\n}\n\n// =============================================================================\n// Markdown Escaping\n// =============================================================================\n\n/**\n * Characters that need escaping in markdown.\n */\nconst ESCAPE_CHARS = /[\\\\`*_{}[\\]()#+\\-.!<>|]/g;\n\n/**\n * Escapes special markdown characters.\n *\n * @param text - The text to escape\n * @returns The escaped text\n */\nexport function escapeMarkdown(text: string): string {\n return text.replace(ESCAPE_CHARS, \"\\\\$&\");\n}\n\n/**\n * Characters that can be escaped in markdown.\n */\nconst ESCAPABLE = \"\\\\!\\\"#$%&'()*+,-./:;<=>?@[]^_`{|}~\";\n\n/**\n * Unescapes backslash-escaped characters in markdown.\n *\n * @param text - The text to unescape\n * @returns The unescaped text\n */\nexport function unescapeMarkdown(text: string): string {\n const parts: string[] = [];\n let i = 0;\n\n while (i < text.length) {\n if (text[i] === \"\\\\\" && i + 1 < text.length) {\n const nextChar = text[i + 1];\n if (nextChar && ESCAPABLE.includes(nextChar)) {\n parts.push(nextChar);\n i += 2;\n continue;\n }\n }\n parts.push(text[i] as string);\n i++;\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Normalizes markdown by unescaping incorrectly escaped emphasis markers.\n * LLMs sometimes escape ** or * markers that shouldn't be escaped.\n *\n * @param text - The markdown text to normalize\n * @returns The normalized text with unescaped emphasis markers\n *\n * @example\n * ```typescript\n * normalizeMarkdownEmphasis(\"\\\\*\\\\*bold\\\\*\\\\*\"); // \"**bold**\"\n * normalizeMarkdownEmphasis(\"\\\\*italic\\\\*\"); // \"*italic*\"\n * ```\n */\nexport function normalizeMarkdownEmphasis(text: string): string {\n // Unescape bold markers: \\*\\* → **\n // Unescape italic markers: \\* → *\n return text.replace(/\\\\(\\*{1,2})/g, \"$1\");\n}\n\n// =============================================================================\n// Entity Handling\n// =============================================================================\n\n/**\n * HTML entity map for decoding.\n */\nconst HTML_ENTITIES: Record<string, string> = {\n amp: \"&\",\n lt: \"<\",\n gt: \">\",\n quot: '\"',\n apos: \"'\",\n nbsp: \"\\u00A0\",\n copy: \"\\u00A9\",\n reg: \"\\u00AE\",\n trade: \"\\u2122\",\n mdash: \"\\u2014\",\n ndash: \"\\u2013\",\n hellip: \"\\u2026\",\n lsquo: \"\\u2018\",\n rsquo: \"\\u2019\",\n ldquo: \"\\u201C\",\n rdquo: \"\\u201D\",\n};\n\n/**\n * Single regex for all HTML entity types.\n */\nconst HTML_ENTITY_REGEX = /&(?:#(\\d+)|#[xX]([0-9a-fA-F]+)|([a-zA-Z]+));/g;\n\n/**\n * Decodes HTML entities in text.\n *\n * @param text - The text to decode\n * @returns The decoded text\n */\nexport function decodeHtmlEntities(text: string): string {\n return text.replace(HTML_ENTITY_REGEX, (match, decimal, hex, named) => {\n if (decimal) {\n const num = Number.parseInt(decimal, 10);\n return num > 0 && num < 0x10ffff ? String.fromCodePoint(num) : match;\n }\n if (hex) {\n const num = Number.parseInt(hex, 16);\n return num > 0 && num < 0x10ffff ? String.fromCodePoint(num) : match;\n }\n if (named) {\n return HTML_ENTITIES[named] ?? match;\n }\n return match;\n });\n}\n\n/**\n * Encodes special HTML characters.\n *\n * @param text - The text to encode\n * @returns The encoded text\n */\nexport function encodeHtmlEntities(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n// =============================================================================\n// URL Handling\n// =============================================================================\n\n/**\n * Encodes a URL for safe use in markdown.\n *\n * @param url - The URL to encode\n * @returns The encoded URL\n */\nexport function encodeUrl(url: string): string {\n // Encode parentheses and spaces which can break markdown links\n return url\n .replace(/%/g, \"%25\")\n .replace(/ /g, \"%20\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\");\n}\n\n/**\n * Decodes a URL from markdown.\n *\n * @param url - The URL to decode\n * @returns The decoded URL\n */\nexport function decodeUrl(url: string): string {\n try {\n return decodeURIComponent(url);\n } catch {\n // Invalid encoding, return as-is\n return url;\n }\n}\n\n/**\n * Checks if a string is a valid URL.\n *\n * @param str - The string to check\n * @returns True if the string is a valid URL\n */\nexport function isValidUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Checks if a string is a valid email address (simplified).\n *\n * @param str - The string to check\n * @returns True if the string looks like an email\n */\nexport function isValidEmail(str: string): boolean {\n // Simplified email regex - not RFC 5322 compliant but good enough for autolinks\n return /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(\n str,\n );\n}\n\n// =============================================================================\n// String Utilities\n// =============================================================================\n\n/**\n * Normalizes a link reference label.\n * Per CommonMark: case-insensitive, collapse internal whitespace.\n *\n * @param label - The label to normalize\n * @returns The normalized label\n */\nexport function normalizeLabel(label: string): string {\n return label\n .trim()\n .toLowerCase()\n .replace(/[\\t\\n\\r ]+/g, \" \");\n}\n\n/**\n * Repeats a string n times.\n *\n * @param str - The string to repeat\n * @param count - The number of times to repeat\n * @returns The repeated string\n */\nexport function repeat(str: string, count: number): string {\n return str.repeat(Math.max(0, count));\n}\n\n/**\n * Pads a string to a minimum length.\n *\n * @param str - The string to pad\n * @param length - The minimum length\n * @param char - The padding character\n * @returns The padded string\n */\nexport function padEnd(str: string, length: number, char = \" \"): string {\n if (str.length >= length) return str;\n return str + char.repeat(length - str.length);\n}\n\n// =============================================================================\n// Pattern Matching\n// =============================================================================\n\n/**\n * Regex for ATX heading (# style).\n */\nexport const ATX_HEADING_REGEX = /^(#{1,6})(?:[ \\t]+(.*))?$/;\n\n/**\n * Regex for setext heading underline.\n */\nexport const SETEXT_HEADING_REGEX = /^(=+|-+)[ \\t]*$/;\n\n/**\n * Regex for thematic break (---, ***, ___).\n */\nexport const THEMATIC_BREAK_REGEX =\n /^(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\n\n/**\n * Regex for fenced code block opening.\n */\nexport const FENCED_CODE_OPEN_REGEX = /^(`{3,}|~{3,})[ \\t]*([^`\\n]*)?$/;\n\n/**\n * Regex for ordered list item.\n */\nexport const ORDERED_LIST_REGEX = /^(\\d{1,9})([.)])[ \\t]+/;\n\n/**\n * Regex for unordered list item.\n */\nexport const UNORDERED_LIST_REGEX = /^([-*+])[ \\t]+/;\n\n/**\n * Regex for blockquote.\n */\nexport const BLOCKQUOTE_REGEX = /^>[ \\t]?/;\n\n/**\n * Regex for link reference definition.\n */\nexport const LINK_REFERENCE_REGEX =\n /^\\[([^\\]]+)\\]:[ \\t]*<?([^\\s>]+)>?(?:[ \\t]+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?[ \\t]*$/;\n\n/**\n * Regex for autolink.\n */\nexport const AUTOLINK_REGEX = /^<([a-zA-Z][a-zA-Z0-9+.-]{1,31}:[^\\s<>]*)>$/;\n\n/**\n * Regex for email autolink.\n */\nexport const EMAIL_AUTOLINK_REGEX =\n /^<([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>$/;\n\n/**\n * Regex for inline link.\n */\nexport const INLINE_LINK_REGEX =\n /^\\[([^\\]]*)\\]\\(([^)\\s]*?)(?:[ \\t]+(?:\"([^\"]*)\"|'([^']*)'|\\(([^)]*)\\)))?\\)/;\n\n/**\n * Regex for reference link.\n */\nexport const REFERENCE_LINK_REGEX = /^\\[([^\\]]*)\\]\\[([^\\]]*)\\]/;\n\n/**\n * Regex for collapsed reference link.\n */\nexport const COLLAPSED_LINK_REGEX = /^\\[([^\\]]*)\\]\\[\\]/;\n\n/**\n * Regex for shortcut reference link.\n */\nexport const SHORTCUT_LINK_REGEX = /^\\[([^\\]]*)\\]/;\n\n// =============================================================================\n// HTML Block Patterns (CommonMark Types 1-7)\n// =============================================================================\n\n/**\n * HTML block type 1 - Script, pre, style, textarea.\n */\nexport const HTML_BLOCK_1_OPEN = /^<(?:script|pre|style|textarea)(?:\\s|>|$)/i;\nexport const HTML_BLOCK_1_CLOSE = /<\\/(?:script|pre|style|textarea)>/i;\n\n/**\n * HTML block type 2 - Comment.\n */\nexport const HTML_BLOCK_2_OPEN = /^<!--/;\nexport const HTML_BLOCK_2_CLOSE = /-->/;\n\n/**\n * HTML block type 3 - Processing instruction.\n */\nexport const HTML_BLOCK_3_OPEN = /^<\\?/;\nexport const HTML_BLOCK_3_CLOSE = /\\?>/;\n\n/**\n * HTML block type 4 - Declaration.\n */\nexport const HTML_BLOCK_4_OPEN = /^<![A-Z]/;\nexport const HTML_BLOCK_4_CLOSE = />/;\n\n/**\n * HTML block type 5 - CDATA.\n */\nexport const HTML_BLOCK_5_OPEN = /^<!\\[CDATA\\[/;\nexport const HTML_BLOCK_5_CLOSE = /\\]\\]>/;\n\n/**\n * HTML block type 6 - Standard block elements.\n */\nexport const HTML_BLOCK_6_OPEN =\n /^<\\/?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\\s|\\/?>|$)/i;\n\n/**\n * HTML block type 7 - Open tag not followed by blank line.\n */\nexport const HTML_BLOCK_7_OPEN =\n /^(?:<[a-zA-Z][a-zA-Z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\\s*=\\s*(?:[^\"'=<>`\\s]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>|<\\/[a-zA-Z][a-zA-Z0-9-]*\\s*>)[ \\t]*$/;\n\n/**\n * Determines HTML block type for a line.\n *\n * @param line - The line to check\n * @returns The HTML block type (1-7) or 0 if not an HTML block\n */\nexport function getHtmlBlockType(line: string): number {\n if (HTML_BLOCK_1_OPEN.test(line)) return 1;\n if (HTML_BLOCK_2_OPEN.test(line)) return 2;\n if (HTML_BLOCK_3_OPEN.test(line)) return 3;\n if (HTML_BLOCK_4_OPEN.test(line)) return 4;\n if (HTML_BLOCK_5_OPEN.test(line)) return 5;\n if (HTML_BLOCK_6_OPEN.test(line)) return 6;\n if (HTML_BLOCK_7_OPEN.test(line)) return 7;\n return 0;\n}\n\n/**\n * Checks if a line closes an HTML block of the given type.\n *\n * @param line - The line to check\n * @param type - The HTML block type\n * @returns True if the line closes the block\n */\nexport function closesHtmlBlock(line: string, type: number): boolean {\n switch (type) {\n case 1:\n return HTML_BLOCK_1_CLOSE.test(line);\n case 2:\n return HTML_BLOCK_2_CLOSE.test(line);\n case 3:\n return HTML_BLOCK_3_CLOSE.test(line);\n case 4:\n return HTML_BLOCK_4_CLOSE.test(line);\n case 5:\n return HTML_BLOCK_5_CLOSE.test(line);\n case 6:\n case 7:\n return isBlankLine(line);\n default:\n return false;\n }\n}\n",
6
+ "import type { InlineNode } from \"./schemas\";\nimport type { Bracket, Delimiter, InlineToken } from \"./types\";\nimport {\n AUTOLINK_REGEX,\n decodeHtmlEntities,\n EMAIL_AUTOLINK_REGEX,\n normalizeLabel,\n unescapeMarkdown,\n} from \"./utils\";\n\n// =============================================================================\n// Tokenization\n// =============================================================================\n\n/**\n * Tokenizes inline content into a sequence of tokens.\n */\nfunction tokenize(text: string): InlineToken[] {\n const tokens: InlineToken[] = [];\n let i = 0;\n let textStart = 0;\n\n const pushText = (end: number) => {\n if (end > textStart) {\n tokens.push({\n type: \"text\",\n value: text.slice(textStart, end),\n start: textStart,\n end,\n });\n }\n };\n\n while (i < text.length) {\n const char = text[i];\n\n // Backslash escapes\n if (char === \"\\\\\") {\n if (i + 1 < text.length) {\n const nextChar = text[i + 1];\n // Hard line break (backslash at end of line)\n if (nextChar === \"\\n\") {\n pushText(i);\n tokens.push({ type: \"hardBreak\", start: i, end: i + 2 });\n i += 2;\n textStart = i;\n continue;\n }\n // Escapable characters\n if (\n nextChar &&\n \"\\\\!\\\"#$%&'()*+,-./:;<=>?@[]^_`{|}~\".includes(nextChar)\n ) {\n pushText(i);\n tokens.push({\n type: \"text\",\n value: nextChar,\n start: i,\n end: i + 2,\n });\n i += 2;\n textStart = i;\n continue;\n }\n }\n i++;\n continue;\n }\n\n // Code spans\n if (char === \"`\") {\n const codeSpan = parseCodeSpan(text, i);\n if (codeSpan) {\n pushText(i);\n tokens.push(codeSpan);\n i = codeSpan.end;\n textStart = i;\n continue;\n }\n i++;\n continue;\n }\n\n // Autolinks\n if (char === \"<\") {\n const autolink = parseAutolink(text, i);\n if (autolink) {\n pushText(i);\n tokens.push(autolink);\n i = autolink.end;\n textStart = i;\n continue;\n }\n\n // HTML inline\n const htmlInline = parseHtmlInline(text, i);\n if (htmlInline) {\n pushText(i);\n tokens.push(htmlInline);\n i = htmlInline.end;\n textStart = i;\n continue;\n }\n\n i++;\n continue;\n }\n\n // Line breaks\n if (char === \"\\n\") {\n pushText(i);\n // Check for hard break (two spaces before newline)\n const prevText = text.slice(textStart, i);\n if (prevText.endsWith(\" \")) {\n // Remove trailing spaces from previous text token\n if (\n tokens.length > 0 &&\n tokens[tokens.length - 1]?.type === \"text\"\n ) {\n const lastToken = tokens[tokens.length - 1] as InlineToken & {\n type: \"text\";\n };\n lastToken.value = lastToken.value.replace(/ {2,}$/, \"\");\n }\n tokens.push({ type: \"hardBreak\", start: i, end: i + 1 });\n } else {\n tokens.push({ type: \"softBreak\", start: i, end: i + 1 });\n }\n i++;\n textStart = i;\n continue;\n }\n\n // Emphasis delimiters\n if (char === \"*\" || char === \"_\") {\n const run = parseDelimiterRun(text, i, char);\n if (run) {\n pushText(i);\n tokens.push(run);\n i = run.end;\n textStart = i;\n continue;\n }\n i++;\n continue;\n }\n\n // Link/Image brackets\n if (char === \"[\") {\n pushText(i);\n // Check for image\n const isImage = i > 0 && text[i - 1] === \"!\";\n if (isImage && tokens.length > 0) {\n // Remove the ! from previous text\n const lastToken = tokens[tokens.length - 1];\n if (lastToken?.type === \"text\" && lastToken.value.endsWith(\"!\")) {\n lastToken.value = lastToken.value.slice(0, -1);\n if (lastToken.value === \"\") {\n tokens.pop();\n }\n }\n }\n tokens.push({\n type: \"openBracket\",\n isImage,\n start: isImage ? i - 1 : i,\n end: i + 1,\n });\n i++;\n textStart = i;\n continue;\n }\n\n if (char === \"]\") {\n pushText(i);\n tokens.push({ type: \"closeBracket\", start: i, end: i + 1 });\n i++;\n textStart = i;\n\n // Check for link destination\n if (i < text.length && text[i] === \"(\") {\n const linkInfo = parseLinkDestination(text, i);\n if (linkInfo) {\n tokens.push(linkInfo);\n i = linkInfo.end;\n textStart = i;\n }\n } else if (i < text.length && text[i] === \"[\") {\n // Reference link\n const refEnd = text.indexOf(\"]\", i + 1);\n if (refEnd > i + 1) {\n const ref = text.slice(i + 1, refEnd);\n tokens.push({\n type: \"linkInfo\",\n url: \"\",\n title: ref,\n start: i,\n end: refEnd + 1,\n });\n i = refEnd + 1;\n textStart = i;\n }\n }\n continue;\n }\n\n i++;\n }\n\n pushText(text.length);\n return tokens;\n}\n\n/**\n * Parses a code span starting at the given position.\n */\nfunction parseCodeSpan(\n text: string,\n start: number,\n): (InlineToken & { type: \"code\" }) | null {\n // Count opening backticks\n let backticks = 0;\n let i = start;\n while (i < text.length && text[i] === \"`\") {\n backticks++;\n i++;\n }\n\n if (backticks === 0) return null;\n\n // Find matching closing backticks\n const closingPattern = \"`\".repeat(backticks);\n let searchStart = i;\n\n while (searchStart < text.length) {\n const closingIndex = text.indexOf(closingPattern, searchStart);\n if (closingIndex === -1) return null;\n\n // Make sure it's exactly the right number of backticks\n const afterClosing = closingIndex + backticks;\n if (\n (closingIndex === searchStart || text[closingIndex - 1] !== \"`\") &&\n (afterClosing >= text.length || text[afterClosing] !== \"`\")\n ) {\n // Extract content and normalize\n let content = text.slice(i, closingIndex);\n\n // Collapse internal newlines to spaces\n content = content.replace(/\\n/g, \" \");\n\n // Strip one leading and one trailing space if both present\n if (\n content.length >= 2 &&\n content.startsWith(\" \") &&\n content.endsWith(\" \") &&\n !/^ +$/.test(content)\n ) {\n content = content.slice(1, -1);\n }\n\n return {\n type: \"code\",\n value: content,\n start,\n end: afterClosing,\n };\n }\n\n searchStart = closingIndex + 1;\n }\n\n return null;\n}\n\n/**\n * Parses an autolink starting at the given position.\n */\nfunction parseAutolink(\n text: string,\n start: number,\n): (InlineToken & { type: \"autolink\" }) | null {\n if (text[start] !== \"<\") return null;\n\n // Find closing >\n const closingIndex = text.indexOf(\">\", start + 1);\n if (closingIndex === -1) return null;\n\n const content = text.slice(start, closingIndex + 1);\n\n // Check for URL autolink\n const urlMatch = AUTOLINK_REGEX.exec(content);\n if (urlMatch && urlMatch[1]) {\n return {\n type: \"autolink\",\n url: urlMatch[1],\n isEmail: false,\n start,\n end: closingIndex + 1,\n };\n }\n\n // Check for email autolink\n const emailMatch = EMAIL_AUTOLINK_REGEX.exec(content);\n if (emailMatch && emailMatch[1]) {\n return {\n type: \"autolink\",\n url: `mailto:${emailMatch[1]}`,\n isEmail: true,\n start,\n end: closingIndex + 1,\n };\n }\n\n return null;\n}\n\n/**\n * Parses inline HTML starting at the given position.\n */\nfunction parseHtmlInline(\n text: string,\n start: number,\n): (InlineToken & { type: \"htmlInline\" }) | null {\n if (text[start] !== \"<\") return null;\n\n // Try to match various HTML patterns\n const remaining = text.slice(start);\n\n // Open tag\n const openTagMatch =\n /^<[a-zA-Z][a-zA-Z0-9-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\\s*=\\s*(?:[^\"'=<>`\\s]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>/.exec(\n remaining,\n );\n if (openTagMatch) {\n return {\n type: \"htmlInline\",\n value: openTagMatch[0],\n start,\n end: start + openTagMatch[0].length,\n };\n }\n\n // Close tag\n const closeTagMatch = /^<\\/[a-zA-Z][a-zA-Z0-9-]*\\s*>/.exec(remaining);\n if (closeTagMatch) {\n return {\n type: \"htmlInline\",\n value: closeTagMatch[0],\n start,\n end: start + closeTagMatch[0].length,\n };\n }\n\n // Comment\n const commentMatch = /^<!--(?!-?>)(?:[^-]|-(?!-))*-->/.exec(remaining);\n if (commentMatch) {\n return {\n type: \"htmlInline\",\n value: commentMatch[0],\n start,\n end: start + commentMatch[0].length,\n };\n }\n\n // Processing instruction\n const piMatch = /^<\\?.*?\\?>/.exec(remaining);\n if (piMatch) {\n return {\n type: \"htmlInline\",\n value: piMatch[0],\n start,\n end: start + piMatch[0].length,\n };\n }\n\n // Declaration\n const declMatch = /^<![A-Z]+\\s+[^>]*>/.exec(remaining);\n if (declMatch) {\n return {\n type: \"htmlInline\",\n value: declMatch[0],\n start,\n end: start + declMatch[0].length,\n };\n }\n\n // CDATA\n const cdataMatch = /^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/.exec(remaining);\n if (cdataMatch) {\n return {\n type: \"htmlInline\",\n value: cdataMatch[0],\n start,\n end: start + cdataMatch[0].length,\n };\n }\n\n return null;\n}\n\n/**\n * Parses a delimiter run (* or _) starting at the given position.\n */\nfunction parseDelimiterRun(\n text: string,\n start: number,\n char: \"*\" | \"_\",\n): (InlineToken & { type: \"delimiterRun\" }) | null {\n let count = 0;\n let i = start;\n while (i < text.length && text[i] === char) {\n count++;\n i++;\n }\n\n if (count === 0) return null;\n\n // Determine if it can open/close emphasis\n const before = start > 0 ? text[start - 1] : \" \";\n const after = i < text.length ? text[i] : \" \";\n\n const beforeWhitespace = /\\s/.test(before ?? \" \");\n const afterWhitespace = /\\s/.test(after ?? \" \");\n const beforePunct = /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(\n before ?? \"\",\n );\n const afterPunct = /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(after ?? \"\");\n\n // Left-flanking: not followed by whitespace, and either not followed by punctuation\n // or preceded by whitespace or punctuation\n const leftFlanking =\n !afterWhitespace && (!afterPunct || beforeWhitespace || beforePunct);\n\n // Right-flanking: not preceded by whitespace, and either not preceded by punctuation\n // or followed by whitespace or punctuation\n const rightFlanking =\n !beforeWhitespace && (!beforePunct || afterWhitespace || afterPunct);\n\n let canOpen: boolean;\n let canClose: boolean;\n\n if (char === \"*\") {\n canOpen = leftFlanking;\n canClose = rightFlanking;\n } else {\n // _ has additional restrictions\n canOpen = leftFlanking && (!rightFlanking || beforePunct);\n canClose = rightFlanking && (!leftFlanking || afterPunct);\n }\n\n return {\n type: \"delimiterRun\",\n char,\n count,\n start,\n end: i,\n canOpen,\n canClose,\n };\n}\n\n/**\n * Parses a link destination after ].\n */\nfunction parseLinkDestination(\n text: string,\n start: number,\n): (InlineToken & { type: \"linkInfo\" }) | null {\n if (text[start] !== \"(\") return null;\n\n let i = start + 1;\n\n // Skip whitespace\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) {\n i++;\n }\n\n if (i >= text.length) return null;\n\n let url = \"\";\n let title: string | undefined;\n\n // Check for angle-bracketed URL\n if (text[i] === \"<\") {\n const closeBracket = text.indexOf(\">\", i + 1);\n if (closeBracket === -1) return null;\n\n // URL cannot contain < or newlines\n const urlContent = text.slice(i + 1, closeBracket);\n if (urlContent.includes(\"<\") || urlContent.includes(\"\\n\")) return null;\n\n url = urlContent;\n i = closeBracket + 1;\n } else {\n // Non-bracketed URL\n let parenDepth = 0;\n const urlStart = i;\n\n while (i < text.length) {\n const char = text[i];\n\n if (char === \" \" || char === \"\\t\" || char === \"\\n\") break;\n\n if (char === \"(\") {\n parenDepth++;\n } else if (char === \")\") {\n if (parenDepth === 0) break;\n parenDepth--;\n }\n\n // Backslash escape\n if (char === \"\\\\\" && i + 1 < text.length) {\n i += 2;\n continue;\n }\n\n // Control characters not allowed\n if (char && char.charCodeAt(0) < 32) return null;\n\n i++;\n }\n\n url = text.slice(urlStart, i);\n }\n\n // Skip whitespace\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) {\n i++;\n }\n\n // Check for title\n if (\n i < text.length &&\n (text[i] === '\"' || text[i] === \"'\" || text[i] === \"(\")\n ) {\n const titleChar = text[i] === \"(\" ? \")\" : text[i];\n const titleStart = i + 1;\n i++;\n\n let escaped = false;\n while (i < text.length) {\n if (escaped) {\n escaped = false;\n i++;\n continue;\n }\n\n if (text[i] === \"\\\\\") {\n escaped = true;\n i++;\n continue;\n }\n\n if (text[i] === titleChar) {\n title = text.slice(titleStart, i);\n i++;\n break;\n }\n\n i++;\n }\n\n if (title === undefined) return null;\n }\n\n // Skip whitespace\n while (i < text.length && /\\s/.test(text[i] ?? \"\")) {\n i++;\n }\n\n // Must end with )\n if (text[i] !== \")\") return null;\n\n return {\n type: \"linkInfo\",\n url: decodeHtmlEntities(unescapeMarkdown(url)),\n title: title ? decodeHtmlEntities(unescapeMarkdown(title)) : undefined,\n start,\n end: i + 1,\n };\n}\n\n// =============================================================================\n// Emphasis Processing\n// =============================================================================\n\ninterface EmphasisMatch {\n openerIdx: number;\n closerIdx: number;\n count: number; // 1 for emphasis, 2 for strong\n}\n\n/**\n * Finds all emphasis matches in the delimiter list.\n */\nfunction findEmphasisMatches(delimiters: Delimiter[]): EmphasisMatch[] {\n const matches: EmphasisMatch[] = [];\n\n // Process from innermost to outermost\n for (let closeIdx = 0; closeIdx < delimiters.length; closeIdx++) {\n const closer = delimiters[closeIdx];\n if (!closer || !closer.canClose || closer.count === 0) continue;\n\n // Find matching opener (search backwards)\n for (let openIdx = closeIdx - 1; openIdx >= 0; openIdx--) {\n const opener = delimiters[openIdx];\n if (!opener || !opener.canOpen || opener.count === 0) continue;\n\n if (opener.char !== closer.char) continue;\n\n // Sum rule for emphasis\n if (\n (opener.canOpen && opener.canClose) ||\n (closer.canOpen && closer.canClose)\n ) {\n if ((opener.count + closer.count) % 3 === 0) {\n if (opener.count % 3 !== 0 || closer.count % 3 !== 0) {\n continue;\n }\n }\n }\n\n // Match found - use strong if both have >= 2, else emphasis\n const useStrong = opener.count >= 2 && closer.count >= 2;\n const used = useStrong ? 2 : 1;\n\n matches.push({\n openerIdx: openIdx,\n closerIdx: closeIdx,\n count: used,\n });\n\n opener.count -= used;\n closer.count -= used;\n\n // Continue looking for more matches with same closer if it has remaining count\n if (closer.count > 0) {\n // Don't break, let outer loop handle it\n }\n break;\n }\n }\n\n return matches;\n}\n\n// =============================================================================\n// Token to Node Conversion\n// =============================================================================\n\n/**\n * Converts tokens to AST nodes with proper emphasis handling.\n */\nfunction tokensToNodes(\n tokens: InlineToken[],\n references: Map<string, { url: string; title?: string }>,\n): InlineNode[] {\n // First pass: identify delimiter tokens and build delimiter list\n const delimiters: (Delimiter & { tokenIndex: number })[] = [];\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n if (token?.type === \"delimiterRun\") {\n delimiters.push({\n char: token.char,\n count: token.count,\n position: i,\n canOpen: token.canOpen,\n canClose: token.canClose,\n active: true,\n tokenIndex: i,\n });\n }\n }\n\n // Find emphasis matches\n const matches = findEmphasisMatches(delimiters);\n\n // Sort matches by opener position (process inner matches first)\n matches.sort((a, b) => b.openerIdx - a.openerIdx);\n\n // Track bracket stack for links/images\n const bracketStack: Bracket[] = [];\n\n // Track which delimiter tokens have been used\n const usedDelimiters = new Map<number, number[]>(); // tokenIndex -> [count1, count2, ...]\n\n for (const match of matches) {\n const opener = delimiters[match.openerIdx];\n const closer = delimiters[match.closerIdx];\n if (!opener || !closer) continue;\n\n const openerUsed = usedDelimiters.get(opener.tokenIndex) ?? [];\n openerUsed.push(match.count);\n usedDelimiters.set(opener.tokenIndex, openerUsed);\n\n const closerUsed = usedDelimiters.get(closer.tokenIndex) ?? [];\n closerUsed.push(match.count);\n usedDelimiters.set(closer.tokenIndex, closerUsed);\n }\n\n // Build node tree with emphasis\n function processTokenRange(\n start: number,\n end: number,\n _emphasisStack: {\n char: \"*\" | \"_\";\n count: number;\n startNodeIdx: number;\n }[],\n ): InlineNode[] {\n const result: InlineNode[] = [];\n let i = start;\n\n while (i < end) {\n const token = tokens[i];\n if (!token) {\n i++;\n continue;\n }\n\n switch (token.type) {\n case \"text\":\n result.push({\n type: \"text\",\n value: decodeHtmlEntities(unescapeMarkdown(token.value)),\n });\n break;\n\n case \"code\":\n result.push({\n type: \"codeSpan\",\n value: token.value,\n });\n break;\n\n case \"hardBreak\":\n result.push({ type: \"hardBreak\" });\n break;\n\n case \"softBreak\":\n result.push({ type: \"softBreak\" });\n break;\n\n case \"autolink\":\n result.push({\n type: \"link\",\n url: token.url,\n children: [\n { type: \"text\", value: token.url.replace(/^mailto:/, \"\") },\n ],\n });\n break;\n\n case \"htmlInline\":\n result.push({\n type: \"htmlInline\",\n value: token.value,\n });\n break;\n\n case \"delimiterRun\": {\n // Check if this delimiter is part of a match\n const delimIdx = delimiters.findIndex((d) => d.tokenIndex === i);\n const delim = delimiters[delimIdx];\n\n if (delim) {\n // Check for opening emphasis\n let remaining = token.count;\n\n for (const match of matches) {\n if (\n match.openerIdx === delimIdx &&\n remaining >= match.count\n ) {\n // This is an opener - find the closer and wrap content\n const closerDelim = delimiters[match.closerIdx];\n if (closerDelim) {\n const closerTokenIdx = closerDelim.tokenIndex;\n\n // Recursively process content between opener and closer\n const innerNodes = processTokenRange(\n i + 1,\n closerTokenIdx,\n [],\n );\n\n const emphNode =\n match.count === 2\n ? {\n type: \"strong\" as const,\n children: innerNodes,\n marker: (token.char + token.char) as\n | \"**\"\n | \"__\",\n }\n : {\n type: \"emphasis\" as const,\n children: innerNodes,\n marker: token.char as \"*\" | \"_\",\n };\n\n result.push(emphNode);\n remaining -= match.count;\n\n // Skip to after closer\n i = closerTokenIdx;\n }\n }\n }\n\n // Output any remaining delimiters as text\n if (remaining > 0) {\n result.push({\n type: \"text\",\n value: token.char.repeat(remaining),\n });\n }\n } else {\n // Not in delimiter list, output as text\n result.push({\n type: \"text\",\n value: token.char.repeat(token.count),\n });\n }\n break;\n }\n\n case \"openBracket\":\n bracketStack.push({\n position: result.length,\n isImage: token.isImage,\n delimiterIndex: -1,\n active: true,\n });\n result.push({ type: \"text\", value: token.isImage ? \"![\" : \"[\" });\n break;\n\n case \"closeBracket\": {\n let matched = false;\n for (let j = bracketStack.length - 1; j >= 0; j--) {\n const bracket = bracketStack[j];\n if (!bracket || !bracket.active) continue;\n\n const nextToken = tokens[i + 1];\n if (nextToken?.type === \"linkInfo\") {\n const linkContent = result.slice(bracket.position + 1);\n result.length = bracket.position;\n\n let url = nextToken.url;\n let title = nextToken.title;\n\n if (!url && title) {\n const ref = references.get(normalizeLabel(title));\n if (ref) {\n url = ref.url;\n title = ref.title;\n }\n }\n\n if (bracket.isImage) {\n const alt = linkContent\n .map((n) => {\n if (n.type === \"text\") return n.value;\n if (n.type === \"codeSpan\") return n.value;\n return \"\";\n })\n .join(\"\");\n\n result.push({\n type: \"image\",\n alt,\n url,\n title,\n });\n } else {\n result.push({\n type: \"link\",\n url,\n title,\n children: linkContent,\n });\n }\n\n i++;\n matched = true;\n } else {\n const linkText = result\n .slice(bracket.position + 1)\n .map((n) => (n.type === \"text\" ? n.value : \"\"))\n .join(\"\");\n\n const ref = references.get(normalizeLabel(linkText));\n if (ref) {\n const linkContent = result.slice(bracket.position + 1);\n result.length = bracket.position;\n\n if (bracket.isImage) {\n result.push({\n type: \"image\",\n alt: linkText,\n url: ref.url,\n title: ref.title,\n });\n } else {\n result.push({\n type: \"link\",\n url: ref.url,\n title: ref.title,\n children: linkContent,\n });\n }\n matched = true;\n }\n }\n\n bracket.active = false;\n break;\n }\n\n if (!matched) {\n result.push({ type: \"text\", value: \"]\" });\n }\n break;\n }\n\n case \"linkInfo\":\n result.push({ type: \"text\", value: `(${token.url})` });\n break;\n }\n\n i++;\n }\n\n return mergeTextNodes(result);\n }\n\n return processTokenRange(0, tokens.length, []);\n}\n\n/**\n * Merges adjacent text nodes.\n */\nfunction mergeTextNodes(nodes: InlineNode[]): InlineNode[] {\n const result: InlineNode[] = [];\n\n for (const node of nodes) {\n if (node.type === \"text\" && result.length > 0) {\n const last = result[result.length - 1];\n if (last?.type === \"text\") {\n last.value += node.value;\n continue;\n }\n }\n result.push(node);\n }\n\n return result;\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Parses inline content and returns AST nodes.\n *\n * @param text - The inline content to parse\n * @param references - Link reference definitions\n * @returns Array of inline nodes\n */\nexport function parseInline(\n text: string,\n references: Map<string, { url: string; title?: string }> = new Map(),\n): InlineNode[] {\n if (!text) return [];\n\n const tokens = tokenize(text);\n return tokensToNodes(tokens, references);\n}\n",
7
+ "import { parseInline } from \"./inline-parser\";\nimport type {\n BlockNode,\n BlockquoteNode,\n CodeBlockNode,\n HeadingNode,\n HtmlBlockNode,\n ListItemNode,\n ListNode,\n ParagraphNode,\n Position,\n TableCellNode,\n TableNode,\n TableRowNode,\n ThematicBreakNode,\n} from \"./schemas\";\nimport type { BlockContext, LineInfo } from \"./types\";\nimport {\n ATX_HEADING_REGEX,\n BLOCKQUOTE_REGEX,\n closesHtmlBlock,\n countIndent,\n FENCED_CODE_OPEN_REGEX,\n getHtmlBlockType,\n isBlankLine,\n LINK_REFERENCE_REGEX,\n ORDERED_LIST_REGEX,\n removeIndent,\n SETEXT_HEADING_REGEX,\n splitLines,\n THEMATIC_BREAK_REGEX,\n UNORDERED_LIST_REGEX,\n} from \"./utils\";\n\n// =============================================================================\n// Block Context\n// =============================================================================\n\n/**\n * Creates a new block parsing context.\n */\nexport function createBlockContext(): BlockContext {\n return {\n lineNumber: 1,\n column: 1,\n indent: 0,\n tight: true,\n inBlockquote: false,\n listDepth: 0,\n blockquoteDepth: 0,\n references: new Map(),\n };\n}\n\n// =============================================================================\n// Position Tracking\n// =============================================================================\n\n/**\n * Creates a position object from line info.\n * Uses pre-calculated line offsets for O(1) lookup instead of O(n) recalculation.\n */\nfunction createPosition(startLine: LineInfo, endLine: LineInfo): Position {\n return {\n startLine: startLine.lineNumber,\n startColumn: 1,\n endLine: endLine.lineNumber,\n endColumn: endLine.raw.length + 1,\n startOffset: startLine.offset,\n endOffset: endLine.offset + endLine.raw.length,\n };\n}\n\n// =============================================================================\n// Block Type Detection\n// =============================================================================\n\n/**\n * Checks if a line starts a thematic break.\n */\nexport function isThematicBreak(line: string): boolean {\n return THEMATIC_BREAK_REGEX.test(line.trim());\n}\n\n/**\n * Checks if a line starts an ATX heading.\n */\nexport function isAtxHeading(line: string): RegExpExecArray | null {\n return ATX_HEADING_REGEX.exec(line.trim());\n}\n\n/**\n * Checks if a line is a setext heading underline.\n */\nexport function isSetextUnderline(line: string): RegExpExecArray | null {\n return SETEXT_HEADING_REGEX.exec(line.trim());\n}\n\n/**\n * Checks if a line starts a fenced code block.\n */\nexport function isFencedCodeStart(line: string): RegExpExecArray | null {\n const trimmed = line.trimStart();\n const indent = countIndent(line);\n if (indent >= 4) return null; // Indented code, not fenced\n return FENCED_CODE_OPEN_REGEX.exec(trimmed);\n}\n\n/**\n * Checks if a line starts an indented code block.\n */\nexport function isIndentedCode(line: string, context: BlockContext): boolean {\n return countIndent(line) >= 4 && !context.inBlockquote;\n}\n\n/**\n * Checks if a line starts a blockquote.\n */\nexport function isBlockquoteStart(line: string): boolean {\n return BLOCKQUOTE_REGEX.test(line.trimStart());\n}\n\n/**\n * Checks if a line starts a list item.\n */\nexport function isListItemStart(\n line: string,\n): { ordered: boolean; marker: string; start?: number; indent: number } | null {\n const trimmed = line.trimStart();\n const leadingIndent = countIndent(line);\n\n const ordered = ORDERED_LIST_REGEX.exec(trimmed);\n if (ordered) {\n return {\n ordered: true,\n marker: ordered[2] as \")\" | \".\",\n start: Number.parseInt(ordered[1] ?? \"1\", 10),\n indent: leadingIndent + (ordered[0]?.length ?? 0),\n };\n }\n\n const unordered = UNORDERED_LIST_REGEX.exec(trimmed);\n if (unordered) {\n return {\n ordered: false,\n marker: unordered[1] as \"-\" | \"*\" | \"+\",\n indent: leadingIndent + (unordered[0]?.length ?? 0),\n };\n }\n\n return null;\n}\n\n/**\n * Checks if a line is a link reference definition.\n */\nexport function isLinkReferenceDefinition(\n line: string,\n): { label: string; url: string; title?: string } | null {\n const match = LINK_REFERENCE_REGEX.exec(line.trim());\n if (!match) return null;\n\n return {\n label: match[1] ?? \"\",\n url: match[2] ?? \"\",\n title: match[3] ?? match[4] ?? match[5],\n };\n}\n\n// =============================================================================\n// Table Detection (GFM Extension)\n// =============================================================================\n\n/**\n * Regex for table delimiter row: | --- | :---: | ---: |\n */\nconst TABLE_DELIMITER_REGEX = /^\\|?\\s*:?-+:?\\s*(?:\\|\\s*:?-+:?\\s*)*\\|?\\s*$/;\n\n/**\n * Checks if a line looks like a table row (contains pipes).\n */\nexport function isTableRow(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.includes(\"|\");\n}\n\n/**\n * Checks if a line is a table delimiter row.\n */\nexport function isTableDelimiter(line: string): boolean {\n return TABLE_DELIMITER_REGEX.test(line.trim());\n}\n\n/**\n * Parses alignment from a delimiter cell.\n */\nfunction parseAlignment(cell: string): \"left\" | \"center\" | \"right\" | null {\n const trimmed = cell.trim();\n const hasLeft = trimmed.startsWith(\":\");\n const hasRight = trimmed.endsWith(\":\");\n\n if (hasLeft && hasRight) return \"center\";\n if (hasRight) return \"right\";\n if (hasLeft) return \"left\";\n return null;\n}\n\n/**\n * Splits a table row into cells.\n */\nfunction splitTableRow(line: string): string[] {\n // Remove leading/trailing pipes if present\n let content = line.trim();\n if (content.startsWith(\"|\")) content = content.slice(1);\n if (content.endsWith(\"|\")) content = content.slice(0, -1);\n\n // Split by pipe, handling escaped pipes\n const cells: string[] = [];\n let current = \"\";\n let escaped = false;\n\n for (const char of content) {\n if (escaped) {\n current += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n current += char;\n } else if (char === \"|\") {\n cells.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n cells.push(current.trim());\n\n return cells;\n}\n\n// =============================================================================\n// Block Parsing Functions\n// =============================================================================\n\n/**\n * Maximum nesting depth to prevent stack overflow on pathological input.\n */\nconst MAX_NESTING_DEPTH = 100;\n\n/**\n * Pre-scans content to collect all link reference definitions.\n * This allows forward references to work correctly.\n */\nfunction collectReferences(lines: LineInfo[], context: BlockContext): void {\n for (const line of lines) {\n if (isBlankLine(line.raw)) continue;\n\n const refMatch = isLinkReferenceDefinition(line.raw);\n if (refMatch) {\n const normalizedLabel = refMatch.label\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n context.references.set(normalizedLabel, {\n url: refMatch.url,\n title: refMatch.title,\n });\n }\n }\n}\n\n/**\n * Parses all blocks from content.\n */\nexport function parseBlocks(\n content: string,\n context?: BlockContext,\n includePositions = true,\n depth = 0,\n): {\n blocks: BlockNode[];\n references: Map<string, { url: string; title?: string }>;\n} {\n // Prevent stack overflow on deeply nested content\n if (depth > MAX_NESTING_DEPTH) {\n return { blocks: [], references: context?.references ?? new Map() };\n }\n\n const ctx = context ?? createBlockContext();\n const lines = splitLines(content);\n\n // First pass: collect all reference definitions\n collectReferences(lines, ctx);\n\n // Second pass: parse blocks (references are now available)\n const blocks: BlockNode[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const result = parseBlock(lines, i, ctx, includePositions, depth);\n if (result.block) {\n blocks.push(result.block);\n }\n i += result.consumed;\n }\n\n return { blocks, references: ctx.references };\n}\n\n/**\n * Parses a single block starting at the given line index.\n */\nfunction parseBlock(\n lines: LineInfo[],\n startIndex: number,\n context: BlockContext,\n includePositions: boolean,\n depth: number,\n): { block: BlockNode | null; consumed: number } {\n const line = lines[startIndex];\n if (!line) {\n return { block: null, consumed: 1 };\n }\n\n // Skip blank lines\n if (line.isBlank) {\n return { block: null, consumed: 1 };\n }\n\n const content = line.content;\n\n // Check for thematic break\n if (isThematicBreak(content)) {\n return parseThematicBreak(line, includePositions);\n }\n\n // Check for ATX heading\n const atxMatch = isAtxHeading(content);\n if (atxMatch) {\n return parseAtxHeading(line, atxMatch, context, includePositions);\n }\n\n // Check for fenced code block\n const fenceMatch = isFencedCodeStart(line.raw);\n if (fenceMatch) {\n return parseFencedCodeBlock(\n lines,\n startIndex,\n fenceMatch,\n includePositions,\n );\n }\n\n // Check for HTML block\n const htmlType = getHtmlBlockType(content);\n if (htmlType > 0 && line.indent < 4) {\n return parseHtmlBlock(lines, startIndex, htmlType, includePositions);\n }\n\n // Check for blockquote\n if (isBlockquoteStart(line.raw)) {\n return parseBlockquote(\n lines,\n startIndex,\n context,\n includePositions,\n depth,\n );\n }\n\n // Check for list item\n const listMatch = isListItemStart(line.raw);\n if (listMatch) {\n return parseList(\n lines,\n startIndex,\n listMatch,\n context,\n includePositions,\n depth,\n );\n }\n\n // Check for indented code block (must come after list check)\n if (line.indent >= 4 && !context.inBlockquote) {\n return parseIndentedCodeBlock(lines, startIndex, includePositions);\n }\n\n // Check for GFM table (before link reference and paragraph)\n if (isTableRow(line.content)) {\n const tableResult = parseTable(\n lines,\n startIndex,\n context,\n includePositions,\n );\n if (tableResult.block) {\n return tableResult;\n }\n }\n\n // Check for link reference definition\n const refMatch = isLinkReferenceDefinition(line.raw);\n if (refMatch) {\n const normalizedLabel = refMatch.label.toLowerCase().replace(/\\s+/g, \" \");\n context.references.set(normalizedLabel, {\n url: refMatch.url,\n title: refMatch.title,\n });\n return { block: null, consumed: 1 };\n }\n\n // Default to paragraph (may be setext heading)\n return parseParagraph(lines, startIndex, context, includePositions);\n}\n\n/**\n * Parses a thematic break.\n */\nfunction parseThematicBreak(\n line: LineInfo,\n includePositions: boolean,\n): { block: ThematicBreakNode; consumed: number } {\n const content = line.content.trim();\n let marker: \"-\" | \"*\" | \"_\" = \"-\";\n if (content.includes(\"*\")) marker = \"*\";\n else if (content.includes(\"_\")) marker = \"_\";\n\n const node: ThematicBreakNode = {\n type: \"thematicBreak\",\n marker,\n };\n\n if (includePositions) {\n node.position = createPosition(line, line);\n }\n\n return { block: node, consumed: 1 };\n}\n\n/**\n * Parses an ATX heading.\n */\nfunction parseAtxHeading(\n line: LineInfo,\n match: RegExpExecArray,\n context: BlockContext,\n includePositions: boolean,\n): { block: HeadingNode; consumed: number } {\n const level = (match[1]?.length ?? 1) as 1 | 2 | 3 | 4 | 5 | 6;\n let text = match[2] ?? \"\";\n\n // Remove trailing # sequence\n text = text\n .replace(/[ \\t]+#+[ \\t]*$/, \"\")\n .replace(/#+[ \\t]*$/, \"\")\n .trim();\n\n const node: HeadingNode = {\n type: \"heading\",\n level,\n children: parseInline(text, context.references),\n style: \"atx\",\n };\n\n if (includePositions) {\n node.position = createPosition(line, line);\n }\n\n return { block: node, consumed: 1 };\n}\n\n/**\n * Parses a fenced code block.\n */\nfunction parseFencedCodeBlock(\n lines: LineInfo[],\n startIndex: number,\n match: RegExpExecArray,\n includePositions: boolean,\n): { block: CodeBlockNode; consumed: number } {\n const startLine = lines[startIndex];\n if (!startLine) {\n return {\n block: {\n type: \"codeBlock\",\n value: \"\",\n style: \"fenced\",\n fence: \"`\",\n fenceLength: 3,\n },\n consumed: 1,\n };\n }\n\n const fence = match[1]?.[0] as \"`\" | \"~\";\n const fenceLength = match[1]?.length ?? 3;\n const infoString = (match[2] ?? \"\").trim();\n\n // Parse info string for language and meta\n const spaceIndex = infoString.indexOf(\" \");\n let lang: string | undefined;\n let meta: string | undefined;\n\n if (infoString) {\n if (spaceIndex > 0) {\n lang = infoString.slice(0, spaceIndex);\n meta = infoString.slice(spaceIndex + 1).trim();\n } else {\n lang = infoString;\n }\n }\n\n const indent = countIndent(startLine.raw);\n const contentLines: string[] = [];\n let i = startIndex + 1;\n\n // Pre-compile the closing fence regex once\n const closingFenceRegex = new RegExp(`^${fence}{${fenceLength},}[ \\\\t]*$`);\n\n // Find closing fence\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n const lineIndent = countIndent(line.raw);\n const trimmed = line.raw.trimStart();\n\n // Check for closing fence\n if (closingFenceRegex.test(trimmed) && lineIndent < 4) {\n i++;\n break;\n }\n\n // Remove indent up to the fence indent\n const contentLine = removeIndent(line.raw, Math.min(indent, line.indent));\n contentLines.push(contentLine);\n i++;\n }\n\n const node: CodeBlockNode = {\n type: \"codeBlock\",\n value: contentLines.join(\"\\n\"),\n style: \"fenced\",\n fence,\n fenceLength,\n };\n\n if (lang) node.lang = lang;\n if (meta) node.meta = meta;\n\n if (includePositions) {\n const endLine = lines[i - 1] ?? startLine;\n node.position = createPosition(startLine, endLine);\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses an indented code block.\n */\nfunction parseIndentedCodeBlock(\n lines: LineInfo[],\n startIndex: number,\n includePositions: boolean,\n): { block: CodeBlockNode; consumed: number } {\n const contentLines: string[] = [];\n let i = startIndex;\n let lastNonBlankIndex = startIndex;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n if (line.isBlank) {\n contentLines.push(\"\");\n i++;\n continue;\n }\n\n if (line.indent < 4) {\n break;\n }\n\n contentLines.push(removeIndent(line.raw, 4));\n lastNonBlankIndex = i;\n i++;\n }\n\n // Trim trailing blank lines\n const trimmedContent = contentLines.slice(\n 0,\n lastNonBlankIndex - startIndex + 1,\n );\n\n const node: CodeBlockNode = {\n type: \"codeBlock\",\n value: trimmedContent.join(\"\\n\"),\n style: \"indented\",\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[lastNonBlankIndex] ?? startLine;\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses a GFM table.\n */\nfunction parseTable(\n lines: LineInfo[],\n startIndex: number,\n context: BlockContext,\n includePositions: boolean,\n): { block: TableNode | null; consumed: number } {\n // Need at least 2 lines for a valid table (header + delimiter)\n if (startIndex + 1 >= lines.length) {\n return { block: null, consumed: 0 };\n }\n\n const headerLine = lines[startIndex];\n const delimiterLine = lines[startIndex + 1];\n\n if (!headerLine || !delimiterLine) {\n return { block: null, consumed: 0 };\n }\n\n // Check if first line looks like a table row and second is delimiter\n if (\n !isTableRow(headerLine.content) ||\n !isTableDelimiter(delimiterLine.content)\n ) {\n return { block: null, consumed: 0 };\n }\n\n // Parse header cells\n const headerCells = splitTableRow(headerLine.content);\n\n // Parse delimiter to get alignments\n const delimiterCells = splitTableRow(delimiterLine.content);\n\n // Number of columns must match\n if (\n headerCells.length !== delimiterCells.length ||\n headerCells.length === 0\n ) {\n return { block: null, consumed: 0 };\n }\n\n // Validate delimiter cells (must contain at least one dash)\n for (const cell of delimiterCells) {\n if (!/^:?-+:?$/.test(cell.trim())) {\n return { block: null, consumed: 0 };\n }\n }\n\n // Get alignments from delimiter row\n const alignments: Array<\"left\" | \"center\" | \"right\" | null> =\n delimiterCells.map(parseAlignment);\n\n // Create header row\n const headerRowCells: TableCellNode[] = headerCells.map((cell, idx) => ({\n type: \"tableCell\" as const,\n children: parseInline(cell, context.references),\n align: alignments[idx] ?? undefined,\n isHeader: true,\n }));\n\n const headerRow: TableRowNode = {\n type: \"tableRow\",\n children: headerRowCells,\n isHeader: true,\n };\n\n if (includePositions && headerLine) {\n headerRow.position = createPosition(headerLine, headerLine);\n }\n\n const rows: TableRowNode[] = [headerRow];\n let i = startIndex + 2; // Start after header and delimiter\n\n // Parse body rows\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n // Stop on blank line or non-table row\n if (line.isBlank || !isTableRow(line.content)) {\n break;\n }\n\n // Also stop if it looks like a new block element\n if (isThematicBreak(line.content) || isAtxHeading(line.content)) {\n break;\n }\n\n const cells = splitTableRow(line.content);\n\n // Create cells, padding or truncating to match header length\n const rowCells: TableCellNode[] = [];\n for (let j = 0; j < headerCells.length; j++) {\n const cellContent = cells[j] ?? \"\";\n rowCells.push({\n type: \"tableCell\",\n children: parseInline(cellContent, context.references),\n align: alignments[j] ?? undefined,\n isHeader: false,\n });\n }\n\n const bodyRow: TableRowNode = {\n type: \"tableRow\",\n children: rowCells,\n isHeader: false,\n };\n\n if (includePositions) {\n bodyRow.position = createPosition(line, line);\n }\n\n rows.push(bodyRow);\n i++;\n }\n\n const node: TableNode = {\n type: \"table\",\n children: rows,\n align: alignments,\n };\n\n if (includePositions) {\n const endLine = lines[i - 1] ?? headerLine;\n node.position = createPosition(headerLine, endLine);\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses an HTML block.\n */\nfunction parseHtmlBlock(\n lines: LineInfo[],\n startIndex: number,\n htmlType: number,\n includePositions: boolean,\n): { block: HtmlBlockNode; consumed: number } {\n const contentLines: string[] = [];\n let i = startIndex;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n contentLines.push(line.raw);\n\n // Check for closing condition\n if (closesHtmlBlock(line.raw, htmlType)) {\n if (htmlType === 6 || htmlType === 7) {\n // Types 6 and 7 close on blank line, don't include it\n contentLines.pop();\n }\n i++;\n break;\n }\n\n i++;\n }\n\n const node: HtmlBlockNode = {\n type: \"htmlBlock\",\n value: contentLines.join(\"\\n\"),\n htmlType,\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[i - 1] ?? startLine;\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses a blockquote.\n */\nfunction parseBlockquote(\n lines: LineInfo[],\n startIndex: number,\n context: BlockContext,\n includePositions: boolean,\n depth: number,\n): { block: BlockquoteNode; consumed: number } {\n const quoteLines: string[] = [];\n let i = startIndex;\n let hadBlankLine = false;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n // Remove blockquote marker\n const match = BLOCKQUOTE_REGEX.exec(line.raw.trimStart());\n if (match) {\n const content = line.raw.trimStart().slice(match[0].length);\n quoteLines.push(content);\n i++;\n continue;\n }\n\n // Lazy continuation (non-blank line without marker)\n if (!line.isBlank && !hadBlankLine) {\n quoteLines.push(line.raw);\n i++;\n continue;\n }\n\n if (line.isBlank) {\n hadBlankLine = true;\n // Check if next line continues the blockquote\n const nextLine = lines[i + 1];\n if (nextLine && BLOCKQUOTE_REGEX.test(nextLine.raw.trimStart())) {\n quoteLines.push(\"\");\n i++;\n continue;\n }\n }\n\n break;\n }\n\n // Parse the content within the blockquote\n const innerContent = quoteLines.join(\"\\n\");\n const innerContext = {\n ...context,\n inBlockquote: true,\n blockquoteDepth: context.blockquoteDepth + 1,\n };\n const { blocks } = parseBlocks(\n innerContent,\n innerContext,\n includePositions,\n depth + 1,\n );\n\n const node: BlockquoteNode = {\n type: \"blockquote\",\n children: blocks,\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[i - 1];\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses a list.\n */\nfunction parseList(\n lines: LineInfo[],\n startIndex: number,\n firstItem: {\n ordered: boolean;\n marker: string;\n start?: number;\n indent: number;\n },\n context: BlockContext,\n includePositions: boolean,\n depth: number,\n): { block: ListNode; consumed: number } {\n const items: ListItemNode[] = [];\n let i = startIndex;\n let spread = false;\n let hadBlankBetweenItems = false;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n // Check for blank line\n if (line.isBlank) {\n hadBlankBetweenItems = true;\n i++;\n continue;\n }\n\n // Check for list item\n const itemMatch = isListItemStart(line.raw);\n\n // Must match same list type and marker family\n if (itemMatch) {\n const sameType = itemMatch.ordered === firstItem.ordered;\n const sameMarkerFamily =\n firstItem.ordered ||\n itemMatch.marker === firstItem.marker ||\n [\"-\", \"*\", \"+\"].includes(itemMatch.marker);\n\n if (!sameType || !sameMarkerFamily) {\n break;\n }\n\n // Parse list item\n const { item, consumed } = parseListItem(\n lines,\n i,\n itemMatch.indent,\n itemMatch.marker as \"-\" | \"*\" | \"+\" | \")\" | \".\",\n context,\n includePositions,\n depth,\n );\n\n if (hadBlankBetweenItems && items.length > 0) {\n spread = true;\n }\n\n items.push(item);\n i += consumed;\n hadBlankBetweenItems = false;\n continue;\n }\n\n // Check for continuation (indented content)\n if (line.indent >= firstItem.indent) {\n // This should be handled by parseListItem\n break;\n }\n\n break;\n }\n\n const node: ListNode = {\n type: \"list\",\n ordered: firstItem.ordered,\n children: items,\n marker: firstItem.marker as \"-\" | \"*\" | \"+\" | \")\" | \".\",\n spread,\n };\n\n if (firstItem.ordered && firstItem.start !== undefined) {\n node.start = firstItem.start;\n }\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[i - 1];\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { block: node, consumed: i - startIndex };\n}\n\n/**\n * Parses a single list item.\n */\nfunction parseListItem(\n lines: LineInfo[],\n startIndex: number,\n itemIndent: number,\n marker: \"-\" | \"*\" | \"+\" | \")\" | \".\",\n context: BlockContext,\n includePositions: boolean,\n depth: number,\n): { item: ListItemNode; consumed: number } {\n const itemLines: string[] = [];\n let i = startIndex;\n let hasBlank = false;\n let spread = false;\n\n // Get first line content (after marker)\n const firstLine = lines[startIndex];\n if (firstLine) {\n const match =\n ORDERED_LIST_REGEX.exec(firstLine.raw.trimStart()) ??\n UNORDERED_LIST_REGEX.exec(firstLine.raw.trimStart());\n if (match) {\n const content = firstLine.raw.trimStart().slice(match[0].length);\n itemLines.push(content);\n }\n }\n i++;\n\n // Collect continuation lines\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n if (line.isBlank) {\n hasBlank = true;\n itemLines.push(\"\");\n i++;\n continue;\n }\n\n // Check if this starts a new list item at same level\n const itemMatch = isListItemStart(line.raw);\n if (itemMatch && line.indent < itemIndent) {\n break;\n }\n\n // Check if this is a continuation\n if (line.indent >= itemIndent) {\n if (hasBlank) {\n spread = true;\n }\n itemLines.push(removeIndent(line.raw, itemIndent));\n i++;\n continue;\n }\n\n // Check for sub-list or other block starting\n if (itemMatch) {\n break;\n }\n\n // Lazy continuation for paragraphs\n if (!hasBlank) {\n itemLines.push(line.raw);\n i++;\n continue;\n }\n\n break;\n }\n\n // Trim trailing blank lines\n while (itemLines.length > 0 && itemLines[itemLines.length - 1] === \"\") {\n itemLines.pop();\n }\n\n // Parse the content within the list item\n const innerContent = itemLines.join(\"\\n\");\n const innerContext = {\n ...context,\n listDepth: context.listDepth + 1,\n };\n const { blocks } = parseBlocks(\n innerContent,\n innerContext,\n includePositions,\n depth + 1,\n );\n\n const node: ListItemNode = {\n type: \"listItem\",\n children: blocks,\n marker,\n spread,\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[i - 1];\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { item: node, consumed: i - startIndex };\n}\n\n/**\n * Parses a paragraph (may become setext heading).\n */\nfunction parseParagraph(\n lines: LineInfo[],\n startIndex: number,\n context: BlockContext,\n includePositions: boolean,\n): { block: HeadingNode | ParagraphNode; consumed: number } {\n const paragraphLines: string[] = [];\n let i = startIndex;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line) break;\n\n if (line.isBlank) {\n break;\n }\n\n // Check for setext underline\n if (paragraphLines.length > 0) {\n const setextMatch = isSetextUnderline(line.content);\n if (setextMatch && line.indent < 4) {\n const level = setextMatch[1]?.[0] === \"=\" ? 1 : 2;\n const text = paragraphLines.join(\"\\n\").trim();\n\n const node: HeadingNode = {\n type: \"heading\",\n level: level as 1 | 2,\n children: parseInline(text, context.references),\n style: \"setext\",\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n if (startLine) {\n node.position = createPosition(startLine, line);\n }\n }\n\n return { block: node, consumed: i - startIndex + 1 };\n }\n }\n\n // Check for block-level interrupts\n if (\n isThematicBreak(line.content) ||\n isAtxHeading(line.content) ||\n isFencedCodeStart(line.raw) ||\n (getHtmlBlockType(line.content) > 0 && line.indent < 4) ||\n isBlockquoteStart(line.raw)\n ) {\n break;\n }\n\n // Check for list item (only certain types can interrupt)\n const listMatch = isListItemStart(line.raw);\n if (listMatch) {\n // Ordered list starting with 1 can interrupt, or unordered\n if (!listMatch.ordered || listMatch.start === 1) {\n break;\n }\n }\n\n paragraphLines.push(line.content);\n i++;\n }\n\n if (paragraphLines.length === 0) {\n return { block: null as unknown as ParagraphNode, consumed: 1 };\n }\n\n const text = paragraphLines.join(\"\\n\").trim();\n const node: ParagraphNode = {\n type: \"paragraph\",\n children: parseInline(text, context.references),\n };\n\n if (includePositions) {\n const startLine = lines[startIndex];\n const endLine = lines[i - 1] ?? startLine;\n if (startLine && endLine) {\n node.position = createPosition(startLine, endLine);\n }\n }\n\n return { block: node, consumed: i - startIndex };\n}\n",
8
+ "import { z } from \"zod\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default maximum buffer size (10MB) to prevent memory exhaustion attacks.\n */\nexport const DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;\n\n// =============================================================================\n// Position Tracking\n// =============================================================================\n\n/**\n * Source position for a node in the original markdown.\n */\nexport const positionSchema = z.object({\n /** Starting line (1-indexed) */\n startLine: z.number().int().min(1),\n /** Starting column (1-indexed) */\n startColumn: z.number().int().min(1),\n /** Ending line (1-indexed) */\n endLine: z.number().int().min(1),\n /** Ending column (1-indexed) */\n endColumn: z.number().int().min(1),\n /** Start offset in original string */\n startOffset: z.number().int().min(0),\n /** End offset in original string */\n endOffset: z.number().int().min(0),\n});\n\nexport type Position = z.infer<typeof positionSchema>;\n\n// =============================================================================\n// Manual Type Definitions\n// =============================================================================\n// Define types manually to avoid Zod lazy inference issues\n\nexport interface TextNode {\n type: \"text\";\n value: string;\n position?: Position;\n}\n\nexport interface CodeSpanNode {\n type: \"codeSpan\";\n value: string;\n position?: Position;\n}\n\nexport interface HardBreakNode {\n type: \"hardBreak\";\n position?: Position;\n}\n\nexport interface SoftBreakNode {\n type: \"softBreak\";\n position?: Position;\n}\n\nexport interface HtmlInlineNode {\n type: \"htmlInline\";\n value: string;\n position?: Position;\n}\n\nexport interface EmphasisNode {\n type: \"emphasis\";\n children: InlineNode[];\n marker: \"*\" | \"_\";\n position?: Position;\n}\n\nexport interface StrongNode {\n type: \"strong\";\n children: InlineNode[];\n marker: \"**\" | \"__\";\n position?: Position;\n}\n\nexport interface LinkNode {\n type: \"link\";\n url: string;\n children: InlineNode[];\n title?: string;\n reference?: string;\n position?: Position;\n}\n\nexport interface ImageNode {\n type: \"image\";\n alt: string;\n url: string;\n title?: string;\n reference?: string;\n position?: Position;\n}\n\nexport type InlineNode =\n | TextNode\n | CodeSpanNode\n | HardBreakNode\n | SoftBreakNode\n | HtmlInlineNode\n | EmphasisNode\n | StrongNode\n | LinkNode\n | ImageNode;\n\n// Alias for backward compatibility\nexport type InlineNodeType = InlineNode;\n\n// =============================================================================\n// Block Node Types\n// =============================================================================\n\nexport interface ThematicBreakNode {\n type: \"thematicBreak\";\n marker: \"-\" | \"*\" | \"_\";\n position?: Position;\n}\n\nexport interface HeadingNode {\n type: \"heading\";\n level: 1 | 2 | 3 | 4 | 5 | 6;\n children: InlineNode[];\n style: \"atx\" | \"setext\";\n position?: Position;\n}\n\nexport interface CodeBlockNode {\n type: \"codeBlock\";\n value: string;\n style: \"fenced\" | \"indented\";\n lang?: string;\n meta?: string;\n fence?: \"`\" | \"~\";\n fenceLength?: number;\n position?: Position;\n}\n\nexport interface HtmlBlockNode {\n type: \"htmlBlock\";\n value: string;\n htmlType: number;\n position?: Position;\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n children: InlineNode[];\n position?: Position;\n}\n\nexport interface LinkReferenceDefinitionNode {\n type: \"linkReferenceDefinition\";\n label: string;\n url: string;\n title?: string;\n position?: Position;\n}\n\nexport interface BlockquoteNode {\n type: \"blockquote\";\n children: BlockNode[];\n position?: Position;\n}\n\nexport interface ListItemNode {\n type: \"listItem\";\n children: BlockNode[];\n marker: \"-\" | \"*\" | \"+\" | \")\" | \".\";\n spread: boolean;\n checked?: boolean;\n position?: Position;\n}\n\nexport interface ListNode {\n type: \"list\";\n ordered: boolean;\n start?: number;\n spread: boolean;\n marker: \"-\" | \"*\" | \"+\" | \")\" | \".\";\n children: ListItemNode[];\n position?: Position;\n}\n\n// =============================================================================\n// Table Node Types (GFM Extension)\n// =============================================================================\n\nexport interface TableCellNode {\n type: \"tableCell\";\n children: InlineNode[];\n align?: \"left\" | \"center\" | \"right\";\n isHeader: boolean;\n position?: Position;\n}\n\nexport interface TableRowNode {\n type: \"tableRow\";\n children: TableCellNode[];\n isHeader: boolean;\n position?: Position;\n}\n\nexport interface TableNode {\n type: \"table\";\n children: TableRowNode[];\n align: Array<\"left\" | \"center\" | \"right\" | null>;\n position?: Position;\n}\n\nexport type BlockNode =\n | ThematicBreakNode\n | HeadingNode\n | CodeBlockNode\n | HtmlBlockNode\n | ParagraphNode\n | LinkReferenceDefinitionNode\n | BlockquoteNode\n | ListItemNode\n | ListNode\n | TableNode;\n\n// Alias for backward compatibility\nexport type BlockNodeType = BlockNode;\n\nexport interface DocumentNode {\n type: \"document\";\n children: BlockNode[];\n references?: Record<\n string,\n {\n type: \"linkReferenceDefinition\";\n label: string;\n url: string;\n title?: string;\n position?: Position;\n }\n >;\n position?: Position;\n}\n\nexport interface MarkdownDocument {\n root: DocumentNode;\n lineEnding: \"\\n\" | \"\\r\\n\";\n source?: string;\n}\n\n// =============================================================================\n// Zod Schemas (for validation only)\n// =============================================================================\n\nconst inlineNodeBase = z.object({\n position: positionSchema.optional(),\n});\n\nexport const textNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"text\"),\n value: z.string(),\n});\n\nexport const codeSpanNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"codeSpan\"),\n value: z.string(),\n});\n\nexport const hardBreakNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"hardBreak\"),\n});\n\nexport const softBreakNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"softBreak\"),\n});\n\nexport const htmlInlineNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"htmlInline\"),\n value: z.string(),\n});\n\n// Use z.array(z.unknown()) for recursive types in schemas\nexport const emphasisNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"emphasis\"),\n children: z.array(z.unknown()),\n marker: z.enum([\"*\", \"_\"]),\n});\n\nexport const strongNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"strong\"),\n children: z.array(z.unknown()),\n marker: z.enum([\"**\", \"__\"]),\n});\n\nexport const linkNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"link\"),\n url: z.string(),\n children: z.array(z.unknown()),\n title: z.string().optional(),\n reference: z.string().optional(),\n});\n\nexport const imageNodeSchema = inlineNodeBase.extend({\n type: z.literal(\"image\"),\n alt: z.string(),\n url: z.string(),\n title: z.string().optional(),\n reference: z.string().optional(),\n});\n\n// Union of all inline node schemas (for validation)\nexport const inlineNodeSchema = z.union([\n textNodeSchema,\n codeSpanNodeSchema,\n hardBreakNodeSchema,\n softBreakNodeSchema,\n htmlInlineNodeSchema,\n emphasisNodeSchema,\n strongNodeSchema,\n linkNodeSchema,\n imageNodeSchema,\n]);\n\n// =============================================================================\n// Block Node Schemas\n// =============================================================================\n\nconst blockNodeBase = z.object({\n position: positionSchema.optional(),\n});\n\nexport const thematicBreakNodeSchema = blockNodeBase.extend({\n type: z.literal(\"thematicBreak\"),\n marker: z.enum([\"-\", \"*\", \"_\"]),\n});\n\nexport const headingNodeSchema = blockNodeBase.extend({\n type: z.literal(\"heading\"),\n level: z.number().int().min(1).max(6),\n children: z.array(z.unknown()),\n style: z.enum([\"atx\", \"setext\"]),\n});\n\nexport const codeBlockNodeSchema = blockNodeBase.extend({\n type: z.literal(\"codeBlock\"),\n value: z.string(),\n style: z.enum([\"fenced\", \"indented\"]),\n lang: z.string().optional(),\n meta: z.string().optional(),\n fence: z.enum([\"`\", \"~\"]).optional(),\n fenceLength: z.number().int().min(3).optional(),\n});\n\nexport const htmlBlockNodeSchema = blockNodeBase.extend({\n type: z.literal(\"htmlBlock\"),\n value: z.string(),\n htmlType: z.number().int().min(1).max(7),\n});\n\nexport const paragraphNodeSchema = blockNodeBase.extend({\n type: z.literal(\"paragraph\"),\n children: z.array(z.unknown()),\n});\n\nexport const linkReferenceDefinitionSchema = blockNodeBase.extend({\n type: z.literal(\"linkReferenceDefinition\"),\n label: z.string(),\n url: z.string(),\n title: z.string().optional(),\n});\n\nexport const blockquoteNodeSchema = blockNodeBase.extend({\n type: z.literal(\"blockquote\"),\n children: z.array(z.unknown()),\n});\n\nexport const listItemNodeSchema = blockNodeBase.extend({\n type: z.literal(\"listItem\"),\n children: z.array(z.unknown()),\n marker: z.enum([\"-\", \"*\", \"+\", \")\", \".\"]),\n spread: z.boolean(),\n checked: z.boolean().optional(),\n});\n\nexport const listNodeSchema = blockNodeBase.extend({\n type: z.literal(\"list\"),\n ordered: z.boolean(),\n start: z.number().int().min(0).optional(),\n spread: z.boolean(),\n marker: z.enum([\"-\", \"*\", \"+\", \")\", \".\"]),\n children: z.array(z.unknown()),\n});\n\n// Table node schemas (GFM Extension)\nexport const tableCellNodeSchema = blockNodeBase.extend({\n type: z.literal(\"tableCell\"),\n children: z.array(z.unknown()),\n align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n isHeader: z.boolean(),\n});\n\nexport const tableRowNodeSchema = blockNodeBase.extend({\n type: z.literal(\"tableRow\"),\n children: z.array(z.unknown()),\n isHeader: z.boolean(),\n});\n\nexport const tableNodeSchema = blockNodeBase.extend({\n type: z.literal(\"table\"),\n children: z.array(z.unknown()),\n align: z.array(z.enum([\"left\", \"center\", \"right\"]).nullable()),\n});\n\n// Union of all block node schemas\nexport const blockNodeSchema = z.union([\n thematicBreakNodeSchema,\n headingNodeSchema,\n codeBlockNodeSchema,\n htmlBlockNodeSchema,\n paragraphNodeSchema,\n linkReferenceDefinitionSchema,\n blockquoteNodeSchema,\n listItemNodeSchema,\n listNodeSchema,\n tableNodeSchema,\n]);\n\n// =============================================================================\n// Document Schema\n// =============================================================================\n\nexport const documentNodeSchema = z.object({\n type: z.literal(\"document\"),\n children: z.array(z.unknown()),\n references: z\n .record(\n z.string(),\n z.object({\n type: z.literal(\"linkReferenceDefinition\"),\n label: z.string(),\n url: z.string(),\n title: z.string().optional(),\n position: positionSchema.optional(),\n }),\n )\n .optional(),\n position: positionSchema.optional(),\n});\n\nexport const markdownDocumentSchema = z.object({\n root: documentNodeSchema,\n lineEnding: z.enum([\"\\n\", \"\\r\\n\"]),\n source: z.string().optional(),\n});\n\n// =============================================================================\n// Parse Options\n// =============================================================================\n\n/**\n * Parse options.\n */\nexport const parseOptionsSchema = z.object({\n /** Include position information in AST nodes */\n positions: z.boolean().optional().default(true),\n /** Preserve original source in document */\n preserveSource: z.boolean().optional().default(false),\n});\n\n// Use z.input to get optional types for function parameters\nexport type ParseOptions = z.input<typeof parseOptionsSchema>;\n\n/**\n * Generate options.\n */\nexport const generateOptionsSchema = z.object({\n /** Line ending to use */\n lineEnding: z.enum([\"\\n\", \"\\r\\n\"]).optional().default(\"\\n\"),\n /** Indent for nested content (spaces) */\n indent: z.number().int().min(1).max(8).optional().default(3),\n /** Use setext headings for level 1-2 */\n setext: z.boolean().optional().default(false),\n /** Fence character for code blocks */\n fence: z.enum([\"`\", \"~\"]).optional().default(\"`\"),\n /** Fence length for code blocks */\n fenceLength: z.number().int().min(3).optional().default(3),\n /** Emphasis marker */\n emphasis: z.enum([\"*\", \"_\"]).optional().default(\"*\"),\n /** Strong marker */\n strong: z.enum([\"**\", \"__\"]).optional().default(\"**\"),\n /** Bullet marker for unordered lists */\n bullet: z.enum([\"-\", \"*\", \"+\"]).optional().default(\"-\"),\n /** Ordered list marker */\n orderedMarker: z.enum([\")\", \".\"]).optional().default(\".\"),\n /** Thematic break character */\n thematicBreak: z.enum([\"-\", \"*\", \"_\"]).optional().default(\"-\"),\n /** Thematic break length */\n thematicBreakLength: z.number().int().min(3).optional().default(3),\n});\n\n// Use z.input to get optional types for function parameters\nexport type GenerateOptions = z.input<typeof generateOptionsSchema>;\n\n/**\n * Stream options.\n */\nexport const streamOptionsSchema = parseOptionsSchema.extend({\n /** Chunk size for processing (default: 64KB) */\n chunkSize: z.number().int().positive().optional().default(65536),\n /** Maximum buffer size in bytes */\n maxBufferSize: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_MAX_BUFFER_SIZE),\n});\n\n// Use z.input to get optional types for function parameters\nexport type StreamOptions = z.input<typeof streamOptionsSchema>;\n\n// =============================================================================\n// Streaming Event Types\n// =============================================================================\n\nexport interface BlockStreamEvent {\n type: \"block\";\n data: BlockNode;\n}\n\nexport interface CompleteStreamEvent {\n type: \"complete\";\n document: MarkdownDocument;\n}\n\nexport interface ErrorStreamEvent {\n type: \"error\";\n error: string;\n}\n\nexport type StreamEvent =\n | BlockStreamEvent\n | CompleteStreamEvent\n | ErrorStreamEvent;\n\n// =============================================================================\n// Batch Processing Types\n// =============================================================================\n\nexport interface BatchMarkdownFileInput {\n filename: string;\n content: string;\n}\n\nexport interface FileStartEvent {\n type: \"file_start\";\n fileIndex: number;\n filename: string;\n}\n\nexport interface FileCompleteEvent {\n type: \"file_complete\";\n fileIndex: number;\n filename: string;\n document: MarkdownDocument;\n}\n\nexport interface FileErrorEvent {\n type: \"file_error\";\n fileIndex: number;\n filename: string;\n error: string;\n}\n\nexport interface BatchBlockEvent {\n type: \"block\";\n fileIndex: number;\n data: BlockNode;\n}\n\nexport interface BatchCompleteEvent {\n type: \"batch_complete\";\n totalFiles: number;\n errorCount: number;\n}\n\nexport type BatchMarkdownStreamEvent =\n | FileStartEvent\n | FileCompleteEvent\n | FileErrorEvent\n | BatchBlockEvent\n | BatchCompleteEvent;\n\nexport interface BatchMarkdownFileResult {\n filename: string;\n document?: MarkdownDocument;\n error?: string;\n}\n\n// =============================================================================\n// Type Aliases (for backward compatibility)\n// =============================================================================\n\n/** Alias for LinkReferenceDefinitionNode */\nexport type LinkReferenceDefinition = LinkReferenceDefinitionNode;\n\n/** Alias for BatchMarkdownFileResult */\nexport type BatchParsedMarkdownFile = BatchMarkdownFileResult;\n\n/** Union type for any node */\nexport type Node = InlineNode | BlockNode | DocumentNode;\n\n/** Nodes that contain a value property */\nexport type LiteralNode =\n | TextNode\n | CodeSpanNode\n | HtmlInlineNode\n | CodeBlockNode\n | HtmlBlockNode;\n\n/** Nodes that contain children */\nexport type ParentNode =\n | EmphasisNode\n | StrongNode\n | LinkNode\n | HeadingNode\n | ParagraphNode\n | BlockquoteNode\n | ListItemNode\n | ListNode\n | TableNode\n | TableRowNode\n | TableCellNode\n | DocumentNode;\n",
9
+ "import { parseBlocks } from \"./block-parser\";\nimport {\n type BlockNodeType,\n type InlineNodeType,\n type MarkdownDocument,\n type ParseOptions,\n parseOptionsSchema,\n} from \"./schemas\";\nimport type { ParseResult } from \"./types\";\nimport { decodeBuffer, detectLineEnding, normalizeLineEndings } from \"./utils\";\n\n// Union type for any node in the AST\ntype AnyNode = MarkdownDocument[\"root\"] | BlockNodeType | InlineNodeType;\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Parses markdown content and returns a result object.\n *\n * @param content - The markdown string to parse\n * @param options - Parsing options\n * @returns A ParseResult containing either the parsed document or an error\n *\n * @example\n * ```typescript\n * const result = parse(\"# Hello World\");\n * if (result.success) {\n * console.log(result.data.root.children);\n * }\n * ```\n */\nexport function parse(\n content: string,\n options?: ParseOptions,\n): ParseResult<MarkdownDocument> {\n try {\n const data = parseOrThrow(content, options);\n return { success: true, data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Parses markdown content and throws on error.\n *\n * @param content - The markdown string to parse\n * @param options - Parsing options\n * @returns The parsed markdown document\n * @throws Error if parsing fails or options are invalid\n *\n * @example\n * ```typescript\n * const doc = parseOrThrow(\"# Hello World\");\n * console.log(doc.root.children);\n * ```\n */\nexport function parseOrThrow(\n content: string,\n options?: ParseOptions,\n): MarkdownDocument {\n // Validate options if provided\n if (options !== undefined) {\n parseOptionsSchema.parse(options);\n }\n\n const includePositions = options?.positions ?? true;\n const preserveSource = options?.preserveSource ?? false;\n\n // Handle empty content\n if (!content || content.trim() === \"\") {\n return {\n root: {\n type: \"document\",\n children: [],\n references: {},\n },\n lineEnding: \"\\n\",\n };\n }\n\n // Detect line ending before normalization\n const lineEnding = detectLineEnding(content);\n\n // Normalize line endings for parsing\n const normalized = normalizeLineEndings(content);\n\n // Parse blocks\n const { blocks, references } = parseBlocks(\n normalized,\n undefined,\n includePositions,\n );\n\n // Convert references map to object\n const referencesObj: Record<\n string,\n {\n type: \"linkReferenceDefinition\";\n label: string;\n url: string;\n title?: string;\n }\n > = {};\n\n for (const [label, ref] of references) {\n referencesObj[label] = {\n type: \"linkReferenceDefinition\",\n label,\n url: ref.url,\n title: ref.title,\n };\n }\n\n const document: MarkdownDocument = {\n root: {\n type: \"document\",\n children: blocks,\n references:\n Object.keys(referencesObj).length > 0 ? referencesObj : undefined,\n },\n lineEnding,\n };\n\n if (preserveSource) {\n document.source = content;\n }\n\n return document;\n}\n\n/**\n * Parses markdown from a buffer with automatic encoding detection.\n *\n * @param buffer - The buffer containing markdown data\n * @param options - Parsing options\n * @returns A ParseResult containing either the parsed document or an error\n *\n * @example\n * ```typescript\n * const buffer = new Uint8Array([...]);\n * const result = parseBuffer(buffer);\n * if (result.success) {\n * console.log(result.data.root.children);\n * }\n * ```\n */\nexport function parseBuffer(\n buffer: Uint8Array,\n options?: ParseOptions,\n): ParseResult<MarkdownDocument> {\n try {\n const data = parseBufferOrThrow(buffer, options);\n return { success: true, data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Parses markdown from a buffer with automatic encoding detection.\n * Throws on error.\n *\n * @param buffer - The buffer containing markdown data\n * @param options - Parsing options\n * @returns The parsed markdown document\n * @throws Error if parsing fails\n *\n * @example\n * ```typescript\n * const buffer = new Uint8Array([...]);\n * const doc = parseBufferOrThrow(buffer);\n * console.log(doc.root.children);\n * ```\n */\nexport function parseBufferOrThrow(\n buffer: Uint8Array,\n options?: ParseOptions,\n): MarkdownDocument {\n const content = decodeBuffer(buffer);\n return parseOrThrow(content, options);\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Parses markdown and returns just the AST root node.\n *\n * @param content - The markdown string to parse\n * @param options - Parsing options\n * @returns The root document node\n *\n * @example\n * ```typescript\n * const root = parseToAst(\"# Hello\");\n * console.log(root.type); // \"document\"\n * ```\n */\nexport function parseToAst(\n content: string,\n options?: ParseOptions,\n): MarkdownDocument[\"root\"] {\n return parseOrThrow(content, options).root;\n}\n\n/**\n * Checks if the given content is valid markdown (doesn't throw during parsing).\n *\n * @param content - The content to check\n * @returns True if the content can be parsed as markdown\n *\n * @example\n * ```typescript\n * isValidMarkdown(\"# Hello\"); // true\n * isValidMarkdown(\"anything\"); // true (markdown is very permissive)\n * ```\n */\nexport function isValidMarkdown(content: string): boolean {\n const result = parse(content);\n return result.success;\n}\n\n/**\n * Extracts all text content from a markdown document (strips formatting).\n *\n * @param content - The markdown string\n * @returns Plain text content\n *\n * @example\n * ```typescript\n * extractText(\"**Hello** *world*\"); // \"Hello world\"\n * ```\n */\nexport function extractText(content: string): string {\n const doc = parseOrThrow(content, { positions: false });\n return extractTextFromNode(doc.root);\n}\n\n/**\n * Recursively extracts text from a node.\n */\nfunction extractTextFromNode(node: AnyNode): string {\n if (\"value\" in node && typeof node.value === \"string\") {\n return node.value;\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n return (node.children as AnyNode[]).map(extractTextFromNode).join(\"\");\n }\n\n if (node.type === \"softBreak\") {\n return \" \";\n }\n\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n\n return \"\";\n}\n\n/**\n * Counts the number of words in a markdown document.\n *\n * @param content - The markdown string\n * @returns Word count\n *\n * @example\n * ```typescript\n * countWords(\"Hello **world**!\"); // 2\n * ```\n */\nexport function countWords(content: string): number {\n const text = extractText(content);\n const words = text.trim().split(/\\s+/).filter(Boolean);\n return words.length;\n}\n\n/**\n * Gets headings from a markdown document.\n *\n * @param content - The markdown string\n * @returns Array of heading info\n *\n * @example\n * ```typescript\n * getHeadings(\"# Title\\n## Section\");\n * // [{ level: 1, text: \"Title\" }, { level: 2, text: \"Section\" }]\n * ```\n */\nexport function getHeadings(\n content: string,\n): Array<{ level: number; text: string }> {\n const doc = parseOrThrow(content, { positions: false });\n const headings: Array<{ level: number; text: string }> = [];\n\n function visit(node: AnyNode): void {\n if (node.type === \"heading\") {\n const text = (node.children as AnyNode[])\n .map(extractTextFromNode)\n .join(\"\");\n headings.push({ level: node.level, text });\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children as AnyNode[]) {\n visit(child);\n }\n }\n }\n\n visit(doc.root);\n return headings;\n}\n\n/**\n * Gets all links from a markdown document.\n *\n * @param content - The markdown string\n * @returns Array of link info\n *\n * @example\n * ```typescript\n * getLinks(\"[Example](https://example.com)\");\n * // [{ text: \"Example\", url: \"https://example.com\" }]\n * ```\n */\nexport function getLinks(\n content: string,\n): Array<{ text: string; url: string; title?: string }> {\n const doc = parseOrThrow(content, { positions: false });\n const links: Array<{ text: string; url: string; title?: string }> = [];\n\n function visit(node: AnyNode): void {\n if (node.type === \"link\") {\n const text = (node.children as AnyNode[])\n .map(extractTextFromNode)\n .join(\"\");\n links.push({ text, url: node.url, title: node.title });\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children as AnyNode[]) {\n visit(child);\n }\n }\n }\n\n visit(doc.root);\n return links;\n}\n\n/**\n * Gets all images from a markdown document.\n *\n * @param content - The markdown string\n * @returns Array of image info\n *\n * @example\n * ```typescript\n * getImages(\"![Alt text](image.png)\");\n * // [{ alt: \"Alt text\", url: \"image.png\" }]\n * ```\n */\nexport function getImages(\n content: string,\n): Array<{ alt: string; url: string; title?: string }> {\n const doc = parseOrThrow(content, { positions: false });\n const images: Array<{ alt: string; url: string; title?: string }> = [];\n\n function visit(node: AnyNode): void {\n if (node.type === \"image\") {\n images.push({ alt: node.alt, url: node.url, title: node.title });\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children as AnyNode[]) {\n visit(child);\n }\n }\n }\n\n visit(doc.root);\n return images;\n}\n\n/**\n * Gets all code blocks from a markdown document.\n *\n * @param content - The markdown string\n * @returns Array of code block info\n *\n * @example\n * ```typescript\n * getCodeBlocks(\"```js\\nconsole.log('hi');\\n```\");\n * // [{ lang: \"js\", code: \"console.log('hi');\" }]\n * ```\n */\nexport function getCodeBlocks(\n content: string,\n): Array<{ lang?: string; code: string }> {\n const doc = parseOrThrow(content, { positions: false });\n const codeBlocks: Array<{ lang?: string; code: string }> = [];\n\n function visit(node: AnyNode): void {\n if (node.type === \"codeBlock\") {\n codeBlocks.push({ lang: node.lang, code: node.value });\n }\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children as AnyNode[]) {\n visit(child);\n }\n }\n }\n\n visit(doc.root);\n return codeBlocks;\n}\n",
10
+ "import type {\n BlockNode,\n BlockquoteNode,\n CodeBlockNode,\n DocumentNode,\n GenerateOptions,\n HeadingNode,\n HtmlBlockNode,\n InlineNode,\n ListItemNode,\n ListNode,\n MarkdownDocument,\n Node,\n ParagraphNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n ThematicBreakNode,\n} from \"./schemas\";\nimport { generateOptionsSchema } from \"./schemas\";\nimport { encodeUrl, repeat } from \"./utils\";\n\n// =============================================================================\n// Default Options\n// =============================================================================\n\nconst DEFAULT_OPTIONS: Required<GenerateOptions> = {\n lineEnding: \"\\n\",\n indent: 3,\n setext: false,\n fence: \"`\",\n fenceLength: 3,\n emphasis: \"*\",\n strong: \"**\",\n bullet: \"-\",\n orderedMarker: \".\",\n thematicBreak: \"-\",\n thematicBreakLength: 3,\n};\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Generates markdown string from a document AST.\n *\n * @param document - The markdown document or root node to convert\n * @param options - Generation options\n * @returns The generated markdown string\n *\n * @example\n * ```typescript\n * const doc = parse(\"# Hello\");\n * const markdown = generate(doc);\n * console.log(markdown); // \"# Hello\"\n * ```\n */\nexport function generate(\n document: MarkdownDocument | DocumentNode,\n options?: GenerateOptions,\n): string {\n // Validate options if provided\n if (options !== undefined) {\n generateOptionsSchema.parse(options);\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const root = \"root\" in document ? document.root : document;\n\n return generateDocument(root, opts);\n}\n\n/**\n * Generates markdown string from any AST node.\n *\n * @param node - The node to convert\n * @param options - Generation options\n * @returns The generated markdown string\n *\n * @example\n * ```typescript\n * const node: HeadingNode = { type: \"heading\", level: 1, children: [...], style: \"atx\" };\n * const markdown = generateNode(node);\n * ```\n */\nexport function generateNode(node: Node, options?: GenerateOptions): string {\n // Validate options if provided\n if (options !== undefined) {\n generateOptionsSchema.parse(options);\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (node.type === \"document\") {\n return generateDocument(node, opts);\n }\n\n if (isBlockNode(node)) {\n return generateBlock(node, opts, 0);\n }\n\n return generateInline(node, opts);\n}\n\n/**\n * Creates an incremental markdown generator.\n *\n * @param options - Generation options\n * @returns A generator object with methods to add nodes\n *\n * @example\n * ```typescript\n * const gen = createGenerator();\n * gen.addNode({ type: \"heading\", level: 1, children: [...], style: \"atx\" });\n * gen.addNode({ type: \"paragraph\", children: [...] });\n * console.log(gen.toString());\n * ```\n */\nexport function createGenerator(options?: GenerateOptions): {\n addNode: (node: Node) => void;\n toString: () => string;\n toStream: () => ReadableStream<string>;\n} {\n // Validate options if provided\n if (options !== undefined) {\n generateOptionsSchema.parse(options);\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const blocks: string[] = [];\n\n return {\n addNode(node: Node) {\n if (node.type === \"document\") {\n for (const child of node.children) {\n blocks.push(generateBlock(child, opts, 0));\n }\n } else if (isBlockNode(node)) {\n blocks.push(generateBlock(node, opts, 0));\n } else {\n blocks.push(generateInline(node, opts));\n }\n },\n\n toString() {\n return blocks.join(opts.lineEnding + opts.lineEnding);\n },\n\n toStream() {\n const blocksSnapshot = [...blocks];\n const lineEnding = opts.lineEnding;\n let index = 0;\n\n return new ReadableStream<string>({\n pull(controller) {\n if (index >= blocksSnapshot.length) {\n controller.close();\n return;\n }\n\n const block = blocksSnapshot[index];\n const isLast = index === blocksSnapshot.length - 1;\n\n controller.enqueue(\n isLast ? block : block + lineEnding + lineEnding,\n );\n index++;\n },\n });\n },\n };\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nfunction isBlockNode(node: Node): node is BlockNode {\n return [\n \"thematicBreak\",\n \"heading\",\n \"codeBlock\",\n \"htmlBlock\",\n \"paragraph\",\n \"linkReferenceDefinition\",\n \"blockquote\",\n \"list\",\n \"listItem\",\n \"table\",\n ].includes(node.type);\n}\n\n// =============================================================================\n// Document Generation\n// =============================================================================\n\nfunction generateDocument(\n node: DocumentNode,\n opts: Required<GenerateOptions>,\n): string {\n const blocks = node.children.map((child) => generateBlock(child, opts, 0));\n return blocks.join(opts.lineEnding + opts.lineEnding);\n}\n\n// =============================================================================\n// Block Generation\n// =============================================================================\n\nfunction generateBlock(\n node: BlockNode,\n opts: Required<GenerateOptions>,\n depth: number,\n): string {\n switch (node.type) {\n case \"thematicBreak\":\n return generateThematicBreak(node, opts);\n case \"heading\":\n return generateHeading(node, opts);\n case \"codeBlock\":\n return generateCodeBlock(node, opts);\n case \"htmlBlock\":\n return generateHtmlBlock(node);\n case \"paragraph\":\n return generateParagraph(node, opts);\n case \"blockquote\":\n return generateBlockquote(node, opts, depth);\n case \"list\":\n return generateList(node, opts, depth);\n case \"listItem\":\n return generateListItem(node, opts, depth);\n case \"table\":\n return generateTable(node, opts);\n case \"linkReferenceDefinition\":\n return generateLinkReferenceDefinition(node);\n default:\n return \"\";\n }\n}\n\nfunction generateThematicBreak(\n node: ThematicBreakNode,\n opts: Required<GenerateOptions>,\n): string {\n const char = node.marker ?? opts.thematicBreak;\n return repeat(char, opts.thematicBreakLength);\n}\n\nfunction generateHeading(\n node: HeadingNode,\n opts: Required<GenerateOptions>,\n): string {\n const text = node.children\n .map((child) => generateInline(child, opts))\n .join(\"\");\n\n // Use setext style for levels 1-2 if enabled and style matches\n if (opts.setext && (node.level === 1 || node.level === 2)) {\n const underlineChar = node.level === 1 ? \"=\" : \"-\";\n const underline = repeat(underlineChar, Math.max(text.length, 3));\n return text + opts.lineEnding + underline;\n }\n\n // Default to ATX style\n return repeat(\"#\", node.level) + \" \" + text;\n}\n\nfunction generateCodeBlock(\n node: CodeBlockNode,\n opts: Required<GenerateOptions>,\n): string {\n if (node.style === \"indented\") {\n // Indent each line by 4 spaces\n const lines = node.value.split(\"\\n\");\n return lines.map((line) => \" \" + line).join(opts.lineEnding);\n }\n\n // Fenced code block - always use opts.fence for consistency\n const fence = opts.fence;\n const fenceLength = node.fenceLength ?? opts.fenceLength;\n const fenceStr = repeat(fence, fenceLength);\n\n let infoString = node.lang ?? \"\";\n if (node.meta) {\n infoString += \" \" + node.meta;\n }\n\n const lines = [fenceStr + infoString, node.value, fenceStr];\n return lines.join(opts.lineEnding);\n}\n\nfunction generateHtmlBlock(node: HtmlBlockNode): string {\n return node.value;\n}\n\nfunction generateParagraph(\n node: ParagraphNode,\n opts: Required<GenerateOptions>,\n): string {\n return node.children.map((child) => generateInline(child, opts)).join(\"\");\n}\n\nfunction generateBlockquote(\n node: BlockquoteNode,\n opts: Required<GenerateOptions>,\n depth: number,\n): string {\n const content = node.children\n .map((child) => generateBlock(child, opts, depth))\n .join(opts.lineEnding + opts.lineEnding);\n\n // Prefix each line with >\n const lines = content.split(opts.lineEnding);\n return lines.map((line) => (line ? \"> \" + line : \">\")).join(opts.lineEnding);\n}\n\nfunction generateList(\n node: ListNode,\n opts: Required<GenerateOptions>,\n depth: number,\n): string {\n const items: string[] = [];\n let counter = node.start ?? 1;\n\n for (const item of node.children) {\n const marker = node.ordered\n ? `${counter}${node.marker ?? opts.orderedMarker}`\n : (node.marker ?? opts.bullet);\n\n const content = generateListItem(item, opts, depth + 1);\n const lines = content.split(opts.lineEnding);\n\n // First line gets the marker\n const firstLine = marker + \" \" + (lines[0] ?? \"\");\n\n // Subsequent lines get indentation\n const indent = repeat(\" \", marker.length + 1);\n const restLines = lines\n .slice(1)\n .map((line) => (line ? indent + line : \"\"));\n\n items.push([firstLine, ...restLines].join(opts.lineEnding));\n counter++;\n }\n\n // Join with single or double line ending based on spread\n const separator = node.spread\n ? opts.lineEnding + opts.lineEnding\n : opts.lineEnding;\n\n return items.join(separator);\n}\n\nfunction generateListItem(\n node: ListItemNode,\n opts: Required<GenerateOptions>,\n depth: number,\n): string {\n // Handle task list\n let prefix = \"\";\n if (node.checked !== undefined) {\n prefix = node.checked ? \"[x] \" : \"[ ] \";\n }\n\n const content = node.children\n .map((child) => generateBlock(child, opts, depth))\n .join(opts.lineEnding + opts.lineEnding);\n\n return prefix + content;\n}\n\nfunction generateLinkReferenceDefinition(node: {\n type: \"linkReferenceDefinition\";\n label: string;\n url: string;\n title?: string;\n}): string {\n let result = `[${node.label}]: ${encodeUrl(node.url)}`;\n if (node.title) {\n result += ` \"${node.title}\"`;\n }\n return result;\n}\n\n// =============================================================================\n// Table Generation (GFM Extension)\n// =============================================================================\n\nfunction generateTable(\n node: TableNode,\n opts: Required<GenerateOptions>,\n): string {\n const rows: string[] = [];\n const headerRow = node.children.find((r) => r.isHeader);\n const bodyRows = node.children.filter((r) => !r.isHeader);\n\n // Generate header row\n if (headerRow) {\n rows.push(generateTableRow(headerRow, opts));\n\n // Generate delimiter row\n const delimiterCells = node.align.map((align) => {\n if (align === \"left\") return \":---\";\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \"---\";\n });\n rows.push(\"| \" + delimiterCells.join(\" | \") + \" |\");\n }\n\n // Generate body rows\n for (const row of bodyRows) {\n rows.push(generateTableRow(row, opts));\n }\n\n return rows.join(opts.lineEnding);\n}\n\nfunction generateTableRow(\n node: TableRowNode,\n opts: Required<GenerateOptions>,\n): string {\n const cells = node.children.map((cell) => generateTableCell(cell, opts));\n return \"| \" + cells.join(\" | \") + \" |\";\n}\n\nfunction generateTableCell(\n node: TableCellNode,\n opts: Required<GenerateOptions>,\n): string {\n return node.children.map((child) => generateInline(child, opts)).join(\"\");\n}\n\n// =============================================================================\n// Inline Generation\n// =============================================================================\n\nfunction generateInline(\n node: InlineNode,\n opts: Required<GenerateOptions>,\n): string {\n switch (node.type) {\n case \"text\":\n return node.value;\n\n case \"codeSpan\":\n return generateCodeSpan(node.value);\n\n case \"emphasis\":\n return generateEmphasis(node, opts);\n\n case \"strong\":\n return generateStrong(node, opts);\n\n case \"link\":\n return generateLink(node, opts);\n\n case \"image\":\n return generateImage(node);\n\n case \"hardBreak\":\n return \" \" + opts.lineEnding;\n\n case \"softBreak\":\n return opts.lineEnding;\n\n case \"htmlInline\":\n return node.value;\n\n default:\n return \"\";\n }\n}\n\nfunction generateCodeSpan(value: string): string {\n // Determine how many backticks we need\n let maxBackticks = 0;\n let current = 0;\n\n for (const char of value) {\n if (char === \"`\") {\n current++;\n maxBackticks = Math.max(maxBackticks, current);\n } else {\n current = 0;\n }\n }\n\n const backtickCount = maxBackticks + 1;\n const backticks = \"`\".repeat(backtickCount);\n\n // Add space padding if:\n // - Content starts or ends with backtick\n // - Content starts AND ends with spaces (and not empty)\n // - Using more than 1 backtick (for clarity per CommonMark)\n const needsPadding =\n backtickCount > 1 ||\n value.startsWith(\"`\") ||\n value.endsWith(\"`\") ||\n (value.startsWith(\" \") && value.endsWith(\" \") && value.length > 0);\n\n if (needsPadding) {\n return backticks + \" \" + value + \" \" + backticks;\n }\n\n return backticks + value + backticks;\n}\n\nfunction generateEmphasis(\n node: { type: \"emphasis\"; children: InlineNode[]; marker: \"*\" | \"_\" },\n opts: Required<GenerateOptions>,\n): string {\n const marker = node.marker ?? opts.emphasis;\n const content = node.children\n .map((child) => generateInline(child, opts))\n .join(\"\");\n return marker + content + marker;\n}\n\nfunction generateStrong(\n node: { type: \"strong\"; children: InlineNode[]; marker: \"**\" | \"__\" },\n opts: Required<GenerateOptions>,\n): string {\n const marker = node.marker ?? opts.strong;\n const content = node.children\n .map((child) => generateInline(child, opts))\n .join(\"\");\n return marker + content + marker;\n}\n\nfunction generateLink(\n node: { type: \"link\"; children: InlineNode[]; url: string; title?: string },\n opts: Required<GenerateOptions>,\n): string {\n const text = node.children\n .map((child) => generateInline(child, opts))\n .join(\"\");\n const url = encodeUrl(node.url);\n\n if (node.title) {\n return `[${text}](${url} \"${node.title}\")`;\n }\n\n return `[${text}](${url})`;\n}\n\nfunction generateImage(node: {\n type: \"image\";\n alt: string;\n url: string;\n title?: string;\n}): string {\n const url = encodeUrl(node.url);\n\n if (node.title) {\n return `![${node.alt}](${url} \"${node.title}\")`;\n }\n\n return `![${node.alt}](${url})`;\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Generates a heading string.\n *\n * @param level - Heading level (1-6)\n * @param text - Heading text\n * @param style - Heading style (atx or setext)\n * @returns The generated heading\n *\n * @example\n * ```typescript\n * generateHeadingString(1, \"Hello\"); // \"# Hello\"\n * generateHeadingString(2, \"World\", \"setext\"); // \"World\\n------\"\n * ```\n */\nexport function generateHeadingString(\n level: 1 | 2 | 3 | 4 | 5 | 6,\n text: string,\n style: \"atx\" | \"setext\" = \"atx\",\n): string {\n if (style === \"setext\" && (level === 1 || level === 2)) {\n const underlineChar = level === 1 ? \"=\" : \"-\";\n const underline = repeat(underlineChar, Math.max(text.length, 3));\n return text + \"\\n\" + underline;\n }\n\n return repeat(\"#\", level) + \" \" + text;\n}\n\n/**\n * Generates a link string.\n *\n * @param text - Link text\n * @param url - Link URL\n * @param title - Optional link title\n * @returns The generated link\n *\n * @example\n * ```typescript\n * generateLinkString(\"Example\", \"https://example.com\"); // \"[Example](https://example.com)\"\n * ```\n */\nexport function generateLinkString(\n text: string,\n url: string,\n title?: string,\n): string {\n const encodedUrl = encodeUrl(url);\n if (title) {\n return `[${text}](${encodedUrl} \"${title}\")`;\n }\n return `[${text}](${encodedUrl})`;\n}\n\n/**\n * Generates an image string.\n *\n * @param alt - Alt text\n * @param url - Image URL\n * @param title - Optional image title\n * @returns The generated image\n *\n * @example\n * ```typescript\n * generateImageString(\"Logo\", \"logo.png\"); // \"![Logo](logo.png)\"\n * ```\n */\nexport function generateImageString(\n alt: string,\n url: string,\n title?: string,\n): string {\n const encodedUrl = encodeUrl(url);\n if (title) {\n return `![${alt}](${encodedUrl} \"${title}\")`;\n }\n return `![${alt}](${encodedUrl})`;\n}\n\n/**\n * Generates a code block string.\n *\n * @param code - The code content\n * @param lang - Optional language identifier\n * @param style - Code block style (fenced or indented)\n * @returns The generated code block\n *\n * @example\n * ```typescript\n * generateCodeBlockString(\"console.log('hi');\", \"js\");\n * // \"```js\\nconsole.log('hi');\\n```\"\n * ```\n */\nexport function generateCodeBlockString(\n code: string,\n lang?: string,\n style: \"fenced\" | \"indented\" = \"fenced\",\n): string {\n if (style === \"indented\") {\n return code\n .split(\"\\n\")\n .map((line) => \" \" + line)\n .join(\"\\n\");\n }\n\n const fence = \"```\";\n const infoString = lang ?? \"\";\n return fence + infoString + \"\\n\" + code + \"\\n\" + fence;\n}\n\n/**\n * Generates a list string from items.\n *\n * @param items - List items (strings or nested lists)\n * @param ordered - Whether the list is ordered\n * @param start - Starting number for ordered lists\n * @returns The generated list\n *\n * @example\n * ```typescript\n * generateListString([\"First\", \"Second\"]); // \"- First\\n- Second\"\n * generateListString([\"First\", \"Second\"], true); // \"1. First\\n2. Second\"\n * ```\n */\nexport function generateListString(\n items: string[],\n ordered = false,\n start = 1,\n): string {\n return items\n .map((item, i) => {\n const marker = ordered ? `${start + i}.` : \"-\";\n return `${marker} ${item}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * Generates a blockquote string.\n *\n * @param content - The content to quote\n * @returns The generated blockquote\n *\n * @example\n * ```typescript\n * generateBlockquoteString(\"Hello world\"); // \"> Hello world\"\n * ```\n */\nexport function generateBlockquoteString(content: string): string {\n return content\n .split(\"\\n\")\n .map((line) => (line ? \"> \" + line : \">\"))\n .join(\"\\n\");\n}\n\n/**\n * Wraps text with emphasis markers.\n *\n * @param text - The text to emphasize\n * @param marker - The emphasis marker (* or _)\n * @returns The emphasized text\n *\n * @example\n * ```typescript\n * generateEmphasisString(\"hello\"); // \"*hello*\"\n * ```\n */\nexport function generateEmphasisString(\n text: string,\n marker: \"*\" | \"_\" = \"*\",\n): string {\n return marker + text + marker;\n}\n\n/**\n * Wraps text with strong emphasis markers.\n *\n * @param text - The text to emphasize\n * @param marker - The strong marker (** or __)\n * @returns The strongly emphasized text\n *\n * @example\n * ```typescript\n * generateStrongString(\"hello\"); // \"**hello**\"\n * ```\n */\nexport function generateStrongString(\n text: string,\n marker: \"**\" | \"__\" = \"**\",\n): string {\n return marker + text + marker;\n}\n\n/**\n * Wraps text in inline code.\n *\n * @param text - The text to wrap\n * @returns The inline code\n *\n * @example\n * ```typescript\n * generateInlineCodeString(\"foo\"); // \"`foo`\"\n * ```\n */\nexport function generateInlineCodeString(text: string): string {\n return generateCodeSpan(text);\n}\n\n/**\n * Generates a GFM table string from headers, rows, and optional alignment.\n *\n * @param headers - Array of column header strings\n * @param rows - 2D array of cell values\n * @param alignments - Optional array of alignment values ('left' | 'center' | 'right')\n * @returns The generated table markdown\n *\n * @example\n * ```typescript\n * generateTableString(\n * [\"Name\", \"Age\"],\n * [[\"Alice\", \"30\"], [\"Bob\", \"25\"]]\n * );\n * // \"| Name | Age |\\n| --- | --- |\\n| Alice | 30 |\\n| Bob | 25 |\"\n * ```\n */\nexport function generateTableString(\n headers: string[],\n rows: string[][],\n alignments?: (\"left\" | \"center\" | \"right\" | null)[],\n): string {\n if (headers.length === 0) {\n return \"\";\n }\n\n const columnCount = headers.length;\n\n // Escape pipe characters in cell content\n const escapeCell = (cell: string): string => {\n return cell.replace(/\\|/g, \"\\\\|\");\n };\n\n // Generate header row\n const headerRow =\n \"| \" + headers.map((h) => escapeCell(h)).join(\" | \") + \" |\";\n\n // Generate delimiter row with alignment\n const delimiterCells = headers.map((_, i) => {\n const align = alignments?.[i];\n if (align === \"left\") return \":---\";\n if (align === \"center\") return \":---:\";\n if (align === \"right\") return \"---:\";\n return \"---\";\n });\n const delimiterRow = \"| \" + delimiterCells.join(\" | \") + \" |\";\n\n // Generate body rows, padding/truncating to match column count\n const bodyRows = rows.map((row) => {\n const paddedRow = [...row];\n // Pad with empty strings if row is shorter than headers\n while (paddedRow.length < columnCount) {\n paddedRow.push(\"\");\n }\n // Truncate if row is longer than headers\n const cells = paddedRow.slice(0, columnCount).map((c) => escapeCell(c));\n return \"| \" + cells.join(\" | \") + \" |\";\n });\n\n return [headerRow, delimiterRow, ...bodyRows].join(\"\\n\");\n}\n\n/**\n * Generates a task list (checklist) string.\n *\n * @param items - Array of items with text and optional checked state\n * @returns The generated task list markdown\n *\n * @example\n * ```typescript\n * generateTaskListString([\n * { text: \"Buy groceries\", checked: true },\n * { text: \"Walk the dog\", checked: false },\n * ]);\n * // \"- [x] Buy groceries\\n- [ ] Walk the dog\"\n * ```\n */\nexport function generateTaskListString(\n items: Array<{ text: string; checked?: boolean }>,\n): string {\n return items\n .map((item) => `- [${item.checked ? \"x\" : \" \"}] ${item.text}`)\n .join(\"\\n\");\n}\n\n/**\n * Wraps text with strikethrough markers (GFM extension).\n *\n * @param text - The text to strike through\n * @returns The strikethrough text\n *\n * @example\n * ```typescript\n * generateStrikethroughString(\"deleted\"); // \"~~deleted~~\"\n * ```\n */\nexport function generateStrikethroughString(text: string): string {\n return `~~${text}~~`;\n}\n",
11
+ "import type {\n BlockNode,\n BlockquoteNode,\n CodeBlockNode,\n CodeSpanNode,\n DocumentNode,\n EmphasisNode,\n HeadingNode,\n HtmlBlockNode,\n HtmlInlineNode,\n ImageNode,\n InlineNode,\n LinkNode,\n ListItemNode,\n ListNode,\n MarkdownDocument,\n Node,\n ParagraphNode,\n StrongNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextNode,\n ThematicBreakNode,\n} from \"./schemas\";\nimport { encodeHtmlEntities } from \"./utils\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for HTML rendering.\n */\nexport interface HtmlRenderOptions {\n /** Whether to sanitize raw HTML blocks/inline (default: true) */\n sanitizeHtml?: boolean;\n /** Whether to add target=\"_blank\" to external links (default: false) */\n externalLinksNewTab?: boolean;\n /** Custom class prefix for elements (default: none) */\n classPrefix?: string;\n /** Whether to render soft breaks as <br> (default: false) */\n softBreakAsBr?: boolean;\n /** Custom URL transformer for links and images */\n transformUrl?: (url: string, type: \"link\" | \"image\") => string;\n /** Custom attributes to add to specific elements */\n elementAttributes?: {\n link?: Record<string, string>;\n image?: Record<string, string>;\n codeBlock?: Record<string, string>;\n heading?: Record<string, string>;\n };\n}\n\n// =============================================================================\n// Default Options\n// =============================================================================\n\nconst DEFAULT_OPTIONS: Required<HtmlRenderOptions> = {\n sanitizeHtml: true,\n externalLinksNewTab: false,\n classPrefix: \"\",\n softBreakAsBr: false,\n transformUrl: (url) => url,\n elementAttributes: {},\n};\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Renders a markdown document to HTML string.\n *\n * @param document - The markdown document or root node\n * @param options - Rendering options\n * @returns The generated HTML string\n *\n * @example\n * ```typescript\n * const doc = parse(\"# Hello **World**\");\n * const html = renderToHtml(doc);\n * // => \"<h1>Hello <strong>World</strong></h1>\"\n * ```\n */\nexport function renderToHtml(\n document: MarkdownDocument | DocumentNode,\n options?: HtmlRenderOptions,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const root = \"root\" in document ? document.root : document;\n\n return renderDocument(root, opts);\n}\n\n/**\n * Renders any AST node to HTML string.\n *\n * @param node - The node to render\n * @param options - Rendering options\n * @returns The generated HTML string\n */\nexport function renderNodeToHtml(\n node: Node,\n options?: HtmlRenderOptions,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n if (node.type === \"document\") {\n return renderDocument(node, opts);\n }\n\n if (isBlockNode(node)) {\n return renderBlock(node, opts);\n }\n\n return renderInline(node, opts);\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nfunction isBlockNode(node: Node): node is BlockNode {\n return [\n \"thematicBreak\",\n \"heading\",\n \"codeBlock\",\n \"htmlBlock\",\n \"paragraph\",\n \"linkReferenceDefinition\",\n \"blockquote\",\n \"list\",\n \"listItem\",\n \"table\",\n ].includes(node.type);\n}\n\n// =============================================================================\n// Document Rendering\n// =============================================================================\n\nfunction renderDocument(\n node: DocumentNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n return node.children.map((child) => renderBlock(child, opts)).join(\"\\n\");\n}\n\n// =============================================================================\n// Block Rendering\n// =============================================================================\n\nfunction renderBlock(\n node: BlockNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n switch (node.type) {\n case \"thematicBreak\":\n return renderThematicBreak(node, opts);\n case \"heading\":\n return renderHeading(node, opts);\n case \"codeBlock\":\n return renderCodeBlock(node, opts);\n case \"htmlBlock\":\n return renderHtmlBlock(node, opts);\n case \"paragraph\":\n return renderParagraph(node, opts);\n case \"blockquote\":\n return renderBlockquote(node, opts);\n case \"list\":\n return renderList(node, opts);\n case \"listItem\":\n return renderListItem(node, opts);\n case \"table\":\n return renderTable(node, opts);\n case \"linkReferenceDefinition\":\n return \"\"; // Link references don't render to HTML\n default:\n return \"\";\n }\n}\n\nfunction renderThematicBreak(\n _node: ThematicBreakNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const className = opts.classPrefix ? ` class=\"${opts.classPrefix}hr\"` : \"\";\n return `<hr${className} />`;\n}\n\nfunction renderHeading(\n node: HeadingNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const tag = `h${node.level}`;\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n\n // Generate ID from heading text content\n const textContent = extractTextContent(node.children);\n const headingId = generateHeadingId(textContent);\n const idAttr = headingId ? ` id=\"${headingId}\"` : \"\";\n\n const attrs = buildAttributes(\n opts.elementAttributes.heading,\n opts.classPrefix,\n tag,\n );\n return `<${tag}${idAttr}${attrs}>${content}</${tag}>`;\n}\n\nfunction renderCodeBlock(\n node: CodeBlockNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const escapedCode = encodeHtmlEntities(node.value);\n const langClass = node.lang\n ? ` class=\"language-${encodeHtmlEntities(node.lang)}\"`\n : \"\";\n const attrs = buildAttributes(\n opts.elementAttributes.codeBlock,\n opts.classPrefix,\n \"pre\",\n );\n return `<pre${attrs}><code${langClass}>${escapedCode}</code></pre>`;\n}\n\nfunction renderHtmlBlock(\n node: HtmlBlockNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n if (opts.sanitizeHtml) {\n // Escape raw HTML to prevent XSS\n return `<div class=\"raw-html\">${encodeHtmlEntities(node.value)}</div>`;\n }\n return node.value;\n}\n\nfunction renderParagraph(\n node: ParagraphNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n const className = opts.classPrefix ? ` class=\"${opts.classPrefix}p\"` : \"\";\n return `<p${className}>${content}</p>`;\n}\n\nfunction renderBlockquote(\n node: BlockquoteNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const content = node.children\n .map((child) => renderBlock(child, opts))\n .join(\"\\n\");\n const className = opts.classPrefix\n ? ` class=\"${opts.classPrefix}blockquote\"`\n : \"\";\n return `<blockquote${className}>\\n${content}\\n</blockquote>`;\n}\n\nfunction renderList(node: ListNode, opts: Required<HtmlRenderOptions>): string {\n const tag = node.ordered ? \"ol\" : \"ul\";\n const startAttr =\n node.ordered && node.start && node.start !== 1\n ? ` start=\"${node.start}\"`\n : \"\";\n const className = opts.classPrefix\n ? ` class=\"${opts.classPrefix}${tag}\"`\n : \"\";\n const items = node.children\n .map((item) => renderListItem(item, opts))\n .join(\"\\n\");\n return `<${tag}${startAttr}${className}>\\n${items}\\n</${tag}>`;\n}\n\nfunction renderListItem(\n node: ListItemNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const className = opts.classPrefix ? ` class=\"${opts.classPrefix}li\"` : \"\";\n\n // Handle task list items\n if (node.checked !== undefined) {\n const checkbox = `<input type=\"checkbox\"${node.checked ? \" checked\" : \"\"} disabled />`;\n const content = node.children\n .map((child) => renderBlock(child, opts))\n .join(\"\\n\");\n // For task lists, unwrap paragraph content for cleaner output\n const unwrappedContent = content.replace(/^<p>|<\\/p>$/g, \"\");\n return `<li${className}>${checkbox} ${unwrappedContent}</li>`;\n }\n\n // For tight lists (single paragraph), unwrap the paragraph\n if (node.children.length === 1 && node.children[0]?.type === \"paragraph\") {\n const paragraph = node.children[0] as ParagraphNode;\n const content = paragraph.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n return `<li${className}>${content}</li>`;\n }\n\n // For loose lists (multiple blocks), keep block structure\n const content = node.children\n .map((child) => renderBlock(child, opts))\n .join(\"\\n\");\n return `<li${className}>\\n${content}\\n</li>`;\n}\n\n// =============================================================================\n// Table Rendering (GFM Extension)\n// =============================================================================\n\nfunction renderTable(\n node: TableNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const rows = node.children;\n const headerRow = rows.find((r) => r.isHeader);\n const bodyRows = rows.filter((r) => !r.isHeader);\n\n const className = opts.classPrefix\n ? ` class=\"${opts.classPrefix}table\"`\n : \"\";\n let html = `<table${className}>`;\n\n if (headerRow) {\n html += \"\\n<thead>\\n\" + renderTableRow(headerRow, opts) + \"\\n</thead>\";\n }\n\n if (bodyRows.length > 0) {\n html +=\n \"\\n<tbody>\\n\" +\n bodyRows.map((r) => renderTableRow(r, opts)).join(\"\\n\") +\n \"\\n</tbody>\";\n }\n\n html += \"\\n</table>\";\n return html;\n}\n\nfunction renderTableRow(\n node: TableRowNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const cells = node.children\n .map((cell) => renderTableCell(cell, opts))\n .join(\"\");\n return `<tr>${cells}</tr>`;\n}\n\nfunction renderTableCell(\n node: TableCellNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const tag = node.isHeader ? \"th\" : \"td\";\n const alignStyle = node.align ? ` style=\"text-align: ${node.align}\"` : \"\";\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n return `<${tag}${alignStyle}>${content}</${tag}>`;\n}\n\n// =============================================================================\n// Inline Rendering\n// =============================================================================\n\nfunction renderInline(\n node: InlineNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n switch (node.type) {\n case \"text\":\n return renderText(node);\n case \"codeSpan\":\n return renderCodeSpan(node, opts);\n case \"emphasis\":\n return renderEmphasis(node, opts);\n case \"strong\":\n return renderStrong(node, opts);\n case \"link\":\n return renderLink(node, opts);\n case \"image\":\n return renderImage(node, opts);\n case \"hardBreak\":\n return renderHardBreak();\n case \"softBreak\":\n return renderSoftBreak(opts);\n case \"htmlInline\":\n return renderHtmlInline(node, opts);\n default:\n return \"\";\n }\n}\n\nfunction renderText(node: TextNode): string {\n return encodeHtmlEntities(node.value);\n}\n\nfunction renderCodeSpan(\n node: CodeSpanNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const className = opts.classPrefix ? ` class=\"${opts.classPrefix}code\"` : \"\";\n return `<code${className}>${encodeHtmlEntities(node.value)}</code>`;\n}\n\nfunction renderEmphasis(\n node: EmphasisNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n const className = opts.classPrefix ? ` class=\"${opts.classPrefix}em\"` : \"\";\n return `<em${className}>${content}</em>`;\n}\n\nfunction renderStrong(\n node: StrongNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n const className = opts.classPrefix\n ? ` class=\"${opts.classPrefix}strong\"`\n : \"\";\n return `<strong${className}>${content}</strong>`;\n}\n\nfunction renderLink(node: LinkNode, opts: Required<HtmlRenderOptions>): string {\n const content = node.children\n .map((child) => renderInline(child, opts))\n .join(\"\");\n const url = encodeHtmlEntities(opts.transformUrl(node.url, \"link\"));\n const title = node.title ? ` title=\"${encodeHtmlEntities(node.title)}\"` : \"\";\n\n let extraAttrs = \"\";\n if (opts.externalLinksNewTab && isExternalUrl(node.url)) {\n extraAttrs = ' target=\"_blank\" rel=\"noopener noreferrer\"';\n }\n\n const customAttrs = buildAttributes(\n opts.elementAttributes.link,\n opts.classPrefix,\n \"a\",\n );\n return `<a href=\"${url}\"${title}${extraAttrs}${customAttrs}>${content}</a>`;\n}\n\nfunction renderImage(\n node: ImageNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n const url = encodeHtmlEntities(opts.transformUrl(node.url, \"image\"));\n const alt = encodeHtmlEntities(node.alt);\n const title = node.title ? ` title=\"${encodeHtmlEntities(node.title)}\"` : \"\";\n const attrs = buildAttributes(\n opts.elementAttributes.image,\n opts.classPrefix,\n \"img\",\n );\n return `<img src=\"${url}\" alt=\"${alt}\"${title}${attrs} />`;\n}\n\nfunction renderHardBreak(): string {\n return \"<br />\";\n}\n\nfunction renderSoftBreak(opts: Required<HtmlRenderOptions>): string {\n return opts.softBreakAsBr ? \"<br />\" : \"\\n\";\n}\n\nfunction renderHtmlInline(\n node: HtmlInlineNode,\n opts: Required<HtmlRenderOptions>,\n): string {\n if (opts.sanitizeHtml) {\n return encodeHtmlEntities(node.value);\n }\n return node.value;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction isExternalUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\n/**\n * Generates a URL-friendly slug from heading text.\n * Used to create unique IDs for headings.\n */\nfunction generateHeadingId(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .slice(0, 50);\n}\n\n/**\n * Extracts plain text from inline nodes (for generating heading IDs).\n */\nfunction extractTextContent(nodes: InlineNode[]): string {\n return nodes\n .map((node) => {\n if (node.type === \"text\") return node.value;\n if (node.type === \"codeSpan\") return node.value;\n if (\"children\" in node && Array.isArray(node.children)) {\n return extractTextContent(node.children);\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction buildAttributes(\n customAttrs: Record<string, string> | undefined,\n classPrefix: string,\n elementName: string,\n): string {\n const attrs: string[] = [];\n\n if (classPrefix) {\n attrs.push(`class=\"${classPrefix}${elementName}\"`);\n }\n\n if (customAttrs) {\n for (const [key, value] of Object.entries(customAttrs)) {\n attrs.push(`${key}=\"${encodeHtmlEntities(value)}\"`);\n }\n }\n\n return attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n}\n",
12
+ "/**\n * HTML to Markdown Parser\n *\n * Converts HTML content to Markdown format using a lightweight state machine parser.\n * Supports all common HTML elements including headings, paragraphs, lists, tables,\n * code blocks, links, images, and inline formatting.\n */\n\nimport { generate } from \"./generator\";\nimport type {\n BlockNode,\n BlockquoteNode,\n CodeBlockNode,\n CodeSpanNode,\n DocumentNode,\n EmphasisNode,\n HardBreakNode,\n HeadingNode,\n ImageNode,\n InlineNode,\n LinkNode,\n ListItemNode,\n ListNode,\n ParagraphNode,\n StrongNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n ThematicBreakNode,\n} from \"./schemas\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for HTML to Markdown conversion\n */\nexport interface HtmlToMarkdownOptions {\n /** Keep original whitespace (default: false) */\n preserveWhitespace?: boolean;\n /** Heading style: \"atx\" (#) or \"setext\" (===) (default: \"atx\") */\n headingStyle?: \"atx\" | \"setext\";\n /** Unordered list marker (default: \"-\") */\n bulletMarker?: \"-\" | \"*\" | \"+\";\n /** Code block style (default: \"fenced\") */\n codeBlockStyle?: \"fenced\" | \"indented\";\n /** Fence character (default: \"`\") */\n fence?: \"`\" | \"~\";\n /** Strong marker (default: \"**\") */\n strongMarker?: \"**\" | \"__\";\n /** Emphasis marker (default: \"*\") */\n emphasisMarker?: \"*\" | \"_\";\n /** Link style (default: \"inline\") */\n linkStyle?: \"inline\" | \"reference\";\n}\n\n/** Intermediate HTML node representation */\ninterface HtmlNode {\n type: \"element\" | \"text\" | \"comment\";\n tag?: string;\n attributes?: Record<string, string>;\n children?: HtmlNode[];\n content?: string;\n}\n\n// =============================================================================\n// HTML Parser (State Machine)\n// =============================================================================\n\nconst SELF_CLOSING_TAGS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst BLOCK_TAGS = new Set([\n \"address\",\n \"article\",\n \"aside\",\n \"blockquote\",\n \"dd\",\n \"details\",\n \"dialog\",\n \"div\",\n \"dl\",\n \"dt\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"footer\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"header\",\n \"hgroup\",\n \"hr\",\n \"li\",\n \"main\",\n \"nav\",\n \"ol\",\n \"p\",\n \"pre\",\n \"section\",\n \"table\",\n \"tbody\",\n \"td\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"tr\",\n \"ul\",\n]);\n\n/**\n * Parse HTML string into an intermediate AST\n */\nexport function parseHtml(html: string): HtmlNode[] {\n let pos = 0;\n\n function parseNodes(): HtmlNode[] {\n const result: HtmlNode[] = [];\n\n while (pos < html.length) {\n // Check for closing tag\n if (html.startsWith(\"</\", pos)) {\n break;\n }\n\n // Check for comment\n if (html.startsWith(\"<!--\", pos)) {\n const endPos = html.indexOf(\"-->\", pos + 4);\n if (endPos !== -1) {\n pos = endPos + 3;\n continue;\n }\n }\n\n // Check for opening tag\n if (html[pos] === \"<\") {\n const element = parseElement();\n if (element) {\n result.push(element);\n continue;\n }\n }\n\n // Parse text content\n const text = parseText();\n if (text) {\n result.push(text);\n }\n }\n\n return result;\n }\n\n function parseElement(): HtmlNode | null {\n if (html[pos] !== \"<\") return null;\n\n const tagStart = pos + 1;\n let tagEnd = tagStart;\n\n // Find end of tag name\n while (tagEnd < html.length && !/[\\s/>]/.test(html[tagEnd]!)) {\n tagEnd++;\n }\n\n const tag = html.slice(tagStart, tagEnd).toLowerCase();\n if (!tag || tag.startsWith(\"!\")) return null;\n\n // Parse attributes\n const attributes: Record<string, string> = {};\n let attrPos = tagEnd;\n\n while (attrPos < html.length) {\n // Skip whitespace\n while (attrPos < html.length && /\\s/.test(html[attrPos]!)) {\n attrPos++;\n }\n\n // Check for end of tag\n if (html[attrPos] === \">\" || html.startsWith(\"/>\", attrPos)) {\n break;\n }\n\n // Parse attribute name\n let attrNameEnd = attrPos;\n while (\n attrNameEnd < html.length &&\n !/[\\s=/>]/.test(html[attrNameEnd]!)\n ) {\n attrNameEnd++;\n }\n\n const attrName = html.slice(attrPos, attrNameEnd).toLowerCase();\n attrPos = attrNameEnd;\n\n // Skip whitespace\n while (attrPos < html.length && /\\s/.test(html[attrPos]!)) {\n attrPos++;\n }\n\n // Check for value\n if (html[attrPos] === \"=\") {\n attrPos++; // Skip =\n\n // Skip whitespace\n while (attrPos < html.length && /\\s/.test(html[attrPos]!)) {\n attrPos++;\n }\n\n let value: string;\n const quote = html[attrPos];\n\n if (quote === '\"' || quote === \"'\") {\n attrPos++; // Skip opening quote\n const valueEnd = html.indexOf(quote, attrPos);\n if (valueEnd !== -1) {\n value = html.slice(attrPos, valueEnd);\n attrPos = valueEnd + 1;\n } else {\n value = \"\";\n }\n } else {\n // Unquoted value\n let valueEnd = attrPos;\n while (\n valueEnd < html.length &&\n !/[\\s>]/.test(html[valueEnd]!)\n ) {\n valueEnd++;\n }\n value = html.slice(attrPos, valueEnd);\n attrPos = valueEnd;\n }\n\n attributes[attrName] = decodeHtmlEntities(value);\n } else if (attrName) {\n attributes[attrName] = \"\";\n }\n }\n\n // Find end of opening tag\n const selfClosing =\n html.startsWith(\"/>\", attrPos) || SELF_CLOSING_TAGS.has(tag);\n if (html.startsWith(\"/>\", attrPos)) {\n pos = attrPos + 2;\n } else {\n const closePos = html.indexOf(\">\", attrPos);\n if (closePos === -1) return null;\n pos = closePos + 1;\n }\n\n // Self-closing tags have no children\n if (selfClosing) {\n return { type: \"element\", tag, attributes };\n }\n\n // Parse children\n const children = parseNodes();\n\n // Find and skip closing tag\n const closingTag = `</${tag}>`;\n const closingPos = html\n .toLowerCase()\n .indexOf(closingTag.toLowerCase(), pos);\n if (closingPos !== -1) {\n pos = closingPos + closingTag.length;\n }\n\n return { type: \"element\", tag, attributes, children };\n }\n\n function parseText(): HtmlNode | null {\n const start = pos;\n while (pos < html.length && html[pos] !== \"<\") {\n pos++;\n }\n\n const content = html.slice(start, pos);\n if (!content) return null;\n\n return { type: \"text\", content: decodeHtmlEntities(content) };\n }\n\n return parseNodes();\n}\n\n/**\n * Decode HTML entities to their character equivalents\n */\nfunction decodeHtmlEntities(text: string): string {\n const entities: Record<string, string> = {\n \"&amp;\": \"&\",\n \"&lt;\": \"<\",\n \"&gt;\": \">\",\n \"&quot;\": '\"',\n \"&apos;\": \"'\",\n \"&nbsp;\": \" \",\n \"&ndash;\": \"–\",\n \"&mdash;\": \"—\",\n \"&lsquo;\": \"\\u2018\",\n \"&rsquo;\": \"\\u2019\",\n \"&ldquo;\": \"\\u201C\",\n \"&rdquo;\": \"\\u201D\",\n \"&copy;\": \"\\u00A9\",\n \"&reg;\": \"\\u00AE\",\n \"&trade;\": \"\\u2122\",\n \"&hellip;\": \"\\u2026\",\n };\n\n // Replace named entities\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.split(entity).join(char);\n }\n\n // Replace numeric entities (decimal)\n result = result.replace(/&#(\\d+);/g, (_, code) =>\n String.fromCharCode(Number.parseInt(code, 10)),\n );\n\n // Replace numeric entities (hex)\n result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, code) =>\n String.fromCharCode(Number.parseInt(code, 16)),\n );\n\n return result;\n}\n\n// =============================================================================\n// HTML to Markdown AST Conversion\n// =============================================================================\n\n/**\n * Convert HTML AST to Markdown AST\n */\nexport function htmlAstToMarkdownAst(\n nodes: HtmlNode[],\n options: HtmlToMarkdownOptions = {},\n): DocumentNode {\n const blocks = convertNodesToBlocks(nodes, options);\n\n return {\n type: \"document\",\n children: blocks,\n };\n}\n\nfunction convertNodesToBlocks(\n nodes: HtmlNode[],\n options: HtmlToMarkdownOptions,\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n\n for (const node of nodes) {\n const converted = convertNodeToBlocks(node, options);\n blocks.push(...converted);\n }\n\n // Merge adjacent text-only blocks into paragraphs if needed\n return blocks;\n}\n\nfunction convertNodeToBlocks(\n node: HtmlNode,\n options: HtmlToMarkdownOptions,\n): BlockNode[] {\n if (node.type === \"text\") {\n const trimmed = options.preserveWhitespace\n ? node.content || \"\"\n : (node.content || \"\").trim();\n\n if (!trimmed) return [];\n\n // Wrap text in paragraph\n const paragraph: ParagraphNode = {\n type: \"paragraph\",\n children: [{ type: \"text\", value: trimmed }],\n };\n return [paragraph];\n }\n\n if (node.type === \"comment\") {\n return [];\n }\n\n const tag = node.tag || \"\";\n const children = node.children || [];\n const attributes = node.attributes || {};\n\n // Headings\n if (/^h([1-6])$/.test(tag)) {\n const level = Number.parseInt(tag[1]!, 10) as 1 | 2 | 3 | 4 | 5 | 6;\n const heading: HeadingNode = {\n type: \"heading\",\n level,\n style: options.headingStyle || \"atx\",\n children: convertNodesToInline(children, options),\n };\n return [heading];\n }\n\n // Paragraph\n if (tag === \"p\") {\n const inlineChildren = convertNodesToInline(children, options);\n if (inlineChildren.length === 0) return [];\n\n const paragraph: ParagraphNode = {\n type: \"paragraph\",\n children: inlineChildren,\n };\n return [paragraph];\n }\n\n // Horizontal rule\n if (tag === \"hr\") {\n const hr: ThematicBreakNode = {\n type: \"thematicBreak\",\n marker: \"-\",\n };\n return [hr];\n }\n\n // Blockquote\n if (tag === \"blockquote\") {\n const blockquote: BlockquoteNode = {\n type: \"blockquote\",\n children: convertNodesToBlocks(children, options),\n };\n return [blockquote];\n }\n\n // Unordered list\n if (tag === \"ul\") {\n const list: ListNode = {\n type: \"list\",\n ordered: false,\n spread: false,\n marker: options.bulletMarker || \"-\",\n children: convertListItems(children, options),\n };\n return [list];\n }\n\n // Ordered list\n if (tag === \"ol\") {\n const start = attributes.start\n ? Number.parseInt(attributes.start, 10)\n : 1;\n const list: ListNode = {\n type: \"list\",\n ordered: true,\n start,\n spread: false,\n marker: \".\",\n children: convertListItems(children, options),\n };\n return [list];\n }\n\n // Code block (pre > code)\n if (tag === \"pre\") {\n const codeChild = children.find(\n (c) => c.type === \"element\" && c.tag === \"code\",\n );\n const content = codeChild\n ? extractTextContent(codeChild.children || [])\n : extractTextContent(children);\n\n // Try to extract language from class\n const codeAttrs = codeChild?.attributes || {};\n const className = codeAttrs.class || \"\";\n const langMatch = className.match(/language-(\\w+)/);\n const lang = langMatch ? langMatch[1] : undefined;\n\n const codeBlock: CodeBlockNode = {\n type: \"codeBlock\",\n style: options.codeBlockStyle || \"fenced\",\n fence: options.fence || \"`\",\n fenceLength: 3,\n lang,\n value: content.trim(),\n };\n return [codeBlock];\n }\n\n // Table\n if (tag === \"table\") {\n const table = convertTable(children, options);\n if (table) return [table];\n return [];\n }\n\n // Div, section, article - extract content\n if (\n [\n \"div\",\n \"section\",\n \"article\",\n \"main\",\n \"aside\",\n \"nav\",\n \"header\",\n \"footer\",\n ].includes(tag)\n ) {\n return convertNodesToBlocks(children, options);\n }\n\n // Figure with caption\n if (tag === \"figure\") {\n const blocks: BlockNode[] = [];\n for (const child of children) {\n if (child.type === \"element\") {\n if (child.tag === \"img\") {\n const imgBlocks = convertNodeToBlocks(child, options);\n blocks.push(...imgBlocks);\n } else if (child.tag === \"figcaption\") {\n // Could add caption as italic text\n const caption = extractTextContent(child.children || []).trim();\n if (caption) {\n const paragraph: ParagraphNode = {\n type: \"paragraph\",\n children: [\n {\n type: \"emphasis\",\n marker: \"*\",\n children: [{ type: \"text\", value: caption }],\n },\n ],\n };\n blocks.push(paragraph);\n }\n }\n }\n }\n return blocks;\n }\n\n // Standalone img becomes a paragraph with image\n if (tag === \"img\") {\n const src = attributes.src || \"\";\n const alt = attributes.alt || \"\";\n const title = attributes.title;\n\n const image: ImageNode = {\n type: \"image\",\n url: src,\n alt,\n title,\n };\n\n const paragraph: ParagraphNode = {\n type: \"paragraph\",\n children: [image],\n };\n return [paragraph];\n }\n\n // Default: try to extract inline content as paragraph\n const inlineChildren = convertNodesToInline(children, options);\n if (inlineChildren.length > 0) {\n // Check if all children are text with only whitespace\n const hasContent = inlineChildren.some(\n (c) => c.type !== \"text\" || (c.type === \"text\" && c.value.trim()),\n );\n if (hasContent) {\n const paragraph: ParagraphNode = {\n type: \"paragraph\",\n children: inlineChildren,\n };\n return [paragraph];\n }\n }\n\n return [];\n}\n\nfunction convertListItems(\n nodes: HtmlNode[],\n options: HtmlToMarkdownOptions,\n): ListItemNode[] {\n const items: ListItemNode[] = [];\n\n for (const node of nodes) {\n if (node.type === \"element\" && node.tag === \"li\") {\n const children = node.children || [];\n\n // Check if LI contains block elements or just inline\n const hasBlockChildren = children.some(\n (c) =>\n c.type === \"element\" &&\n c.tag &&\n BLOCK_TAGS.has(c.tag) &&\n c.tag !== \"li\",\n );\n\n let itemChildren: BlockNode[];\n if (hasBlockChildren) {\n itemChildren = convertNodesToBlocks(children, options);\n } else {\n const inlineContent = convertNodesToInline(children, options);\n if (inlineContent.length > 0) {\n itemChildren = [\n {\n type: \"paragraph\",\n children: inlineContent,\n },\n ];\n } else {\n itemChildren = [];\n }\n }\n\n // Check for task list item\n const checkbox = children.find(\n (c) =>\n c.type === \"element\" &&\n c.tag === \"input\" &&\n c.attributes?.type === \"checkbox\",\n );\n\n const item: ListItemNode = {\n type: \"listItem\",\n marker: \"-\",\n spread: false,\n children: itemChildren,\n };\n\n if (checkbox) {\n item.checked = checkbox.attributes?.checked !== undefined;\n }\n\n items.push(item);\n }\n }\n\n return items;\n}\n\nfunction convertNodesToInline(\n nodes: HtmlNode[],\n options: HtmlToMarkdownOptions,\n): InlineNode[] {\n const result: InlineNode[] = [];\n\n for (const node of nodes) {\n const converted = convertNodeToInline(node, options);\n result.push(...converted);\n }\n\n return result;\n}\n\nfunction convertNodeToInline(\n node: HtmlNode,\n options: HtmlToMarkdownOptions,\n): InlineNode[] {\n if (node.type === \"text\") {\n const content = options.preserveWhitespace\n ? node.content || \"\"\n : normalizeWhitespace(node.content || \"\");\n\n if (!content) return [];\n\n return [{ type: \"text\", value: content }];\n }\n\n if (node.type === \"comment\") {\n return [];\n }\n\n const tag = node.tag || \"\";\n const children = node.children || [];\n const attributes = node.attributes || {};\n\n // Strong / Bold\n if (tag === \"strong\" || tag === \"b\") {\n const strong: StrongNode = {\n type: \"strong\",\n marker: options.strongMarker || \"**\",\n children: convertNodesToInline(children, options),\n };\n return [strong];\n }\n\n // Emphasis / Italic\n if (tag === \"em\" || tag === \"i\") {\n const emphasis: EmphasisNode = {\n type: \"emphasis\",\n marker: options.emphasisMarker || \"*\",\n children: convertNodesToInline(children, options),\n };\n return [emphasis];\n }\n\n // Strikethrough\n if (tag === \"s\" || tag === \"del\" || tag === \"strike\") {\n // Wrap in ~~ markers via text\n const content = extractTextContent(children);\n return [{ type: \"text\", value: `~~${content}~~` }];\n }\n\n // Code (inline)\n if (tag === \"code\") {\n const content = extractTextContent(children);\n const codeSpan: CodeSpanNode = {\n type: \"codeSpan\",\n value: content,\n };\n return [codeSpan];\n }\n\n // Link\n if (tag === \"a\") {\n const href = attributes.href || \"\";\n const title = attributes.title;\n\n const link: LinkNode = {\n type: \"link\",\n url: href,\n title,\n children: convertNodesToInline(children, options),\n };\n return [link];\n }\n\n // Image (inline)\n if (tag === \"img\") {\n const src = attributes.src || \"\";\n const alt = attributes.alt || \"\";\n const title = attributes.title;\n\n const image: ImageNode = {\n type: \"image\",\n url: src,\n alt,\n title,\n };\n return [image];\n }\n\n // Line break\n if (tag === \"br\") {\n const hardBreak: HardBreakNode = {\n type: \"hardBreak\",\n };\n return [hardBreak];\n }\n\n // Subscript / Superscript - convert to text\n if (tag === \"sub\" || tag === \"sup\") {\n const content = extractTextContent(children);\n return [{ type: \"text\", value: content }];\n }\n\n // Span, small, etc - extract content\n if (\n [\"span\", \"small\", \"mark\", \"u\", \"abbr\", \"cite\", \"q\", \"time\"].includes(tag)\n ) {\n return convertNodesToInline(children, options);\n }\n\n // Default: extract text content\n const textContent = extractTextContent([node]);\n if (textContent.trim()) {\n return [{ type: \"text\", value: normalizeWhitespace(textContent) }];\n }\n\n return [];\n}\n\nfunction convertTable(\n nodes: HtmlNode[],\n options: HtmlToMarkdownOptions,\n): TableNode | null {\n const rows: TableRowNode[] = [];\n let headerRow: TableRowNode | null = null;\n let alignments: Array<\"left\" | \"center\" | \"right\" | null> = [];\n\n // Find thead and tbody\n for (const node of nodes) {\n if (node.type !== \"element\") continue;\n\n if (node.tag === \"thead\") {\n const theadRows = extractTableRows(node.children || [], true, options);\n if (theadRows.length > 0) {\n headerRow = theadRows[0]!;\n alignments = extractAlignments(node.children || []);\n }\n } else if (node.tag === \"tbody\") {\n const tbodyRows = extractTableRows(\n node.children || [],\n false,\n options,\n );\n rows.push(...tbodyRows);\n } else if (node.tag === \"tr\") {\n // Direct tr children (no thead/tbody)\n if (!headerRow) {\n headerRow = convertTableRow(node, true, options);\n alignments = extractRowAlignments(node);\n } else {\n rows.push(convertTableRow(node, false, options));\n }\n }\n }\n\n if (!headerRow && rows.length === 0) return null;\n\n // If no explicit header, use first row as header\n if (!headerRow && rows.length > 0) {\n headerRow = rows.shift()!;\n }\n\n const allRows = headerRow ? [headerRow, ...rows] : rows;\n if (allRows.length === 0) return null;\n\n // Set alignments on all rows\n for (const row of allRows) {\n for (let i = 0; i < row.children.length; i++) {\n const cell = row.children[i];\n if (cell && alignments[i]) {\n cell.align = alignments[i] ?? undefined;\n }\n }\n }\n\n return {\n type: \"table\",\n align: alignments,\n children: allRows,\n };\n}\n\nfunction extractTableRows(\n nodes: HtmlNode[],\n isHeader: boolean,\n options: HtmlToMarkdownOptions,\n): TableRowNode[] {\n const rows: TableRowNode[] = [];\n\n for (const node of nodes) {\n if (node.type === \"element\" && node.tag === \"tr\") {\n rows.push(convertTableRow(node, isHeader, options));\n }\n }\n\n return rows;\n}\n\nfunction convertTableRow(\n node: HtmlNode,\n isHeader: boolean,\n options: HtmlToMarkdownOptions,\n): TableRowNode {\n const cells: TableCellNode[] = [];\n\n for (const child of node.children || []) {\n if (\n child.type === \"element\" &&\n (child.tag === \"td\" || child.tag === \"th\")\n ) {\n const cell: TableCellNode = {\n type: \"tableCell\",\n isHeader: child.tag === \"th\" || isHeader,\n children: convertNodesToInline(child.children || [], options),\n };\n\n // Extract alignment from style or align attribute\n const align = child.attributes?.align?.toLowerCase();\n const style = child.attributes?.style || \"\";\n const styleAlign = style.match(/text-align:\\s*(left|center|right)/i);\n\n if (align === \"left\" || align === \"center\" || align === \"right\") {\n cell.align = align;\n } else if (styleAlign) {\n cell.align = styleAlign[1]!.toLowerCase() as\n | \"left\"\n | \"center\"\n | \"right\";\n }\n\n cells.push(cell);\n }\n }\n\n return {\n type: \"tableRow\",\n isHeader,\n children: cells,\n };\n}\n\nfunction extractAlignments(\n nodes: HtmlNode[],\n): Array<\"left\" | \"center\" | \"right\" | null> {\n for (const node of nodes) {\n if (node.type === \"element\" && node.tag === \"tr\") {\n return extractRowAlignments(node);\n }\n }\n return [];\n}\n\nfunction extractRowAlignments(\n row: HtmlNode,\n): Array<\"left\" | \"center\" | \"right\" | null> {\n const alignments: Array<\"left\" | \"center\" | \"right\" | null> = [];\n\n for (const child of row.children || []) {\n if (\n child.type === \"element\" &&\n (child.tag === \"td\" || child.tag === \"th\")\n ) {\n const align = child.attributes?.align?.toLowerCase();\n const style = child.attributes?.style || \"\";\n const styleAlign = style.match(/text-align:\\s*(left|center|right)/i);\n\n if (align === \"left\" || align === \"center\" || align === \"right\") {\n alignments.push(align);\n } else if (styleAlign) {\n alignments.push(\n styleAlign[1]!.toLowerCase() as \"left\" | \"center\" | \"right\",\n );\n } else {\n alignments.push(null);\n }\n }\n }\n\n return alignments;\n}\n\nfunction extractTextContent(nodes: HtmlNode[]): string {\n let text = \"\";\n\n for (const node of nodes) {\n if (node.type === \"text\") {\n text += node.content || \"\";\n } else if (node.type === \"element\" && node.children) {\n text += extractTextContent(node.children);\n }\n }\n\n return text;\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, \" \");\n}\n\n// =============================================================================\n// Main Export Functions\n// =============================================================================\n\n/**\n * Convert HTML string to Markdown string\n *\n * @param html - The HTML content to convert\n * @param options - Conversion options\n * @returns Markdown string\n *\n * @example\n * ```typescript\n * const html = '<h1>Hello</h1><p>This is <strong>bold</strong> text.</p>';\n * const markdown = htmlToMarkdown(html);\n * // Result: \"# Hello\\n\\nThis is **bold** text.\"\n * ```\n */\nexport function htmlToMarkdown(\n html: string,\n options: HtmlToMarkdownOptions = {},\n): string {\n // Remove doctype, html, head, body wrapper tags\n const cleanHtml = html\n .replace(/<!DOCTYPE[^>]*>/gi, \"\")\n .replace(/<\\/?html[^>]*>/gi, \"\")\n .replace(/<head[\\s\\S]*?<\\/head>/gi, \"\")\n .replace(/<\\/?body[^>]*>/gi, \"\")\n .trim();\n\n if (!cleanHtml) return \"\";\n\n // Parse HTML to intermediate AST\n const htmlAst = parseHtml(cleanHtml);\n\n // Convert to Markdown AST\n const markdownAst = htmlAstToMarkdownAst(htmlAst, options);\n\n // Generate Markdown string - only pass defined options to avoid overriding defaults\n const generateOptions: Record<string, unknown> = {};\n if (options.fence !== undefined) generateOptions.fence = options.fence;\n if (options.emphasisMarker !== undefined)\n generateOptions.emphasis = options.emphasisMarker;\n if (options.strongMarker !== undefined)\n generateOptions.strong = options.strongMarker;\n if (options.bulletMarker !== undefined)\n generateOptions.bullet = options.bulletMarker;\n if (options.headingStyle === \"setext\") generateOptions.setext = true;\n\n return generate(markdownAst, generateOptions);\n}\n",
13
+ "import { createBlockContext, parseBlocks } from \"./block-parser\";\nimport {\n type BatchMarkdownFileInput,\n type BatchMarkdownStreamEvent,\n type BatchParsedMarkdownFile,\n type BlockNode,\n DEFAULT_MAX_BUFFER_SIZE,\n type MarkdownDocument,\n type StreamEvent,\n type StreamOptions,\n streamOptionsSchema,\n} from \"./schemas\";\nimport { decodeBuffer, normalizeLineEndings } from \"./utils\";\n\n// =============================================================================\n// Streaming Parser State\n// =============================================================================\n\ninterface StreamingParserState {\n buffer: string;\n lineBuffer: string[];\n references: Map<string, { url: string; title?: string }>;\n includePositions: boolean;\n maxBufferSize: number;\n}\n\n/**\n * Creates initial streaming parser state.\n */\nfunction createStreamingParserState(\n options?: StreamOptions,\n): StreamingParserState {\n return {\n buffer: \"\",\n lineBuffer: [],\n references: new Map(),\n includePositions: options?.positions ?? true,\n maxBufferSize: options?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n };\n}\n\n// =============================================================================\n// Streaming Parser\n// =============================================================================\n\n/**\n * Parses markdown content from a stream, yielding events for each block.\n *\n * @param input - A ReadableStream of Uint8Array or AsyncIterable of strings\n * @param options - Parsing options\n * @yields StreamEvent for each block and completion\n *\n * @example\n * ```typescript\n * const response = await fetch(\"doc.md\");\n * for await (const event of parseStream(response.body)) {\n * if (event.type === \"block\") {\n * console.log(event.data.type);\n * }\n * }\n * ```\n */\nexport async function* parseStream(\n input: ReadableStream<Uint8Array> | AsyncIterable<string>,\n options?: StreamOptions,\n): AsyncGenerator<StreamEvent> {\n // Validate options if provided\n if (options !== undefined) {\n streamOptionsSchema.parse(options);\n }\n\n const state = createStreamingParserState(options);\n\n // Convert ReadableStream to AsyncIterable if needed\n let iterable: AsyncIterable<string>;\n\n if (input instanceof ReadableStream) {\n const reader = input.getReader();\n const decoder = new TextDecoder();\n\n iterable = {\n async *[Symbol.asyncIterator]() {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n // Flush any remaining bytes\n const final = decoder.decode();\n if (final) yield final;\n },\n };\n } else {\n iterable = input;\n }\n\n // Process each chunk\n for await (const chunk of iterable) {\n yield* processStreamChunk(chunk, state);\n }\n\n // Process remaining buffer\n yield* flushStreamBuffer(state);\n\n // Emit completion event\n const document = buildDocument(state);\n yield { type: \"complete\", document };\n}\n\n/**\n * Processes a chunk of markdown content.\n */\nfunction* processStreamChunk(\n chunk: string,\n state: StreamingParserState,\n): Generator<StreamEvent> {\n state.buffer += chunk;\n\n // Check buffer size limit\n if (state.buffer.length > state.maxBufferSize) {\n yield {\n type: \"error\",\n error: `Buffer size exceeded maximum of ${state.maxBufferSize} bytes`,\n };\n return;\n }\n\n // Split into lines\n const normalized = normalizeLineEndings(state.buffer);\n const lines = normalized.split(\"\\n\");\n\n // Keep the last line in buffer (might be incomplete)\n state.buffer = lines.pop() ?? \"\";\n\n // Add complete lines to line buffer and process\n state.lineBuffer.push(...lines);\n\n // Process complete blocks\n yield* processLineBuffer(state);\n}\n\n/**\n * Processes lines in the buffer, yielding complete blocks.\n */\nfunction* processLineBuffer(\n state: StreamingParserState,\n): Generator<StreamEvent> {\n // We need enough context to detect block boundaries\n // Process when we have at least 2 blank lines or EOF\n while (state.lineBuffer.length > 0) {\n // Find the next block boundary\n const { block, consumedLines } = extractNextBlock(state);\n\n if (block) {\n yield { type: \"block\", data: block };\n state.lineBuffer.splice(0, consumedLines);\n } else {\n // No complete block yet, wait for more input\n break;\n }\n }\n}\n\n/**\n * Extracts the next complete block from the line buffer.\n */\nfunction extractNextBlock(state: StreamingParserState): {\n block: BlockNode | null;\n consumedLines: number;\n} {\n if (state.lineBuffer.length === 0) {\n return { block: null, consumedLines: 0 };\n }\n\n // Look for block boundaries\n let endIndex = -1;\n let blankCount = 0;\n let inFencedCode = false;\n let fenceChar = \"\";\n let fenceLength = 0;\n let closingFenceRegex: RegExp | null = null;\n\n for (let i = 0; i < state.lineBuffer.length; i++) {\n const line = state.lineBuffer[i] ?? \"\";\n const trimmedLine = line.trimStart();\n\n // Track fenced code blocks\n const fenceMatch = /^(`{3,}|~{3,})/.exec(trimmedLine);\n if (fenceMatch) {\n if (!inFencedCode) {\n inFencedCode = true;\n fenceChar = fenceMatch[1]?.[0] ?? \"`\";\n fenceLength = fenceMatch[1]?.length ?? 3;\n // Pre-compile the closing fence regex once\n closingFenceRegex = new RegExp(\n `^${fenceChar}{${fenceLength},}\\\\s*$`,\n );\n } else if (closingFenceRegex?.test(trimmedLine)) {\n // Check for closing fence\n inFencedCode = false;\n closingFenceRegex = null;\n endIndex = i + 1;\n break;\n }\n continue;\n }\n\n if (inFencedCode) continue;\n\n // Blank line detection\n if (trimmedLine === \"\") {\n blankCount++;\n if (blankCount >= 2 && i > 0) {\n endIndex = i;\n break;\n }\n } else {\n blankCount = 0;\n }\n }\n\n // If still in fenced code or no boundary found, can't extract yet\n if (inFencedCode || endIndex < 0) {\n // But if buffer is getting large, try to extract what we can\n if (state.lineBuffer.length > 100) {\n endIndex = Math.min(50, state.lineBuffer.length);\n } else {\n return { block: null, consumedLines: 0 };\n }\n }\n\n // Parse the extracted lines\n const content = state.lineBuffer.slice(0, endIndex).join(\"\\n\");\n const context = createBlockContext();\n context.references = state.references;\n\n const { blocks, references } = parseBlocks(\n content,\n context,\n state.includePositions,\n );\n\n // Merge references\n for (const [key, value] of references) {\n state.references.set(key, value);\n }\n\n // Return first block\n if (blocks.length > 0) {\n return { block: blocks[0] ?? null, consumedLines: endIndex };\n }\n\n return { block: null, consumedLines: endIndex };\n}\n\n/**\n * Flushes remaining content in the buffer.\n */\nfunction* flushStreamBuffer(\n state: StreamingParserState,\n): Generator<StreamEvent> {\n // Add any remaining buffer content\n if (state.buffer.trim()) {\n state.lineBuffer.push(state.buffer);\n }\n state.buffer = \"\";\n\n // Process remaining lines\n if (state.lineBuffer.length > 0) {\n const content = state.lineBuffer.join(\"\\n\");\n const context = createBlockContext();\n context.references = state.references;\n\n const { blocks, references } = parseBlocks(\n content,\n context,\n state.includePositions,\n );\n\n // Merge references\n for (const [key, value] of references) {\n state.references.set(key, value);\n }\n\n for (const block of blocks) {\n yield { type: \"block\", data: block };\n }\n }\n}\n\n/**\n * Builds the final document from accumulated state.\n */\nfunction buildDocument(state: StreamingParserState): MarkdownDocument {\n // Convert references map to object\n const referencesObj: Record<\n string,\n {\n type: \"linkReferenceDefinition\";\n label: string;\n url: string;\n title?: string;\n }\n > = {};\n\n for (const [label, ref] of state.references) {\n referencesObj[label] = {\n type: \"linkReferenceDefinition\",\n label,\n url: ref.url,\n title: ref.title,\n };\n }\n\n return {\n root: {\n type: \"document\",\n children: [], // Blocks were already emitted via events\n references:\n Object.keys(referencesObj).length > 0 ? referencesObj : undefined,\n },\n lineEnding: \"\\n\",\n };\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Parses markdown content from a stream and collects all blocks into a document.\n *\n * @param input - A ReadableStream of Uint8Array or AsyncIterable of strings\n * @param options - Parsing options\n * @returns A promise that resolves to the complete MarkdownDocument\n *\n * @example\n * ```typescript\n * const response = await fetch(\"doc.md\");\n * const doc = await parseStreamToDocument(response.body);\n * console.log(doc.root.children.length);\n * ```\n */\nexport async function parseStreamToDocument(\n input: ReadableStream<Uint8Array> | AsyncIterable<string>,\n options?: StreamOptions,\n): Promise<MarkdownDocument> {\n const blocks: BlockNode[] = [];\n let document: MarkdownDocument | null = null;\n\n for await (const event of parseStream(input, options)) {\n switch (event.type) {\n case \"block\":\n blocks.push(event.data);\n break;\n case \"complete\":\n document = event.document;\n break;\n case \"error\":\n throw new Error(event.error);\n }\n }\n\n if (!document) {\n throw new Error(\"Stream ended without completion event\");\n }\n\n // Merge collected blocks into document\n document.root.children = blocks;\n return document;\n}\n\n/**\n * Creates a streaming parser from a buffer.\n * Useful when you have a buffer but want to use the streaming API.\n *\n * @param buffer - The buffer containing markdown data\n * @param options - Parsing options\n * @yields StreamEvent for each block and completion\n */\nexport async function* parseBufferStream(\n buffer: Uint8Array,\n options?: StreamOptions,\n): AsyncGenerator<StreamEvent> {\n const content = decodeBuffer(buffer);\n const chunkSize = options?.chunkSize ?? 65536; // 64KB default\n\n // Create an async iterable that yields chunks\n async function* chunkGenerator(): AsyncGenerator<string> {\n for (let i = 0; i < content.length; i += chunkSize) {\n yield content.slice(i, i + chunkSize);\n }\n }\n\n yield* parseStream(chunkGenerator(), options);\n}\n\n// =============================================================================\n// Batch Streaming\n// =============================================================================\n\n/**\n * Streaming batch parser - processes files sequentially, yielding events.\n *\n * @param files - Array of files with filename and content\n * @param options - Stream options\n * @yields BatchMarkdownStreamEvent for each file start, block, completion, or error\n *\n * @example\n * ```typescript\n * const files = [\n * { filename: \"readme.md\", content: \"# Hello\" },\n * { filename: \"docs.md\", content: \"## World\" }\n * ];\n * for await (const event of parseBatchStream(files)) {\n * console.log(event.type, event.filename);\n * }\n * ```\n */\nexport async function* parseBatchStream(\n files: BatchMarkdownFileInput[],\n options?: StreamOptions,\n): AsyncGenerator<BatchMarkdownStreamEvent> {\n let errorCount = 0;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n if (!file) continue;\n\n const filename = file.filename;\n const content = file.content;\n\n yield { type: \"file_start\", fileIndex: i, filename };\n\n try {\n const blocks: BlockNode[] = [];\n\n // Create chunked async iterable\n async function* chunkGenerator(): AsyncGenerator<string> {\n const chunkSize = options?.chunkSize ?? 65536;\n for (let j = 0; j < content.length; j += chunkSize) {\n yield content.slice(j, j + chunkSize);\n // Yield to main thread\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n\n for await (const event of parseStream(chunkGenerator(), options)) {\n switch (event.type) {\n case \"block\":\n yield { type: \"block\", fileIndex: i, data: event.data };\n blocks.push(event.data);\n break;\n case \"complete\": {\n const doc: MarkdownDocument = {\n ...event.document,\n root: {\n ...event.document.root,\n children: blocks,\n },\n };\n yield {\n type: \"file_complete\",\n fileIndex: i,\n filename,\n document: doc,\n };\n break;\n }\n case \"error\":\n throw new Error(event.error);\n }\n }\n } catch (err) {\n errorCount++;\n yield {\n type: \"file_error\",\n fileIndex: i,\n filename,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n // Yield control between files\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n yield {\n type: \"batch_complete\",\n totalFiles: files.length,\n errorCount,\n };\n}\n\n/**\n * Convenience function that collects streaming batch results into arrays.\n *\n * @param files - Array of files with filename and content\n * @param options - Stream options\n * @returns Array of parsed file results\n */\nexport async function parseBatchStreamToArray(\n files: BatchMarkdownFileInput[],\n options?: StreamOptions,\n): Promise<BatchParsedMarkdownFile[]> {\n const results: BatchParsedMarkdownFile[] = files.map((file, index) => ({\n fileIndex: index,\n filename: file.filename,\n }));\n\n for await (const event of parseBatchStream(files, options)) {\n switch (event.type) {\n case \"file_complete\": {\n const result = results[event.fileIndex];\n if (result) {\n result.document = event.document;\n }\n break;\n }\n case \"file_error\": {\n const result = results[event.fileIndex];\n if (result) {\n result.error = event.error;\n }\n break;\n }\n }\n }\n\n return results;\n}\n"
14
+ ],
15
+ "mappings": "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",
16
+ "debugId": "4AEC3EE5419B3F1E64756E2164756E21",
17
+ "names": []
18
+ }