typewright 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/SPEC.md +327 -0
  4. package/dist/chunk-CZQO7TTL.js +1533 -0
  5. package/dist/chunk-CZQO7TTL.js.map +1 -0
  6. package/dist/chunk-KNEKNZXK.js +286 -0
  7. package/dist/chunk-KNEKNZXK.js.map +1 -0
  8. package/dist/chunk-M6IVEMXO.js +1398 -0
  9. package/dist/chunk-M6IVEMXO.js.map +1 -0
  10. package/dist/chunk-NJ7PJKHN.js +652 -0
  11. package/dist/chunk-NJ7PJKHN.js.map +1 -0
  12. package/dist/commands-Z3ndUSza.d.cts +221 -0
  13. package/dist/commands-Z3ndUSza.d.ts +221 -0
  14. package/dist/core/index.cjs +2952 -0
  15. package/dist/core/index.cjs.map +1 -0
  16. package/dist/core/index.d.cts +410 -0
  17. package/dist/core/index.d.ts +410 -0
  18. package/dist/core/index.js +4 -0
  19. package/dist/core/index.js.map +1 -0
  20. package/dist/mdx/index.cjs +662 -0
  21. package/dist/mdx/index.cjs.map +1 -0
  22. package/dist/mdx/index.d.cts +252 -0
  23. package/dist/mdx/index.d.ts +252 -0
  24. package/dist/mdx/index.js +3 -0
  25. package/dist/mdx/index.js.map +1 -0
  26. package/dist/react/index.cjs +7439 -0
  27. package/dist/react/index.cjs.map +1 -0
  28. package/dist/react/index.d.cts +140 -0
  29. package/dist/react/index.d.ts +140 -0
  30. package/dist/react/index.js +3644 -0
  31. package/dist/react/index.js.map +1 -0
  32. package/dist/streaming/index.cjs +1494 -0
  33. package/dist/streaming/index.cjs.map +1 -0
  34. package/dist/streaming/index.d.cts +64 -0
  35. package/dist/streaming/index.d.ts +64 -0
  36. package/dist/streaming/index.js +4 -0
  37. package/dist/streaming/index.js.map +1 -0
  38. package/dist/types-CX1GOx0Y.d.cts +319 -0
  39. package/dist/types-CX1GOx0Y.d.ts +319 -0
  40. package/package.json +128 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/unified.ts","../src/core/fold.ts","../src/core/commands.ts","../src/core/text.ts","../src/core/highlight.ts","../src/core/comments.ts","../src/core/table.ts","../src/core/index.ts"],"names":["lineStart","t"],"mappings":"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","file":"chunk-CZQO7TTL.js","sourcesContent":["/**\n * Unified (Obsidian-style live-preview) source-revealing logic.\n *\n * In `unified` mode the formatting renders inline, but the raw syntax markers\n * (a heading's `### `, an emphasis `*`, a link's `](url)`, …) are hidden UNLESS\n * the caret/selection is on top of them — then they reveal so you can edit the\n * source. This module is pure and offset-exact: it maps the AST to the set of\n * hideable marker ranges (`collectMarkers`) and decides which stay hidden for a\n * given selection (`hiddenMarkers`). It never mutates the tree or the string.\n */\n\nimport { walk } from './ast';\nimport type { Document, Pos } from './ast';\n\n/**\n * A hideable syntax-marker range: `[from, to)` with a `kind` tag.\n *\n * `kind` is an open string (not a closed union) so new marker families can be\n * added without a breaking type change. The kinds currently emitted are\n * `heading`, `emphasis`, `strong`, `strike`, `code`, `link`, `image`,\n * `listMarker`, `math`, `footnoteRef`, `fence` and `blockquote`.\n */\nexport interface Marker extends Pos {\n kind: string;\n}\n\n/**\n * Every hideable syntax-marker range in the document, in document order.\n *\n * Covers: heading `#… ` prefixes, the two emphasis/strong/strike delimiter runs\n * on each side, inline-code backtick fences, link `[`/`](`/url/`)` pieces, the\n * image `!` (plus its bracket/paren pieces), list-item markers, inline-math `$`\n * (or `$$`) delimiters, and footnote-reference `[^`/`]` brackets.\n *\n * When the original `source` string is supplied it additionally emits the\n * `fence` (opening + closing fenced-code lines) and `blockquote` (the leading\n * `>` run on each quoted line) markers — these need the raw text to be\n * offset-exact, so they are omitted when `source` is not passed (keeping the\n * source-free call identical to before). Always pure; never mutates.\n */\nexport function collectMarkers(doc: Document, source?: string): Marker[] {\n const markers: Marker[] = [];\n const push = (from: number, to: number, kind: string): void => {\n if (to > from) markers.push({ from, to, kind });\n };\n\n walk(doc, (node) => {\n switch (node.type) {\n case 'heading': {\n // '#… ' prefix up to the start of content.\n push(node.from, node.contentFrom, 'heading');\n break;\n }\n case 'emphasis':\n case 'strong':\n case 'strikethrough': {\n const kind = node.type === 'strikethrough' ? 'strike' : node.type;\n const kids = node.children;\n const first = kids[0];\n const last = kids[kids.length - 1];\n const innerFrom = first ? first.from : node.to;\n const innerTo = last ? last.to : node.from;\n push(node.from, innerFrom, kind); // opening delimiter run\n push(innerTo, node.to, kind); // closing delimiter run\n break;\n }\n case 'inlineCode': {\n const ticks = Math.max(1, node.ticks);\n const openTo = Math.min(node.from + ticks, node.to);\n const closeFrom = Math.max(node.to - ticks, openTo);\n push(node.from, openTo, 'code'); // opening backtick fence\n push(closeFrom, node.to, 'code'); // closing backtick fence\n break;\n }\n case 'link': {\n const kids = node.children;\n const last = kids[kids.length - 1];\n const textEnd = last ? last.to : node.from + 1;\n const midTo = Math.min(textEnd + 2, node.to);\n push(node.from, Math.min(node.from + 1, node.to), 'link'); // '['\n push(textEnd, midTo, 'link'); // ']('\n push(midTo, node.to - 1, 'link'); // url (+ optional title)\n push(Math.max(node.to - 1, node.from), node.to, 'link'); // ')'\n break;\n }\n case 'image': {\n const bracketOpen = node.from + 1;\n const altStart = bracketOpen + 1;\n const altEnd = Math.min(altStart + node.alt.length, node.to);\n const midTo = Math.min(altEnd + 2, node.to);\n push(node.from, Math.min(node.from + 1, node.to), 'image'); // '!'\n push(bracketOpen, Math.min(bracketOpen + 1, node.to), 'image'); // '['\n push(altEnd, midTo, 'image'); // ']('\n push(midTo, node.to - 1, 'image'); // url (+ optional title)\n push(Math.max(node.to - 1, node.from), node.to, 'image'); // ')'\n break;\n }\n case 'listItem': {\n // The list marker up to the start of item content (`- `, `1. `, `- [x] `).\n push(node.from, node.contentFrom, 'listMarker');\n break;\n }\n case 'math': {\n // The `$` (inline) / `$$` (display) fences on each side of the source.\n const delim = node.display ? 2 : 1;\n const openTo = Math.min(node.from + delim, node.to);\n const closeFrom = Math.max(node.to - delim, openTo);\n push(node.from, openTo, 'math'); // opening `$`/`$$`\n push(closeFrom, node.to, 'math'); // closing `$`/`$$`\n break;\n }\n case 'footnoteRef': {\n // `[^` opener and `]` closer; the id between them stays as content.\n const openTo = Math.min(node.from + 2, node.to);\n const closeFrom = Math.max(node.to - 1, openTo);\n push(node.from, openTo, 'footnoteRef'); // `[^`\n push(closeFrom, node.to, 'footnoteRef'); // `]`\n break;\n }\n case 'codeBlock': {\n // Only *fenced* blocks have marker lines (indented code has none), and\n // we need the raw text to locate the fence lines offset-exactly.\n if (!source || !node.fenced) break;\n // Opening fence line: the ``` `` ``/`~~~` run + info string, up to the\n // end of that first source line (the trailing newline is excluded).\n let openTo = source.indexOf('\\n', node.from);\n if (openTo === -1 || openTo > node.to) openTo = node.to;\n if (openTo > node.from && source[openTo - 1] === '\\r') openTo--;\n push(node.from, openTo, 'fence'); // opening fence line\n // Closing fence line: the block's last source line, emitted only when it\n // is a real closing fence. An unterminated fence's last line is content\n // (the parser would have closed on a genuine fence line), so the regex\n // check never false-fires; a container-nested close that does not sit at\n // the physical line start simply isn't emitted (never a wrong offset).\n const closeStart = source.lastIndexOf('\\n', node.to - 1) + 1;\n if (closeStart > node.from) {\n const closeText = source.slice(closeStart, node.to);\n const cm = /^( {0,3})(`{3,}|~{3,}) *$/.exec(closeText);\n const om = /^ {0,3}([`~])/.exec(source.slice(node.from, openTo));\n if (cm && om && cm[2]![0] === om[1]) push(closeStart, node.to, 'fence'); // closing fence line\n }\n break;\n }\n case 'blockquote': {\n if (!source) break;\n // Emit the leading `>` run per line only for a *root* blockquote whose\n // first line starts at a physical line boundary. For such a blockquote\n // every line in [from,to) begins with its quote run, which we can read\n // directly and offset-exactly. A blockquote nested inside another (its\n // `from` sits after an outer `>` prefix) is skipped — its prefixes are\n // already covered by the outer root's full per-line run.\n const lineStart = source.lastIndexOf('\\n', node.from - 1) + 1;\n if (lineStart !== node.from) break;\n let p = node.from;\n while (p < node.to) {\n let end = source.indexOf('\\n', p);\n if (end === -1 || end > node.to) end = node.to;\n // The stacked quote prefix on this line: `( {0,3}> ?)+`.\n const qm = /^(?: {0,3}> ?)+/.exec(source.slice(p, end));\n if (qm) push(p, p + qm[0].length, 'blockquote');\n p = end + 1; // step over the newline; exits when end === node.to\n }\n break;\n }\n }\n return true;\n });\n\n return markers;\n}\n\n/**\n * The markers that stay HIDDEN for a given selection: those whose `[from, to)`\n * does NOT intersect the selection widened by 1 on each side. Markers that DO\n * intersect are revealed (returned excluded), so the caret can edit the raw\n * syntax it sits on — the live-preview reveal rule.\n *\n * `source` is forwarded to {@link collectMarkers} so the fence/blockquote\n * markers participate in the reveal too; omit it to keep the source-free set.\n * The selection filter itself is unchanged.\n */\nexport function hiddenMarkers(\n doc: Document,\n sel: { from: number; to: number },\n source?: string,\n): Marker[] {\n const lo = Math.min(sel.from, sel.to) - 1;\n const hi = Math.max(sel.from, sel.to) + 1;\n // Half-open overlap of marker [from,to) with widened selection [lo,hi).\n const intersects = (m: Marker): boolean => m.from < hi && lo < m.to;\n return collectMarkers(doc, source).filter((m) => !intersects(m));\n}\n\n/**\n * Index into `doc.children` of the top-level block whose inclusive `[from, to]`\n * range contains `offset`, or -1 when the offset falls in a gap between blocks.\n */\nexport function activeBlockIndex(doc: Document, offset: number): number {\n const blocks = doc.children;\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n if (b && offset >= b.from && offset <= b.to) return i;\n }\n return -1;\n}\n","/**\n * Heading-based folding.\n *\n * A heading folds away everything from the end of its line down to (but not\n * including) the next heading of the same or higher level — the standard\n * \"collapse a section\" affordance. Pure and offset-exact.\n */\n\nimport type { Document } from './ast';\n\n/** A foldable region owned by a heading. `[from, to)` is the collapsible body. */\nexport interface FoldRange {\n /** Offset where the owning heading starts (its `#`). */\n headingFrom: number;\n /** The heading's level (1–6). */\n level: number;\n /** Start of the collapsible body — the end of the heading line. */\n from: number;\n /** End of the collapsible body — the next same-or-higher heading, or doc end. */\n to: number;\n}\n\n/**\n * One `FoldRange` per top-level heading: `from` is the heading node's `to` (end\n * of the heading line), `to` is the `from` of the next heading whose level is\n * `<=` this heading's level (or the document's `to` if there is none). Ranges\n * with an empty body (`to <= from`) are omitted.\n */\nexport function headingFoldRanges(doc: Document): FoldRange[] {\n const blocks = doc.children;\n const ranges: FoldRange[] = [];\n\n for (let i = 0; i < blocks.length; i++) {\n const h = blocks[i];\n if (!h || h.type !== 'heading') continue;\n\n let to = doc.to;\n for (let j = i + 1; j < blocks.length; j++) {\n const n = blocks[j];\n if (n && n.type === 'heading' && n.level <= h.level) {\n to = n.from;\n break;\n }\n }\n\n const from = h.to;\n if (to > from) {\n ranges.push({ headingFrom: h.from, level: h.level, from, to });\n }\n }\n\n return ranges;\n}\n","/**\n * Editing commands — pure transforms over `(text, selection)` used by the\n * formatting toolbar and keyboard shortcuts. Each returns the new text and the\n * new selection, so the caller (edit textarea / unified active block) can apply\n * it and restore the caret. Pure and framework-free — fully unit-testable.\n */\n\nexport type Command =\n | 'bold'\n | 'italic'\n | 'strikethrough'\n | 'inlineCode'\n | 'link'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'heading4'\n | 'heading5'\n | 'heading6'\n | 'bulletList'\n | 'orderedList'\n | 'taskList'\n | 'quote'\n | 'horizontalRule'\n | 'codeBlock'\n | 'table';\n\n/** Metadata describing a command for enumerable surfaces (toolbar, palette, keymap). */\nexport interface CommandMeta {\n id: Command;\n label: string;\n /** Display shortcut (e.g. `⌘B`) when one is bound; omitted otherwise. */\n kbd?: string;\n group: 'inline' | 'block' | 'insert';\n}\n\n/**\n * The single source of truth enumerating every command — consumed by the\n * formatting toolbar, the command palette, and the keymap. Plain data, no side\n * effects; one entry per `Command` id (kept exhaustive by the `applyCommand`\n * `never` guard, which forces new ids to exist before they can be listed here).\n */\nexport const COMMANDS: readonly CommandMeta[] = [\n { id: 'bold', label: 'Bold', kbd: '⌘B', group: 'inline' },\n { id: 'italic', label: 'Italic', kbd: '⌘I', group: 'inline' },\n { id: 'strikethrough', label: 'Strikethrough', group: 'inline' },\n { id: 'inlineCode', label: 'Inline Code', kbd: '⌘E', group: 'inline' },\n { id: 'link', label: 'Link', kbd: '⌘K', group: 'inline' },\n { id: 'heading1', label: 'Heading 1', group: 'block' },\n { id: 'heading2', label: 'Heading 2', group: 'block' },\n { id: 'heading3', label: 'Heading 3', group: 'block' },\n { id: 'heading4', label: 'Heading 4', group: 'block' },\n { id: 'heading5', label: 'Heading 5', group: 'block' },\n { id: 'heading6', label: 'Heading 6', group: 'block' },\n { id: 'bulletList', label: 'Bullet List', group: 'block' },\n { id: 'orderedList', label: 'Ordered List', group: 'block' },\n { id: 'taskList', label: 'Task List', group: 'block' },\n { id: 'quote', label: 'Quote', group: 'block' },\n { id: 'horizontalRule', label: 'Horizontal Rule', group: 'insert' },\n { id: 'codeBlock', label: 'Code Block', group: 'insert' },\n { id: 'table', label: 'Table', group: 'insert' },\n];\n\nexport interface Sel {\n from: number;\n to: number;\n}\n\nexport interface CommandResult {\n text: string;\n selection: Sel;\n}\n\nfunction norm(sel: Sel): Sel {\n return { from: Math.min(sel.from, sel.to), to: Math.max(sel.from, sel.to) };\n}\n\n/** Toggle-wrap the selection in a symmetric inline marker (e.g. `**`). */\nfunction toggleWrap(text: string, sel: Sel, marker: string): CommandResult {\n const len = marker.length;\n const { from, to } = norm(sel);\n\n // already wrapped just OUTSIDE the selection → unwrap\n if (from >= len && text.slice(from - len, from) === marker && text.slice(to, to + len) === marker) {\n const t = text.slice(0, from - len) + text.slice(from, to) + text.slice(to + len);\n return { text: t, selection: { from: from - len, to: to - len } };\n }\n\n const selected = text.slice(from, to);\n\n // already wrapped INSIDE the selection → unwrap\n if (selected.length >= 2 * len && selected.startsWith(marker) && selected.endsWith(marker)) {\n const inner = selected.slice(len, selected.length - len);\n const t = text.slice(0, from) + inner + text.slice(to);\n return { text: t, selection: { from, to: from + inner.length } };\n }\n\n // wrap\n const t = text.slice(0, from) + marker + selected + marker + text.slice(to);\n if (from === to) return { text: t, selection: { from: from + len, to: from + len } };\n return { text: t, selection: { from: from + len, to: to + len } };\n}\n\nfunction insertLink(text: string, sel: Sel): CommandResult {\n const { from, to } = norm(sel);\n const label = text.slice(from, to) || 'text';\n const url = 'https://';\n const inserted = `[${label}](${url})`;\n const t = text.slice(0, from) + inserted + text.slice(to);\n const urlStart = from + label.length + 3; // '[' + label + '](' = len + 3\n return { text: t, selection: { from: urlStart, to: urlStart + url.length } };\n}\n\nconst HEADING_RE = /^ {0,3}#{1,6}\\s+/;\nconst LIST_RE = /^ {0,3}(?:[-*+]\\s(?:\\[[ xX]\\]\\s)?|\\d+[.)]\\s)/;\nconst QUOTE_RE = /^ {0,3}>\\s?/;\n\ninterface LinePrefix {\n has: (line: string) => boolean;\n strip: (line: string) => string;\n add: (line: string, index: number) => string;\n}\n\nfunction applyLinePrefix(text: string, sel: Sel, p: LinePrefix): CommandResult {\n const { from, to } = norm(sel);\n const start = text.lastIndexOf('\\n', from - 1) + 1;\n const searchFrom = to > from ? to - 1 : to;\n let end = text.indexOf('\\n', searchFrom);\n if (end === -1) end = text.length;\n\n const lines = text.slice(start, end).split('\\n');\n const allHave = lines.every((l) => l.trim() === '' || p.has(l));\n const out = lines\n .map((l, i) => (l.trim() === '' ? l : allHave ? p.strip(l) : p.add(p.strip(l), i)))\n .join('\\n');\n\n const t = text.slice(0, start) + out + text.slice(end);\n return { text: t, selection: { from: start, to: start + out.length } };\n}\n\nfunction stripAllPrefixes(line: string): string {\n return line.replace(HEADING_RE, '').replace(LIST_RE, '').replace(QUOTE_RE, '');\n}\n\nfunction insertBlock(text: string, sel: Sel, block: string, selectInner?: [number, number]): CommandResult {\n const { from, to } = norm(sel);\n const before = text.slice(0, from);\n const after = text.slice(to);\n const lead = before === '' || before.endsWith('\\n\\n') ? '' : before.endsWith('\\n') ? '\\n' : '\\n\\n';\n const trail = after === '' || after.startsWith('\\n\\n') ? '' : after.startsWith('\\n') ? '\\n' : '\\n\\n';\n const insertedAt = from + lead.length;\n const t = before + lead + block + trail + after;\n const selection: Sel = selectInner\n ? { from: insertedAt + selectInner[0], to: insertedAt + selectInner[1] }\n : { from: insertedAt, to: insertedAt + block.length };\n return { text: t, selection };\n}\n\nexport function applyCommand(text: string, sel: Sel, cmd: Command): CommandResult {\n switch (cmd) {\n case 'bold':\n return toggleWrap(text, sel, '**');\n case 'italic':\n return toggleWrap(text, sel, '*');\n case 'strikethrough':\n return toggleWrap(text, sel, '~~');\n case 'inlineCode':\n return toggleWrap(text, sel, '`');\n case 'link':\n return insertLink(text, sel);\n case 'heading1':\n case 'heading2':\n case 'heading3':\n case 'heading4':\n case 'heading5':\n case 'heading6': {\n const level =\n cmd === 'heading1'\n ? 1\n : cmd === 'heading2'\n ? 2\n : cmd === 'heading3'\n ? 3\n : cmd === 'heading4'\n ? 4\n : cmd === 'heading5'\n ? 5\n : 6;\n const marker = '#'.repeat(level) + ' ';\n return applyLinePrefix(text, sel, {\n has: (l) => new RegExp(`^ {0,3}#{${level}}\\\\s`).test(l),\n strip: (l) => l.replace(HEADING_RE, ''),\n add: (l) => marker + l,\n });\n }\n case 'bulletList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}[-*+]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l) => '- ' + l,\n });\n case 'orderedList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}\\d+[.)]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l, i) => `${i + 1}. ` + l,\n });\n case 'taskList':\n return applyLinePrefix(text, sel, {\n has: (l) => /^ {0,3}[-*+]\\s\\[[ xX]\\]\\s/.test(l),\n strip: stripAllPrefixes,\n add: (l) => '- [ ] ' + l,\n });\n case 'quote':\n return applyLinePrefix(text, sel, {\n has: (l) => QUOTE_RE.test(l),\n strip: (l) => l.replace(QUOTE_RE, ''),\n add: (l) => '> ' + l,\n });\n case 'horizontalRule':\n return insertBlock(text, sel, '---');\n case 'codeBlock': {\n const selected = text.slice(norm(sel).from, norm(sel).to);\n const block = '```\\n' + selected + '\\n```';\n // place caret after the opening fence when empty\n return insertBlock(text, sel, block, selected ? undefined : [4, 4]);\n }\n case 'table': {\n const block = '| Column | Column |\\n| --- | --- |\\n| Cell | Cell |';\n return insertBlock(text, sel, block, [2, 8]); // select first header word\n }\n default: {\n const _exhaustive: never = cmd;\n return { text, selection: norm(sel) };\n }\n }\n}\n","/**\n * Document model — an immutable text container with transaction-based edits and\n * position mapping. The string is the source of truth (SPEC.md §4.1): every edit\n * is a `{from, to, insert}` change, applying one returns a NEW `TextDoc`, and\n * offsets can be mapped across a change so decorations / anchors survive edits.\n */\n\nexport interface Change {\n /** Inclusive start offset of the replaced range. */\n from: number;\n /** Exclusive end offset of the replaced range. */\n to: number;\n /** Text inserted in place of `[from, to)`. */\n insert: string;\n}\n\nexport interface LineInfo {\n /** 1-based line number. */\n number: number;\n /** Offset of the first character of the line. */\n from: number;\n /** Offset just past the last character (before the newline). */\n to: number;\n /** The line's text (without the trailing newline). */\n text: string;\n}\n\nexport interface Position {\n /** 1-based line. */\n line: number;\n /** 1-based column (UTF-16 units within the line). */\n column: number;\n}\n\nexport class TextDoc {\n readonly text: string;\n private _lineStarts: number[] | null = null;\n\n constructor(text = '') {\n this.text = text;\n }\n\n get length(): number {\n return this.text.length;\n }\n\n /** Apply one change, returning a new document. */\n apply(change: Change): TextDoc {\n const { from, to, insert } = normalize(change, this.text.length);\n return new TextDoc(this.text.slice(0, from) + insert + this.text.slice(to));\n }\n\n /**\n * Apply several changes, returning a new document. Changes are given in\n * document coordinates of THIS doc; they are applied right-to-left so earlier\n * offsets stay valid.\n */\n applyAll(changes: Change[]): TextDoc {\n const sorted = [...changes].sort((a, b) => b.from - a.from);\n let text = this.text;\n for (const c of sorted) {\n const { from, to, insert } = normalize(c, text.length);\n text = text.slice(0, from) + insert + text.slice(to);\n }\n return new TextDoc(text);\n }\n\n private lineStarts(): number[] {\n if (this._lineStarts) return this._lineStarts;\n const starts = [0];\n for (let i = 0; i < this.text.length; i++) {\n if (this.text.charCodeAt(i) === 10 /* \\n */) starts.push(i + 1);\n }\n this._lineStarts = starts;\n return starts;\n }\n\n /** Total number of lines (a trailing newline yields an extra empty line). */\n get lines(): number {\n return this.lineStarts().length;\n }\n\n /** The line (1-based) containing `offset`. */\n lineAt(offset: number): LineInfo {\n const off = clamp(offset, 0, this.text.length);\n const starts = this.lineStarts();\n // binary search for the last start <= off\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid]! <= off) lo = mid;\n else hi = mid - 1;\n }\n const from = starts[lo]!;\n const nextStart = starts[lo + 1];\n const to = nextStart === undefined ? this.text.length : nextStart - 1;\n return { number: lo + 1, from, to, text: this.text.slice(from, to) };\n }\n\n /** Line/column (both 1-based) for an offset. */\n positionAt(offset: number): Position {\n const line = this.lineAt(offset);\n return { line: line.number, column: clamp(offset, 0, this.text.length) - line.from + 1 };\n }\n\n /** Offset for a 1-based line/column. */\n offsetAt(line: number, column: number): number {\n const starts = this.lineStarts();\n const idx = clamp(line, 1, starts.length) - 1;\n const from = starts[idx]!;\n const nextStart = starts[idx + 1];\n const to = nextStart === undefined ? this.text.length : nextStart - 1;\n return clamp(from + (column - 1), from, to);\n }\n\n /**\n * Map an offset from this document's coordinates to the coordinates AFTER the\n * given change(s). `assoc` controls which side of an insertion at the offset\n * the mapped position sticks to: -1 = before (default), 1 = after.\n */\n mapOffset(offset: number, changes: Change | Change[], assoc: -1 | 1 = -1): number {\n const list = Array.isArray(changes) ? changes : [changes];\n // apply in document order; each change shifts offsets after it\n const ordered = [...list].sort((a, b) => a.from - b.from);\n let result = offset;\n for (const c of ordered) {\n const { from, to, insert } = normalize(c, Number.MAX_SAFE_INTEGER);\n const delta = insert.length - (to - from);\n if (result < from) continue;\n if (result > to) {\n result += delta;\n } else if (result === from && assoc < 0) {\n // stays at from\n } else if (result === to && assoc > 0) {\n result += delta;\n } else {\n // inside the replaced range: collapse toward the edit boundary\n result = assoc < 0 ? from : from + insert.length;\n }\n }\n return result;\n }\n\n toString(): string {\n return this.text;\n }\n}\n\nfunction normalize(change: Change, len: number): Change {\n let from = clamp(Math.min(change.from, change.to), 0, len);\n let to = clamp(Math.max(change.from, change.to), 0, len);\n return { from, to, insert: change.insert };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return n < lo ? lo : n > hi ? hi : n;\n}\n","/**\n * Native, zero-dependency syntax highlighter.\n *\n * {@link highlightToHtml} turns a fenced code block's source into an HTML\n * string with tokens wrapped in `<span class=\"tw-tok-KIND\">…</span>`. The\n * tokenizers are small, hand-written, single-pass line/char scanners — NOT\n * full grammars. They recognise the shapes that carry the most colour signal:\n * keywords, strings (including template literals), line + block comments,\n * numbers, punctuation, and a light dusting of function / type / property\n * classification.\n *\n * Safety is the load-bearing invariant: **every** character that reaches the\n * output — token content and the gaps between tokens alike — is HTML-escaped\n * through the local {@link escapeHtml}. A `<script>` (or `<img onerror=…>`)\n * embedded in the code therefore always appears inert/escaped, never as live\n * markup. This mirrors the sanitizing contract of `render.ts` so the\n * highlighter can be handed straight to the renderer without widening the\n * attack surface.\n *\n * Complexity is O(n) in the source length. There are no unbounded-backtracking\n * regexes; scanning advances the cursor monotonically, so pathological input\n * (huge whitespace runs, unterminated strings/comments) is safe.\n */\n\n/** The token classes we emit. `KIND` in `tw-tok-KIND`. */\ntype TokenKind =\n | 'keyword'\n | 'string'\n | 'comment'\n | 'number'\n | 'punct'\n | 'fn'\n | 'type'\n | 'prop';\n\n/* ------------------------------------------------------------------ *\n * Escaping + span emission\n * ------------------------------------------------------------------ */\n\n/**\n * Escape the four characters that matter in HTML text / double-quoted attrs\n * (`&`, `<`, `>`, `\"`). This is the security boundary: nothing leaves this\n * module without passing through here.\n */\nfunction escapeHtml(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n switch (ch) {\n case 38 /* & */:\n out += '&amp;';\n break;\n case 60 /* < */:\n out += '&lt;';\n break;\n case 62 /* > */:\n out += '&gt;';\n break;\n case 34 /* \" */:\n out += '&quot;';\n break;\n default:\n out += value.charAt(i);\n }\n }\n return out;\n}\n\n/** Wrap escaped `text` in a token span. */\nfunction span(kind: TokenKind, text: string): string {\n return `<span class=\"tw-tok-${kind}\">${escapeHtml(text)}</span>`;\n}\n\n/* ------------------------------------------------------------------ *\n * Character predicates (charCode based, O(1))\n * ------------------------------------------------------------------ */\n\nfunction isDigit(ch: number): boolean {\n return ch >= 48 && ch <= 57;\n}\n\nfunction isIdentStart(ch: number): boolean {\n return (\n (ch >= 65 && ch <= 90) || // A-Z\n (ch >= 97 && ch <= 122) || // a-z\n ch === 95 || // _\n ch === 36 // $\n );\n}\n\nfunction isIdentPart(ch: number): boolean {\n return isIdentStart(ch) || isDigit(ch);\n}\n\n/** Chars that may appear inside a numeric literal (hex/oct/bin/float/sep). */\nfunction isNumberPart(ch: number): boolean {\n return (\n isDigit(ch) ||\n ch === 46 || // .\n ch === 95 || // _ separator\n ch === 120 || // x\n ch === 88 || // X\n ch === 111 || // o\n ch === 79 || // O\n ch === 98 || // b\n ch === 66 || // B\n (ch >= 97 && ch <= 102) || // a-f (hex + exponent 'e')\n (ch >= 65 && ch <= 70) // A-F (hex + exponent 'E')\n );\n}\n\n/** Punctuation we colour in C-like languages. */\nfunction isPunct(ch: number): boolean {\n switch (ch) {\n case 123: // {\n case 125: // }\n case 40: // (\n case 41: // )\n case 91: // [\n case 93: // ]\n case 60: // <\n case 62: // >\n case 61: // =\n case 43: // +\n case 45: // -\n case 42: // *\n case 47: // /\n case 37: // %\n case 33: // !\n case 63: // ?\n case 58: // :\n case 59: // ;\n case 44: // ,\n case 46: // .\n case 38: // &\n case 124: // |\n case 94: // ^\n case 126: // ~\n case 64: // @\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Scan back from `i-1` to the first non-whitespace char code (0 if none).\n * Amortised O(n) across a scan because each gap is walked at most once.\n */\nfunction prevNonSpace(code: string, i: number): number {\n let k = i - 1;\n while (k >= 0) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9 || c === 10 || c === 13) {\n k--;\n continue;\n }\n return c;\n }\n return 0;\n}\n\n/**\n * Consume a quoted string starting at `start` (the opening quote). Backslash\n * escapes are skipped. Non-template strings terminate at an unescaped newline\n * (so an unterminated `\"` can't swallow the rest of the file). Returns the\n * exclusive end index.\n */\nfunction consumeString(code: string, start: number, quote: number): number {\n const n = code.length;\n let j = start + 1;\n while (j < n) {\n const c = code.charCodeAt(j);\n if (c === 92 /* \\ */) {\n j += 2;\n continue;\n }\n if (c === quote) {\n return j + 1;\n }\n if (quote !== 96 /* ` */ && c === 10 /* \\n */) {\n return j; // unterminated: stop before the newline\n }\n j++;\n }\n return n;\n}\n\n/* ------------------------------------------------------------------ *\n * Keyword / type tables\n * ------------------------------------------------------------------ */\n\n// prettier-ignore\nconst JS_KEYWORDS = new Set([\n 'abstract', 'any', 'as', 'asserts', 'async', 'await', 'break', 'case',\n 'catch', 'class', 'const', 'continue', 'debugger', 'declare', 'default',\n 'delete', 'do', 'else', 'enum', 'export', 'extends', 'false', 'finally',\n 'for', 'from', 'function', 'get', 'if', 'implements', 'import', 'in',\n 'infer', 'instanceof', 'interface', 'is', 'keyof', 'let', 'namespace',\n 'new', 'null', 'of', 'override', 'package', 'private', 'protected',\n 'public', 'readonly', 'return', 'satisfies', 'set', 'static', 'super',\n 'switch', 'this', 'throw', 'true', 'try', 'type', 'typeof', 'undefined',\n 'var', 'void', 'while', 'with', 'yield',\n]);\n\n// prettier-ignore\nconst TS_TYPES = new Set([\n 'string', 'number', 'boolean', 'object', 'symbol', 'bigint', 'unknown',\n 'never', 'Array', 'Record', 'Promise', 'Partial', 'Required', 'Readonly',\n 'Pick', 'Omit', 'Map', 'Set', 'WeakMap', 'WeakSet', 'Date', 'RegExp',\n 'Error',\n]);\n\n// prettier-ignore\nconst PY_KEYWORDS = new Set([\n 'and', 'as', 'assert', 'async', 'await', 'break', 'case', 'class',\n 'continue', 'def', 'del', 'elif', 'else', 'except', 'False', 'finally',\n 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'match',\n 'None', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'True', 'try',\n 'while', 'with', 'yield',\n]);\n\n// prettier-ignore\nconst BASH_KEYWORDS = new Set([\n 'if', 'then', 'else', 'elif', 'fi', 'for', 'while', 'until', 'do', 'done',\n 'case', 'esac', 'in', 'function', 'select', 'time', 'return', 'break',\n 'continue', 'echo', 'cd', 'export', 'local', 'read', 'printf', 'source',\n 'exit', 'set', 'unset', 'test', 'eval', 'exec', 'trap', 'shift',\n]);\n\n// prettier-ignore\nconst SQL_KEYWORDS = new Set([\n 'add', 'all', 'alter', 'and', 'as', 'asc', 'auto_increment', 'begin',\n 'between', 'by', 'case', 'column', 'commit', 'constraint', 'create',\n 'cross', 'default', 'delete', 'desc', 'distinct', 'drop', 'else', 'end',\n 'exists', 'foreign', 'from', 'full', 'group', 'having', 'if', 'in',\n 'index', 'inner', 'insert', 'into', 'is', 'join', 'key', 'left', 'like',\n 'limit', 'not', 'null', 'offset', 'on', 'or', 'order', 'outer', 'primary',\n 'references', 'right', 'rollback', 'select', 'set', 'table', 'then',\n 'union', 'unique', 'update', 'values', 'view', 'when', 'where', 'with',\n // common types / functions\n 'int', 'integer', 'bigint', 'smallint', 'decimal', 'numeric', 'float',\n 'real', 'double', 'char', 'varchar', 'text', 'boolean', 'bool', 'date',\n 'datetime', 'timestamp', 'count', 'sum', 'avg', 'min', 'max', 'coalesce',\n]);\n\n/* ------------------------------------------------------------------ *\n * C-like (javascript / typescript / jsx / tsx)\n * ------------------------------------------------------------------ */\n\nfunction highlightCLike(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let prevWord = '';\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // line comment //\n if (ch === 47 /* / */ && code.charCodeAt(i + 1) === 47) {\n let j = i + 2;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42 /* * */) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings: \" ' `\n if (ch === 34 || ch === 39 || ch === 96) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // identifier / keyword / type / fn / prop\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (JS_KEYWORDS.has(word)) {\n out += span('keyword', word);\n } else if (TS_TYPES.has(word)) {\n out += span('type', word);\n } else {\n // look ahead past spaces for a call paren\n let k = j;\n while (k < n) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9) {\n k++;\n continue;\n }\n break;\n }\n const isCall = code.charCodeAt(k) === 40; // (\n if (prevNonSpace(code, i) === 46 /* . */) {\n out += span('prop', word);\n } else if (prevWord === 'class' || prevWord === 'interface') {\n out += span('type', word);\n } else if (isCall || prevWord === 'function') {\n out += span('fn', word);\n } else {\n out += escapeHtml(word);\n }\n }\n prevWord = word;\n i = j;\n continue;\n }\n\n // punctuation\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n // whitespace / anything else\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * JSON\n * ------------------------------------------------------------------ */\n\nfunction highlightJson(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // string — key (followed by ':') vs value\n if (ch === 34 /* \" */) {\n const end = consumeString(code, i, 34);\n const text = code.slice(i, end);\n // peek past whitespace for a colon\n let k = end;\n while (k < n) {\n const c = code.charCodeAt(k);\n if (c === 32 || c === 9 || c === 10 || c === 13) {\n k++;\n continue;\n }\n break;\n }\n out += span(code.charCodeAt(k) === 58 /* : */ ? 'prop' : 'string', text);\n i = end;\n continue;\n }\n\n // number (with optional leading -)\n if (isDigit(ch) || (ch === 45 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // literals true / false / null\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (word === 'true' || word === 'false' || word === 'null') {\n out += span('keyword', word);\n } else {\n out += escapeHtml(word);\n }\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * CSS\n * ------------------------------------------------------------------ */\n\nfunction highlightCss(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let depth = 0;\n let beforeColon = true; // property-name position inside a block\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // at-rule\n if (ch === 64 /* @ */) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n out += span('keyword', code.slice(i, j));\n i = j;\n continue;\n }\n\n // structural punctuation controlling the prop/value state machine\n if (ch === 123 /* { */) {\n out += span('punct', '{');\n depth++;\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 125 /* } */) {\n out += span('punct', '}');\n if (depth > 0) depth--;\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 59 /* ; */) {\n out += span('punct', ';');\n beforeColon = true;\n i++;\n continue;\n }\n if (ch === 58 /* : */) {\n out += span('punct', ':');\n beforeColon = false;\n i++;\n continue;\n }\n\n // number (+ trailing unit stays plain)\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // identifier-ish run (property, value keyword, selector fragment)\n if (isIdentStart(ch) || ch === 45 /* - */) {\n let j = i + 1;\n while (\n j < n &&\n (isIdentPart(code.charCodeAt(j)) || code.charCodeAt(j) === 45)\n ) {\n j++;\n }\n const word = code.slice(i, j);\n if (depth > 0 && beforeColon) {\n out += span('prop', word);\n } else {\n out += escapeHtml(word);\n }\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * HTML\n * ------------------------------------------------------------------ */\n\nfunction isTagChar(ch: number): boolean {\n return isIdentPart(ch) || ch === 45 /* - */ || ch === 58 /* : */;\n}\n\nfunction highlightHtml(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment <!-- -->\n if (ch === 60 && code.startsWith('<!--', i)) {\n const idx = code.indexOf('-->', i + 4);\n const j = idx === -1 ? n : idx + 3;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // tag\n if (ch === 60 /* < */) {\n let j = i + 1;\n if (code.charCodeAt(j) === 47 /* / */) j++;\n out += span('punct', code.slice(i, j));\n // tag name\n const nameStart = j;\n while (j < n && isTagChar(code.charCodeAt(j))) j++;\n if (j > nameStart) out += span('keyword', code.slice(nameStart, j));\n // attributes up to '>'\n while (j < n && code.charCodeAt(j) !== 62 /* > */) {\n const c = code.charCodeAt(j);\n if (c === 34 || c === 39) {\n const end = consumeString(code, j, c);\n out += span('string', code.slice(j, end));\n j = end;\n continue;\n }\n if (c === 61 /* = */) {\n out += span('punct', '=');\n j++;\n continue;\n }\n if (isTagChar(c)) {\n const a = j;\n while (j < n && isTagChar(code.charCodeAt(j))) j++;\n out += span('prop', code.slice(a, j));\n continue;\n }\n out += escapeHtml(code.charAt(j));\n j++;\n }\n if (j < n && code.charCodeAt(j) === 62) {\n out += span('punct', '>');\n j++;\n }\n i = j;\n continue;\n }\n\n // entity &name; / &#123;\n if (ch === 38 /* & */) {\n let j = i + 1;\n while (\n j < n &&\n j - i < 12 &&\n code.charCodeAt(j) !== 59 &&\n (isIdentPart(code.charCodeAt(j)) || code.charCodeAt(j) === 35)\n ) {\n j++;\n }\n if (j < n && code.charCodeAt(j) === 59) {\n out += span('type', code.slice(i, j + 1));\n i = j + 1;\n continue;\n }\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Markdown\n * ------------------------------------------------------------------ */\n\nfunction highlightMarkdownLine(line: string): string {\n const n = line.length;\n let out = '';\n let i = 0;\n\n // leading whitespace\n while (i < n && (line.charCodeAt(i) === 32 || line.charCodeAt(i) === 9)) {\n out += line.charAt(i);\n i++;\n }\n\n // heading marker: #{1,6} followed by space\n if (line.charCodeAt(i) === 35 /* # */) {\n let h = i;\n while (h < n && line.charCodeAt(h) === 35) h++;\n if (h - i <= 6 && (h >= n || line.charCodeAt(h) === 32)) {\n out += span('keyword', line.slice(i, h));\n i = h;\n }\n } else if (line.charCodeAt(i) === 62 /* > */) {\n // blockquote marker\n out += span('keyword', '>');\n i++;\n } else {\n // list marker: - + * or `N.`\n const c = line.charCodeAt(i);\n if ((c === 45 || c === 43 || c === 42) && line.charCodeAt(i + 1) === 32) {\n out += span('punct', line.charAt(i));\n i++;\n }\n }\n\n // inline scan of the remainder\n while (i < n) {\n const ch = line.charCodeAt(i);\n\n // inline code `…`\n if (ch === 96 /* ` */) {\n let j = i + 1;\n while (j < n && line.charCodeAt(j) !== 96) j++;\n j = Math.min(n, j + 1);\n out += span('string', line.slice(i, j));\n i = j;\n continue;\n }\n\n // emphasis markers ** * _ ~~\n if (ch === 42 /* * */ || ch === 95 /* _ */ || ch === 126 /* ~ */) {\n let j = i;\n while (j < n && line.charCodeAt(j) === ch) j++;\n out += span('punct', line.slice(i, j));\n i = j;\n continue;\n }\n\n // link / image punctuation\n if (ch === 91 || ch === 93 || ch === 40 || ch === 41) {\n out += span('punct', line.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(line.charAt(i));\n i++;\n }\n\n return out;\n}\n\nfunction highlightMarkdown(code: string): string {\n const lines = code.split('\\n');\n let out = '';\n for (let i = 0; i < lines.length; i++) {\n if (i > 0) out += '\\n';\n out += highlightMarkdownLine(lines[i] ?? '');\n }\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Python\n * ------------------------------------------------------------------ */\n\nfunction highlightPython(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n let prevWord = '';\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment # …\n if (ch === 35 /* # */) {\n let j = i + 1;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // triple-quoted string\n if (\n (ch === 34 || ch === 39) &&\n code.charCodeAt(i + 1) === ch &&\n code.charCodeAt(i + 2) === ch\n ) {\n const marker = code.slice(i, i + 3);\n const idx = code.indexOf(marker, i + 3);\n const j = idx === -1 ? n : idx + 3;\n out += span('string', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // single/double string\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n prevWord = '';\n continue;\n }\n\n // decorator @name\n if (ch === 64 /* @ */ && isIdentStart(code.charCodeAt(i + 1))) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n out += span('keyword', code.slice(i, j));\n i = j;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n prevWord = '';\n continue;\n }\n\n // identifier / keyword / fn\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n if (PY_KEYWORDS.has(word)) {\n out += span('keyword', word);\n } else if (prevWord === 'def') {\n out += span('fn', word);\n } else if (prevWord === 'class') {\n out += span('type', word);\n } else {\n // call?\n let k = j;\n while (k < n && (code.charCodeAt(k) === 32 || code.charCodeAt(k) === 9))\n k++;\n out +=\n code.charCodeAt(k) === 40 ? span('fn', word) : escapeHtml(word);\n }\n prevWord = word;\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Bash\n * ------------------------------------------------------------------ */\n\nfunction highlightBash(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // comment # … (only when the '#' begins a word)\n if (ch === 35 /* # */) {\n const prev = i > 0 ? code.charCodeAt(i - 1) : 10;\n if (\n i === 0 ||\n prev === 32 ||\n prev === 9 ||\n prev === 10 ||\n prev === 13 ||\n prev === 59 /* ; */\n ) {\n let j = i + 1;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n }\n\n // strings\n if (ch === 34 || ch === 39) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // variable $name / ${name} / $1\n if (ch === 36 /* $ */) {\n let j = i + 1;\n if (code.charCodeAt(j) === 123 /* { */) {\n while (j < n && code.charCodeAt(j) !== 125 /* } */) j++;\n j = Math.min(n, j + 1);\n } else {\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n }\n out += span('prop', code.slice(i, j));\n i = j;\n continue;\n }\n\n // number\n if (isDigit(ch)) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // word / keyword\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n out += BASH_KEYWORDS.has(word)\n ? span('keyword', word)\n : escapeHtml(word);\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * SQL\n * ------------------------------------------------------------------ */\n\nfunction highlightSql(code: string): string {\n const n = code.length;\n let out = '';\n let i = 0;\n\n while (i < n) {\n const ch = code.charCodeAt(i);\n\n // line comment -- …\n if (ch === 45 /* - */ && code.charCodeAt(i + 1) === 45) {\n let j = i + 2;\n while (j < n && code.charCodeAt(j) !== 10) j++;\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // block comment /* */\n if (ch === 47 && code.charCodeAt(i + 1) === 42) {\n let j = i + 2;\n while (\n j < n &&\n !(code.charCodeAt(j) === 42 && code.charCodeAt(j + 1) === 47)\n ) {\n j++;\n }\n j = Math.min(n, j + 2);\n out += span('comment', code.slice(i, j));\n i = j;\n continue;\n }\n\n // strings (single-quoted values, double-quoted identifiers)\n if (ch === 39 || ch === 34) {\n const end = consumeString(code, i, ch);\n out += span('string', code.slice(i, end));\n i = end;\n continue;\n }\n\n // number\n if (isDigit(ch) || (ch === 46 && isDigit(code.charCodeAt(i + 1)))) {\n let j = i + 1;\n while (j < n && isNumberPart(code.charCodeAt(j))) j++;\n out += span('number', code.slice(i, j));\n i = j;\n continue;\n }\n\n // keyword (case-insensitive) / identifier\n if (isIdentStart(ch)) {\n let j = i + 1;\n while (j < n && isIdentPart(code.charCodeAt(j))) j++;\n const word = code.slice(i, j);\n out += SQL_KEYWORDS.has(word.toLowerCase())\n ? span('keyword', word)\n : escapeHtml(word);\n i = j;\n continue;\n }\n\n if (isPunct(ch)) {\n out += span('punct', code.charAt(i));\n i++;\n continue;\n }\n\n out += escapeHtml(code.charAt(i));\n i++;\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------ *\n * Language resolution + dispatch\n * ------------------------------------------------------------------ */\n\n/**\n * Alias map → canonical tokenizer key. Anything absent here (and from\n * {@link TOKENIZERS}) is treated as plain text, e.g. `yaml`/`yml`.\n */\nconst ALIASES: Record<string, string> = {\n js: 'javascript',\n jsx: 'javascript',\n javascript: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n typescript: 'typescript',\n json: 'json',\n jsonc: 'json',\n json5: 'json',\n css: 'css',\n html: 'html',\n htm: 'html',\n xml: 'html',\n md: 'markdown',\n markdown: 'markdown',\n py: 'python',\n python: 'python',\n sh: 'bash',\n bash: 'bash',\n shell: 'bash',\n zsh: 'bash',\n sql: 'sql',\n};\n\nconst TOKENIZERS: Record<string, (code: string) => string> = {\n javascript: highlightCLike,\n typescript: highlightCLike,\n json: highlightJson,\n css: highlightCss,\n html: highlightHtml,\n markdown: highlightMarkdown,\n python: highlightPython,\n bash: highlightBash,\n sql: highlightSql,\n};\n\n/**\n * Highlight `code` for the given fence `info` string.\n *\n * `info` is the WHOLE fence info (e.g. `\"js {1,3}\"` or `\"ts title=foo\"`); the\n * language is the first whitespace-delimited token, lowercased, run through\n * {@link ALIASES}. Unknown / empty / unsupported languages return the escaped\n * source with no spans, so the output is always safe to inject.\n *\n * @param lang the fence info string (language + any attributes)\n * @param code the raw code block source\n * @returns HTML with `<span class=\"tw-tok-KIND\">` tokens; fully HTML-escaped.\n */\nexport function highlightToHtml(lang: string, code: string): string {\n const info = typeof lang === 'string' ? lang : '';\n const first = info.trim().split(/\\s+/)[0] ?? '';\n const key = first.toLowerCase();\n const resolved = ALIASES[key] ?? key;\n const tokenizer = TOKENIZERS[resolved];\n if (!tokenizer) return escapeHtml(code);\n return tokenizer(code);\n}\n","/**\n * Comment-anchor maintenance (plan-TW-0002 Phase A2).\n *\n * A comment thread is anchored to a text range `{from, to}`. Every time the\n * document is edited we must move that range so the highlight keeps covering\n * the same words — or drop the anchor (return `null`) when the words it pointed\n * at have been deleted. This is the first real consumer of `TextDoc.mapOffset`\n * (previously dead code) — it is built directly on top of that primitive rather\n * than re-deriving the position math here.\n */\nimport { TextDoc, type Change } from './text';\n\n/**\n * `mapOffset` is a pure function of `(offset, change, assoc)` — it never reads\n * the document text (it normalizes changes against `Number.MAX_SAFE_INTEGER`,\n * see text.ts:122-143), so a single shared empty doc is a valid host for the\n * call and we avoid allocating a `TextDoc` per invocation.\n */\nconst MAPPER = new TextDoc();\n\n/**\n * Association for the two anchor ends, in `mapOffset`'s convention\n * (text.ts:117-121): `assoc = -1` keeps the mapped offset *before* text\n * inserted exactly at it (the offset value is unchanged); `assoc = +1` pushes\n * it to *after* the inserted text (offset value += inserted length).\n *\n * We want a comment highlight to behave like a mark with a NON-inclusive start\n * and an INCLUSIVE end. Working that through the semantics above (verified\n * against the mapOffset branches):\n *\n * • `from` → +1: text typed exactly at the anchor start maps the start\n * *past* that insert, so the inserted text lands OUTSIDE the highlight —\n * \"insert exactly at 'from' stays outside\".\n * • `to` → +1: text typed exactly at the anchor end maps the end *past*\n * that insert, so the inserted text lands INSIDE the highlight —\n * \"insert exactly at 'to' extends the anchor\".\n *\n * Note the convention subtlety: under text.ts's semantics it is the +1\n * (\"after\") association — not -1 — that makes a boundary insert at `from` stay\n * *outside* the range (with -1 the start would sit before the insert and\n * swallow it). Both ends therefore map with +1: the start slides off a\n * boundary insert while the end absorbs it.\n */\nconst ASSOC_FROM: -1 | 1 = 1;\nconst ASSOC_TO: -1 | 1 = 1;\n\n/**\n * Re-anchor a comment range across a single document `change`.\n *\n * @returns the mapped `{from, to}` (always `from <= to`), or `null` when the\n * change deleted the entire anchored range.\n */\nexport function mapAnchor(\n anchor: { from: number; to: number },\n change: Change,\n): { from: number; to: number } | null {\n const from = MAPPER.mapOffset(anchor.from, change, ASSOC_FROM);\n const to = MAPPER.mapOffset(anchor.to, change, ASSOC_TO);\n\n // The anchored text is gone when the ends collapsed onto a single point AND\n // the change's deleted span `[change.from, change.to)` covered the whole\n // original anchor. The coverage guard keeps a plain boundary insert (which\n // can also make the ends equal for a zero-length anchor) from nulling out.\n const collapsed = from === to;\n const deletedWholeRange =\n change.to > change.from && change.from <= anchor.from && change.to >= anchor.to;\n if (collapsed && deletedWholeRange) return null;\n\n // mapOffset is monotonic for a fixed change/assoc, so from <= to already;\n // min/max is a cheap defensive guard.\n return { from: Math.min(from, to), to: Math.max(from, to) };\n}\n","/**\n * Pure table-editing helpers (Phase F1 of plan-TW-0002).\n *\n * These are the headless layer under the in-place table grid: no DOM, no React,\n * just string → string transforms over the offset-exact {@link Table} AST that\n * `./parser` produces. Every mutation keeps the Markdown *canonical* — a GFM\n * pipe table with a delimiter row — so `parse → mutate → parse` round-trips to\n * the same structure.\n *\n * Two edit shapes, matching the plan:\n * - **Single-cell** edits are scoped: {@link cellSourceRange} hands back a\n * cell's *exact* source range so the caller can splice only that slice.\n * - **Structural** ops (add/remove row/column, set alignment) re-serialize the\n * whole table block and return a full-block splice over `[table.from, table.to]`.\n *\n * Addressing convention (documented once, used everywhere):\n * - Rows use a **grid index**: row `0` is the header, rows `1..N` are body rows\n * (this mirrors the rendered grid, where the header is the top row).\n * - Columns are 0-based.\n *\n * The AST contract these helpers lean on (see `src/core/ast.ts:144-156`):\n * - `TableCell extends Pos` — every cell carries exact `{from,to}` UTF-16\n * offsets of its *trimmed* content (`splitRow`, `parser.ts:447-459`).\n * - `Table { from; to; align: CellAlign[]; header: TableCell[]; rows: TableCell[][] }`.\n * The delimiter row has no node of its own, so alignment edits (like every\n * structural op) re-serialize the block rather than splicing that row in place.\n */\n\nimport type { CellAlign, Pos, Table, TableCell } from './ast';\n\n/** Result of a structural (whole-block) table edit. */\nexport interface TableEdit {\n /** The full new document text after the splice. */\n text: string;\n /** A sensible caret offset into {@link text} after the edit. */\n selection: number;\n}\n\nconst clampInt = (n: number, lo: number, hi: number): number =>\n n < lo ? lo : n > hi ? hi : n;\n\n/** Canonical delimiter cell for an alignment (`---`, `:---`, `:---:`, `---:`). */\nfunction delimCell(align: CellAlign): string {\n switch (align) {\n case 'left':\n return ':---';\n case 'center':\n return ':---:';\n case 'right':\n return '---:';\n default:\n return '---';\n }\n}\n\n/**\n * A normalized, string-only view of a table: header, per-column alignment, and\n * body rows, every row widened/truncated to the header's column count. Editing\n * happens on this, then it is serialized back to canonical GFM.\n */\ninterface Grid {\n header: string[];\n align: CellAlign[];\n rows: string[][];\n}\n\nconst cellText = (text: string, cell: TableCell): string =>\n text.slice(cell.from, cell.to);\n\nconst emptyRow = (ncols: number): string[] =>\n Array.from({ length: ncols }, () => '');\n\n/** Build a rectangular {@link Grid} from a parsed table, reading raw cell source. */\nfunction tableToGrid(text: string, table: Table): Grid {\n const ncols = Math.max(1, table.header.length);\n const header = table.header.map((c) => cellText(text, c));\n while (header.length < ncols) header.push('');\n\n const align: CellAlign[] = [];\n for (let i = 0; i < ncols; i++) align.push(table.align[i] ?? null);\n\n const rows = table.rows.map((row) => {\n const cells = row.map((c) => cellText(text, c));\n while (cells.length < ncols) cells.push('');\n cells.length = ncols;\n return cells;\n });\n\n return { header, align, rows };\n}\n\n/** The cell strings that make up a given serialized line (0 header, 1 delim, ≥2 body). */\nfunction cellsForLine(grid: Grid, lineIdx: number): string[] {\n const ncols = grid.header.length;\n if (lineIdx === 0) return grid.header;\n if (lineIdx === 1) {\n const a: string[] = [];\n for (let i = 0; i < ncols; i++) a.push(delimCell(grid.align[i] ?? null));\n return a;\n }\n return grid.rows[lineIdx - 2] ?? grid.header;\n}\n\n/** Serialize the grid to canonical GFM lines: header, delimiter, then body rows. */\nfunction gridLines(grid: Grid): string[] {\n const ncols = grid.header.length;\n const rowLine = (cells: string[]): string => {\n const out = cells.slice(0, ncols);\n while (out.length < ncols) out.push('');\n return `| ${out.join(' | ')} |`;\n };\n const delim: string[] = [];\n for (let i = 0; i < ncols; i++) delim.push(delimCell(grid.align[i] ?? null));\n\n const lines = [rowLine(grid.header), `| ${delim.join(' | ')} |`];\n for (const r of grid.rows) lines.push(rowLine(r));\n return lines;\n}\n\n/** Offset of the first char of `lineIdx` within the joined serialization. */\nfunction lineStart(lines: string[], lineIdx: number): number {\n let off = 0;\n for (const l of lines.slice(0, lineIdx)) off += l.length + 1; // +1 for '\\n'\n return off;\n}\n\n/** Content-start offset of column `col` within a canonical `| c0 | c1 | … |` row. */\nfunction colOffsetInLine(cells: string[], col: number): number {\n let off = 2; // leading \"| \"\n for (const c of cells.slice(0, col)) off += c.length + 3; // \"cell\" + \" | \"\n return off;\n}\n\n/**\n * Serialize `grid`, splice it over `[table.from, table.to]`, and place the caret\n * at the start of `(lineIdx, col)` in the new block.\n */\nfunction commit(\n text: string,\n table: Table,\n grid: Grid,\n lineIdx: number,\n col: number,\n): TableEdit {\n const lines = gridLines(grid);\n const block = lines.join('\\n');\n const inBlock =\n lineStart(lines, lineIdx) + colOffsetInLine(cellsForLine(grid, lineIdx), col);\n const newText = text.slice(0, table.from) + block + text.slice(table.to);\n return { text: newText, selection: table.from + inBlock };\n}\n\n/* ------------------------------------------------------------------ *\n * Public helpers\n * ------------------------------------------------------------------ */\n\n/**\n * Exact source range of a single cell's (trimmed) text, for scoped single-cell\n * splices. Row `0` is the header; rows `1..N` are body rows. Returns `null` when\n * the coordinate is out of bounds.\n */\nexport function cellSourceRange(\n table: Table,\n row: number,\n col: number,\n): Pos | null {\n const cell: TableCell | undefined =\n row === 0 ? table.header[col] : table.rows[row - 1]?.[col];\n if (!cell) return null;\n return { from: cell.from, to: cell.to };\n}\n\n/**\n * Insert a new empty body row so it lands at grid position `atRow`\n * (clamped into the body range). Re-serializes the whole block.\n */\nexport function addRow(text: string, table: Table, atRow: number): TableEdit {\n const grid = tableToGrid(text, table);\n const bodyIdx = clampInt(atRow - 1, 0, grid.rows.length);\n grid.rows.splice(bodyIdx, 0, emptyRow(grid.header.length));\n return commit(text, table, grid, 2 + bodyIdx, 0);\n}\n\n/**\n * Insert a new empty column at index `atCol` (clamped), widening the header,\n * the alignment row, and every body row. Re-serializes the whole block.\n */\nexport function addColumn(text: string, table: Table, atCol: number): TableEdit {\n const grid = tableToGrid(text, table);\n const idx = clampInt(atCol, 0, grid.header.length);\n grid.header.splice(idx, 0, '');\n grid.align.splice(idx, 0, null);\n for (const r of grid.rows) r.splice(idx, 0, '');\n return commit(text, table, grid, 0, idx);\n}\n\n/**\n * Remove the body row at grid position `atRow` (row `0`, the header, and\n * out-of-range indices are no-ops). Re-serializes the whole block.\n */\nexport function removeRow(text: string, table: Table, atRow: number): TableEdit {\n const grid = tableToGrid(text, table);\n const bodyIdx = atRow - 1;\n if (bodyIdx >= 0 && bodyIdx < grid.rows.length) grid.rows.splice(bodyIdx, 1);\n\n const lineIdx =\n grid.rows.length === 0 ? 0 : 2 + clampInt(bodyIdx, 0, grid.rows.length - 1);\n return commit(text, table, grid, lineIdx, 0);\n}\n\n/**\n * Remove the column at index `atCol` from the header, alignment row, and every\n * body row. The last remaining column is never removed (a GFM table needs ≥1\n * column), and out-of-range indices are no-ops. Re-serializes the whole block.\n */\nexport function removeColumn(\n text: string,\n table: Table,\n atCol: number,\n): TableEdit {\n const grid = tableToGrid(text, table);\n if (grid.header.length > 1 && atCol >= 0 && atCol < grid.header.length) {\n grid.header.splice(atCol, 1);\n grid.align.splice(atCol, 1);\n for (const r of grid.rows) r.splice(atCol, 1);\n }\n const caretCol = clampInt(atCol, 0, grid.header.length - 1);\n return commit(text, table, grid, 0, caretCol);\n}\n\n/**\n * Set column `col`'s alignment and rewrite the delimiter row (via a canonical\n * re-serialization of the whole block). Out-of-range `col` is a no-op.\n */\nexport function setAlignment(\n text: string,\n table: Table,\n col: number,\n align: CellAlign,\n): TableEdit {\n const grid = tableToGrid(text, table);\n if (col >= 0 && col < grid.align.length) grid.align[col] = align;\n const caretCol = clampInt(col, 0, grid.align.length - 1);\n return commit(text, table, grid, 1, caretCol);\n}\n","/**\n * `typewright/core` — the headless, framework-agnostic engine.\n *\n * Status: PRE-ALPHA SCAFFOLD. The from-scratch document model, incremental\n * block-structured parser, and virtualized DOM view described in SPEC.md are\n * not yet implemented. This module defines the public surface those internals\n * will fulfil so integrators can build against a stable contract.\n */\n\nimport type {\n DocChange,\n DocSelection,\n EditorConfig,\n EditorEvents,\n} from '../types';\n\nexport * from '../types';\n\n/* Headless engine surface — parser, renderer, unified-mode, folding, doc model. */\nexport { parse, parseIncremental } from './parser';\nexport { renderToHtml, renderInline, renderNode, safeUrl } from './render';\nexport type { RenderOptions } from './render';\nexport { collectMarkers, hiddenMarkers, activeBlockIndex } from './unified';\nexport type { Marker } from './unified';\nexport { headingFoldRanges } from './fold';\nexport type { FoldRange } from './fold';\nexport { applyCommand, COMMANDS } from './commands';\nexport type { Command, Sel, CommandResult } from './commands';\nexport { TextDoc } from './text';\nexport type { Change, LineInfo, Position } from './text';\n/* Syntax highlighting (native, zero-dep), comment-anchor + table helpers. */\nexport { highlightToHtml } from './highlight';\nexport { mapAnchor } from './comments';\nexport {\n cellSourceRange,\n addRow,\n addColumn,\n removeRow,\n removeColumn,\n setAlignment,\n} from './table';\nexport type { TableEdit } from './table';\n/* ParseOptions and the AST node types are re-exported here too. */\nexport * from './ast';\n\nexport interface EditorViewOptions extends EditorConfig, EditorEvents {\n /** Element the editor mounts into. */\n parent: HTMLElement;\n}\n\n/**\n * PRE-ALPHA SCAFFOLD — not yet implemented. Constructing an `EditorView`\n * throws: the stateful mounted engine (document string, incremental parse tree,\n * decoration set, virtualized viewport) described in SPEC.md is still to come.\n * This class only reserves the eventual public surface.\n *\n * To edit or render Markdown today, use the functional headless API exported\n * from this module — {@link parse}, {@link parseIncremental}, {@link renderToHtml} —\n * or the React `TypewrightEditor` component in `typewright`.\n */\nexport class EditorView {\n readonly dom: HTMLElement;\n\n constructor(options: EditorViewOptions) {\n this.dom = options.parent;\n throw new Error(\n 'typewright/core: engine not yet implemented (pre-alpha scaffold). ' +\n 'See SPEC.md for the architecture and roadmap.',\n );\n }\n\n /** Current document string. */\n get doc(): string {\n return '';\n }\n\n /** Apply an edit. */\n dispatch(_change: DocChange): void {\n /* not implemented */\n }\n\n setSelection(_selection: DocSelection): void {\n /* not implemented */\n }\n\n destroy(): void {\n /* not implemented */\n }\n}\n"]}
@@ -0,0 +1,286 @@
1
+ import { renderToHtml, parse, renderInline } from './chunk-M6IVEMXO.js';
2
+
3
+ // src/streaming/anticipate.ts
4
+ function normalizeOpt(o) {
5
+ const all = (v) => ({
6
+ emphasis: v,
7
+ strong: v,
8
+ code: v,
9
+ strikethrough: v,
10
+ links: v,
11
+ headings: v,
12
+ fences: v,
13
+ listItems: v,
14
+ tables: v,
15
+ jsx: v
16
+ });
17
+ if (o === true || o === void 0) return all(true);
18
+ if (o === false) return all(false);
19
+ return { ...all(true), ...o };
20
+ }
21
+ function esc(s) {
22
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
23
+ }
24
+ function inlineHtml(text) {
25
+ const doc = parse(text);
26
+ const first = doc.children[0];
27
+ if (first && (first.type === "paragraph" || first.type === "heading")) {
28
+ return renderInline(first.children);
29
+ }
30
+ return esc(text);
31
+ }
32
+ var CARET = '<span class="tw-caret" aria-hidden="true"></span>';
33
+ function indexesOf(line, sub) {
34
+ const out = [];
35
+ let i = line.indexOf(sub);
36
+ while (i >= 0) {
37
+ out.push(i);
38
+ i = line.indexOf(sub, i + sub.length);
39
+ }
40
+ return out;
41
+ }
42
+ function findOpenLink(line) {
43
+ const bi = line.lastIndexOf("[");
44
+ if (bi < 0) return null;
45
+ const rest = line.slice(bi);
46
+ if (!rest.includes("]")) return bi;
47
+ if (/^\[[^\]]*\]\([^)]*$/.test(rest)) return bi;
48
+ return null;
49
+ }
50
+ function pushEmphasis(line, ch, dbl, cands) {
51
+ const masked = line.split(dbl).join("");
52
+ const idx = [];
53
+ for (let i = 0; i < masked.length; i++) if (masked[i] === ch) idx.push(i);
54
+ if (idx.length % 2 === 1) {
55
+ cands.push({ kind: "emphasis", tag: "em", cls: "tw-pending tw-pending-em", opener: idx[idx.length - 1], dl: 1 });
56
+ }
57
+ }
58
+ function findOpenRun(line, opt) {
59
+ const cands = [];
60
+ if (opt.strong) {
61
+ const x = indexesOf(line, "**");
62
+ if (x.length % 2 === 1) cands.push({ kind: "strong", tag: "strong", cls: "tw-pending tw-pending-strong", opener: x[x.length - 1], dl: 2 });
63
+ }
64
+ if (opt.strikethrough) {
65
+ const x = indexesOf(line, "~~");
66
+ if (x.length % 2 === 1) cands.push({ kind: "strikethrough", tag: "del", cls: "tw-pending tw-pending-del", opener: x[x.length - 1], dl: 2 });
67
+ }
68
+ if (opt.code) {
69
+ const ticks = [];
70
+ for (const m of line.matchAll(/`+/g)) {
71
+ if (m[0].length >= 3) continue;
72
+ for (let k = 0; k < m[0].length; k++) ticks.push(m.index + k);
73
+ }
74
+ if (ticks.length % 2 === 1) cands.push({ kind: "code", tag: "code", cls: "tw-pending tw-pending-code", opener: ticks[ticks.length - 1], dl: 1 });
75
+ }
76
+ if (opt.links) {
77
+ const li = findOpenLink(line);
78
+ if (li !== null) cands.push({ kind: "link", tag: "a", cls: "tw-pending tw-pending-link", opener: li, dl: 1 });
79
+ }
80
+ if (opt.emphasis) {
81
+ pushEmphasis(line, "*", "**", cands);
82
+ pushEmphasis(line, "_", "__", cands);
83
+ }
84
+ if (!cands.length) return null;
85
+ cands.sort((a, b) => a.opener - b.opener);
86
+ return cands[0];
87
+ }
88
+ function isFormingJsx(line, opt) {
89
+ return opt.jsx && /<[A-Z][A-Za-z0-9]*\b[^>]*$/.test(line) && !/\/?>\s*$/.test(line);
90
+ }
91
+ var LIST_ITEM_RE = /^( {0,3})([-+*]|\d{1,9}[.)])[ \t]+(.*)$/;
92
+ function isFormingListItem(line, opt) {
93
+ return opt.listItems && LIST_ITEM_RE.test(line);
94
+ }
95
+ var TABLE_ROW_RE = /^ {0,3}\|/;
96
+ function splitTableCells(row) {
97
+ let s = row.trim();
98
+ if (s.startsWith("|")) s = s.slice(1);
99
+ if (s.endsWith("|")) s = s.slice(0, -1);
100
+ return s.split("|").map((c) => c.trim());
101
+ }
102
+ function hasTrailing(line, opt) {
103
+ if (!line.trim()) return false;
104
+ return isFormingJsx(line, opt) || isFormingListItem(line, opt) || findOpenRun(line, opt) !== null;
105
+ }
106
+ function renderActiveLine(line, opt, pending, fallback) {
107
+ if (isFormingJsx(line, opt)) {
108
+ const name = /<([A-Z][A-Za-z0-9]*)/.exec(line)?.[1] ?? "Component";
109
+ pending.push("jsx");
110
+ const label = fallback ? esc(fallback) : `\u2039${esc(name)}\u203A rendering\u2026`;
111
+ return `<div class="tw-skeleton" data-component="${esc(name)}"><span class="tw-skeleton-label">${label}</span><div class="tw-skeleton-bar"></div><div class="tw-skeleton-bar" style="width:70%"></div></div>`;
112
+ }
113
+ if (isFormingListItem(line, opt)) return renderActiveListItem(line, opt, pending);
114
+ const heading = /^(#{1,6})\s+(.*)$/.exec(line);
115
+ const body = heading ? heading[2] ?? "" : line;
116
+ const inner = renderInlineWithOpen(body, opt, pending);
117
+ if (heading) return `<h${heading[1].length}>${inner}${CARET}</h${heading[1].length}>`;
118
+ return `<p>${inner}${CARET}</p>`;
119
+ }
120
+ function renderActiveListItem(line, opt, pending) {
121
+ const m = LIST_ITEM_RE.exec(line);
122
+ const marker = m[2];
123
+ const content = m[3] ?? "";
124
+ pending.push("listItem");
125
+ const inner = content ? renderInlineWithOpen(content, opt, pending) : "";
126
+ const li = `<li class="tw-pending tw-pending-li">${inner}${CARET}</li>`;
127
+ if (/\d/.test(marker)) {
128
+ const n = parseInt(marker, 10);
129
+ const startAttr = Number.isFinite(n) && n !== 1 ? ` start="${esc(String(n))}"` : "";
130
+ return `<ol${startAttr} class="tw-pending tw-pending-list">${li}</ol>`;
131
+ }
132
+ return `<ul class="tw-pending tw-pending-list">${li}</ul>`;
133
+ }
134
+ function renderInlineWithOpen(text, opt, pending) {
135
+ const open = findOpenRun(text, opt);
136
+ if (!open) return inlineHtml(text);
137
+ const prefix = text.slice(0, open.opener);
138
+ pending.push(open.kind);
139
+ if (open.kind === "link") {
140
+ const after = text.slice(open.opener + 1);
141
+ const close = after.indexOf("]");
142
+ const label = close >= 0 ? after.slice(0, close) : after;
143
+ return `${inlineHtml(prefix)}<a class="${open.cls}">${inlineHtml(label)}</a>`;
144
+ }
145
+ const content = text.slice(open.opener + open.dl);
146
+ const inner = open.kind === "code" ? esc(content) : inlineHtml(content);
147
+ return `${inlineHtml(prefix)}<${open.tag} class="${open.cls}">${inner}</${open.tag}>`;
148
+ }
149
+ function renderOpenFence(block, pending) {
150
+ const nl = block.indexOf("\n");
151
+ const info = block.slice(3, nl < 0 ? block.length : nl).trim();
152
+ const lang = info.split(/\s+/)[0] ?? "";
153
+ const code = nl < 0 ? "" : block.slice(nl + 1);
154
+ pending.push("code");
155
+ const langAttr = lang ? ` class="language-${esc(lang)}"` : "";
156
+ return `<pre class="tw-codeblock"><code${langAttr}>${esc(code)}${CARET}</code></pre>`;
157
+ }
158
+ function renderActiveTableRow(row, pending) {
159
+ const cells = splitTableCells(row);
160
+ pending.push("tableRow");
161
+ let tds = "";
162
+ for (let i = 0; i < cells.length; i++) {
163
+ const caret = i === cells.length - 1 ? CARET : "";
164
+ tds += `<td>${cells[i] ? inlineHtml(cells[i]) : ""}${caret}</td>`;
165
+ }
166
+ return `<table class="tw-pending tw-pending-table"><tbody><tr>${tds}</tr></tbody></table>`;
167
+ }
168
+ function anticipate(partial, options = true, componentFallback) {
169
+ const opt = normalizeOpt(options);
170
+ const pending = [];
171
+ if (!partial) return { html: "", pending };
172
+ const fenceCount = (partial.match(/^```/gm) ?? []).length;
173
+ if (opt.fences && fenceCount % 2 === 1) {
174
+ const idx = partial.lastIndexOf("```");
175
+ const committed2 = partial.slice(0, idx).replace(/\n+$/, "");
176
+ const open = partial.slice(idx);
177
+ const committedHtml2 = committed2.trim() ? renderToHtml(parse(committed2)) : "";
178
+ return { html: committedHtml2 + renderOpenFence(open, pending), pending };
179
+ }
180
+ if (opt.tables) {
181
+ const nl = partial.lastIndexOf("\n");
182
+ if (nl >= 0) {
183
+ const row = partial.slice(nl + 1);
184
+ if (TABLE_ROW_RE.test(row)) {
185
+ const committed2 = partial.slice(0, nl);
186
+ const doc = parse(committed2);
187
+ const last = doc.children[doc.children.length - 1];
188
+ if (last && last.type === "table") {
189
+ return { html: renderToHtml(doc) + renderActiveTableRow(row, pending), pending };
190
+ }
191
+ }
192
+ }
193
+ }
194
+ const lastNl = partial.lastIndexOf("\n");
195
+ const active = lastNl >= 0 ? partial.slice(lastNl + 1) : partial;
196
+ if (!hasTrailing(active, opt)) {
197
+ return { html: renderToHtml(parse(partial)), pending };
198
+ }
199
+ const committed = lastNl >= 0 ? partial.slice(0, lastNl) : "";
200
+ const committedHtml = committed.trim() ? renderToHtml(parse(committed)) : "";
201
+ return { html: committedHtml + renderActiveLine(active, opt, pending, componentFallback), pending };
202
+ }
203
+
204
+ // src/streaming/index.ts
205
+ var DEFAULT_CPS = 220;
206
+ var TICK_MS = 1e3 / 30;
207
+ function createStreamController(onUpdate, options = {}) {
208
+ const smoothCfg = !options.smooth ? null : typeof options.smooth === "object" ? options.smooth : { charsPerSecond: DEFAULT_CPS };
209
+ const cps = smoothCfg && smoothCfg.charsPerSecond > 0 ? smoothCfg.charsPerSecond : DEFAULT_CPS;
210
+ const perTick = Math.max(1, Math.round(cps * TICK_MS / 1e3));
211
+ let text = "";
212
+ let revealed = 0;
213
+ let complete = false;
214
+ let timer = null;
215
+ const emit = () => onUpdate(smoothCfg ? text.slice(0, revealed) : text, complete);
216
+ const stopTimer = () => {
217
+ if (timer !== null) {
218
+ clearInterval(timer);
219
+ timer = null;
220
+ }
221
+ };
222
+ const tick = () => {
223
+ revealed = Math.min(text.length, revealed + perTick);
224
+ emit();
225
+ if (revealed >= text.length) stopTimer();
226
+ };
227
+ const ensureTimer = () => {
228
+ if (timer !== null || complete || revealed >= text.length) return;
229
+ timer = setInterval(tick, TICK_MS);
230
+ };
231
+ return {
232
+ push(chunk) {
233
+ if (complete) return;
234
+ text += chunk;
235
+ if (smoothCfg) ensureTimer();
236
+ emit();
237
+ },
238
+ replace(full) {
239
+ text = full;
240
+ complete = false;
241
+ if (smoothCfg) {
242
+ if (revealed > text.length) revealed = text.length;
243
+ ensureTimer();
244
+ }
245
+ emit();
246
+ },
247
+ end() {
248
+ complete = true;
249
+ revealed = text.length;
250
+ stopTimer();
251
+ emit();
252
+ },
253
+ reset() {
254
+ text = "";
255
+ revealed = 0;
256
+ complete = false;
257
+ stopTimer();
258
+ emit();
259
+ },
260
+ get text() {
261
+ return text;
262
+ },
263
+ get complete() {
264
+ return complete;
265
+ }
266
+ };
267
+ }
268
+ async function pipeStream(source, controller) {
269
+ if (Symbol.asyncIterator in source) {
270
+ for await (const chunk of source) {
271
+ controller.push(chunk);
272
+ }
273
+ } else {
274
+ const reader = source.getReader();
275
+ for (; ; ) {
276
+ const { done, value } = await reader.read();
277
+ if (done) break;
278
+ if (value != null) controller.push(value);
279
+ }
280
+ }
281
+ controller.end();
282
+ }
283
+
284
+ export { anticipate, createStreamController, pipeStream };
285
+ //# sourceMappingURL=chunk-KNEKNZXK.js.map
286
+ //# sourceMappingURL=chunk-KNEKNZXK.js.map