@copilotkit/markdown 2.0.0-rc.20 → 2.0.0-rc.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -7
- package/dist/dom/index.cjs +255 -0
- package/dist/dom/index.cjs.map +1 -0
- package/dist/dom/index.d.cts +93 -0
- package/dist/dom/index.d.cts.map +1 -0
- package/dist/dom/index.d.mts +93 -0
- package/dist/dom/index.d.mts.map +1 -0
- package/dist/dom/index.mjs +254 -0
- package/dist/dom/index.mjs.map +1 -0
- package/dist/index.cjs +522 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +271 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +271 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +512 -12
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.cjs +66 -458
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +13 -22
- package/dist/react/index.d.cts.map +1 -1
- package/dist/react/index.d.mts +13 -22
- package/dist/react/index.d.mts.map +1 -1
- package/dist/react/index.mjs +67 -459
- package/dist/react/index.mjs.map +1 -1
- package/dist/react-native/index.cjs.map +1 -1
- package/dist/react-native/index.d.cts.map +1 -1
- package/dist/react-native/index.d.mts.map +1 -1
- package/dist/react-native/index.mjs.map +1 -1
- package/dist/vue/index.cjs +86 -199
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +46 -16
- package/dist/vue/index.d.cts.map +1 -1
- package/dist/vue/index.d.mts +46 -16
- package/dist/vue/index.d.mts.map +1 -1
- package/dist/vue/index.mjs +88 -201
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +6 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["CLOSING_PUNCTUATION"],"sources":["../src/parser/helpers.ts","../src/parser/citations.ts","../src/parser/segments.ts","../src/parser/inline-parser.ts","../src/parser/block-parser.ts","../src/parser/ops.ts","../src/parser/state.ts","../src/dev-warning.ts"],"sourcesContent":["import type { StreamingMarkdownParserOptions } from \"./types\";\nimport type { SourceLine } from \"./internal\";\n\n/**\n * Default parser options for streaming markdown.\n */\nexport const DEFAULT_OPTIONS: StreamingMarkdownParserOptions = {\n segmenter: true,\n enableTables: true,\n enableAutolinks: true,\n};\n\n/**\n * Merges user-provided parser options with defaults.\n *\n * @param options - Optional partial parser options.\n * @returns Fully populated parser options.\n */\nexport function normalizeOptions(\n options: Partial<StreamingMarkdownParserOptions> | undefined,\n): StreamingMarkdownParserOptions {\n return {\n segmenter: options?.segmenter ?? DEFAULT_OPTIONS.segmenter,\n enableTables: options?.enableTables ?? DEFAULT_OPTIONS.enableTables,\n enableAutolinks:\n options?.enableAutolinks ?? DEFAULT_OPTIONS.enableAutolinks,\n };\n}\n\n/**\n * Normalizes streaming input chunks by handling trailing carriage-return boundaries.\n *\n * @param chunk - Incoming raw chunk.\n * @param hadPendingCR - Whether the previous chunk ended with `\\\\r`.\n * @returns Normalized text and whether this chunk now ends with a pending `\\\\r`.\n */\nexport function normalizeChunk(\n chunk: string,\n hadPendingCR: boolean,\n): { text: string; pendingCarriageReturn: boolean } {\n const input = (hadPendingCR ? \"\\r\" : \"\") + chunk;\n const pendingCarriageReturn = input.endsWith(\"\\r\");\n const head = pendingCarriageReturn ? input.slice(0, -1) : input;\n\n return {\n text: head.replace(/\\r\\n?/g, \"\\n\"),\n pendingCarriageReturn,\n };\n}\n\n/**\n * Splits normalized source text into lines with source offsets.\n *\n * @param source - Normalized source text.\n * @returns Line descriptors preserving absolute ranges.\n */\nexport function splitLines(source: string): SourceLine[] {\n const lines: SourceLine[] = [];\n let start = 0;\n\n for (let i = 0; i < source.length; i += 1) {\n if (source[i] !== \"\\n\") {\n continue;\n }\n\n lines.push({\n text: source.slice(start, i),\n start,\n end: i + 1,\n hasNewline: true,\n });\n start = i + 1;\n }\n\n if (start < source.length || source.length === 0) {\n lines.push({\n text: source.slice(start),\n start,\n end: source.length,\n hasNewline: false,\n });\n }\n\n return lines;\n}\n\n/**\n * Returns the trailing unterminated line text.\n *\n * @param source - Full source text.\n * @returns Last line content after the final newline.\n */\nexport function getLineBuffer(source: string): string {\n const newline = source.lastIndexOf(\"\\n\");\n return newline < 0 ? source : source.slice(newline + 1);\n}\n\n/**\n * Converts an absolute source index to 1-based line/column.\n *\n * @param source - Source text.\n * @param index - Absolute index.\n * @returns 1-based line and column coordinates.\n */\nexport function toLineColumn(\n source: string,\n index: number,\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < index; i += 1) {\n if (source[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Returns true for blank lines.\n */\nexport function isBlank(value: string): boolean {\n return /^\\s*$/.test(value);\n}\n\n/**\n * Returns true when a line is a citation definition.\n */\nexport function isCitationDefinitionLine(value: string): boolean {\n return /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.test(value);\n}\n\n/**\n * Returns true when a line is an unfinished citation-definition prefix candidate.\n *\n * This enables optimistic streaming behavior for definition lines that begin with\n * `[^` but are not yet complete enough to classify as either:\n * 1) a valid citation definition, or\n * 2) plain paragraph text.\n *\n * @param value - Raw line text.\n * @param hasNewline - Whether the source line is newline-terminated.\n * @param isComplete - Whether the parser has been finalized.\n */\nexport function isCitationDefinitionPrefixCandidate(\n value: string,\n hasNewline: boolean,\n isComplete: boolean,\n): boolean {\n if (hasNewline || isComplete || isCitationDefinitionLine(value)) {\n return false;\n }\n\n return (\n /^\\s{0,3}\\[\\^[^\\]\\s]*$/.test(value) || /^\\s{0,3}\\[\\^[^\\]\\s]+\\]$/.test(value)\n );\n}\n\n/**\n * Matches an opening fenced code block marker.\n */\nexport function matchFenceOpen(\n value: string,\n): { marker: \"```\" | \"~~~\"; length: number; info: string } | null {\n const trimmed = value.trimStart();\n const backtick = /^(`{3,})(.*)$/.exec(trimmed);\n if (backtick) {\n return {\n marker: \"```\",\n length: backtick[1].length,\n info: backtick[2].trim(),\n };\n }\n\n const tilde = /^(~{3,})(.*)$/.exec(trimmed);\n if (tilde) {\n return {\n marker: \"~~~\",\n length: tilde[1].length,\n info: tilde[2].trim(),\n };\n }\n\n return null;\n}\n\n/**\n * Matches a valid fenced code block closing line.\n */\nexport function matchFenceClose(\n value: string,\n marker: \"```\" | \"~~~\",\n length: number,\n): boolean {\n const re = marker === \"```\" ? /^\\s*`{3,}\\s*$/ : /^\\s*~{3,}\\s*$/;\n if (!re.test(value)) {\n return false;\n }\n\n const trimmed = value.trim();\n return trimmed.length >= length;\n}\n\n/**\n * Matches ATX heading syntax and extracts heading metadata.\n */\nexport function matchAtxHeading(value: string): {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n text: string;\n contentOffset: number;\n} | null {\n const match = /^\\s{0,3}(#{1,6})[ \\t]+(.+?)\\s*#*\\s*$/.exec(value);\n if (!match) {\n return null;\n }\n\n return {\n level: match[1].length as 1 | 2 | 3 | 4 | 5 | 6,\n text: match[2],\n contentOffset: value.indexOf(match[2]),\n };\n}\n\n/**\n * Returns true for setext heading underline lines.\n */\nexport function isSetextUnderline(value: string): boolean {\n return /^\\s{0,3}(=+|-+)\\s*$/.test(value);\n}\n\n/**\n * Returns true for thematic break syntax.\n */\nexport function isThematicBreak(value: string): boolean {\n return /^\\s{0,3}((\\*\\s*){3,}|(-\\s*){3,}|(_\\s*){3,})$/.test(value);\n}\n\n/**\n * Matches ordered and unordered list-item markers.\n */\nexport function matchListItem(value: string): {\n ordered: boolean;\n start: number;\n content: string;\n indent: number;\n contentIndent: number;\n} | null {\n const unordered = /^(\\s{0,3})([-+*])(\\s+)(.*)$/.exec(value);\n if (unordered) {\n const indent = unordered[1].length;\n const contentIndent = indent + unordered[2].length + unordered[3].length;\n return {\n ordered: false,\n start: 1,\n content: unordered[4],\n indent,\n contentIndent,\n };\n }\n\n const ordered = /^(\\s{0,3})(\\d{1,9})([.)])(\\s+)(.*)$/.exec(value);\n if (ordered) {\n const indent = ordered[1].length;\n const markerLength = ordered[2].length + ordered[3].length;\n const contentIndent = indent + markerLength + ordered[4].length;\n return {\n ordered: true,\n start: Number(ordered[2]),\n content: ordered[5],\n indent,\n contentIndent,\n };\n }\n\n return null;\n}\n\n/**\n * Returns true for blockquote marker lines.\n */\nexport function isBlockquoteLine(value: string): boolean {\n return /^\\s{0,3}>\\s?/.test(value);\n}\n\n/**\n * Returns true when two lines form a GFM table header + divider pair.\n */\nexport function isPipeTableHeader(\n first: SourceLine,\n second: SourceLine,\n): boolean {\n return looksLikeTableRow(first.text) && isTableDividerRow(second.text);\n}\n\n/**\n * Returns true when a line appears to be a table row.\n */\nexport function looksLikeTableRow(value: string): boolean {\n return value.includes(\"|\") && /\\S/.test(value.replace(/\\|/g, \"\"));\n}\n\n/**\n * Returns true for GFM table divider rows.\n */\nexport function isTableDividerRow(value: string): boolean {\n const cells = splitTableCells(value);\n if (cells.length === 0) {\n return false;\n }\n\n return cells.every((cell) => /^:?-{3,}:?$/.test(cell.trim()));\n}\n\n/**\n * Splits a pipe-table row into trimmed cell values.\n */\nexport function splitTableCells(value: string): string[] {\n const trimmed = value.trim();\n const body = trimmed.startsWith(\"|\") ? trimmed.slice(1) : trimmed;\n const core = body.endsWith(\"|\") ? body.slice(0, -1) : body;\n return core.split(\"|\").map((cell) => cell.trim());\n}\n\n/**\n * Converts table divider cells into alignment metadata.\n */\nexport function parseTableAlignment(\n cells: string[],\n): Array<\"left\" | \"right\" | \"center\" | \"none\"> {\n return cells.map((cell) => {\n const trimmed = cell.trim();\n const left = trimmed.startsWith(\":\");\n const right = trimmed.endsWith(\":\");\n\n if (left && right) {\n return \"center\";\n }\n if (left) {\n return \"left\";\n }\n if (right) {\n return \"right\";\n }\n\n return \"none\";\n });\n}\n\n/**\n * Determines whether a line starts a new block construct.\n */\nexport function startsNewBlock(\n lines: SourceLine[],\n index: number,\n enableTables: boolean,\n): boolean {\n const line = lines[index].text;\n\n return (\n !!matchFenceOpen(line) ||\n !!matchAtxHeading(line) ||\n isThematicBreak(line) ||\n !!matchListItem(line) ||\n isBlockquoteLine(line) ||\n (enableTables &&\n index + 1 < lines.length &&\n isPipeTableHeader(lines[index], lines[index + 1]))\n );\n}\n\n/**\n * Returns true when a character is escapable in CommonMark inline syntax.\n */\nexport function isEscapable(ch: string): boolean {\n return /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(ch);\n}\n\n/**\n * Finds the matching closing delimiter for a nested delimiter pair.\n */\nexport function findClosing(\n input: string,\n openAt: number,\n openChar: \"[\" | \"(\",\n closeChar: \"]\" | \")\",\n): number {\n let depth = 0;\n for (let i = openAt; i < input.length; i += 1) {\n const ch = input[i];\n if (ch === \"\\\\\") {\n i += 1;\n continue;\n }\n\n if (ch === openChar) {\n depth += 1;\n continue;\n }\n\n if (ch === closeChar) {\n depth -= 1;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Parses a markdown link destination and optional title.\n */\nexport function parseLinkDestination(input: string): {\n url: string;\n title?: string;\n} {\n const trimmed = input.trim();\n\n if (trimmed.startsWith(\"<\")) {\n const close = trimmed.indexOf(\">\");\n if (close > 0) {\n const url = trimmed.slice(1, close);\n const rest = trimmed.slice(close + 1).trim();\n const title = parseLinkTitle(rest);\n return title ? { url, title } : { url };\n }\n }\n\n const firstSpace = trimmed.search(/\\s/);\n if (firstSpace < 0) {\n return { url: trimmed };\n }\n\n const url = trimmed.slice(0, firstSpace);\n const title = parseLinkTitle(trimmed.slice(firstSpace).trim());\n\n return title ? { url, title } : { url };\n}\n\n/**\n * Parses CommonMark-style link titles (`\\\"...\\\"`, `'...'`, `( ... )`).\n */\nexport function parseLinkTitle(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n\n if (\n (input.startsWith('\"') && input.endsWith('\"')) ||\n (input.startsWith(\"'\") && input.endsWith(\"'\"))\n ) {\n return input.slice(1, -1);\n }\n\n if (input.startsWith(\"(\") && input.endsWith(\")\")) {\n return input.slice(1, -1);\n }\n\n return undefined;\n}\n\n/**\n * Returns true for URL-shaped text supported by autolink detection.\n */\nexport function isUrl(value: string): boolean {\n return /^(https?:\\/\\/|www\\.)\\S+$/.test(value);\n}\n\n/**\n * Returns true for email-shaped text supported by autolink detection.\n */\nexport function isEmail(value: string): boolean {\n return /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/.test(value);\n}\n\n/**\n * Trims punctuation suffixes from autolink candidates.\n */\nexport function trimAutolinkTrailingPunctuation(value: string): string {\n let end = value.length;\n while (end > 0 && /[.,;:!?]/.test(value[end - 1])) {\n end -= 1;\n }\n\n let candidate = value.slice(0, end);\n if (candidate.endsWith(\")\")) {\n const open = (candidate.match(/\\(/g) ?? []).length;\n const close = (candidate.match(/\\)/g) ?? []).length;\n if (close > open) {\n candidate = candidate.slice(0, -1);\n }\n }\n\n return candidate;\n}\n","import type { CitationState, StreamingMarkdownWarning } from \"./types\";\n\n/**\n * Extracts citation definitions from source text.\n *\n * @param source - Full normalized markdown source.\n * @param warnings - Mutable warning collection for parse diagnostics.\n * @returns Citation state with collected definitions and empty reference order.\n */\nexport function parseCitationDefinitions(source: string): {\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n} {\n const definitions: CitationState[\"definitions\"] = {};\n const warnings: StreamingMarkdownWarning[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n\n for (const line of lines) {\n const match = /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.exec(line);\n\n if (!match) {\n offset += line.length + 1;\n continue;\n }\n\n const id = match[1];\n\n if (definitions[id]) {\n warnings.push({ code: \"invalid_citation_definition\", at: offset });\n offset += line.length + 1;\n continue;\n }\n\n const extracted = extractTrailingUrl(match[2].trim());\n definitions[id] = {\n id,\n text: extracted.text,\n ...(extracted.url ? { url: extracted.url } : {}),\n };\n\n offset += line.length + 1;\n }\n\n return {\n citations: {\n order: [],\n numbers: {},\n definitions,\n },\n warnings,\n };\n}\n\n/**\n * Assigns or returns a stable citation number by first-seen inline reference order.\n *\n * @param citations - Citation state that tracks numbering.\n * @param idRef - Citation identifier (without `[^` and `]` markers).\n * @returns Stable numeric citation number.\n */\nexport function assignCitationNumber(\n citations: CitationState,\n idRef: string,\n): { citations: CitationState; number: number } {\n const existing = citations.numbers[idRef];\n if (typeof existing === \"number\") {\n return { citations, number: existing };\n }\n\n const next = citations.order.length + 1;\n return {\n citations: {\n ...citations,\n order: [...citations.order, idRef],\n numbers: { ...citations.numbers, [idRef]: next },\n },\n number: next,\n };\n}\n\nfunction extractTrailingUrl(input: string): { text: string; url?: string } {\n if (!input) {\n return { text: \"\" };\n }\n\n const match = /(?:\\s|^)(https?:\\/\\/\\S+|www\\.\\S+)$/.exec(input);\n\n if (!match) {\n return { text: input };\n }\n\n return {\n text: input.slice(0, match.index).trimEnd(),\n url: match[1],\n };\n}\n","import type { SegmenterOptions, TextSegment } from \"./types\";\n\n/**\n * Computes parse-time text segments for animation and incremental rendering.\n *\n * @param text - Raw text content for a single text node.\n * @param absoluteStart - Absolute source index where `text` begins.\n * @param context - Parse context containing segmenter options and warning state.\n * @returns Segment list or empty list when segmentation is disabled/unavailable.\n */\nexport function createSegments(\n text: string,\n absoluteStart: number,\n options: {\n segmenter: SegmenterOptions;\n hasWarnedSegmenterUnavailable: boolean;\n },\n): {\n segments: TextSegment[];\n warning?: { code: \"segmenter_unavailable\"; at: number };\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (options.segmenter === false) {\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n }\n\n const segmenterCtor =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n if (!segmenterCtor) {\n if (!options.hasWarnedSegmenterUnavailable) {\n return {\n segments: [],\n warning: { code: \"segmenter_unavailable\", at: absoluteStart },\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n const granularity =\n options.segmenter === true\n ? \"word\"\n : (options.segmenter.granularity ?? \"word\");\n const locale =\n options.segmenter === true ? undefined : options.segmenter.locale;\n\n const segmenter = new segmenterCtor(locale, { granularity });\n const segments: TextSegment[] = [];\n\n for (const segment of segmenter.segment(text)) {\n const segmentText = segment.segment;\n const start = absoluteStart + segment.index;\n\n segments.push({\n text: segmentText,\n start,\n end: start + segmentText.length,\n kind: granularity,\n isWhitespace: /^\\s+$/.test(segmentText),\n });\n }\n\n const clustered = clusterPunctuationSegments(segments);\n\n return {\n segments: clustered,\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction clusterPunctuationSegments(segments: TextSegment[]): TextSegment[] {\n const withClosingAttached = segments.reduce<TextSegment[]>((acc, segment) => {\n const previous = acc[acc.length - 1];\n if (\n previous &&\n !previous.isWhitespace &&\n isClosingPunctuationOnly(segment.text)\n ) {\n acc[acc.length - 1] = {\n ...previous,\n text: `${previous.text}${segment.text}`,\n end: segment.end,\n };\n\n return acc;\n }\n\n return [...acc, segment];\n }, []);\n\n const clustered: TextSegment[] = [];\n let i = 0;\n while (i < withClosingAttached.length) {\n const current = withClosingAttached[i];\n const next =\n i + 1 < withClosingAttached.length ? withClosingAttached[i + 1] : null;\n\n if (next && !next.isWhitespace && isOpeningPunctuationOnly(current.text)) {\n clustered.push({\n ...next,\n text: `${current.text}${next.text}`,\n start: current.start,\n });\n i += 2;\n continue;\n }\n\n clustered.push(current);\n i += 1;\n }\n\n return clustered;\n}\n\nfunction isClosingPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, CLOSING_PUNCTUATION);\n}\n\nfunction isOpeningPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, OPENING_PUNCTUATION);\n}\n\nfunction isOnlyFromSet(value: string, charset: ReadonlySet<string>): boolean {\n return (\n value.length > 0 && [...value].every((character) => charset.has(character))\n );\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nconst OPENING_PUNCTUATION = new Set([\n \"(\",\n \"{\",\n \"[\",\n '\"',\n \"'\",\n \"〈\",\n \"《\",\n \"「\",\n \"『\",\n \"【\",\n \"〔\",\n \"〖\",\n \"(\",\n \"[\",\n \"{\",\n]);\n","import { assignCitationNumber } from \"./citations\";\nimport {\n findClosing,\n isEmail,\n isEscapable,\n isUrl,\n parseLinkDestination,\n trimAutolinkTrailingPunctuation,\n} from \"./helpers\";\nimport type { DraftNode, ParseContext, ParseResult } from \"./internal\";\nimport { createSegments } from \"./segments\";\nimport type {\n CitationState,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Parses inline markdown content into inline draft nodes.\n *\n * @param text - Inline source text.\n * @param absoluteStart - Absolute source offset for the first character in `text`.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Immutable parse context shared across block/inline parsing.\n * @returns Inline draft nodes and updated immutable parser context.\n */\nexport function parseInline(\n text: string,\n absoluteStart: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode[]> {\n const nodes: DraftNode[] = [];\n let i = 0;\n let textBuffer = \"\";\n let textBufferStart = -1;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const flushTextBuffer = () => {\n if (textBuffer.length === 0 || textBufferStart < 0) {\n return;\n }\n\n const appendResult = appendText(\n nodes,\n textBuffer,\n textBufferStart,\n path,\n context.options.segmenter,\n hasWarnedSegmenterUnavailable,\n );\n warnings =\n appendResult.warnings.length > 0\n ? [...warnings, ...appendResult.warnings]\n : warnings;\n hasWarnedSegmenterUnavailable = appendResult.hasWarnedSegmenterUnavailable;\n textBuffer = \"\";\n textBufferStart = -1;\n };\n\n const appendBufferedText = (value: string, start: number) => {\n if (value.length === 0) {\n return;\n }\n\n if (textBuffer.length === 0) {\n textBufferStart = start;\n }\n\n textBuffer += value;\n };\n\n while (i < text.length) {\n const current = text[i];\n\n if (current === \"\\n\") {\n const trailingBackslashes = countTrailing(text, i - 1, \"\\\\\");\n const hardByBackslash = trailingBackslashes % 2 === 1;\n const hardBySpaces = i > 1 && text.slice(i - 2, i) === \" \";\n const hard = hardByBackslash || hardBySpaces;\n\n if (hardByBackslash && textBuffer.endsWith(\"\\\\\")) {\n textBuffer = textBuffer.slice(0, -1);\n }\n\n flushTextBuffer();\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: hard ? \"hard-break\" : \"soft-break\",\n range: { start: absoluteStart + i, end: absoluteStart + i + 1 },\n closed: true,\n props: {},\n children: [],\n });\n i += 1;\n continue;\n }\n\n if (current === \"\\\\\" && i + 1 < text.length && isEscapable(text[i + 1])) {\n appendBufferedText(text[i + 1], absoluteStart + i);\n i += 2;\n continue;\n }\n\n const citation = parseCitationInline(\n text,\n i,\n absoluteStart,\n path,\n citations,\n nodes.length,\n context.isComplete,\n );\n if (citation) {\n flushTextBuffer();\n nodes.push(citation.node);\n i = citation.next;\n citations = citation.citations;\n continue;\n }\n\n const image = parseImageInline(text, i, absoluteStart, path, nodes.length);\n if (image) {\n flushTextBuffer();\n nodes.push(image.node);\n i = image.next;\n continue;\n }\n\n const link = parseLinkInline(\n text,\n i,\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (link) {\n flushTextBuffer();\n nodes.push(link.node);\n i = link.next;\n citations = link.citations;\n warnings = link.warnings;\n hasWarnedSegmenterUnavailable = link.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const auto = parseAutolinkInline(\n text,\n i,\n absoluteStart,\n path,\n context.options.enableAutolinks,\n nodes.length,\n );\n if (auto) {\n flushTextBuffer();\n nodes.push(auto.node);\n i = auto.next;\n continue;\n }\n\n const code = parseInlineCode(text, i, absoluteStart, path, nodes.length);\n if (code) {\n flushTextBuffer();\n nodes.push(code.node);\n i = code.next;\n continue;\n }\n\n const strong =\n parseDelimitedInline(\n text,\n i,\n \"**\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"__\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strong) {\n flushTextBuffer();\n nodes.push(strong.node);\n i = strong.next;\n citations = strong.citations;\n warnings = strong.warnings;\n hasWarnedSegmenterUnavailable = strong.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const strike = parseDelimitedInline(\n text,\n i,\n \"~~\",\n \"strikethrough\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strike) {\n flushTextBuffer();\n nodes.push(strike.node);\n i = strike.next;\n citations = strike.citations;\n warnings = strike.warnings;\n hasWarnedSegmenterUnavailable = strike.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const em =\n parseDelimitedInline(\n text,\n i,\n \"*\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"_\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (em) {\n flushTextBuffer();\n nodes.push(em.node);\n i = em.next;\n citations = em.citations;\n warnings = em.warnings;\n hasWarnedSegmenterUnavailable = em.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n appendBufferedText(text[i], absoluteStart + i);\n i += 1;\n }\n\n flushTextBuffer();\n const inlineNodes = annotateNoBreakBeforeSegments(nodes);\n\n return {\n value: inlineNodes,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction countTrailing(text: string, index: number, value: string): number {\n let run = 0;\n let i = index;\n\n while (i >= 0 && text[i] === value) {\n run += 1;\n i -= 1;\n }\n\n return run;\n}\n\nfunction annotateNoBreakBeforeSegments(nodes: DraftNode[]): DraftNode[] {\n let changed = false;\n\n const next = nodes.map((node, index) => {\n if (node.type !== \"text\") {\n return node;\n }\n\n const segments = node.props[\"segments\"];\n if (!Array.isArray(segments) || segments.length === 0) {\n return node;\n }\n\n const typedSegments = segments as TextSegment[];\n const firstSegment = typedSegments[0];\n if (!firstSegment) {\n return node;\n }\n\n const previous = index > 0 ? nodes[index - 1] : null;\n const shouldMark =\n startsWithClosingPunctuation(firstSegment.text) &&\n shouldPreventBreakBeforeNode(previous);\n const alreadyMarked = firstSegment.noBreakBefore === true;\n\n if (shouldMark === alreadyMarked) {\n return node;\n }\n\n const nextFirst: TextSegment = shouldMark\n ? { ...firstSegment, noBreakBefore: true }\n : { ...firstSegment, noBreakBefore: undefined };\n const nextSegments = [nextFirst, ...typedSegments.slice(1)];\n\n changed = true;\n return {\n ...node,\n props: {\n ...node.props,\n segments: nextSegments,\n },\n };\n });\n\n return changed ? next : nodes;\n}\n\nfunction shouldPreventBreakBeforeNode(node: DraftNode | null): boolean {\n if (!node) {\n return false;\n }\n\n if (node.type === \"soft-break\" || node.type === \"hard-break\") {\n return false;\n }\n\n if (node.type === \"text\") {\n const text = String(node.props[\"text\"] ?? \"\");\n if (!text || /\\s$/u.test(text)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction startsWithClosingPunctuation(value: string): boolean {\n if (!value) {\n return false;\n }\n\n const [first] = [...value];\n return first != null && CLOSING_PUNCTUATION.has(first);\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nfunction appendText(\n nodes: DraftNode[],\n text: string,\n start: number,\n path: string,\n segmenter: ParseContext[\"options\"][\"segmenter\"],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (!text) {\n return { warnings: [], hasWarnedSegmenterUnavailable };\n }\n\n const segmentation = createSegments(text, start, {\n segmenter,\n hasWarnedSegmenterUnavailable,\n });\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: \"text\",\n range: { start, end: start + text.length },\n closed: true,\n props: {\n text,\n segments: segmentation.segments,\n },\n children: [],\n });\n\n return {\n warnings: segmentation.warning ? [segmentation.warning] : [],\n hasWarnedSegmenterUnavailable: segmentation.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCitationInline(\n text: string,\n at: number,\n start: number,\n path: string,\n citations: CitationState,\n index: number,\n isComplete: boolean,\n): { node: DraftNode; next: number; citations: CitationState } | null {\n if (!text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const close = text.indexOf(\"]\", at + 2);\n if (close >= 0) {\n const idRef = text.slice(at + 2, close).trim();\n if (!idRef) {\n return null;\n }\n\n const numbered = assignCitationNumber(citations, idRef);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { idRef, number: numbered.number },\n children: [],\n },\n next: close + 1,\n citations: numbered.citations,\n };\n }\n\n if (isComplete) {\n return null;\n }\n\n const partial = text.slice(at);\n if (!/^\\[\\^[^\\]\\s]+$/u.test(partial)) {\n return null;\n }\n\n const partialIdRef = partial.slice(2);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: { idRef: partialIdRef },\n children: [],\n },\n next: text.length,\n citations,\n };\n}\n\nfunction parseImageInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!text.startsWith(\"![\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at + 1, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const alt = text.slice(at + 2, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"image\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n alt,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: [],\n },\n next: destEnd + 1,\n };\n}\n\nfunction parseLinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (text[at] !== \"[\" || text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const label = text.slice(at + 1, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n const childResult = parseInline(label, start + at + 1, `${path}.${index}`, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"link\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: childResult.value,\n },\n next: destEnd + 1,\n citations: childResult.citations,\n warnings: childResult.warnings,\n hasWarnedSegmenterUnavailable: childResult.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseAutolinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n enabled: boolean,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!enabled) {\n return null;\n }\n\n if (text[at] === \"<\") {\n const close = text.indexOf(\">\", at + 1);\n if (close > at + 1) {\n const value = text.slice(at + 1, close).trim();\n if (isUrl(value) || isEmail(value)) {\n const url = isEmail(value) ? `mailto:${value}` : value;\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { url, text: value },\n children: [],\n },\n next: close + 1,\n };\n }\n }\n }\n\n const boundaryOk = at === 0 || /\\s|[([{\"'`]/.test(text[at - 1]);\n if (!boundaryOk) {\n return null;\n }\n\n const match =\n /^(https?:\\/\\/\\S+|www\\.\\S+|[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})/.exec(\n text.slice(at),\n );\n if (!match) {\n return null;\n }\n\n const raw = trimAutolinkTrailingPunctuation(match[1]);\n if (!raw) {\n return null;\n }\n\n const url = isEmail(raw)\n ? `mailto:${raw}`\n : raw.startsWith(\"www.\")\n ? `https://${raw}`\n : raw;\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + at + raw.length },\n closed: true,\n props: {\n url,\n text: raw,\n },\n children: [],\n },\n next: at + raw.length,\n };\n}\n\nfunction parseInlineCode(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (text[at] !== \"`\") {\n return null;\n }\n\n let len = 1;\n while (text[at + len] === \"`\") {\n len += 1;\n }\n\n const delimiter = \"`\".repeat(len);\n const close = text.indexOf(delimiter, at + len);\n if (close < 0) {\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {\n text: text.slice(at + len),\n },\n children: [],\n },\n next: text.length,\n };\n }\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + close + len },\n closed: true,\n props: {\n text: text.slice(at + len, close),\n },\n children: [],\n },\n next: close + len,\n };\n}\n\nfunction parseDelimitedInline(\n text: string,\n at: number,\n delimiter: string,\n type: \"em\" | \"strong\" | \"strikethrough\",\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (!text.startsWith(delimiter, at)) {\n return null;\n }\n\n const close = text.indexOf(delimiter, at + delimiter.length);\n if (close < 0) {\n const content = text.slice(at + delimiter.length);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {},\n children: children.value,\n },\n next: text.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n }\n\n const content = text.slice(at + delimiter.length, close);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + close + delimiter.length },\n closed: true,\n props: {},\n children: children.value,\n },\n next: close + delimiter.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import {\n isBlank,\n isBlockquoteLine,\n isCitationDefinitionLine,\n isCitationDefinitionPrefixCandidate,\n isPipeTableHeader,\n isSetextUnderline,\n isThematicBreak,\n looksLikeTableRow,\n matchAtxHeading,\n matchFenceClose,\n matchFenceOpen,\n matchListItem,\n parseTableAlignment,\n splitTableCells,\n startsNewBlock,\n} from \"./helpers\";\nimport type {\n DraftNode,\n ParseContext,\n ParseResult,\n SourceLine,\n} from \"./internal\";\nimport { parseInline } from \"./inline-parser\";\n\n/**\n * Parses a contiguous range of source lines into block-level draft nodes.\n *\n * @param lines - Line-split source with offsets.\n * @param from - Inclusive start line index.\n * @param to - Exclusive end line index.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Shared parse context carrying options, warnings, and citations.\n * @param isRoot - Whether this parse call is for the document root.\n * @returns Root draft node plus updated immutable parse context.\n */\nexport function parseBlocks(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n isRoot: boolean,\n): ParseResult<DraftNode> {\n let root: DraftNode = {\n path,\n type: \"document\",\n range: {\n start: from < to ? lines[from].start : 0,\n end: from < to ? lines[to - 1].end : 0,\n },\n closed: false,\n props: {},\n children: [],\n };\n\n let i = from;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const line = lines[i];\n const isCitationDefinition = isCitationDefinitionLine(line.text);\n const isCitationDefinitionPrefix = isCitationDefinitionPrefixCandidate(\n line.text,\n line.hasNewline,\n context.isComplete,\n );\n\n if (\n isBlank(line.text) ||\n isCitationDefinition ||\n isCitationDefinitionPrefix\n ) {\n i += 1;\n continue;\n }\n\n const fenced = matchFenceOpen(line.text);\n if (fenced) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseCodeFence(lines, i, to, nodePath, context, fenced);\n root.children = [...root.children, parsed.node];\n i = parsed.next;\n continue;\n }\n\n if (isBlockquoteLine(line.text)) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseBlockquote(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const listMarker = matchListItem(line.text);\n if (listMarker) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseList(\n lines,\n i,\n to,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n listMarker.ordered,\n );\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const heading = matchAtxHeading(line.text);\n if (heading) {\n const nodePath = `${path}.${root.children.length}`;\n const children = parseInline(\n heading.text,\n line.start + heading.contentOffset,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: line.end },\n closed: context.isComplete || line.hasNewline,\n props: { level: heading.level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 1;\n continue;\n }\n\n if (\n i + 1 < to &&\n isSetextUnderline(lines[i + 1].text) &&\n !isBlank(line.text)\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const level = lines[i + 1].text.trim().startsWith(\"=\") ? 1 : 2;\n const children = parseInline(line.text, line.start, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: lines[i + 1].end },\n closed: context.isComplete || lines[i + 1].hasNewline,\n props: { level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 2;\n continue;\n }\n\n if (isThematicBreak(line.text)) {\n root.children = [\n ...root.children,\n {\n path: `${path}.${root.children.length}`,\n type: \"thematic-break\",\n range: { start: line.start, end: line.end },\n closed: true,\n props: {},\n children: [],\n },\n ];\n i += 1;\n continue;\n }\n\n if (\n context.options.enableTables &&\n i + 1 < to &&\n isPipeTableHeader(lines[i], lines[i + 1])\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parsePipeTable(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseParagraph(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n root = {\n ...root,\n closed:\n !isRoot ||\n context.isComplete ||\n (to > from &&\n lines[to - 1].hasNewline &&\n root.children.every((child) => child.closed)),\n };\n\n return {\n value: root,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCodeFence(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n fenceOpen: { marker: \"```\" | \"~~~\"; length: number; info: string },\n): { node: DraftNode; next: number } {\n let i = from + 1;\n let closeLine = -1;\n\n while (i < to) {\n if (matchFenceClose(lines[i].text, fenceOpen.marker, fenceOpen.length)) {\n closeLine = i;\n break;\n }\n i += 1;\n }\n\n const endLine = closeLine >= 0 ? closeLine : to - 1;\n const textLines = lines.slice(from + 1, closeLine >= 0 ? closeLine : to);\n const text = textLines.map((line) => line.text).join(\"\\n\");\n const closed = closeLine >= 0 || context.isComplete;\n\n return {\n node: {\n path,\n type: \"code-block\",\n range: { start: lines[from].start, end: lines[endLine].end },\n closed,\n props: {\n fence: fenceOpen.marker,\n ...(fenceOpen.info ? { info: fenceOpen.info.split(/\\s+/)[0] } : {}),\n ...(fenceOpen.info.includes(\" \")\n ? { meta: fenceOpen.info.slice(fenceOpen.info.indexOf(\" \") + 1) }\n : {}),\n text,\n },\n children: [],\n },\n next: closeLine >= 0 ? closeLine + 1 : to,\n };\n}\n\nfunction parseBlockquote(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n const line = lines[i];\n if (isBlank(line.text) && picked.length > 0) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n if (\n isBlockquoteLine(line.text) ||\n (!isBlank(line.text) &&\n picked.length > 0 &&\n !startsNewBlock(lines, i, context.options.enableTables))\n ) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n break;\n }\n\n const stripped = picked.map((line) => {\n const marker = /^(\\s{0,3}>\\s?)/.exec(line.text);\n const markerWidth = marker?.[1].length ?? 0;\n const text = marker ? line.text.slice(markerWidth) : line.text;\n const start = line.start + markerWidth;\n\n return {\n text,\n start,\n end: start + text.length,\n hasNewline: line.hasNewline,\n };\n });\n const children = parseBlocks(\n stripped,\n 0,\n stripped.length,\n path,\n context,\n false,\n );\n\n return {\n value: {\n path,\n type: \"blockquote\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value.children,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseList(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n ordered: boolean,\n): ParseResult<DraftNode> & { next: number } {\n const items: DraftNode[] = [];\n let i = from;\n let sawBlankBetweenItems = false;\n let listStartNumber: number | null = null;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const marker = matchListItem(lines[i].text);\n if (!marker || marker.ordered !== ordered) {\n break;\n }\n\n if (ordered && listStartNumber === null) {\n listStartNumber = marker.start;\n }\n\n const contentLines: SourceLine[] = [\n {\n ...lines[i],\n text: marker.content,\n },\n ];\n const contentIndent = marker.contentIndent;\n\n i += 1;\n let hadBlank = false;\n\n while (i < to) {\n const next = lines[i];\n const nextMarker = matchListItem(next.text);\n\n if (nextMarker) {\n break;\n }\n\n if (isBlank(next.text)) {\n hadBlank = true;\n contentLines.push(next);\n i += 1;\n\n if (i < to) {\n const afterBlank = matchListItem(lines[i].text);\n if (afterBlank) {\n sawBlankBetweenItems = true;\n break;\n }\n }\n\n continue;\n }\n\n const leadingWhitespace = /^\\s*/.exec(next.text)?.[0].length ?? 0;\n if (leadingWhitespace < contentIndent) {\n break;\n }\n\n const continuation = next.text.slice(contentIndent);\n contentLines.push({ ...next, text: continuation });\n i += 1;\n }\n\n const paragraphText = contentLines\n .map((line) => line.text)\n .join(\"\\n\")\n .trimEnd();\n const itemPath = `${path}.${items.length}`;\n const parsedInline = parseInline(\n paragraphText,\n contentLines[0].start,\n `${itemPath}.0`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n const paragraph: DraftNode = {\n path: `${itemPath}.0`,\n type: \"paragraph\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: {},\n children: parsedInline.value,\n };\n\n items.push({\n path: itemPath,\n type: \"list-item\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: {},\n children: [paragraph],\n });\n\n citations = parsedInline.citations;\n warnings = parsedInline.warnings;\n hasWarnedSegmenterUnavailable = parsedInline.hasWarnedSegmenterUnavailable;\n\n if (hadBlank) {\n sawBlankBetweenItems = true;\n }\n }\n\n return {\n value: {\n path,\n type: \"list\",\n range: {\n start: lines[from].start,\n end: lines[Math.max(from, i - 1)].end,\n },\n closed: context.isComplete || lines[Math.max(from, i - 1)].hasNewline,\n props: {\n ordered,\n start: ordered ? (listStartNumber ?? 1) : null,\n tight: !sawBlankBetweenItems,\n },\n children: items,\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parsePipeTable(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const header = splitTableCells(lines[from].text);\n const align = parseTableAlignment(splitTableCells(lines[from + 1].text));\n\n const rows: string[][] = [];\n let i = from + 2;\n while (i < to && looksLikeTableRow(lines[i].text)) {\n rows.push(splitTableCells(lines[i].text));\n i += 1;\n }\n\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const headerChildren: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < header.length; cellIndex += 1) {\n const parsed = parseInline(\n header[cellIndex],\n lines[from].start,\n `${path}.0.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n headerChildren.push({\n path: `${path}.0.${cellIndex}`,\n type: \"table-cell\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n const headerRow: DraftNode = {\n path: `${path}.0`,\n type: \"table-row\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: { isHeader: true },\n children: headerChildren,\n };\n\n const bodyRows: DraftNode[] = [];\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) {\n const row = rows[rowIndex];\n const cellNodes: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < row.length; cellIndex += 1) {\n const parsed = parseInline(\n row[cellIndex],\n lines[from + 2 + rowIndex].start,\n `${path}.${rowIndex + 1}.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n cellNodes.push({\n path: `${path}.${rowIndex + 1}.${cellIndex}`,\n type: \"table-cell\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n bodyRows.push({\n path: `${path}.${rowIndex + 1}`,\n type: \"table-row\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: { isHeader: false },\n children: cellNodes,\n });\n }\n\n return {\n value: {\n path,\n type: \"table\",\n range: { start: lines[from].start, end: lines[i - 1].end },\n closed: context.isComplete || lines[i - 1].hasNewline,\n props: { align },\n children: [headerRow, ...bodyRows],\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseParagraph(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n if (isBlank(lines[i].text)) {\n break;\n }\n\n if (\n picked.length > 0 &&\n startsNewBlock(lines, i, context.options.enableTables)\n ) {\n break;\n }\n\n if (\n isCitationDefinitionLine(lines[i].text) ||\n isCitationDefinitionPrefixCandidate(\n lines[i].text,\n lines[i].hasNewline,\n context.isComplete,\n )\n ) {\n break;\n }\n\n picked.push(lines[i]);\n i += 1;\n }\n\n const text = picked.map((line) => line.text).join(\"\\n\");\n const children = parseInline(text, picked[0].start, path, context);\n\n return {\n value: {\n path,\n type: \"paragraph\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import type { DraftNode } from \"./internal\";\nimport type {\n CitationState,\n StreamingMarkdownAstNode,\n StreamingMarkdownHeadingNode,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Operation protocol used to reduce tokenized draft trees into immutable AST state.\n * @internal\n */\nexport type StreamingMarkdownAstOp =\n | {\n kind: \"upsert-node\";\n path: string;\n parentPath: string | null;\n type: DraftNode[\"type\"];\n range: { start: number; end: number };\n closed: boolean;\n props: Record<string, unknown>;\n childPaths: string[];\n }\n | { kind: \"set-warnings\"; warnings: StreamingMarkdownWarning[] }\n | { kind: \"set-citations\"; citations: CitationState }\n | {\n kind: \"set-segmenter-warning-state\";\n hasWarnedSegmenterUnavailable: boolean;\n };\n\n/**\n * Flattens a draft tree into reducer operations.\n *\n * @param root - Draft AST root.\n * @returns Ordered operations for reducer application.\n */\nexport function createAstOpsFromDraft(\n root: DraftNode,\n): StreamingMarkdownAstOp[] {\n const ops: StreamingMarkdownAstOp[] = [];\n\n function visit(node: DraftNode, parentPath: string | null) {\n const childPaths = node.children.map(\n (child, index) => `${node.path}.${index}`,\n );\n\n ops.push({\n kind: \"upsert-node\",\n path: node.path,\n parentPath,\n type: node.type,\n range: node.range,\n closed: node.closed,\n props: node.props,\n childPaths,\n });\n\n for (let index = 0; index < node.children.length; index += 1) {\n const child = node.children[index];\n visit({ ...child, path: `${node.path}.${index}` }, node.path);\n }\n }\n\n visit(root, null);\n return ops;\n}\n\n/**\n * Applies AST ops with identity reuse for unchanged nodes.\n *\n * @param input - Previous parser state fragments and ops to apply.\n * @returns Next materialized state fragments.\n */\nexport function applyAstOps(input: {\n previousNodes: StreamingMarkdownAstNode[];\n previousPathToId: Record<string, number>;\n nextId: number;\n ops: StreamingMarkdownAstOp[];\n}): {\n nodes: StreamingMarkdownAstNode[];\n rootId: number;\n nextId: number;\n pathToId: Record<string, number>;\n warnings: StreamingMarkdownWarning[];\n citations: CitationState;\n hasWarnedSegmenterUnavailable: boolean;\n} {\n const previousNodeById = new Map(\n input.previousNodes.map((node) => [node.id, node]),\n );\n const nodeOps = input.ops.filter(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }> =>\n op.kind === \"upsert-node\",\n );\n\n const pathToId: Record<string, number> = {};\n let nextId = input.nextId;\n\n for (const op of nodeOps) {\n const existingId = input.previousPathToId[op.path];\n const id = existingId ?? nextId++;\n pathToId[op.path] = id;\n }\n\n const nodesById = new Map<number, StreamingMarkdownAstNode>();\n\n for (const op of nodeOps) {\n const id = pathToId[op.path];\n const parentId = op.parentPath ? pathToId[op.parentPath] : null;\n const childIds = op.childPaths.map((childPath) => pathToId[childPath]);\n const materialized = opToAstNode(op, id, parentId, childIds);\n const previous = previousNodeById.get(id);\n const reconciled =\n previous?.type === \"text\" && materialized.type === \"text\"\n ? reconcileTextNode(previous, materialized)\n : materialized;\n\n nodesById.set(\n id,\n previous && astNodeEquals(previous, reconciled) ? previous : reconciled,\n );\n }\n\n const rootPath = nodeOps[0]?.path;\n if (!rootPath) {\n throw new Error(\"StreamingMarkdown op stream did not include a root node\");\n }\n\n const warnings =\n input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-warnings\" }> =>\n op.kind === \"set-warnings\",\n )?.warnings ?? [];\n const citations = input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-citations\" }> =>\n op.kind === \"set-citations\",\n )?.citations ?? { order: [], numbers: {}, definitions: {} };\n const hasWarnedSegmenterUnavailable =\n input.ops.find(\n (\n op,\n ): op is Extract<\n StreamingMarkdownAstOp,\n { kind: \"set-segmenter-warning-state\" }\n > => op.kind === \"set-segmenter-warning-state\",\n )?.hasWarnedSegmenterUnavailable ?? false;\n\n return {\n nodes: Array.from(nodesById.values()).sort((a, b) => a.id - b.id),\n rootId: pathToId[rootPath],\n nextId,\n pathToId,\n warnings,\n citations,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction opToAstNode(\n op: Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }>,\n id: number,\n parentId: number | null,\n children: number[],\n): StreamingMarkdownAstNode {\n const base = {\n id,\n type: op.type,\n parentId,\n closed: op.closed,\n range: op.range,\n };\n\n switch (op.type) {\n case \"document\":\n return { ...base, type: \"document\", children };\n case \"paragraph\":\n return { ...base, type: \"paragraph\", children };\n case \"heading\":\n return {\n ...base,\n type: \"heading\",\n level: op.props[\"level\"] as StreamingMarkdownHeadingNode[\"level\"],\n children,\n };\n case \"blockquote\":\n return { ...base, type: \"blockquote\", children };\n case \"list\":\n return {\n ...base,\n type: \"list\",\n ordered: op.props[\"ordered\"] as boolean,\n start: op.props[\"start\"] as number | null,\n tight: op.props[\"tight\"] as boolean,\n children,\n };\n case \"list-item\":\n return { ...base, type: \"list-item\", children };\n case \"code-block\":\n return {\n ...base,\n type: \"code-block\",\n fence: op.props[\"fence\"] as \"```\" | \"~~~\",\n info: op.props[\"info\"] as string | undefined,\n meta: op.props[\"meta\"] as string | undefined,\n text: op.props[\"text\"] as string,\n };\n case \"table\":\n return {\n ...base,\n type: \"table\",\n align: op.props[\"align\"] as Array<\"left\" | \"right\" | \"center\" | \"none\">,\n children,\n };\n case \"table-row\":\n return {\n ...base,\n type: \"table-row\",\n isHeader: op.props[\"isHeader\"] as boolean,\n children,\n };\n case \"table-cell\":\n return { ...base, type: \"table-cell\", children };\n case \"thematic-break\":\n return { ...base, type: \"thematic-break\" };\n case \"text\":\n return {\n ...base,\n type: \"text\",\n text: op.props[\"text\"] as string,\n segments: op.props[\"segments\"] as TextSegment[],\n };\n case \"em\":\n return { ...base, type: \"em\", children };\n case \"strong\":\n return { ...base, type: \"strong\", children };\n case \"strikethrough\":\n return { ...base, type: \"strikethrough\", children };\n case \"inline-code\":\n return {\n ...base,\n type: \"inline-code\",\n text: op.props[\"text\"] as string,\n };\n case \"soft-break\":\n return { ...base, type: \"soft-break\" };\n case \"hard-break\":\n return { ...base, type: \"hard-break\" };\n case \"link\":\n return {\n ...base,\n type: \"link\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n children,\n };\n case \"image\":\n return {\n ...base,\n type: \"image\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n alt: op.props[\"alt\"] as string,\n };\n case \"autolink\":\n return {\n ...base,\n type: \"autolink\",\n url: op.props[\"url\"] as string,\n text: op.props[\"text\"] as string,\n };\n case \"citation\":\n return {\n ...base,\n type: \"citation\",\n idRef: op.props[\"idRef\"] as string,\n number: op.props[\"number\"] as number | undefined,\n };\n }\n}\n\nfunction astNodeEquals(\n a: StreamingMarkdownAstNode,\n b: StreamingMarkdownAstNode,\n): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction reconcileTextNode(\n previous: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n next: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n): Extract<StreamingMarkdownAstNode, { type: \"text\" }> {\n if (next.segments.length === 0 || previous.segments.length === 0) {\n return next;\n }\n\n const previousBySignature = groupSegmentsBySignature(previous.segments);\n let reusedAnySegment = false;\n\n const segments = next.segments.map((segment) => {\n const signature = getSegmentSignature(segment);\n const bucket = previousBySignature.get(signature);\n if (!bucket?.length) {\n return segment;\n }\n\n const [reused, ...rest] = bucket;\n if (rest.length) {\n previousBySignature.set(signature, rest);\n } else {\n previousBySignature.delete(signature);\n }\n\n reusedAnySegment = true;\n return reused;\n });\n\n if (areSegmentArraysIdentical(previous.segments, segments)) {\n return {\n ...next,\n segments: previous.segments,\n };\n }\n\n if (!reusedAnySegment) {\n return next;\n }\n\n return {\n ...next,\n segments,\n };\n}\n\n/**\n * Returns true when both arrays contain the same segment object references in order.\n */\nfunction areSegmentArraysIdentical(\n a: TextSegment[],\n b: TextSegment[],\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((segment, index) => segment === b[index]);\n}\n\n/**\n * Produces a stable signature for matching segments across immutable parse iterations.\n */\nfunction getSegmentSignature(segment: TextSegment): string {\n return `${segment.start}:${segment.end}:${segment.text}:${segment.kind}:${String(segment.isWhitespace)}:${String(segment.noBreakBefore === true)}`;\n}\n\n/**\n * Groups previous segments by signature to support one-to-one identity reuse.\n */\nfunction groupSegmentsBySignature(\n segments: TextSegment[],\n): Map<string, TextSegment[]> {\n const bySignature = new Map<string, TextSegment[]>();\n\n for (const segment of segments) {\n const signature = getSegmentSignature(segment);\n const existing = bySignature.get(signature) ?? [];\n bySignature.set(signature, [...existing, segment]);\n }\n\n return bySignature;\n}\n","import { parseBlocks } from \"./block-parser\";\nimport { parseCitationDefinitions } from \"./citations\";\nimport {\n getLineBuffer,\n normalizeChunk,\n normalizeOptions,\n splitLines,\n toLineColumn,\n} from \"./helpers\";\nimport { applyAstOps, createAstOpsFromDraft } from \"./ops\";\nimport type {\n StreamingMarkdownAstNode,\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserState,\n ParseMode,\n} from \"./types\";\n\n/**\n * Creates a new streaming markdown parser state.\n *\n * @param options - Optional parser option overrides.\n * @returns New immutable parser state.\n * @public\n */\nexport function createStreamingMarkdownParserState(\n options?: Partial<StreamingMarkdownParserOptions>,\n): StreamingMarkdownParserState {\n const normalizedOptions = normalizeOptions(options);\n const documentNode = {\n id: 1,\n type: \"document\" as const,\n parentId: null,\n closed: false,\n range: { start: 0, end: 0 },\n children: [],\n };\n\n return {\n nextId: 2,\n nodes: [documentNode],\n rootId: 1,\n stack: [1],\n mode: \"block\",\n warnings: [],\n citations: {\n order: [],\n numbers: {},\n definitions: {},\n },\n lineBuffer: \"\",\n isComplete: false,\n index: 0,\n line: 1,\n column: 1,\n options: normalizedOptions,\n source: \"\",\n pathToId: { \"0\": 1 },\n pendingCarriageReturn: false,\n hasWarnedSegmenterUnavailable: false,\n };\n}\n\n/**\n * Parses a streaming chunk and returns the next immutable parser state.\n *\n * @param state - Current parser state.\n * @param chunk - Incoming text chunk.\n * @returns Updated parser state.\n * @public\n */\nexport function parseStreamingMarkdownChunk(\n state: StreamingMarkdownParserState,\n chunk: string,\n): StreamingMarkdownParserState {\n const normalized = normalizeChunk(chunk, state.pendingCarriageReturn);\n const source = state.source + normalized.text;\n\n return rebuildState(state, {\n source,\n isComplete: false,\n pendingCarriageReturn: normalized.pendingCarriageReturn,\n });\n}\n\n/**\n * Finalizes parsing by closing any provisional nodes and flushing trailing CR.\n *\n * @param state - Current parser state.\n * @returns Final parser state.\n * @public\n */\nexport function finalizeStreamingMarkdown(\n state: StreamingMarkdownParserState,\n): StreamingMarkdownParserState {\n if (state.isComplete) {\n return state;\n }\n\n const source = state.source + (state.pendingCarriageReturn ? \"\\n\" : \"\");\n\n return rebuildState(state, {\n source,\n isComplete: true,\n pendingCarriageReturn: false,\n });\n}\n\nfunction rebuildState(\n prev: StreamingMarkdownParserState,\n input: {\n source: string;\n isComplete: boolean;\n pendingCarriageReturn: boolean;\n },\n): StreamingMarkdownParserState {\n const definitions = parseCitationDefinitions(input.source);\n const parseContext = {\n options: prev.options,\n warnings: definitions.warnings,\n citations: definitions.citations,\n isComplete: input.isComplete,\n hasWarnedSegmenterUnavailable: prev.hasWarnedSegmenterUnavailable,\n };\n\n const lines = splitLines(input.source);\n const parsedBlocks = parseBlocks(\n lines,\n 0,\n lines.length,\n \"0\",\n parseContext,\n true,\n );\n const ops = [\n { kind: \"set-warnings\", warnings: parsedBlocks.warnings } as const,\n { kind: \"set-citations\", citations: parsedBlocks.citations } as const,\n {\n kind: \"set-segmenter-warning-state\",\n hasWarnedSegmenterUnavailable: parsedBlocks.hasWarnedSegmenterUnavailable,\n } as const,\n ...createAstOpsFromDraft(parsedBlocks.value),\n ];\n\n const reduced = applyAstOps({\n previousNodes: prev.nodes,\n previousPathToId: prev.pathToId,\n nextId: prev.nextId,\n ops,\n });\n\n const lineBuffer = getLineBuffer(input.source);\n const { line, column } = toLineColumn(input.source, input.source.length);\n\n return {\n ...prev,\n nextId: reduced.nextId,\n nodes: reduced.nodes,\n rootId: reduced.rootId,\n stack: computeOpenStack(reduced.nodes, reduced.rootId),\n mode: inferMode(reduced.nodes, reduced.rootId),\n warnings: reduced.warnings,\n citations: reduced.citations,\n lineBuffer,\n isComplete: input.isComplete,\n index: input.source.length,\n line,\n column,\n source: input.source,\n pathToId: reduced.pathToId,\n pendingCarriageReturn: input.pendingCarriageReturn,\n hasWarnedSegmenterUnavailable: reduced.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction computeOpenStack(\n nodes: StreamingMarkdownAstNode[],\n rootId: number,\n): number[] {\n const nodeById = new Map(nodes.map((node) => [node.id, node]));\n const stack: number[] = [];\n\n let cursor: number | null = rootId;\n while (cursor != null) {\n const node = nodeById.get(cursor);\n if (!node || node.closed) {\n break;\n }\n\n stack.push(cursor);\n if (!(\"children\" in node) || node.children.length === 0) {\n break;\n }\n\n const lastChild = node.children[node.children.length - 1];\n cursor = typeof lastChild === \"number\" ? lastChild : null;\n }\n\n return stack;\n}\n\nfunction inferMode(\n nodes: StreamingMarkdownAstNode[],\n rootId: number | null,\n): ParseMode {\n if (rootId == null) {\n return \"block\";\n }\n\n const root = nodes.find((node) => node.id === rootId);\n if (!root || !(\"children\" in root) || root.children.length === 0) {\n return \"block\";\n }\n\n const lastChild = nodes.find(\n (node) => node.id === root.children[root.children.length - 1],\n );\n if (!lastChild || lastChild.closed) {\n return \"block\";\n }\n\n if (lastChild.type === \"paragraph\") {\n return \"paragraph\";\n }\n if (lastChild.type === \"heading\") {\n return \"heading\";\n }\n if (lastChild.type === \"blockquote\") {\n return \"blockquote\";\n }\n if (lastChild.type === \"list-item\") {\n return \"list-item\";\n }\n if (lastChild.type === \"code-block\") {\n return \"code-fence\";\n }\n if (lastChild.type === \"table\") {\n return \"table\";\n }\n\n return \"block\";\n}\n","let warned = false;\n\nconst MIGRATION_GUIDE_URL =\n \"https://docs.copilotkit.ai/migrate/markdown-renderer#migrate-with-your-ai-assistant\";\n\n// A ``` or ~~~ fence immediately followed by a language token (e.g. ```ts).\n// Plain fences with no language are not flagged — they render fine.\nconst HIGHLIGHTABLE_CODE = /(^|\\n)[ \\t]*(```|~~~)[ \\t]*[A-Za-z][\\w+#-]*/;\n// Block math: $$ … $$ or \\[ … \\]. Inline `$…$` is intentionally not flagged\n// (too many false positives with currency, e.g. \"$5 and $10\").\nconst BLOCK_MATH = /\\$\\$[\\s\\S]+?\\$\\$/;\nconst BRACKET_MATH = /\\\\\\[[\\s\\S]+?\\\\\\]/;\n\nfunction isProduction(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.env != null &&\n process.env.NODE_ENV === \"production\"\n );\n}\n\n/**\n * Dev-only, once-per-session warning emitted when CopilotKit's built-in default\n * markdown renderer encounters markdown it won't render richly — math\n * (`$$…$$` / `\\[…\\]`) or a language-tagged fenced code block (rendered as plain,\n * un-highlighted code). Helps people upgrading from the bundled Streamdown\n * default notice the behavioral change and points them at the migration guide.\n *\n * No-op in production and after the first warning. Only the built-in default\n * renderers call this — a custom `markdownRenderer` never triggers it.\n *\n * @internal\n */\nexport function warnUnsupportedRichSyntaxOnce(content: string): void {\n if (warned || !content || isProduction()) return;\n\n const hasMath = BLOCK_MATH.test(content) || BRACKET_MATH.test(content);\n const hasHighlightableCode = HIGHLIGHTABLE_CODE.test(content);\n if (!hasMath && !hasHighlightableCode) return;\n\n warned = true;\n const [feature, missing] = hasMath\n ? [\"math\", \"math typesetting\"]\n : [\"a syntax-highlighted code block\", \"syntax highlighting\"];\n // eslint-disable-next-line no-console\n console.warn(\n `[CopilotKit] The built-in markdown renderer rendered ${feature} without ${missing}. ` +\n `It supports GFM, tables, autolinks, and citations, but not math, syntax ` +\n `highlighting, or diagrams. To restore those, plug in a custom markdownRenderer ` +\n `(e.g. react-markdown or streamdown) — or paste the migration prompt into your ` +\n `AI assistant: ${MIGRATION_GUIDE_URL}`,\n );\n}\n\n/**\n * Resets the once-guard. Test-only.\n * @internal\n */\nexport function __resetUnsupportedRichSyntaxWarning(): void {\n warned = false;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["CLOSING_PUNCTUATION"],"sources":["../src/parser/helpers.ts","../src/parser/citations.ts","../src/parser/segments.ts","../src/parser/inline-parser.ts","../src/parser/block-parser.ts","../src/parser/ops.ts","../src/parser/state.ts","../src/dev-warning.ts","../src/render/parser-session.ts","../src/render/render-tree.ts"],"sourcesContent":["import type { StreamingMarkdownParserOptions } from \"./types\";\nimport type { SourceLine } from \"./internal\";\n\n/**\n * Default parser options for streaming markdown.\n */\nexport const DEFAULT_OPTIONS: StreamingMarkdownParserOptions = {\n segmenter: true,\n enableTables: true,\n enableAutolinks: true,\n enableMath: false,\n};\n\n/**\n * Merges user-provided parser options with defaults.\n *\n * @param options - Optional partial parser options.\n * @returns Fully populated parser options.\n */\nexport function normalizeOptions(\n options: Partial<StreamingMarkdownParserOptions> | undefined,\n): StreamingMarkdownParserOptions {\n return {\n segmenter: options?.segmenter ?? DEFAULT_OPTIONS.segmenter,\n enableTables: options?.enableTables ?? DEFAULT_OPTIONS.enableTables,\n enableAutolinks:\n options?.enableAutolinks ?? DEFAULT_OPTIONS.enableAutolinks,\n enableMath: options?.enableMath ?? DEFAULT_OPTIONS.enableMath,\n };\n}\n\n/**\n * Normalizes streaming input chunks by handling trailing carriage-return boundaries.\n *\n * @param chunk - Incoming raw chunk.\n * @param hadPendingCR - Whether the previous chunk ended with `\\\\r`.\n * @returns Normalized text and whether this chunk now ends with a pending `\\\\r`.\n */\nexport function normalizeChunk(\n chunk: string,\n hadPendingCR: boolean,\n): { text: string; pendingCarriageReturn: boolean } {\n const input = (hadPendingCR ? \"\\r\" : \"\") + chunk;\n const pendingCarriageReturn = input.endsWith(\"\\r\");\n const head = pendingCarriageReturn ? input.slice(0, -1) : input;\n\n return {\n text: head.replace(/\\r\\n?/g, \"\\n\"),\n pendingCarriageReturn,\n };\n}\n\n/**\n * Splits normalized source text into lines with source offsets.\n *\n * @param source - Normalized source text.\n * @returns Line descriptors preserving absolute ranges.\n */\nexport function splitLines(source: string): SourceLine[] {\n const lines: SourceLine[] = [];\n let start = 0;\n\n for (let i = 0; i < source.length; i += 1) {\n if (source[i] !== \"\\n\") {\n continue;\n }\n\n lines.push({\n text: source.slice(start, i),\n start,\n end: i + 1,\n hasNewline: true,\n });\n start = i + 1;\n }\n\n if (start < source.length || source.length === 0) {\n lines.push({\n text: source.slice(start),\n start,\n end: source.length,\n hasNewline: false,\n });\n }\n\n return lines;\n}\n\n/**\n * Returns the trailing unterminated line text.\n *\n * @param source - Full source text.\n * @returns Last line content after the final newline.\n */\nexport function getLineBuffer(source: string): string {\n const newline = source.lastIndexOf(\"\\n\");\n return newline < 0 ? source : source.slice(newline + 1);\n}\n\n/**\n * Converts an absolute source index to 1-based line/column.\n *\n * @param source - Source text.\n * @param index - Absolute index.\n * @returns 1-based line and column coordinates.\n */\nexport function toLineColumn(\n source: string,\n index: number,\n): { line: number; column: number } {\n let line = 1;\n let column = 1;\n\n for (let i = 0; i < index; i += 1) {\n if (source[i] === \"\\n\") {\n line += 1;\n column = 1;\n } else {\n column += 1;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Returns true for blank lines.\n */\nexport function isBlank(value: string): boolean {\n return /^\\s*$/.test(value);\n}\n\n/**\n * Returns true when a line is a citation definition.\n */\nexport function isCitationDefinitionLine(value: string): boolean {\n return /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.test(value);\n}\n\n/**\n * Returns true when a line is an unfinished citation-definition prefix candidate.\n *\n * This enables optimistic streaming behavior for definition lines that begin with\n * `[^` but are not yet complete enough to classify as either:\n * 1) a valid citation definition, or\n * 2) plain paragraph text.\n *\n * @param value - Raw line text.\n * @param hasNewline - Whether the source line is newline-terminated.\n * @param isComplete - Whether the parser has been finalized.\n */\nexport function isCitationDefinitionPrefixCandidate(\n value: string,\n hasNewline: boolean,\n isComplete: boolean,\n): boolean {\n if (hasNewline || isComplete || isCitationDefinitionLine(value)) {\n return false;\n }\n\n return (\n /^\\s{0,3}\\[\\^[^\\]\\s]*$/.test(value) || /^\\s{0,3}\\[\\^[^\\]\\s]+\\]$/.test(value)\n );\n}\n\n/**\n * Matches an opening fenced code block marker.\n */\nexport function matchFenceOpen(\n value: string,\n): { marker: \"```\" | \"~~~\"; length: number; info: string } | null {\n const trimmed = value.trimStart();\n const backtick = /^(`{3,})(.*)$/.exec(trimmed);\n if (backtick) {\n return {\n marker: \"```\",\n length: backtick[1].length,\n info: backtick[2].trim(),\n };\n }\n\n const tilde = /^(~{3,})(.*)$/.exec(trimmed);\n if (tilde) {\n return {\n marker: \"~~~\",\n length: tilde[1].length,\n info: tilde[2].trim(),\n };\n }\n\n return null;\n}\n\n/**\n * Matches a valid fenced code block closing line.\n */\nexport function matchFenceClose(\n value: string,\n marker: \"```\" | \"~~~\",\n length: number,\n): boolean {\n const re = marker === \"```\" ? /^\\s*`{3,}\\s*$/ : /^\\s*~{3,}\\s*$/;\n if (!re.test(value)) {\n return false;\n }\n\n const trimmed = value.trim();\n return trimmed.length >= length;\n}\n\n/**\n * Matches ATX heading syntax and extracts heading metadata.\n */\nexport function matchAtxHeading(value: string): {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n text: string;\n contentOffset: number;\n} | null {\n const match = /^\\s{0,3}(#{1,6})[ \\t]+(.+?)\\s*#*\\s*$/.exec(value);\n if (!match) {\n return null;\n }\n\n return {\n level: match[1].length as 1 | 2 | 3 | 4 | 5 | 6,\n text: match[2],\n contentOffset: value.indexOf(match[2]),\n };\n}\n\n/**\n * Returns true for setext heading underline lines.\n */\nexport function isSetextUnderline(value: string): boolean {\n return /^\\s{0,3}(=+|-+)\\s*$/.test(value);\n}\n\n/**\n * Returns true for thematic break syntax.\n */\nexport function isThematicBreak(value: string): boolean {\n return /^\\s{0,3}((\\*\\s*){3,}|(-\\s*){3,}|(_\\s*){3,})$/.test(value);\n}\n\n/**\n * Matches ordered and unordered list-item markers.\n */\nexport function matchListItem(value: string): {\n ordered: boolean;\n start: number;\n content: string;\n indent: number;\n contentIndent: number;\n} | null {\n const unordered = /^(\\s{0,3})([-+*])(\\s+)(.*)$/.exec(value);\n if (unordered) {\n const indent = unordered[1].length;\n const contentIndent = indent + unordered[2].length + unordered[3].length;\n return {\n ordered: false,\n start: 1,\n content: unordered[4],\n indent,\n contentIndent,\n };\n }\n\n const ordered = /^(\\s{0,3})(\\d{1,9})([.)])(\\s+)(.*)$/.exec(value);\n if (ordered) {\n const indent = ordered[1].length;\n const markerLength = ordered[2].length + ordered[3].length;\n const contentIndent = indent + markerLength + ordered[4].length;\n return {\n ordered: true,\n start: Number(ordered[2]),\n content: ordered[5],\n indent,\n contentIndent,\n };\n }\n\n return null;\n}\n\n/**\n * Returns true for blockquote marker lines.\n */\nexport function isBlockquoteLine(value: string): boolean {\n return /^\\s{0,3}>\\s?/.test(value);\n}\n\n/**\n * Returns true when two lines form a GFM table header + divider pair.\n */\nexport function isPipeTableHeader(\n first: SourceLine,\n second: SourceLine,\n): boolean {\n return looksLikeTableRow(first.text) && isTableDividerRow(second.text);\n}\n\n/**\n * Returns true when a line appears to be a table row.\n */\nexport function looksLikeTableRow(value: string): boolean {\n return value.includes(\"|\") && /\\S/.test(value.replace(/\\|/g, \"\"));\n}\n\n/**\n * Returns true for GFM table divider rows.\n */\nexport function isTableDividerRow(value: string): boolean {\n const cells = splitTableCells(value);\n if (cells.length === 0) {\n return false;\n }\n\n return cells.every((cell) => /^:?-{3,}:?$/.test(cell.trim()));\n}\n\n/**\n * Splits a pipe-table row into trimmed cell values.\n */\nexport function splitTableCells(value: string): string[] {\n const trimmed = value.trim();\n const body = trimmed.startsWith(\"|\") ? trimmed.slice(1) : trimmed;\n const core = body.endsWith(\"|\") ? body.slice(0, -1) : body;\n return core.split(\"|\").map((cell) => cell.trim());\n}\n\n/**\n * Converts table divider cells into alignment metadata.\n */\nexport function parseTableAlignment(\n cells: string[],\n): Array<\"left\" | \"right\" | \"center\" | \"none\"> {\n return cells.map((cell) => {\n const trimmed = cell.trim();\n const left = trimmed.startsWith(\":\");\n const right = trimmed.endsWith(\":\");\n\n if (left && right) {\n return \"center\";\n }\n if (left) {\n return \"left\";\n }\n if (right) {\n return \"right\";\n }\n\n return \"none\";\n });\n}\n\n/**\n * Determines whether a line starts a new block construct.\n */\nexport function startsNewBlock(\n lines: SourceLine[],\n index: number,\n enableTables: boolean,\n): boolean {\n const line = lines[index].text;\n\n return (\n !!matchFenceOpen(line) ||\n !!matchAtxHeading(line) ||\n isThematicBreak(line) ||\n !!matchListItem(line) ||\n isBlockquoteLine(line) ||\n (enableTables &&\n index + 1 < lines.length &&\n isPipeTableHeader(lines[index], lines[index + 1]))\n );\n}\n\n/**\n * Returns true when a character is escapable in CommonMark inline syntax.\n */\nexport function isEscapable(ch: string): boolean {\n return /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/.test(ch);\n}\n\n/**\n * Finds the matching closing delimiter for a nested delimiter pair.\n */\nexport function findClosing(\n input: string,\n openAt: number,\n openChar: \"[\" | \"(\",\n closeChar: \"]\" | \")\",\n): number {\n let depth = 0;\n for (let i = openAt; i < input.length; i += 1) {\n const ch = input[i];\n if (ch === \"\\\\\") {\n i += 1;\n continue;\n }\n\n if (ch === openChar) {\n depth += 1;\n continue;\n }\n\n if (ch === closeChar) {\n depth -= 1;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Parses a markdown link destination and optional title.\n */\nexport function parseLinkDestination(input: string): {\n url: string;\n title?: string;\n} {\n const trimmed = input.trim();\n\n if (trimmed.startsWith(\"<\")) {\n const close = trimmed.indexOf(\">\");\n if (close > 0) {\n const url = trimmed.slice(1, close);\n const rest = trimmed.slice(close + 1).trim();\n const title = parseLinkTitle(rest);\n return title ? { url, title } : { url };\n }\n }\n\n const firstSpace = trimmed.search(/\\s/);\n if (firstSpace < 0) {\n return { url: trimmed };\n }\n\n const url = trimmed.slice(0, firstSpace);\n const title = parseLinkTitle(trimmed.slice(firstSpace).trim());\n\n return title ? { url, title } : { url };\n}\n\n/**\n * Parses CommonMark-style link titles (`\\\"...\\\"`, `'...'`, `( ... )`).\n */\nexport function parseLinkTitle(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n\n if (\n (input.startsWith('\"') && input.endsWith('\"')) ||\n (input.startsWith(\"'\") && input.endsWith(\"'\"))\n ) {\n return input.slice(1, -1);\n }\n\n if (input.startsWith(\"(\") && input.endsWith(\")\")) {\n return input.slice(1, -1);\n }\n\n return undefined;\n}\n\n/**\n * Returns true for URL-shaped text supported by autolink detection.\n */\nexport function isUrl(value: string): boolean {\n return /^(https?:\\/\\/|www\\.)\\S+$/.test(value);\n}\n\n/**\n * Returns true for email-shaped text supported by autolink detection.\n */\nexport function isEmail(value: string): boolean {\n return /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/.test(value);\n}\n\n/**\n * Trims punctuation suffixes from autolink candidates.\n */\nexport function trimAutolinkTrailingPunctuation(value: string): string {\n let end = value.length;\n while (end > 0 && /[.,;:!?]/.test(value[end - 1])) {\n end -= 1;\n }\n\n let candidate = value.slice(0, end);\n if (candidate.endsWith(\")\")) {\n const open = (candidate.match(/\\(/g) ?? []).length;\n const close = (candidate.match(/\\)/g) ?? []).length;\n if (close > open) {\n candidate = candidate.slice(0, -1);\n }\n }\n\n return candidate;\n}\n","import type { CitationState, StreamingMarkdownWarning } from \"./types\";\n\n/**\n * Extracts citation definitions from source text.\n *\n * @param source - Full normalized markdown source.\n * @param warnings - Mutable warning collection for parse diagnostics.\n * @returns Citation state with collected definitions and empty reference order.\n */\nexport function parseCitationDefinitions(source: string): {\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n} {\n const definitions: CitationState[\"definitions\"] = {};\n const warnings: StreamingMarkdownWarning[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n\n for (const line of lines) {\n const match = /^\\s{0,3}\\[\\^([^\\]\\s]+)\\]:\\s*(.*)$/.exec(line);\n\n if (!match) {\n offset += line.length + 1;\n continue;\n }\n\n const id = match[1];\n\n if (definitions[id]) {\n warnings.push({ code: \"invalid_citation_definition\", at: offset });\n offset += line.length + 1;\n continue;\n }\n\n const extracted = extractTrailingUrl(match[2].trim());\n definitions[id] = {\n id,\n text: extracted.text,\n ...(extracted.url ? { url: extracted.url } : {}),\n };\n\n offset += line.length + 1;\n }\n\n return {\n citations: {\n order: [],\n numbers: {},\n definitions,\n },\n warnings,\n };\n}\n\n/**\n * Assigns or returns a stable citation number by first-seen inline reference order.\n *\n * @param citations - Citation state that tracks numbering.\n * @param idRef - Citation identifier (without `[^` and `]` markers).\n * @returns Stable numeric citation number.\n */\nexport function assignCitationNumber(\n citations: CitationState,\n idRef: string,\n): { citations: CitationState; number: number } {\n const existing = citations.numbers[idRef];\n if (typeof existing === \"number\") {\n return { citations, number: existing };\n }\n\n const next = citations.order.length + 1;\n return {\n citations: {\n ...citations,\n order: [...citations.order, idRef],\n numbers: { ...citations.numbers, [idRef]: next },\n },\n number: next,\n };\n}\n\nfunction extractTrailingUrl(input: string): { text: string; url?: string } {\n if (!input) {\n return { text: \"\" };\n }\n\n const match = /(?:\\s|^)(https?:\\/\\/\\S+|www\\.\\S+)$/.exec(input);\n\n if (!match) {\n return { text: input };\n }\n\n return {\n text: input.slice(0, match.index).trimEnd(),\n url: match[1],\n };\n}\n","import type { SegmenterOptions, TextSegment } from \"./types\";\n\n/**\n * Computes parse-time text segments for animation and incremental rendering.\n *\n * @param text - Raw text content for a single text node.\n * @param absoluteStart - Absolute source index where `text` begins.\n * @param context - Parse context containing segmenter options and warning state.\n * @returns Segment list or empty list when segmentation is disabled/unavailable.\n */\nexport function createSegments(\n text: string,\n absoluteStart: number,\n options: {\n segmenter: SegmenterOptions;\n hasWarnedSegmenterUnavailable: boolean;\n },\n): {\n segments: TextSegment[];\n warning?: { code: \"segmenter_unavailable\"; at: number };\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (options.segmenter === false) {\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n }\n\n const segmenterCtor =\n typeof Intl === \"undefined\"\n ? undefined\n : (Intl as unknown as { Segmenter?: typeof Intl.Segmenter }).Segmenter;\n\n if (!segmenterCtor) {\n if (!options.hasWarnedSegmenterUnavailable) {\n return {\n segments: [],\n warning: { code: \"segmenter_unavailable\", at: absoluteStart },\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n return {\n segments: [],\n hasWarnedSegmenterUnavailable: true,\n };\n }\n\n const granularity =\n options.segmenter === true\n ? \"word\"\n : (options.segmenter.granularity ?? \"word\");\n const locale =\n options.segmenter === true ? undefined : options.segmenter.locale;\n\n const segmenter = new segmenterCtor(locale, { granularity });\n const segments: TextSegment[] = [];\n\n for (const segment of segmenter.segment(text)) {\n const segmentText = segment.segment;\n const start = absoluteStart + segment.index;\n\n segments.push({\n text: segmentText,\n start,\n end: start + segmentText.length,\n kind: granularity,\n isWhitespace: /^\\s+$/.test(segmentText),\n });\n }\n\n const clustered = clusterPunctuationSegments(segments);\n\n return {\n segments: clustered,\n hasWarnedSegmenterUnavailable: options.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction clusterPunctuationSegments(segments: TextSegment[]): TextSegment[] {\n const withClosingAttached = segments.reduce<TextSegment[]>((acc, segment) => {\n const previous = acc[acc.length - 1];\n if (\n previous &&\n !previous.isWhitespace &&\n isClosingPunctuationOnly(segment.text)\n ) {\n acc[acc.length - 1] = {\n ...previous,\n text: `${previous.text}${segment.text}`,\n end: segment.end,\n };\n\n return acc;\n }\n\n return [...acc, segment];\n }, []);\n\n const clustered: TextSegment[] = [];\n let i = 0;\n while (i < withClosingAttached.length) {\n const current = withClosingAttached[i];\n const next =\n i + 1 < withClosingAttached.length ? withClosingAttached[i + 1] : null;\n\n if (next && !next.isWhitespace && isOpeningPunctuationOnly(current.text)) {\n clustered.push({\n ...next,\n text: `${current.text}${next.text}`,\n start: current.start,\n });\n i += 2;\n continue;\n }\n\n clustered.push(current);\n i += 1;\n }\n\n return clustered;\n}\n\nfunction isClosingPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, CLOSING_PUNCTUATION);\n}\n\nfunction isOpeningPunctuationOnly(value: string): boolean {\n return isOnlyFromSet(value, OPENING_PUNCTUATION);\n}\n\nfunction isOnlyFromSet(value: string, charset: ReadonlySet<string>): boolean {\n return (\n value.length > 0 && [...value].every((character) => charset.has(character))\n );\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nconst OPENING_PUNCTUATION = new Set([\n \"(\",\n \"{\",\n \"[\",\n '\"',\n \"'\",\n \"〈\",\n \"《\",\n \"「\",\n \"『\",\n \"【\",\n \"〔\",\n \"〖\",\n \"(\",\n \"[\",\n \"{\",\n]);\n","import { assignCitationNumber } from \"./citations\";\nimport {\n findClosing,\n isEmail,\n isEscapable,\n isUrl,\n parseLinkDestination,\n trimAutolinkTrailingPunctuation,\n} from \"./helpers\";\nimport type { DraftNode, ParseContext, ParseResult } from \"./internal\";\nimport { createSegments } from \"./segments\";\nimport type {\n CitationState,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Parses inline markdown content into inline draft nodes.\n *\n * @param text - Inline source text.\n * @param absoluteStart - Absolute source offset for the first character in `text`.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Immutable parse context shared across block/inline parsing.\n * @returns Inline draft nodes and updated immutable parser context.\n */\nexport function parseInline(\n text: string,\n absoluteStart: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode[]> {\n const nodes: DraftNode[] = [];\n let i = 0;\n let textBuffer = \"\";\n let textBufferStart = -1;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const flushTextBuffer = () => {\n if (textBuffer.length === 0 || textBufferStart < 0) {\n return;\n }\n\n const appendResult = appendText(\n nodes,\n textBuffer,\n textBufferStart,\n path,\n context.options.segmenter,\n hasWarnedSegmenterUnavailable,\n );\n warnings =\n appendResult.warnings.length > 0\n ? [...warnings, ...appendResult.warnings]\n : warnings;\n hasWarnedSegmenterUnavailable = appendResult.hasWarnedSegmenterUnavailable;\n textBuffer = \"\";\n textBufferStart = -1;\n };\n\n const appendBufferedText = (value: string, start: number) => {\n if (value.length === 0) {\n return;\n }\n\n if (textBuffer.length === 0) {\n textBufferStart = start;\n }\n\n textBuffer += value;\n };\n\n while (i < text.length) {\n const current = text[i];\n\n if (current === \"\\n\") {\n const trailingBackslashes = countTrailing(text, i - 1, \"\\\\\");\n const hardByBackslash = trailingBackslashes % 2 === 1;\n const hardBySpaces = i > 1 && text.slice(i - 2, i) === \" \";\n const hard = hardByBackslash || hardBySpaces;\n\n if (hardByBackslash && textBuffer.endsWith(\"\\\\\")) {\n textBuffer = textBuffer.slice(0, -1);\n }\n\n flushTextBuffer();\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: hard ? \"hard-break\" : \"soft-break\",\n range: { start: absoluteStart + i, end: absoluteStart + i + 1 },\n closed: true,\n props: {},\n children: [],\n });\n i += 1;\n continue;\n }\n\n if (current === \"\\\\\" && i + 1 < text.length && isEscapable(text[i + 1])) {\n appendBufferedText(text[i + 1], absoluteStart + i);\n i += 2;\n continue;\n }\n\n const citation = parseCitationInline(\n text,\n i,\n absoluteStart,\n path,\n citations,\n nodes.length,\n context.isComplete,\n );\n if (citation) {\n flushTextBuffer();\n nodes.push(citation.node);\n i = citation.next;\n citations = citation.citations;\n continue;\n }\n\n const image = parseImageInline(text, i, absoluteStart, path, nodes.length);\n if (image) {\n flushTextBuffer();\n nodes.push(image.node);\n i = image.next;\n continue;\n }\n\n const link = parseLinkInline(\n text,\n i,\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (link) {\n flushTextBuffer();\n nodes.push(link.node);\n i = link.next;\n citations = link.citations;\n warnings = link.warnings;\n hasWarnedSegmenterUnavailable = link.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const auto = parseAutolinkInline(\n text,\n i,\n absoluteStart,\n path,\n context.options.enableAutolinks,\n nodes.length,\n );\n if (auto) {\n flushTextBuffer();\n nodes.push(auto.node);\n i = auto.next;\n continue;\n }\n\n const code = parseInlineCode(text, i, absoluteStart, path, nodes.length);\n if (code) {\n flushTextBuffer();\n nodes.push(code.node);\n i = code.next;\n continue;\n }\n\n const math = context.options.enableMath\n ? parseMathInline(text, i, absoluteStart, path, nodes.length)\n : null;\n if (math) {\n flushTextBuffer();\n nodes.push(math.node);\n i = math.next;\n continue;\n }\n\n const strong =\n parseDelimitedInline(\n text,\n i,\n \"**\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"__\",\n \"strong\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strong) {\n flushTextBuffer();\n nodes.push(strong.node);\n i = strong.next;\n citations = strong.citations;\n warnings = strong.warnings;\n hasWarnedSegmenterUnavailable = strong.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const strike = parseDelimitedInline(\n text,\n i,\n \"~~\",\n \"strikethrough\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (strike) {\n flushTextBuffer();\n nodes.push(strike.node);\n i = strike.next;\n citations = strike.citations;\n warnings = strike.warnings;\n hasWarnedSegmenterUnavailable = strike.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const em =\n parseDelimitedInline(\n text,\n i,\n \"*\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n ) ??\n parseDelimitedInline(\n text,\n i,\n \"_\",\n \"em\",\n absoluteStart,\n path,\n nodes.length,\n context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n );\n if (em) {\n flushTextBuffer();\n nodes.push(em.node);\n i = em.next;\n citations = em.citations;\n warnings = em.warnings;\n hasWarnedSegmenterUnavailable = em.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n appendBufferedText(text[i], absoluteStart + i);\n i += 1;\n }\n\n flushTextBuffer();\n const inlineNodes = annotateNoBreakBeforeSegments(nodes);\n\n return {\n value: inlineNodes,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction countTrailing(text: string, index: number, value: string): number {\n let run = 0;\n let i = index;\n\n while (i >= 0 && text[i] === value) {\n run += 1;\n i -= 1;\n }\n\n return run;\n}\n\nfunction annotateNoBreakBeforeSegments(nodes: DraftNode[]): DraftNode[] {\n let changed = false;\n\n const next = nodes.map((node, index) => {\n if (node.type !== \"text\") {\n return node;\n }\n\n const segments = node.props[\"segments\"];\n if (!Array.isArray(segments) || segments.length === 0) {\n return node;\n }\n\n const typedSegments = segments as TextSegment[];\n const firstSegment = typedSegments[0];\n if (!firstSegment) {\n return node;\n }\n\n const previous = index > 0 ? nodes[index - 1] : null;\n const shouldMark =\n startsWithClosingPunctuation(firstSegment.text) &&\n shouldPreventBreakBeforeNode(previous);\n const alreadyMarked = firstSegment.noBreakBefore === true;\n\n if (shouldMark === alreadyMarked) {\n return node;\n }\n\n const nextFirst: TextSegment = shouldMark\n ? { ...firstSegment, noBreakBefore: true }\n : { ...firstSegment, noBreakBefore: undefined };\n const nextSegments = [nextFirst, ...typedSegments.slice(1)];\n\n changed = true;\n return {\n ...node,\n props: {\n ...node.props,\n segments: nextSegments,\n },\n };\n });\n\n return changed ? next : nodes;\n}\n\nfunction shouldPreventBreakBeforeNode(node: DraftNode | null): boolean {\n if (!node) {\n return false;\n }\n\n if (node.type === \"soft-break\" || node.type === \"hard-break\") {\n return false;\n }\n\n if (node.type === \"text\") {\n const text = String(node.props[\"text\"] ?? \"\");\n if (!text || /\\s$/u.test(text)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction startsWithClosingPunctuation(value: string): boolean {\n if (!value) {\n return false;\n }\n\n const [first] = [...value];\n return first != null && CLOSING_PUNCTUATION.has(first);\n}\n\nconst CLOSING_PUNCTUATION = new Set([\n \"]\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \";\",\n \":\",\n \"%\",\n \")\",\n \"}\",\n \">\",\n '\"',\n \"'\",\n \"、\",\n \"。\",\n \",\",\n \".\",\n \"!\",\n \"?\",\n \":\",\n \";\",\n \"%\",\n \")\",\n \"]\",\n \"}\",\n \"〉\",\n \"》\",\n \"」\",\n \"』\",\n \"】\",\n \"〕\",\n \"〗\",\n]);\n\nfunction appendText(\n nodes: DraftNode[],\n text: string,\n start: number,\n path: string,\n segmenter: ParseContext[\"options\"][\"segmenter\"],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} {\n if (!text) {\n return { warnings: [], hasWarnedSegmenterUnavailable };\n }\n\n const segmentation = createSegments(text, start, {\n segmenter,\n hasWarnedSegmenterUnavailable,\n });\n\n nodes.push({\n path: `${path}.${nodes.length}`,\n type: \"text\",\n range: { start, end: start + text.length },\n closed: true,\n props: {\n text,\n segments: segmentation.segments,\n },\n children: [],\n });\n\n return {\n warnings: segmentation.warning ? [segmentation.warning] : [],\n hasWarnedSegmenterUnavailable: segmentation.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCitationInline(\n text: string,\n at: number,\n start: number,\n path: string,\n citations: CitationState,\n index: number,\n isComplete: boolean,\n): { node: DraftNode; next: number; citations: CitationState } | null {\n if (!text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const close = text.indexOf(\"]\", at + 2);\n if (close >= 0) {\n const idRef = text.slice(at + 2, close).trim();\n if (!idRef) {\n return null;\n }\n\n const numbered = assignCitationNumber(citations, idRef);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { idRef, number: numbered.number },\n children: [],\n },\n next: close + 1,\n citations: numbered.citations,\n };\n }\n\n if (isComplete) {\n return null;\n }\n\n const partial = text.slice(at);\n if (!/^\\[\\^[^\\]\\s]+$/u.test(partial)) {\n return null;\n }\n\n const partialIdRef = partial.slice(2);\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"citation\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: { idRef: partialIdRef },\n children: [],\n },\n next: text.length,\n citations,\n };\n}\n\nfunction parseImageInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!text.startsWith(\"![\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at + 1, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const alt = text.slice(at + 2, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"image\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n alt,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: [],\n },\n next: destEnd + 1,\n };\n}\n\nfunction parseLinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (text[at] !== \"[\" || text.startsWith(\"[^\", at)) {\n return null;\n }\n\n const labelEnd = findClosing(text, at, \"[\", \"]\");\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") {\n return null;\n }\n\n const destEnd = findClosing(text, labelEnd + 1, \"(\", \")\");\n if (destEnd < 0) {\n return null;\n }\n\n const label = text.slice(at + 1, labelEnd);\n const parsed = parseLinkDestination(text.slice(labelEnd + 2, destEnd));\n const childResult = parseInline(label, start + at + 1, `${path}.${index}`, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"link\",\n range: { start: start + at, end: start + destEnd + 1 },\n closed: true,\n props: {\n url: parsed.url,\n ...(parsed.title ? { title: parsed.title } : {}),\n },\n children: childResult.value,\n },\n next: destEnd + 1,\n citations: childResult.citations,\n warnings: childResult.warnings,\n hasWarnedSegmenterUnavailable: childResult.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseAutolinkInline(\n text: string,\n at: number,\n start: number,\n path: string,\n enabled: boolean,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (!enabled) {\n return null;\n }\n\n if (text[at] === \"<\") {\n const close = text.indexOf(\">\", at + 1);\n if (close > at + 1) {\n const value = text.slice(at + 1, close).trim();\n if (isUrl(value) || isEmail(value)) {\n const url = isEmail(value) ? `mailto:${value}` : value;\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + close + 1 },\n closed: true,\n props: { url, text: value },\n children: [],\n },\n next: close + 1,\n };\n }\n }\n }\n\n const boundaryOk = at === 0 || /\\s|[([{\"'`]/.test(text[at - 1]);\n if (!boundaryOk) {\n return null;\n }\n\n const match =\n /^(https?:\\/\\/\\S+|www\\.\\S+|[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})/.exec(\n text.slice(at),\n );\n if (!match) {\n return null;\n }\n\n const raw = trimAutolinkTrailingPunctuation(match[1]);\n if (!raw) {\n return null;\n }\n\n const url = isEmail(raw)\n ? `mailto:${raw}`\n : raw.startsWith(\"www.\")\n ? `https://${raw}`\n : raw;\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"autolink\",\n range: { start: start + at, end: start + at + raw.length },\n closed: true,\n props: {\n url,\n text: raw,\n },\n children: [],\n },\n next: at + raw.length,\n };\n}\n\nfunction parseInlineCode(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (text[at] !== \"`\") {\n return null;\n }\n\n let len = 1;\n while (text[at + len] === \"`\") {\n len += 1;\n }\n\n const delimiter = \"`\".repeat(len);\n const close = text.indexOf(delimiter, at + len);\n if (close < 0) {\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {\n text: text.slice(at + len),\n },\n children: [],\n },\n next: text.length,\n };\n }\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"inline-code\",\n range: { start: start + at, end: start + close + len },\n closed: true,\n props: {\n text: text.slice(at + len, close),\n },\n children: [],\n },\n next: close + len,\n };\n}\n\n// `$$…$$` display math may span lines. Inline `$…$` may not start with or end\n// on whitespace and may not be followed by a digit, so currency such as\n// \"$349 … $289\" stays prose. Unclosed delimiters stay text while streaming.\nconst DISPLAY_MATH = /^\\$\\$([\\s\\S]+?)\\$\\$/;\nconst INLINE_MATH = /^\\$(?!\\s)([^$\\n]*?\\S)\\$(?!\\d)/;\n\nfunction parseMathInline(\n text: string,\n at: number,\n start: number,\n path: string,\n index: number,\n): { node: DraftNode; next: number } | null {\n if (text[at] !== \"$\") {\n return null;\n }\n\n const rest = text.slice(at);\n const display = DISPLAY_MATH.exec(rest);\n const match = display ?? INLINE_MATH.exec(rest);\n if (!match) {\n return null;\n }\n\n return {\n node: {\n path: `${path}.${index}`,\n type: \"math\",\n range: { start: start + at, end: start + at + match[0].length },\n closed: true,\n props: { text: match[1], display: display !== null },\n children: [],\n },\n next: at + match[0].length,\n };\n}\n\nfunction parseDelimitedInline(\n text: string,\n at: number,\n delimiter: string,\n type: \"em\" | \"strong\" | \"strikethrough\",\n start: number,\n path: string,\n index: number,\n context: ParseContext,\n citations: CitationState,\n warnings: StreamingMarkdownWarning[],\n hasWarnedSegmenterUnavailable: boolean,\n): {\n node: DraftNode;\n next: number;\n citations: CitationState;\n warnings: StreamingMarkdownWarning[];\n hasWarnedSegmenterUnavailable: boolean;\n} | null {\n if (!text.startsWith(delimiter, at)) {\n return null;\n }\n\n const close = text.indexOf(delimiter, at + delimiter.length);\n if (close < 0) {\n const content = text.slice(at + delimiter.length);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + text.length },\n closed: false,\n props: {},\n children: children.value,\n },\n next: text.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n }\n\n const content = text.slice(at + delimiter.length, close);\n const children = parseInline(\n content,\n start + at + delimiter.length,\n `${path}.${index}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n return {\n node: {\n path: `${path}.${index}`,\n type,\n range: { start: start + at, end: start + close + delimiter.length },\n closed: true,\n props: {},\n children: children.value,\n },\n next: close + delimiter.length,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import {\n isBlank,\n isBlockquoteLine,\n isCitationDefinitionLine,\n isCitationDefinitionPrefixCandidate,\n isPipeTableHeader,\n isSetextUnderline,\n isThematicBreak,\n looksLikeTableRow,\n matchAtxHeading,\n matchFenceClose,\n matchFenceOpen,\n matchListItem,\n parseTableAlignment,\n splitTableCells,\n startsNewBlock,\n} from \"./helpers\";\nimport type {\n DraftNode,\n ParseContext,\n ParseResult,\n SourceLine,\n} from \"./internal\";\nimport { parseInline } from \"./inline-parser\";\n\n/**\n * GFM task-list marker at the start of a list item: `[ ]`, `[x]` or `[X]`,\n * followed by whitespace and then content.\n */\nconst TASK_MARKER = /^\\[([ xX])\\][ \\t]+(?=\\S)/;\n\n/**\n * Parses a contiguous range of source lines into block-level draft nodes.\n *\n * @param lines - Line-split source with offsets.\n * @param from - Inclusive start line index.\n * @param to - Exclusive end line index.\n * @param path - Stable path prefix for emitted nodes.\n * @param context - Shared parse context carrying options, warnings, and citations.\n * @param isRoot - Whether this parse call is for the document root.\n * @returns Root draft node plus updated immutable parse context.\n */\nexport function parseBlocks(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n isRoot: boolean,\n): ParseResult<DraftNode> {\n let root: DraftNode = {\n path,\n type: \"document\",\n range: {\n start: from < to ? lines[from].start : 0,\n end: from < to ? lines[to - 1].end : 0,\n },\n closed: false,\n props: {},\n children: [],\n };\n\n let i = from;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const line = lines[i];\n const isCitationDefinition = isCitationDefinitionLine(line.text);\n const isCitationDefinitionPrefix = isCitationDefinitionPrefixCandidate(\n line.text,\n line.hasNewline,\n context.isComplete,\n );\n\n if (\n isBlank(line.text) ||\n isCitationDefinition ||\n isCitationDefinitionPrefix\n ) {\n i += 1;\n continue;\n }\n\n const fenced = matchFenceOpen(line.text);\n if (fenced) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseCodeFence(lines, i, to, nodePath, context, fenced);\n root.children = [...root.children, parsed.node];\n i = parsed.next;\n continue;\n }\n\n if (isBlockquoteLine(line.text)) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseBlockquote(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const listMarker = matchListItem(line.text);\n if (listMarker) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseList(\n lines,\n i,\n to,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n listMarker.ordered,\n );\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const heading = matchAtxHeading(line.text);\n if (heading) {\n const nodePath = `${path}.${root.children.length}`;\n const children = parseInline(\n heading.text,\n line.start + heading.contentOffset,\n nodePath,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: line.end },\n closed: context.isComplete || line.hasNewline,\n props: { level: heading.level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 1;\n continue;\n }\n\n if (\n i + 1 < to &&\n isSetextUnderline(lines[i + 1].text) &&\n !isBlank(line.text)\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const level = lines[i + 1].text.trim().startsWith(\"=\") ? 1 : 2;\n const children = parseInline(line.text, line.start, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n\n root.children = [\n ...root.children,\n {\n path: nodePath,\n type: \"heading\",\n range: { start: line.start, end: lines[i + 1].end },\n closed: context.isComplete || lines[i + 1].hasNewline,\n props: { level },\n children: children.value,\n },\n ];\n citations = children.citations;\n warnings = children.warnings;\n hasWarnedSegmenterUnavailable = children.hasWarnedSegmenterUnavailable;\n i += 2;\n continue;\n }\n\n if (isThematicBreak(line.text)) {\n root.children = [\n ...root.children,\n {\n path: `${path}.${root.children.length}`,\n type: \"thematic-break\",\n range: { start: line.start, end: line.end },\n closed: true,\n props: {},\n children: [],\n },\n ];\n i += 1;\n continue;\n }\n\n if (\n context.options.enableTables &&\n i + 1 < to &&\n isPipeTableHeader(lines[i], lines[i + 1])\n ) {\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parsePipeTable(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n continue;\n }\n\n const nodePath = `${path}.${root.children.length}`;\n const parsed = parseParagraph(lines, i, to, nodePath, {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n });\n root.children = [...root.children, parsed.value];\n i = parsed.next;\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n root = {\n ...root,\n closed:\n !isRoot ||\n context.isComplete ||\n (to > from &&\n lines[to - 1].hasNewline &&\n root.children.every((child) => child.closed)),\n };\n\n return {\n value: root,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseCodeFence(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n fenceOpen: { marker: \"```\" | \"~~~\"; length: number; info: string },\n): { node: DraftNode; next: number } {\n let i = from + 1;\n let closeLine = -1;\n\n while (i < to) {\n if (matchFenceClose(lines[i].text, fenceOpen.marker, fenceOpen.length)) {\n closeLine = i;\n break;\n }\n i += 1;\n }\n\n const endLine = closeLine >= 0 ? closeLine : to - 1;\n const textLines = lines.slice(from + 1, closeLine >= 0 ? closeLine : to);\n const text = textLines.map((line) => line.text).join(\"\\n\");\n const closed = closeLine >= 0 || context.isComplete;\n\n return {\n node: {\n path,\n type: \"code-block\",\n range: { start: lines[from].start, end: lines[endLine].end },\n closed,\n props: {\n fence: fenceOpen.marker,\n ...(fenceOpen.info ? { info: fenceOpen.info.split(/\\s+/)[0] } : {}),\n ...(fenceOpen.info.includes(\" \")\n ? { meta: fenceOpen.info.slice(fenceOpen.info.indexOf(\" \") + 1) }\n : {}),\n text,\n },\n children: [],\n },\n next: closeLine >= 0 ? closeLine + 1 : to,\n };\n}\n\nfunction parseBlockquote(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n const line = lines[i];\n if (isBlank(line.text) && picked.length > 0) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n if (\n isBlockquoteLine(line.text) ||\n (!isBlank(line.text) &&\n picked.length > 0 &&\n !startsNewBlock(lines, i, context.options.enableTables))\n ) {\n picked.push(line);\n i += 1;\n continue;\n }\n\n break;\n }\n\n const stripped = picked.map((line) => {\n const marker = /^(\\s{0,3}>\\s?)/.exec(line.text);\n const markerWidth = marker?.[1].length ?? 0;\n const text = marker ? line.text.slice(markerWidth) : line.text;\n const start = line.start + markerWidth;\n\n return {\n text,\n start,\n end: start + text.length,\n hasNewline: line.hasNewline,\n };\n });\n const children = parseBlocks(\n stripped,\n 0,\n stripped.length,\n path,\n context,\n false,\n );\n\n return {\n value: {\n path,\n type: \"blockquote\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value.children,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseList(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n ordered: boolean,\n): ParseResult<DraftNode> & { next: number } {\n const items: DraftNode[] = [];\n let i = from;\n let sawBlankBetweenItems = false;\n let listStartNumber: number | null = null;\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n while (i < to) {\n const marker = matchListItem(lines[i].text);\n if (!marker || marker.ordered !== ordered) {\n break;\n }\n\n if (ordered && listStartNumber === null) {\n listStartNumber = marker.start;\n }\n\n const task = TASK_MARKER.exec(marker.content);\n const contentLines: SourceLine[] = [\n {\n ...lines[i],\n text: task ? marker.content.slice(task[0].length) : marker.content,\n },\n ];\n const contentIndent = marker.contentIndent;\n\n i += 1;\n let hadBlank = false;\n\n while (i < to) {\n const next = lines[i];\n const nextMarker = matchListItem(next.text);\n\n if (nextMarker) {\n break;\n }\n\n if (isBlank(next.text)) {\n hadBlank = true;\n contentLines.push(next);\n i += 1;\n\n if (i < to) {\n const afterBlank = matchListItem(lines[i].text);\n if (afterBlank) {\n sawBlankBetweenItems = true;\n break;\n }\n }\n\n continue;\n }\n\n const leadingWhitespace = /^\\s*/.exec(next.text)?.[0].length ?? 0;\n if (leadingWhitespace < contentIndent) {\n break;\n }\n\n const continuation = next.text.slice(contentIndent);\n contentLines.push({ ...next, text: continuation });\n i += 1;\n }\n\n const paragraphText = contentLines\n .map((line) => line.text)\n .join(\"\\n\")\n .trimEnd();\n const itemPath = `${path}.${items.length}`;\n const parsedInline = parseInline(\n paragraphText,\n contentLines[0].start,\n `${itemPath}.0`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n const paragraph: DraftNode = {\n path: `${itemPath}.0`,\n type: \"paragraph\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: {},\n children: parsedInline.value,\n };\n\n items.push({\n path: itemPath,\n type: \"list-item\",\n range: {\n start: contentLines[0].start,\n end: contentLines[contentLines.length - 1].end,\n },\n closed:\n context.isComplete || contentLines[contentLines.length - 1].hasNewline,\n props: task ? { checked: task[1] !== \" \" } : {},\n children: [paragraph],\n });\n\n citations = parsedInline.citations;\n warnings = parsedInline.warnings;\n hasWarnedSegmenterUnavailable = parsedInline.hasWarnedSegmenterUnavailable;\n\n if (hadBlank) {\n sawBlankBetweenItems = true;\n }\n }\n\n return {\n value: {\n path,\n type: \"list\",\n range: {\n start: lines[from].start,\n end: lines[Math.max(from, i - 1)].end,\n },\n closed: context.isComplete || lines[Math.max(from, i - 1)].hasNewline,\n props: {\n ordered,\n start: ordered ? (listStartNumber ?? 1) : null,\n tight: !sawBlankBetweenItems,\n },\n children: items,\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parsePipeTable(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const header = splitTableCells(lines[from].text);\n const align = parseTableAlignment(splitTableCells(lines[from + 1].text));\n\n const rows: string[][] = [];\n let i = from + 2;\n while (i < to && looksLikeTableRow(lines[i].text)) {\n rows.push(splitTableCells(lines[i].text));\n i += 1;\n }\n\n let citations = context.citations;\n let warnings = context.warnings;\n let hasWarnedSegmenterUnavailable = context.hasWarnedSegmenterUnavailable;\n\n const headerChildren: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < header.length; cellIndex += 1) {\n const parsed = parseInline(\n header[cellIndex],\n lines[from].start,\n `${path}.0.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n headerChildren.push({\n path: `${path}.0.${cellIndex}`,\n type: \"table-cell\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n const headerRow: DraftNode = {\n path: `${path}.0`,\n type: \"table-row\",\n range: { start: lines[from].start, end: lines[from].end },\n closed: true,\n props: { isHeader: true },\n children: headerChildren,\n };\n\n const bodyRows: DraftNode[] = [];\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex += 1) {\n const row = rows[rowIndex];\n const cellNodes: DraftNode[] = [];\n for (let cellIndex = 0; cellIndex < row.length; cellIndex += 1) {\n const parsed = parseInline(\n row[cellIndex],\n lines[from + 2 + rowIndex].start,\n `${path}.${rowIndex + 1}.${cellIndex}`,\n {\n ...context,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n },\n );\n\n cellNodes.push({\n path: `${path}.${rowIndex + 1}.${cellIndex}`,\n type: \"table-cell\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: {},\n children: parsed.value,\n });\n\n citations = parsed.citations;\n warnings = parsed.warnings;\n hasWarnedSegmenterUnavailable = parsed.hasWarnedSegmenterUnavailable;\n }\n\n bodyRows.push({\n path: `${path}.${rowIndex + 1}`,\n type: \"table-row\",\n range: {\n start: lines[from + 2 + rowIndex].start,\n end: lines[from + 2 + rowIndex].end,\n },\n closed: true,\n props: { isHeader: false },\n children: cellNodes,\n });\n }\n\n return {\n value: {\n path,\n type: \"table\",\n range: { start: lines[from].start, end: lines[i - 1].end },\n closed: context.isComplete || lines[i - 1].hasNewline,\n props: { align },\n children: [headerRow, ...bodyRows],\n },\n next: i,\n citations,\n warnings,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction parseParagraph(\n lines: SourceLine[],\n from: number,\n to: number,\n path: string,\n context: ParseContext,\n): ParseResult<DraftNode> & { next: number } {\n const picked: SourceLine[] = [];\n let i = from;\n\n while (i < to) {\n if (isBlank(lines[i].text)) {\n break;\n }\n\n if (\n picked.length > 0 &&\n startsNewBlock(lines, i, context.options.enableTables)\n ) {\n break;\n }\n\n if (\n isCitationDefinitionLine(lines[i].text) ||\n isCitationDefinitionPrefixCandidate(\n lines[i].text,\n lines[i].hasNewline,\n context.isComplete,\n )\n ) {\n break;\n }\n\n picked.push(lines[i]);\n i += 1;\n }\n\n const text = picked.map((line) => line.text).join(\"\\n\");\n const children = parseInline(text, picked[0].start, path, context);\n\n return {\n value: {\n path,\n type: \"paragraph\",\n range: { start: picked[0].start, end: picked[picked.length - 1].end },\n closed: context.isComplete || picked[picked.length - 1].hasNewline,\n props: {},\n children: children.value,\n },\n next: i,\n citations: children.citations,\n warnings: children.warnings,\n hasWarnedSegmenterUnavailable: children.hasWarnedSegmenterUnavailable,\n };\n}\n","import type { DraftNode } from \"./internal\";\nimport type {\n CitationState,\n StreamingMarkdownAstNode,\n StreamingMarkdownHeadingNode,\n StreamingMarkdownWarning,\n TextSegment,\n} from \"./types\";\n\n/**\n * Operation protocol used to reduce tokenized draft trees into immutable AST state.\n * @internal\n */\nexport type StreamingMarkdownAstOp =\n | {\n kind: \"upsert-node\";\n path: string;\n parentPath: string | null;\n type: DraftNode[\"type\"];\n range: { start: number; end: number };\n closed: boolean;\n props: Record<string, unknown>;\n childPaths: string[];\n }\n | { kind: \"set-warnings\"; warnings: StreamingMarkdownWarning[] }\n | { kind: \"set-citations\"; citations: CitationState }\n | {\n kind: \"set-segmenter-warning-state\";\n hasWarnedSegmenterUnavailable: boolean;\n };\n\n/**\n * Flattens a draft tree into reducer operations.\n *\n * @param root - Draft AST root.\n * @returns Ordered operations for reducer application.\n */\nexport function createAstOpsFromDraft(\n root: DraftNode,\n): StreamingMarkdownAstOp[] {\n const ops: StreamingMarkdownAstOp[] = [];\n\n function visit(node: DraftNode, parentPath: string | null) {\n const childPaths = node.children.map(\n (child, index) => `${node.path}.${index}`,\n );\n\n ops.push({\n kind: \"upsert-node\",\n path: node.path,\n parentPath,\n type: node.type,\n range: node.range,\n closed: node.closed,\n props: node.props,\n childPaths,\n });\n\n for (let index = 0; index < node.children.length; index += 1) {\n const child = node.children[index];\n visit({ ...child, path: `${node.path}.${index}` }, node.path);\n }\n }\n\n visit(root, null);\n return ops;\n}\n\n/**\n * Applies AST ops with identity reuse for unchanged nodes.\n *\n * @param input - Previous parser state fragments and ops to apply.\n * @returns Next materialized state fragments.\n */\nexport function applyAstOps(input: {\n previousNodes: StreamingMarkdownAstNode[];\n previousPathToId: Record<string, number>;\n nextId: number;\n ops: StreamingMarkdownAstOp[];\n}): {\n nodes: StreamingMarkdownAstNode[];\n rootId: number;\n nextId: number;\n pathToId: Record<string, number>;\n warnings: StreamingMarkdownWarning[];\n citations: CitationState;\n hasWarnedSegmenterUnavailable: boolean;\n} {\n const previousNodeById = new Map(\n input.previousNodes.map((node) => [node.id, node]),\n );\n const nodeOps = input.ops.filter(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }> =>\n op.kind === \"upsert-node\",\n );\n\n const pathToId: Record<string, number> = {};\n let nextId = input.nextId;\n\n for (const op of nodeOps) {\n const existingId = input.previousPathToId[op.path];\n const id = existingId ?? nextId++;\n pathToId[op.path] = id;\n }\n\n const nodesById = new Map<number, StreamingMarkdownAstNode>();\n\n for (const op of nodeOps) {\n const id = pathToId[op.path];\n const parentId = op.parentPath ? pathToId[op.parentPath] : null;\n const childIds = op.childPaths.map((childPath) => pathToId[childPath]);\n const materialized = opToAstNode(op, id, parentId, childIds);\n const previous = previousNodeById.get(id);\n const reconciled =\n previous?.type === \"text\" && materialized.type === \"text\"\n ? reconcileTextNode(previous, materialized)\n : materialized;\n\n nodesById.set(\n id,\n previous && astNodeEquals(previous, reconciled) ? previous : reconciled,\n );\n }\n\n const rootPath = nodeOps[0]?.path;\n if (!rootPath) {\n throw new Error(\"StreamingMarkdown op stream did not include a root node\");\n }\n\n const warnings =\n input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-warnings\" }> =>\n op.kind === \"set-warnings\",\n )?.warnings ?? [];\n const citations = input.ops.find(\n (op): op is Extract<StreamingMarkdownAstOp, { kind: \"set-citations\" }> =>\n op.kind === \"set-citations\",\n )?.citations ?? { order: [], numbers: {}, definitions: {} };\n const hasWarnedSegmenterUnavailable =\n input.ops.find(\n (\n op,\n ): op is Extract<\n StreamingMarkdownAstOp,\n { kind: \"set-segmenter-warning-state\" }\n > => op.kind === \"set-segmenter-warning-state\",\n )?.hasWarnedSegmenterUnavailable ?? false;\n\n return {\n nodes: Array.from(nodesById.values()).sort((a, b) => a.id - b.id),\n rootId: pathToId[rootPath],\n nextId,\n pathToId,\n warnings,\n citations,\n hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction opToAstNode(\n op: Extract<StreamingMarkdownAstOp, { kind: \"upsert-node\" }>,\n id: number,\n parentId: number | null,\n children: number[],\n): StreamingMarkdownAstNode {\n const base = {\n id,\n type: op.type,\n parentId,\n closed: op.closed,\n range: op.range,\n };\n\n switch (op.type) {\n case \"document\":\n return { ...base, type: \"document\", children };\n case \"paragraph\":\n return { ...base, type: \"paragraph\", children };\n case \"heading\":\n return {\n ...base,\n type: \"heading\",\n level: op.props[\"level\"] as StreamingMarkdownHeadingNode[\"level\"],\n children,\n };\n case \"blockquote\":\n return { ...base, type: \"blockquote\", children };\n case \"list\":\n return {\n ...base,\n type: \"list\",\n ordered: op.props[\"ordered\"] as boolean,\n start: op.props[\"start\"] as number | null,\n tight: op.props[\"tight\"] as boolean,\n children,\n };\n case \"list-item\": {\n const checked = op.props[\"checked\"] as boolean | undefined;\n return checked === undefined\n ? { ...base, type: \"list-item\", children }\n : { ...base, type: \"list-item\", checked, children };\n }\n case \"code-block\":\n return {\n ...base,\n type: \"code-block\",\n fence: op.props[\"fence\"] as \"```\" | \"~~~\",\n info: op.props[\"info\"] as string | undefined,\n meta: op.props[\"meta\"] as string | undefined,\n text: op.props[\"text\"] as string,\n };\n case \"table\":\n return {\n ...base,\n type: \"table\",\n align: op.props[\"align\"] as Array<\"left\" | \"right\" | \"center\" | \"none\">,\n children,\n };\n case \"table-row\":\n return {\n ...base,\n type: \"table-row\",\n isHeader: op.props[\"isHeader\"] as boolean,\n children,\n };\n case \"table-cell\":\n return { ...base, type: \"table-cell\", children };\n case \"thematic-break\":\n return { ...base, type: \"thematic-break\" };\n case \"text\":\n return {\n ...base,\n type: \"text\",\n text: op.props[\"text\"] as string,\n segments: op.props[\"segments\"] as TextSegment[],\n };\n case \"em\":\n return { ...base, type: \"em\", children };\n case \"strong\":\n return { ...base, type: \"strong\", children };\n case \"strikethrough\":\n return { ...base, type: \"strikethrough\", children };\n case \"inline-code\":\n return {\n ...base,\n type: \"inline-code\",\n text: op.props[\"text\"] as string,\n };\n case \"soft-break\":\n return { ...base, type: \"soft-break\" };\n case \"hard-break\":\n return { ...base, type: \"hard-break\" };\n case \"link\":\n return {\n ...base,\n type: \"link\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n children,\n };\n case \"image\":\n return {\n ...base,\n type: \"image\",\n url: op.props[\"url\"] as string,\n title: op.props[\"title\"] as string | undefined,\n alt: op.props[\"alt\"] as string,\n };\n case \"autolink\":\n return {\n ...base,\n type: \"autolink\",\n url: op.props[\"url\"] as string,\n text: op.props[\"text\"] as string,\n };\n case \"math\":\n return {\n ...base,\n type: \"math\",\n text: op.props[\"text\"] as string,\n display: op.props[\"display\"] as boolean,\n };\n case \"citation\":\n return {\n ...base,\n type: \"citation\",\n idRef: op.props[\"idRef\"] as string,\n number: op.props[\"number\"] as number | undefined,\n };\n }\n}\n\nfunction astNodeEquals(\n a: StreamingMarkdownAstNode,\n b: StreamingMarkdownAstNode,\n): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction reconcileTextNode(\n previous: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n next: Extract<StreamingMarkdownAstNode, { type: \"text\" }>,\n): Extract<StreamingMarkdownAstNode, { type: \"text\" }> {\n if (next.segments.length === 0 || previous.segments.length === 0) {\n return next;\n }\n\n const previousBySignature = groupSegmentsBySignature(previous.segments);\n let reusedAnySegment = false;\n\n const segments = next.segments.map((segment) => {\n const signature = getSegmentSignature(segment);\n const bucket = previousBySignature.get(signature);\n if (!bucket?.length) {\n return segment;\n }\n\n const [reused, ...rest] = bucket;\n if (rest.length) {\n previousBySignature.set(signature, rest);\n } else {\n previousBySignature.delete(signature);\n }\n\n reusedAnySegment = true;\n return reused;\n });\n\n if (areSegmentArraysIdentical(previous.segments, segments)) {\n return {\n ...next,\n segments: previous.segments,\n };\n }\n\n if (!reusedAnySegment) {\n return next;\n }\n\n return {\n ...next,\n segments,\n };\n}\n\n/**\n * Returns true when both arrays contain the same segment object references in order.\n */\nfunction areSegmentArraysIdentical(\n a: TextSegment[],\n b: TextSegment[],\n): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n return a.every((segment, index) => segment === b[index]);\n}\n\n/**\n * Produces a stable signature for matching segments across immutable parse iterations.\n */\nfunction getSegmentSignature(segment: TextSegment): string {\n return `${segment.start}:${segment.end}:${segment.text}:${segment.kind}:${String(segment.isWhitespace)}:${String(segment.noBreakBefore === true)}`;\n}\n\n/**\n * Groups previous segments by signature to support one-to-one identity reuse.\n */\nfunction groupSegmentsBySignature(\n segments: TextSegment[],\n): Map<string, TextSegment[]> {\n const bySignature = new Map<string, TextSegment[]>();\n\n for (const segment of segments) {\n const signature = getSegmentSignature(segment);\n const existing = bySignature.get(signature) ?? [];\n bySignature.set(signature, [...existing, segment]);\n }\n\n return bySignature;\n}\n","import { parseBlocks } from \"./block-parser\";\nimport { parseCitationDefinitions } from \"./citations\";\nimport {\n getLineBuffer,\n normalizeChunk,\n normalizeOptions,\n splitLines,\n toLineColumn,\n} from \"./helpers\";\nimport { applyAstOps, createAstOpsFromDraft } from \"./ops\";\nimport type {\n StreamingMarkdownAstNode,\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserState,\n ParseMode,\n} from \"./types\";\n\n/**\n * Creates a new streaming markdown parser state.\n *\n * @param options - Optional parser option overrides.\n * @returns New immutable parser state.\n * @public\n */\nexport function createStreamingMarkdownParserState(\n options?: Partial<StreamingMarkdownParserOptions>,\n): StreamingMarkdownParserState {\n const normalizedOptions = normalizeOptions(options);\n const documentNode = {\n id: 1,\n type: \"document\" as const,\n parentId: null,\n closed: false,\n range: { start: 0, end: 0 },\n children: [],\n };\n\n return {\n nextId: 2,\n nodes: [documentNode],\n rootId: 1,\n stack: [1],\n mode: \"block\",\n warnings: [],\n citations: {\n order: [],\n numbers: {},\n definitions: {},\n },\n lineBuffer: \"\",\n isComplete: false,\n index: 0,\n line: 1,\n column: 1,\n options: normalizedOptions,\n source: \"\",\n pathToId: { \"0\": 1 },\n pendingCarriageReturn: false,\n hasWarnedSegmenterUnavailable: false,\n };\n}\n\n/**\n * Parses a streaming chunk and returns the next immutable parser state.\n *\n * @param state - Current parser state.\n * @param chunk - Incoming text chunk.\n * @returns Updated parser state.\n * @public\n */\nexport function parseStreamingMarkdownChunk(\n state: StreamingMarkdownParserState,\n chunk: string,\n): StreamingMarkdownParserState {\n const normalized = normalizeChunk(chunk, state.pendingCarriageReturn);\n const source = state.source + normalized.text;\n\n return rebuildState(state, {\n source,\n isComplete: false,\n pendingCarriageReturn: normalized.pendingCarriageReturn,\n });\n}\n\n/**\n * Finalizes parsing by closing any provisional nodes and flushing trailing CR.\n *\n * @param state - Current parser state.\n * @returns Final parser state.\n * @public\n */\nexport function finalizeStreamingMarkdown(\n state: StreamingMarkdownParserState,\n): StreamingMarkdownParserState {\n if (state.isComplete) {\n return state;\n }\n\n const source = state.source + (state.pendingCarriageReturn ? \"\\n\" : \"\");\n\n return rebuildState(state, {\n source,\n isComplete: true,\n pendingCarriageReturn: false,\n });\n}\n\nfunction rebuildState(\n prev: StreamingMarkdownParserState,\n input: {\n source: string;\n isComplete: boolean;\n pendingCarriageReturn: boolean;\n },\n): StreamingMarkdownParserState {\n const definitions = parseCitationDefinitions(input.source);\n const parseContext = {\n options: prev.options,\n warnings: definitions.warnings,\n citations: definitions.citations,\n isComplete: input.isComplete,\n hasWarnedSegmenterUnavailable: prev.hasWarnedSegmenterUnavailable,\n };\n\n const lines = splitLines(input.source);\n const parsedBlocks = parseBlocks(\n lines,\n 0,\n lines.length,\n \"0\",\n parseContext,\n true,\n );\n const ops = [\n { kind: \"set-warnings\", warnings: parsedBlocks.warnings } as const,\n { kind: \"set-citations\", citations: parsedBlocks.citations } as const,\n {\n kind: \"set-segmenter-warning-state\",\n hasWarnedSegmenterUnavailable: parsedBlocks.hasWarnedSegmenterUnavailable,\n } as const,\n ...createAstOpsFromDraft(parsedBlocks.value),\n ];\n\n const reduced = applyAstOps({\n previousNodes: prev.nodes,\n previousPathToId: prev.pathToId,\n nextId: prev.nextId,\n ops,\n });\n\n const lineBuffer = getLineBuffer(input.source);\n const { line, column } = toLineColumn(input.source, input.source.length);\n\n return {\n ...prev,\n nextId: reduced.nextId,\n nodes: reduced.nodes,\n rootId: reduced.rootId,\n stack: computeOpenStack(reduced.nodes, reduced.rootId),\n mode: inferMode(reduced.nodes, reduced.rootId),\n warnings: reduced.warnings,\n citations: reduced.citations,\n lineBuffer,\n isComplete: input.isComplete,\n index: input.source.length,\n line,\n column,\n source: input.source,\n pathToId: reduced.pathToId,\n pendingCarriageReturn: input.pendingCarriageReturn,\n hasWarnedSegmenterUnavailable: reduced.hasWarnedSegmenterUnavailable,\n };\n}\n\nfunction computeOpenStack(\n nodes: StreamingMarkdownAstNode[],\n rootId: number,\n): number[] {\n const nodeById = new Map(nodes.map((node) => [node.id, node]));\n const stack: number[] = [];\n\n let cursor: number | null = rootId;\n while (cursor != null) {\n const node = nodeById.get(cursor);\n if (!node || node.closed) {\n break;\n }\n\n stack.push(cursor);\n if (!(\"children\" in node) || node.children.length === 0) {\n break;\n }\n\n const lastChild = node.children[node.children.length - 1];\n cursor = typeof lastChild === \"number\" ? lastChild : null;\n }\n\n return stack;\n}\n\nfunction inferMode(\n nodes: StreamingMarkdownAstNode[],\n rootId: number | null,\n): ParseMode {\n if (rootId == null) {\n return \"block\";\n }\n\n const root = nodes.find((node) => node.id === rootId);\n if (!root || !(\"children\" in root) || root.children.length === 0) {\n return \"block\";\n }\n\n const lastChild = nodes.find(\n (node) => node.id === root.children[root.children.length - 1],\n );\n if (!lastChild || lastChild.closed) {\n return \"block\";\n }\n\n if (lastChild.type === \"paragraph\") {\n return \"paragraph\";\n }\n if (lastChild.type === \"heading\") {\n return \"heading\";\n }\n if (lastChild.type === \"blockquote\") {\n return \"blockquote\";\n }\n if (lastChild.type === \"list-item\") {\n return \"list-item\";\n }\n if (lastChild.type === \"code-block\") {\n return \"code-fence\";\n }\n if (lastChild.type === \"table\") {\n return \"table\";\n }\n\n return \"block\";\n}\n","let warned = false;\n\nconst MIGRATION_GUIDE_URL =\n \"https://docs.copilotkit.ai/migrate/markdown-renderer#migrate-with-your-ai-assistant\";\n\n// A ``` or ~~~ fence immediately followed by a language token (e.g. ```ts).\n// Plain fences with no language are not flagged — they render fine.\nconst HIGHLIGHTABLE_CODE = /(^|\\n)[ \\t]*(```|~~~)[ \\t]*[A-Za-z][\\w+#-]*/;\n// Block math: $$ … $$ or \\[ … \\]. Inline `$…$` is intentionally not flagged\n// (too many false positives with currency, e.g. \"$5 and $10\").\nconst BLOCK_MATH = /\\$\\$[\\s\\S]+?\\$\\$/;\nconst BRACKET_MATH = /\\\\\\[[\\s\\S]+?\\\\\\]/;\n\nfunction isProduction(): boolean {\n return (\n typeof process !== \"undefined\" &&\n process.env != null &&\n process.env.NODE_ENV === \"production\"\n );\n}\n\n/**\n * Dev-only, once-per-session warning emitted when CopilotKit's built-in default\n * markdown renderer encounters markdown it won't render richly — math\n * (`$$…$$` / `\\[…\\]`) or a language-tagged fenced code block (rendered as plain,\n * un-highlighted code). Helps people upgrading from the bundled Streamdown\n * default notice the behavioral change and points them at the migration guide.\n *\n * No-op in production and after the first warning. Only the built-in default\n * renderers call this — a custom `markdownRenderer` never triggers it.\n * Pass `{ rendersMath: true }` from a default renderer that typesets math, so\n * only code blocks are flagged.\n *\n * @internal\n */\nexport function warnUnsupportedRichSyntaxOnce(\n content: string,\n { rendersMath = false }: { rendersMath?: boolean } = {},\n): void {\n if (warned || !content || isProduction()) return;\n\n const hasMath =\n !rendersMath && (BLOCK_MATH.test(content) || BRACKET_MATH.test(content));\n const hasHighlightableCode = HIGHLIGHTABLE_CODE.test(content);\n if (!hasMath && !hasHighlightableCode) return;\n\n warned = true;\n const [feature, missing] = hasMath\n ? [\"math\", \"math typesetting\"]\n : [\"a syntax-highlighted code block\", \"syntax highlighting\"];\n // eslint-disable-next-line no-console\n console.warn(\n `[CopilotKit] The built-in markdown renderer rendered ${feature} without ${missing}. ` +\n `It supports GFM, tables, autolinks, and citations, but not math, syntax ` +\n `highlighting, or diagrams. To restore those, plug in a custom markdownRenderer ` +\n `(e.g. react-markdown or streamdown) — or paste the migration prompt into your ` +\n `AI assistant: ${MIGRATION_GUIDE_URL}`,\n );\n}\n\n/**\n * Resets the once-guard. Test-only.\n * @internal\n */\nexport function __resetUnsupportedRichSyntaxWarning(): void {\n warned = false;\n}\n","import { normalizeOptions } from \"../parser/helpers\";\nimport {\n createStreamingMarkdownParserState,\n finalizeStreamingMarkdown,\n parseStreamingMarkdownChunk,\n} from \"../parser/state\";\nimport type {\n StreamingMarkdownParserOptions,\n StreamingMarkdownParserState,\n} from \"../parser/types\";\n\n/**\n * Parser state plus the inputs that produced it, so the next update can parse\n * only the appended text.\n *\n * @public\n */\nexport interface StreamingMarkdownParserSession {\n parserState: StreamingMarkdownParserState;\n text: string;\n optionsKey: string;\n isCompleteInput: boolean;\n}\n\nfunction getSegmenterKey(\n segmenter: StreamingMarkdownParserOptions[\"segmenter\"],\n) {\n if (segmenter === true || segmenter === false) {\n return String(segmenter);\n }\n\n const locale = segmenter.locale ?? \"\";\n const granularity = segmenter.granularity ?? \"word\";\n return `object:${locale}:${granularity}`;\n}\n\nfunction getOptionsKey(options: StreamingMarkdownParserOptions) {\n return `${getSegmenterKey(options.segmenter)}|tables:${String(options.enableTables)}|autolinks:${String(options.enableAutolinks)}|math:${String(options.enableMath)}`;\n}\n\nfunction parseFullText(\n text: string,\n options: StreamingMarkdownParserOptions,\n isCompleteInput: boolean,\n) {\n const initialState = createStreamingMarkdownParserState(options);\n const parsedState =\n text.length > 0\n ? parseStreamingMarkdownChunk(initialState, text)\n : initialState;\n\n return isCompleteInput ? finalizeStreamingMarkdown(parsedState) : parsedState;\n}\n\n/**\n * Returns the parser session for `text`, reusing `previous` when it can.\n *\n * - Same inputs: returns `previous` unchanged.\n * - Text grew by a suffix: parses only the suffix, so unchanged AST nodes keep\n * their identity (renderers rely on this to keep DOM and animations stable).\n * - Text was replaced or options changed: parses from scratch.\n * - `isComplete` toggled: finalizes (or re-opens) the current state.\n *\n * @param previous - The session from the last update, or `null` on first use.\n * @param text - Full markdown source, which usually grows over time.\n * @param options - Parser option overrides.\n * @param isCompleteInput - `true` once the source is final.\n * @public\n */\nexport function updateStreamingMarkdownParserSession(\n previous: StreamingMarkdownParserSession | null,\n text: string,\n options: Partial<StreamingMarkdownParserOptions> | undefined,\n isCompleteInput: boolean,\n): StreamingMarkdownParserSession {\n const normalized = normalizeOptions(options);\n const optionsKey = getOptionsKey(normalized);\n\n if (previous === null || previous.optionsKey !== optionsKey) {\n return {\n parserState: parseFullText(text, normalized, isCompleteInput),\n text,\n optionsKey,\n isCompleteInput,\n };\n }\n\n const textChanged = text !== previous.text;\n const completionChanged = previous.isCompleteInput !== isCompleteInput;\n if (!textChanged && !completionChanged) {\n return previous;\n }\n\n if (!textChanged) {\n const parserState = isCompleteInput\n ? finalizeStreamingMarkdown(previous.parserState)\n : parseStreamingMarkdownChunk(previous.parserState, \"\");\n return { ...previous, parserState, isCompleteInput };\n }\n\n const suffix = text.startsWith(previous.text)\n ? text.slice(previous.text.length)\n : null;\n const parsed =\n suffix === null\n ? parseFullText(text, normalized, false)\n : parseStreamingMarkdownChunk(previous.parserState, suffix);\n\n return {\n parserState: isCompleteInput ? finalizeStreamingMarkdown(parsed) : parsed,\n text,\n optionsKey,\n isCompleteInput,\n };\n}\n","import type {\n CitationDefinition,\n CitationState,\n StreamingMarkdownAstNode,\n StreamingMarkdownNodeType,\n StreamingMarkdownParserState,\n TextSegment,\n} from \"../parser/types\";\n\n// ---------------------------------------------------------------------------\n// Public render-tree types\n// ---------------------------------------------------------------------------\n\n/**\n * Key names for per-node customization (`nodeRenderers`, `nodeClassNames`).\n * camelCase versions of the AST node types, plus `node` as a catch-all.\n *\n * @public\n */\nexport type StreamingMarkdownNodeRendererKey =\n | \"node\"\n | \"document\"\n | \"paragraph\"\n | \"heading\"\n | \"blockquote\"\n | \"list\"\n | \"listItem\"\n | \"codeBlock\"\n | \"table\"\n | \"tableRow\"\n | \"tableCell\"\n | \"thematicBreak\"\n | \"text\"\n | \"em\"\n | \"strong\"\n | \"strikethrough\"\n | \"inlineCode\"\n | \"softBreak\"\n | \"hardBreak\"\n | \"image\"\n | \"link\"\n | \"autolink\"\n | \"citation\"\n | \"math\";\n\n/**\n * Metadata available when a citation node is rendered.\n *\n * @public\n */\nexport interface StreamingMarkdownCitationRenderData {\n id: string;\n number: number | string;\n definition?: CitationDefinition;\n}\n\n/**\n * Extra class names for the outermost default element of a node type, for\n * example `{ codeBlock: \"cpk-markdown-code-block\" }`. Ignored for node types\n * that render no element of their own (`document`, `text`, `softBreak`).\n *\n * @public\n */\nexport type StreamingMarkdownNodeClassNames = Partial<\n Record<StreamingMarkdownNodeRendererKey, string>\n>;\n\n/**\n * Click behavior a backend attaches to a rendered element.\n *\n * @public\n */\nexport type StreamingMarkdownRenderAction =\n | { type: \"link\"; url: string; node: StreamingMarkdownAstNode }\n | {\n type: \"citation\";\n citation: StreamingMarkdownCitationRenderData;\n node: StreamingMarkdownAstNode;\n };\n\n/**\n * A plain element. Attribute values are already sanitized; `true` marks a\n * boolean attribute that is present.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderElement {\n kind: \"element\";\n key: string;\n tag: string;\n attrs: Readonly<Record<string, string | true>>;\n children: StreamingMarkdownRenderChild[];\n action?: StreamingMarkdownRenderAction;\n}\n\n/**\n * A text run.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderText {\n kind: \"text\";\n key: string;\n text: string;\n}\n\n/**\n * Where the streaming caret goes. The backend decides what the caret looks like.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderCaret {\n kind: \"caret\";\n key: string;\n}\n\n/**\n * Placeholder inside a node's default `output` that stands for its `children`.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderSlot {\n kind: \"slot\";\n key: string;\n}\n\n/**\n * One AST node, ready to render. Backends render `children` once, render\n * `output` with every `slot` replaced by those children, and pass both to a\n * custom node renderer when one is registered for `rendererKey`.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderNode {\n kind: \"node\";\n key: string;\n node: StreamingMarkdownAstNode;\n rendererKey: StreamingMarkdownNodeRendererKey;\n /** Content a custom renderer receives as its children; `null` for leaves. */\n children: StreamingMarkdownRenderChild[] | null;\n /** The default rendering. */\n output: StreamingMarkdownRenderChild[];\n /** `true` when the caret renders somewhere inside this node. */\n containsCaret: boolean;\n citation?: StreamingMarkdownCitationRenderData;\n}\n\n/**\n * Any entry in a render tree.\n *\n * @public\n */\nexport type StreamingMarkdownRenderChild =\n | StreamingMarkdownRenderNode\n | StreamingMarkdownRenderElement\n | StreamingMarkdownRenderText\n | StreamingMarkdownRenderCaret\n | StreamingMarkdownRenderSlot;\n\n/**\n * Options for {@link buildStreamingMarkdownRenderTree}.\n *\n * @public\n */\nexport interface StreamingMarkdownRenderTreeOptions {\n /** Render a caret inside the deepest open node while streaming. */\n caret: boolean;\n nodeClassNames?: StreamingMarkdownNodeClassNames;\n}\n\n// ---------------------------------------------------------------------------\n// Shared constants\n// ---------------------------------------------------------------------------\n\n/**\n * Class on the root element every renderer emits.\n * @public\n */\nexport const STREAMING_MARKDOWN_ROOT_CLASS = \"cpk-streaming-markdown-root\";\n\n/**\n * Node classes CopilotKit's built-in chat markdown renderers (React, Vue,\n * Angular) apply, so all three emit the same themed markup.\n * @public\n */\nexport const CHAT_MARKDOWN_NODE_CLASS_NAMES = {\n codeBlock: \"cpk-markdown-code-block\",\n} as const satisfies StreamingMarkdownNodeClassNames;\n\nconst SEGMENT_CLASS = \"cpk-streaming-markdown-segment\";\nconst CITATION_CLASS = \"cpk-streaming-markdown-citation\";\nconst CITATION_LABEL_CLASS = \"cpk-streaming-markdown-citation-label\";\nconst WORD_JOINER = \"\";\n\n/**\n * Attributes of the default caret element.\n * @public\n */\nexport const STREAMING_MARKDOWN_CARET_ATTRS = {\n \"aria-hidden\": \"true\",\n class: \"cpk-streaming-markdown-caret\",\n \"data-streaming-markdown-caret\": \"true\",\n} as const;\n\n/**\n * Inline style of the default caret element (camelCase CSS properties).\n * @public\n */\nexport const STREAMING_MARKDOWN_CARET_STYLE = {\n display: \"inline-block\",\n width: \"0.48em\",\n height: \"0.48em\",\n marginInlineStart: \"0.08em\",\n verticalAlign: \"-0.08em\",\n borderRadius: \"999px\",\n backgroundColor: \"currentColor\",\n opacity: \"0.55\",\n} as const;\n\nconst CITATION_STYLES = `\n .${STREAMING_MARKDOWN_ROOT_CLASS} .${CITATION_CLASS} {\n vertical-align: baseline;\n }\n\n .${STREAMING_MARKDOWN_ROOT_CLASS} .${CITATION_LABEL_CLASS} {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 1.4em;\n block-size: 1.4em;\n border-radius: 999px;\n border: 1px solid hsl(0 0% 50% / 0.35);\n background-color: hsl(0 0% 50% / 0.16);\n color: inherit;\n font-size: 0.7em;\n line-height: 1;\n font-variant-numeric: tabular-nums;\n text-decoration: none;\n transform: translateY(-0.15em);\n }\n`;\n\nconst SEGMENT_FADE_IN_STYLES = `\n .${STREAMING_MARKDOWN_ROOT_CLASS} .${SEGMENT_CLASS} {\n opacity: 1;\n transition: opacity 400ms ease-out;\n @starting-style {\n opacity: 0;\n }\n }\n`;\n\n// jsdom's CSS parser rejects nested `@starting-style`, so tests get the same\n// rules without the fade-in start state.\nconst SEGMENT_FALLBACK_STYLES = `\n .${STREAMING_MARKDOWN_ROOT_CLASS} .${SEGMENT_CLASS} {\n opacity: 1;\n transition: opacity 400ms ease-out;\n }\n`;\n\n/**\n * Stylesheet every renderer injects next to its root: the per-token fade-in\n * for text segments and the citation pill. Read at render time, so it is safe\n * to call during server rendering.\n *\n * @public\n */\nexport function getStreamingMarkdownStyles() {\n const isJsdom =\n typeof navigator !== \"undefined\" && /jsdom/i.test(navigator.userAgent);\n return (\n (isJsdom ? SEGMENT_FALLBACK_STYLES : SEGMENT_FADE_IN_STYLES) +\n CITATION_STYLES\n );\n}\n\n// ---------------------------------------------------------------------------\n// URL sanitization\n// ---------------------------------------------------------------------------\n\n// Only http(s), mailto, tel, relative and anchor hrefs, and non-SVG\n// data:image/* image sources are allowed. Anything else (javascript:,\n// data:text/html, data:image/svg+xml, vbscript:, …) is dropped.\nconst SAFE_HREF = /^(https?:|mailto:|tel:|#|\\/|\\.\\/|\\.\\.\\/)/i;\nconst SAFE_IMG_SRC = /^(https?:|data:image\\/(?!svg)|\\/|\\.\\/|\\.\\.\\/)/i;\n\n/**\n * Returns `href` when its scheme is allowed for links, else `undefined`.\n * @public\n */\nexport function sanitizeStreamingMarkdownHref(href: string | undefined) {\n if (!href) return undefined;\n return SAFE_HREF.test(href.trim()) ? href : undefined;\n}\n\n/**\n * Returns `src` when its scheme is allowed for images, else `undefined`.\n * @public\n */\nexport function sanitizeStreamingMarkdownImageSrc(src: string | undefined) {\n if (!src) return undefined;\n return SAFE_IMG_SRC.test(src.trim()) ? src : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\nconst RENDERER_KEY_BY_NODE_TYPE: Record<\n StreamingMarkdownNodeType,\n StreamingMarkdownNodeRendererKey\n> = {\n document: \"document\",\n paragraph: \"paragraph\",\n heading: \"heading\",\n blockquote: \"blockquote\",\n list: \"list\",\n \"list-item\": \"listItem\",\n \"code-block\": \"codeBlock\",\n table: \"table\",\n \"table-row\": \"tableRow\",\n \"table-cell\": \"tableCell\",\n \"thematic-break\": \"thematicBreak\",\n text: \"text\",\n em: \"em\",\n strong: \"strong\",\n strikethrough: \"strikethrough\",\n \"inline-code\": \"inlineCode\",\n \"soft-break\": \"softBreak\",\n \"hard-break\": \"hardBreak\",\n image: \"image\",\n link: \"link\",\n autolink: \"autolink\",\n citation: \"citation\",\n math: \"math\",\n};\n\ntype NodeById = ReadonlyMap<number, StreamingMarkdownAstNode>;\n\ntype BuildContext = {\n nodeById: NodeById;\n citations: CitationState;\n caretTargetNodeId: number | null;\n caretPath: ReadonlySet<number>;\n nodeClassNames: StreamingMarkdownNodeClassNames | undefined;\n};\n\ntype TextNode = Extract<StreamingMarkdownAstNode, { type: \"text\" }>;\ntype CitationNode = Extract<StreamingMarkdownAstNode, { type: \"citation\" }>;\n\nconst SLOT: StreamingMarkdownRenderSlot = { kind: \"slot\", key: \"slot\" };\n\nfunction indexNodes(state: StreamingMarkdownParserState): NodeById {\n return new Map(state.nodes.map((node) => [node.id, node]));\n}\n\nfunction findOpenNode(stack: number[], nodeById: NodeById) {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n const candidate = nodeById.get(stack[index]);\n if (candidate && candidate.type !== \"document\") {\n return candidate;\n }\n }\n return null;\n}\n\n/**\n * The deepest open (still streaming) node other than the document, or `null`.\n * This is where the caret goes.\n *\n * @public\n */\nexport function findStreamingMarkdownOpenNode(\n state: StreamingMarkdownParserState,\n) {\n return findOpenNode(state.stack, indexNodes(state));\n}\n\n/**\n * Citation number and definition for a citation node.\n *\n * @public\n */\nexport function getStreamingMarkdownCitationData(\n node: CitationNode,\n citations: CitationState,\n): StreamingMarkdownCitationRenderData {\n return {\n id: node.idRef,\n number: node.number ?? citations.numbers[node.idRef] ?? node.idRef,\n definition: citations.definitions[node.idRef],\n };\n}\n\nfunction nodeAttrs(\n node: StreamingMarkdownAstNode,\n context: BuildContext,\n extra: Record<string, string | true | undefined> = {},\n) {\n const attrs: Record<string, string | true> = {};\n const className =\n context.nodeClassNames?.[RENDERER_KEY_BY_NODE_TYPE[node.type]];\n if (className) attrs.class = className;\n const entries = Object.entries(extra);\n for (const [name, value] of entries) {\n if (value !== undefined) attrs[name] = value;\n }\n attrs[\"data-streaming-markdown-node\"] = node.type;\n attrs[\"data-node-open\"] = String(!node.closed);\n return attrs;\n}\n\nfunction element(\n key: string,\n tag: string,\n attrs: Readonly<Record<string, string | true>>,\n children: StreamingMarkdownRenderChild[],\n action?: StreamingMarkdownRenderAction,\n): StreamingMarkdownRenderElement {\n return action\n ? { kind: \"element\", key, tag, attrs, children, action }\n : { kind: \"element\", key, tag, attrs, children };\n}\n\nfunction text(key: string, value: string): StreamingMarkdownRenderText {\n return { kind: \"text\", key, text: value };\n}\n\nfunction caretFor(\n nodeId: number,\n context: BuildContext,\n): StreamingMarkdownRenderCaret[] {\n return context.caretTargetNodeId === nodeId\n ? [{ kind: \"caret\", key: `caret-${nodeId}` }]\n : [];\n}\n\nfunction renderNode(\n node: StreamingMarkdownAstNode,\n context: BuildContext,\n children: StreamingMarkdownRenderChild[] | null,\n output: StreamingMarkdownRenderChild[],\n citation?: StreamingMarkdownCitationRenderData,\n): StreamingMarkdownRenderNode {\n const base: StreamingMarkdownRenderNode = {\n kind: \"node\",\n key: String(node.id),\n node,\n rendererKey: RENDERER_KEY_BY_NODE_TYPE[node.type],\n children,\n output,\n containsCaret: context.caretPath.has(node.id),\n };\n return citation ? { ...base, citation } : base;\n}\n\nfunction containerChildren(\n node: { id: number; children: number[] },\n context: BuildContext,\n) {\n const built = node.children.flatMap((childId) => {\n const child = context.nodeById.get(childId);\n return child ? [buildNode(child, context)] : [];\n });\n return [...built, ...caretFor(node.id, context)];\n}\n\n/** A container whose default output is one element wrapping its children. */\nfunction wrapped(\n node: Extract<StreamingMarkdownAstNode, { children: number[] }>,\n context: BuildContext,\n tag: string,\n extra: Record<string, string | true | undefined> = {},\n action?: StreamingMarkdownRenderAction,\n) {\n const attrs = nodeAttrs(node, context, extra);\n return renderNode(node, context, containerChildren(node, context), [\n element(String(node.id), tag, attrs, [SLOT], action),\n ]);\n}\n\nfunction textSegments(node: TextNode): StreamingMarkdownRenderChild[] {\n if (node.text.length === 0) {\n return [];\n }\n\n if (node.segments.length === 0) {\n return [\n element(\n `segment-${node.id}-full`,\n \"span\",\n {\n class: SEGMENT_CLASS,\n \"data-streaming-markdown-segment-kind\": \"full\",\n \"data-streaming-markdown-whitespace\": \"false\",\n },\n [text(\"text\", node.text)],\n ),\n ];\n }\n\n return node.segments.map((segment: TextSegment) =>\n element(\n `segment-${node.id}-${segment.start}-${segment.kind}`,\n \"span\",\n {\n class: SEGMENT_CLASS,\n \"data-streaming-markdown-segment-kind\": segment.kind,\n \"data-streaming-markdown-whitespace\": String(segment.isWhitespace),\n },\n [\n text(\n \"text\",\n segment.noBreakBefore\n ? `${WORD_JOINER}${segment.text}`\n : segment.text,\n ),\n ],\n ),\n );\n}\n\nfunction taskCheckbox(\n node: StreamingMarkdownAstNode,\n context: BuildContext,\n): StreamingMarkdownRenderChild[] {\n const parent =\n node.parentId == null ? undefined : context.nodeById.get(node.parentId);\n const isFirstParagraphOfTask =\n parent?.type === \"list-item\" &&\n parent.checked !== undefined &&\n parent.children[0] === node.id;\n if (!isFirstParagraphOfTask) {\n return [];\n }\n const attrs: Record<string, string | true> = {\n type: \"checkbox\",\n disabled: true,\n \"data-streaming-markdown-task\": \"true\",\n };\n if (parent.checked) attrs.checked = true;\n return [\n element(`task-${parent.id}`, \"input\", attrs, []),\n text(\"task-space\", \" \"),\n ];\n}\n\nfunction buildCitation(node: CitationNode, context: BuildContext) {\n const citation = getStreamingMarkdownCitationData(node, context.citations);\n const label = [text(\"label\", String(citation.number))];\n const href = sanitizeStreamingMarkdownHref(citation.definition?.url);\n const inner = href\n ? element(\n \"label\",\n \"a\",\n {\n href,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n role: \"doc-noteref\",\n class: CITATION_LABEL_CLASS,\n },\n label,\n { type: \"citation\", citation, node },\n )\n : element(\n \"label\",\n \"span\",\n { role: \"doc-noteref\", class: CITATION_LABEL_CLASS },\n label,\n );\n const attrs = nodeAttrs(node, context);\n const supClass = attrs.class\n ? `${CITATION_CLASS} ${attrs.class}`\n : CITATION_CLASS;\n return renderNode(\n node,\n context,\n null,\n [element(String(node.id), \"sup\", { ...attrs, class: supClass }, [inner])],\n citation,\n );\n}\n\nfunction buildNode(\n node: StreamingMarkdownAstNode,\n context: BuildContext,\n): StreamingMarkdownRenderNode {\n const key = String(node.id);\n\n switch (node.type) {\n case \"document\":\n return renderNode(node, context, containerChildren(node, context), [\n SLOT,\n ]);\n case \"paragraph\": {\n const attrs = nodeAttrs(node, context);\n return renderNode(node, context, containerChildren(node, context), [\n element(key, \"p\", attrs, [...taskCheckbox(node, context), SLOT]),\n ]);\n }\n case \"heading\":\n return wrapped(node, context, `h${node.level}`);\n case \"blockquote\":\n return wrapped(node, context, \"blockquote\");\n case \"list\":\n return wrapped(node, context, node.ordered ? \"ol\" : \"ul\", {\n start:\n node.ordered && node.start != null ? String(node.start) : undefined,\n \"data-list-tight\": String(node.tight),\n });\n case \"list-item\":\n return wrapped(node, context, \"li\");\n case \"table\": {\n const attrs = nodeAttrs(node, context);\n return renderNode(node, context, containerChildren(node, context), [\n element(key, \"table\", attrs, [element(\"tbody\", \"tbody\", {}, [SLOT])]),\n ]);\n }\n case \"table-row\":\n return wrapped(node, context, \"tr\");\n case \"table-cell\": {\n const parent =\n node.parentId == null ? undefined : context.nodeById.get(node.parentId);\n const isHeaderRow = parent?.type === \"table-row\" && parent.isHeader;\n return wrapped(node, context, isHeaderRow ? \"th\" : \"td\");\n }\n case \"em\":\n return wrapped(node, context, \"em\");\n case \"strong\":\n return wrapped(node, context, \"strong\");\n case \"strikethrough\":\n return wrapped(node, context, \"s\");\n case \"link\": {\n const href = sanitizeStreamingMarkdownHref(node.url);\n return wrapped(\n node,\n context,\n \"a\",\n {\n href,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n title: node.title,\n },\n href ? { type: \"link\", url: href, node } : undefined,\n );\n }\n case \"code-block\": {\n const attrs = nodeAttrs(node, context);\n const codeAttrs: Record<string, string> = node.info\n ? { \"data-code-info\": node.info }\n : {};\n return renderNode(node, context, null, [\n element(key, \"pre\", attrs, [\n element(\"code\", \"code\", codeAttrs, [\n text(\"text\", node.text),\n ...caretFor(node.id, context),\n ]),\n ]),\n ]);\n }\n case \"thematic-break\":\n return renderNode(node, context, null, [\n element(key, \"hr\", nodeAttrs(node, context), []),\n ]);\n case \"hard-break\":\n return renderNode(node, context, null, [\n element(key, \"br\", nodeAttrs(node, context), []),\n ]);\n case \"text\":\n return renderNode(node, context, textSegments(node), [SLOT]);\n case \"soft-break\":\n return renderNode(node, context, [text(\"text\", \"\\n\")], [SLOT]);\n case \"inline-code\":\n return renderNode(\n node,\n context,\n [text(\"text\", node.text)],\n [element(key, \"code\", nodeAttrs(node, context), [SLOT])],\n );\n case \"image\":\n return renderNode(node, context, null, [\n element(\n key,\n \"img\",\n nodeAttrs(node, context, {\n src: sanitizeStreamingMarkdownImageSrc(node.url),\n alt: node.alt,\n title: node.title,\n }),\n [],\n ),\n ]);\n case \"autolink\": {\n const href = sanitizeStreamingMarkdownHref(node.url);\n return renderNode(\n node,\n context,\n [text(\"text\", node.text)],\n [\n element(\n key,\n \"a\",\n nodeAttrs(node, context, {\n href,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n }),\n [SLOT],\n href ? { type: \"link\", url: href, node } : undefined,\n ),\n ],\n );\n }\n case \"math\":\n return renderNode(\n node,\n context,\n [text(\"text\", node.text)],\n [\n element(\n key,\n \"span\",\n nodeAttrs(node, context, {\n \"data-math-display\": String(node.display),\n }),\n [SLOT],\n ),\n ],\n );\n case \"citation\":\n return buildCitation(node, context);\n default: {\n const unreachable: never = node;\n return unreachable;\n }\n }\n}\n\n/**\n * Turns parser state into a framework-neutral render tree: which elements to\n * create, their sanitized attributes, click actions, text segments for the\n * per-token animation, and where the caret goes. The React, Vue, and DOM\n * renderers all render this tree, so markup and sanitization live here only.\n *\n * @param state - Parser state from the streaming markdown parser.\n * @param options - Whether to place a caret, and optional per-node classes.\n * @returns The root render node (`null` when the state has no root) and the\n * open node the caret targets.\n * @public\n */\nexport function buildStreamingMarkdownRenderTree(\n state: StreamingMarkdownParserState,\n options: StreamingMarkdownRenderTreeOptions,\n) {\n const nodeById = indexNodes(state);\n const openNode = findOpenNode(state.stack, nodeById);\n const caretTargetNodeId =\n options.caret && !state.isComplete && openNode ? openNode.id : null;\n\n const caretPath = new Set<number>();\n let cursor =\n caretTargetNodeId == null ? undefined : nodeById.get(caretTargetNodeId);\n while (cursor) {\n caretPath.add(cursor.id);\n cursor =\n cursor.parentId == null ? undefined : nodeById.get(cursor.parentId);\n }\n\n const context: BuildContext = {\n nodeById,\n citations: state.citations,\n caretTargetNodeId,\n caretPath,\n nodeClassNames: options.nodeClassNames,\n };\n const rootNode =\n state.rootId == null ? undefined : nodeById.get(state.rootId);\n\n return {\n root: rootNode ? buildNode(rootNode, context) : null,\n openNode,\n isComplete: state.isComplete,\n };\n}\n\n/**\n * The render tree produced by {@link buildStreamingMarkdownRenderTree}.\n * @public\n */\nexport type StreamingMarkdownRenderTree = ReturnType<\n typeof buildStreamingMarkdownRenderTree\n>;\n"],"mappings":"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"}
|