/** Shared Markdown parsing and depth-first traversal for documentation gates. */ import { fromMarkdown } from 'mdast-util-from-markdown' import { gfmFromMarkdown } from 'mdast-util-gfm' import { gfm } from 'micromark-extension-gfm' import type { Nodes } from 'mdast' /** Parse GitHub-flavored Markdown with the repository's standard extensions. */ export function parseMarkdown(source: string): Nodes { return fromMarkdown(source, { extensions: [gfm()], mdastExtensions: [gfmFromMarkdown()] }) } /** * Visit a Markdown tree depth-first; returning false prunes a node's children. * @param node - current tree node. * @param visitor - callback invoked before each node's children. */ export function visitMarkdown(node: Nodes, visitor: (node: Nodes) => boolean | void): void { if (visitor(node) === false) return if ('children' in node) { for (const child of node.children) visitMarkdown(child, visitor) } }