import type MarkdownIt from 'markdown-it'; import type { MarkdownParsedData } from '../markdown'; import { deeplyParseHeader } from '../../utils/parseHeader'; import { slugify } from './slugify'; export const extractHeaderPlugin = (md: MarkdownIt, include = ['h2', 'h3']) => { md.renderer.rules.heading_open = (tokens, i, options, _env, self) => { const token = tokens[i]; if (include.includes(token.tag)) { const title = tokens[i + 1].content; const idAttr = token.attrs!.find(([name]) => name === 'id'); const slug = idAttr && idAttr[1]; const content = tokens[i + 4].content; const data = (md as any).__data as MarkdownParsedData; const headers = data.headers || (data.headers = []); headers.push({ level: parseInt(token.tag.slice(1), 10), title: deeplyParseHeader(title), slug: slug || slugify(title), content, }); } return self.renderToken(tokens, i, options); }; };