🌈 An enterprise-class UI components based on Ant Design and Vue. 🐜
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.
 
 
 
 

25 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);
};
};