You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
26 lines
973 B
26 lines
973 B
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);
|
|
};
|
|
};
|