vitepress-theme-base-teek
Version:
99 lines (85 loc) • 3.06 kB
text/typescript
import type MarkdownIt from "markdown-it";
import container from "markdown-it-container";
export type ContainerArgs = [typeof container, string, { render: (tokens: Token[], idx: number) => string }];
export interface ContainerOption {
name: string; // 容器名称
useTitle?: boolean; // 是否使用标题
defaultTitle?: string; // 默认标题
className?: string; // 容器类名
}
export interface ContainerLabel {
noteLabel?: string;
}
interface Token {
nesting: number;
info: string;
}
/**
* 创建 Teeker 内置的 markdown-it-container 插件
* @param md markdown-it 实例
* @param containerLabel
*/
export const containerPlugins = (md: MarkdownIt, containerLabel?: ContainerLabel) => {
const markdownContainer = [
{ name: "center", useTitle: false, className: `tk-center-container` },
{ name: "right", useTitle: false, className: `tk-right-container` },
{ name: "note", useTitle: true, defaultTitle: containerLabel?.noteLabel || "NOTE", className: `custom-block` },
];
createContainersThenUse(md, markdownContainer);
};
/**
* 创建一个自定义的容器,并使用
*
* @param md markdown-it 实例
* @param option 容器配置项
*/
export const createContainerThenUse = (md: MarkdownIt, option: ContainerOption) => {
md.use(...createContainerThenGet(md, option));
};
/**
* 创建一个自定义的容器,并返回
*
* @param md markdown-it 实例
* @param option 容器配置项
*/
export const createContainerThenGet = (md: MarkdownIt, option: ContainerOption): ContainerArgs => {
const { name, useTitle, defaultTitle, className } = option;
return [
container,
name,
{
render(tokens: Token[], idx: number) {
const token = tokens[idx];
const info = token.info.trim().slice(name.length).trim();
if (token.nesting === 1) {
const title = useTitle ? md.renderInline(info || defaultTitle || "") : "";
return `<div class="${name} ${className}">${useTitle ? `<p class="title ${name}-title ${className ? `${className}-title` : ""}">${title}</p>` : ""}\n`;
} else return `</div>\n`;
},
},
];
};
/**
* 创建多个自定义的容器,并使用
*
* @param md markdown-it 实例
* @param options 容器配置项
*/
export const createContainersThenUse = (md: MarkdownIt, options: ContainerOption[]) => {
options.forEach(option => {
md.use(...createContainerThenGet(md, option));
});
};
/**
* 创建多个自定义的容器,并返回
*
* @param md markdown-it 实例
* @param options 容器配置项
*/
export const createContainersThenGet = (md: MarkdownIt, options: ContainerOption[]) => {
const containers: ContainerArgs[] = [];
options.forEach(option => {
containers.push(createContainerThenGet(md, option));
});
return containers;
};