{"version":3,"sources":["../src/strict/index.ts"],"names":[],"mappings":"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","file":"strict.cjs","sourcesContent":["/**\n * stream-md/strict — opt-in CommonMark + GFM compliant adapter.\n *\n * Wraps `micromark` for spec-correct parsing. Slower and larger than the\n * default hand-rolled parser, but passes the full CommonMark + GFM test\n * suites. Loaded lazily so users who don't import this entry pay nothing.\n *\n * @example\n * ```ts\n * import { StrictStreamParser } from 'stream-md/strict';\n *\n * const parser = new StrictStreamParser();\n * parser.push(text);\n * const blocks = parser.getBlocks();\n * ```\n */\n\nimport type { Block, BlockMeta, ParseResult, StreamMDOptions } from \"../parser/types\";\n\n/**\n * Strict parser — same `push() / getBlocks() / reset()` interface as\n * `StreamParser`, but uses micromark internally for spec compliance.\n *\n * Implementation note: micromark is async to load, so the first `push()`\n * after construction triggers a one-time async init. Until init resolves,\n * `getBlocks()` returns whatever the previous (synchronous) parse produced.\n */\nexport class StrictStreamParser {\n  private blocks: Block[] = [];\n  private prevText = \"\";\n  private blockId = 0;\n  private opts: StreamMDOptions;\n  private micromarkPromise: Promise<typeof import(\"micromark\")> | null = null;\n  private gfmPromise: Promise<typeof import(\"micromark-extension-gfm\")> | null = null;\n\n  constructor(options: StreamMDOptions = {}) {\n    this.opts = options;\n  }\n\n  push(fullText: string): ParseResult {\n    if (fullText === this.prevText) {\n      return { blocks: this.blocks, activeIndex: this.blocks.length - 1 };\n    }\n    this.prevText = fullText;\n    void this.parseAsync(fullText);\n    return { blocks: this.blocks, activeIndex: this.blocks.length - 1 };\n  }\n\n  /** Synchronous wait for the parse to finish. Use in tests. */\n  async pushAsync(fullText: string): Promise<ParseResult> {\n    this.prevText = fullText;\n    await this.parseAsync(fullText);\n    return { blocks: this.blocks, activeIndex: this.blocks.length - 1 };\n  }\n\n  getBlocks(): Block[] {\n    return this.blocks;\n  }\n\n  reset(): void {\n    this.blocks = [];\n    this.prevText = \"\";\n  }\n\n  private async parseAsync(text: string): Promise<void> {\n    if (!this.micromarkPromise) this.micromarkPromise = import(\"micromark\");\n    if (!this.gfmPromise) this.gfmPromise = import(\"micromark-extension-gfm\");\n    const [{ micromark }, gfmMod] = await Promise.all([\n      this.micromarkPromise,\n      this.gfmPromise,\n    ]);\n    const gfm = (gfmMod as { gfm: () => unknown }).gfm;\n    const html = micromark(text, {\n      allowDangerousHtml: false,\n      extensions: [gfm() as never],\n    });\n    // Convert HTML → blocks. We use a tiny regex-based block extractor\n    // because we don't want to pull in a full HTML parser. This is a\n    // pragmatic compromise: micromark gives us spec-correct *parsing*,\n    // and we just translate the canonical HTML output into our Block AST.\n    this.blocks = htmlToBlocks(html, () => \"smd-strict-\" + ++this.blockId);\n    if (this.opts.onBlockComplete) {\n      for (const b of this.blocks) if (b.closed) this.opts.onBlockComplete(b);\n    }\n  }\n}\n\nfunction htmlToBlocks(html: string, mkId: () => string): Block[] {\n  const blocks: Block[] = [];\n  // Match top-level block elements. This is intentionally simple — micromark\n  // emits well-formed HTML, no comments, no nested unclosed tags at the top\n  // level.\n  const re =\n    /<(h[1-6]|p|pre|ul|ol|blockquote|table|hr)(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\1>|<(hr)\\s*\\/?>/g;\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(html)) !== null) {\n    const tag = (m[1] ?? m[3])!;\n    const inner = m[2] ?? \"\";\n    if (/^h[1-6]$/.test(tag)) {\n      const meta: BlockMeta = { level: parseInt(tag.slice(1), 10) };\n      blocks.push({\n        id: mkId(),\n        type: \"heading\",\n        content: stripTags(inner),\n        closed: true,\n        meta,\n      });\n    } else if (tag === \"p\") {\n      blocks.push({\n        id: mkId(),\n        type: \"paragraph\",\n        content: stripTags(inner),\n        closed: true,\n        meta: {},\n      });\n    } else if (tag === \"pre\") {\n      // <pre><code class=\"language-foo\">...</code></pre>\n      const codeMatch = inner.match(/<code(?:\\s+class=\"language-([^\"]+)\")?>([\\s\\S]*?)<\\/code>/);\n      const language = codeMatch?.[1] ?? \"\";\n      const content = decodeEntities(codeMatch?.[2] ?? inner);\n      blocks.push({\n        id: mkId(),\n        type: \"code\",\n        content,\n        closed: true,\n        meta: { language },\n      });\n    } else if (tag === \"ul\" || tag === \"ol\") {\n      // Reconstruct list source.\n      const itemRe = /<li(?:\\s[^>]*)?>([\\s\\S]*?)<\\/li>/g;\n      const items: string[] = [];\n      let im: RegExpExecArray | null;\n      while ((im = itemRe.exec(inner)) !== null) items.push(stripTags(im[1]!));\n      const ordered = tag === \"ol\";\n      const meta: BlockMeta = { ordered };\n      blocks.push({\n        id: mkId(),\n        type: \"list\",\n        content: items.map((t) => (ordered ? `1. ${t}` : `- ${t}`)).join(\"\\n\"),\n        closed: true,\n        meta,\n      });\n    } else if (tag === \"blockquote\") {\n      blocks.push({\n        id: mkId(),\n        type: \"blockquote\",\n        content: stripTags(inner),\n        closed: true,\n        meta: {},\n      });\n    } else if (tag === \"table\") {\n      blocks.push({\n        id: mkId(),\n        type: \"table\",\n        content: htmlTableToMarkdown(inner),\n        closed: true,\n        meta: {},\n      });\n    } else if (tag === \"hr\") {\n      blocks.push({\n        id: mkId(),\n        type: \"hr\",\n        content: \"\",\n        closed: true,\n        meta: {},\n      });\n    }\n  }\n  return blocks;\n}\n\nfunction stripTags(s: string): string {\n  return decodeEntities(s.replace(/<[^>]+>/g, \"\"));\n}\n\nfunction decodeEntities(s: string): string {\n  return s\n    .replace(/&lt;/g, \"<\")\n    .replace(/&gt;/g, \">\")\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&amp;/g, \"&\");\n}\n\nfunction htmlTableToMarkdown(html: string): string {\n  const rows: string[] = [];\n  const rowRe = /<tr(?:\\s[^>]*)?>([\\s\\S]*?)<\\/tr>/g;\n  let rm: RegExpExecArray | null;\n  while ((rm = rowRe.exec(html)) !== null) {\n    const cellRe = /<t[hd](?:\\s[^>]*)?>([\\s\\S]*?)<\\/t[hd]>/g;\n    const cells: string[] = [];\n    let cm: RegExpExecArray | null;\n    while ((cm = cellRe.exec(rm[1]!)) !== null) cells.push(stripTags(cm[1]!));\n    rows.push(`| ${cells.join(\" | \")} |`);\n  }\n  if (rows.length > 1) {\n    const headerCells = rows[0]!.split(\"|\").length - 2;\n    rows.splice(1, 0, `| ${Array(headerCells).fill(\"---\").join(\" | \")} |`);\n  }\n  return rows.join(\"\\n\");\n}\n"]}