Restore the replaced pipeline's synthetic fence newline so a real trailing blank line inside a fence survives CodeBlock's display trim, and pin it plus header-only tables in the DOM-parity corpus. Route extractMarkdownPlainText through parseGfm so the grammar has one source. Document the fixture provenance check (all 46 fixtures reproduce byte-identically from react-markdown at 9e8101b800), the deliberate O(prefix) divergence memcmp, the per-arm scope of grammar consistency, the React 18 MathML namespace limitation, and the prefix-equivalence corpus constraint.
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
/**
|
|
* The markdown renderer's two mdast grammars, one per rendering arm. Each
|
|
* arm is internally consistent — the incremental tail parses, the one-shot
|
|
* parses, and the plain-text projection of a given grammar always agree on
|
|
* where blocks start and end — and the settled grammar is the streaming one
|
|
* plus the math extensions, so the arms differ only where TeX delimiters
|
|
* begin a math construct (a `$$` block is a paragraph while streaming and a
|
|
* math block once settled, by design).
|
|
*/
|
|
|
|
import type { Root } from 'mdast'
|
|
import { fromMarkdown } from 'mdast-util-from-markdown'
|
|
import { gfmFromMarkdown } from 'mdast-util-gfm'
|
|
import { mathFromMarkdown } from 'mdast-util-math'
|
|
import { gfm } from 'micromark-extension-gfm'
|
|
import { math } from 'micromark-extension-math'
|
|
import { cjkFriendlyStrong } from './cjkFriendlyStrong.ts'
|
|
import { mathCompatibility } from './mathCompatibility.ts'
|
|
|
|
/**
|
|
* Parse GFM markdown (the streaming arm's grammar: no math, so incomplete
|
|
* TeX never flashes KaTeX errors mid-stream).
|
|
* @param text - Markdown source.
|
|
* @returns The mdast root.
|
|
*/
|
|
export function parseGfm(text: string): Root {
|
|
return fromMarkdown(text, {
|
|
extensions: [gfm(), cjkFriendlyStrong()],
|
|
mdastExtensions: [gfmFromMarkdown()],
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Parse GFM markdown plus TeX math with the compatibility delimiters
|
|
* (the settled arm's grammar).
|
|
* @param text - Markdown source.
|
|
* @returns The mdast root.
|
|
*/
|
|
export function parseGfmWithMath(text: string): Root {
|
|
return fromMarkdown(text, {
|
|
extensions: [gfm(), cjkFriendlyStrong(), mathCompatibility(), math()],
|
|
mdastExtensions: [gfmFromMarkdown(), mathFromMarkdown()],
|
|
})
|
|
}
|