vuecssuiant-designantdreactantantd-vueenterprisefrontendui-designvue-antdvue-antd-uivue3vuecomponent
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
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); |
|
}; |
|
};
|
|
|