UNPKG

vitepress-theme-base-teek

Version:
99 lines (85 loc) 3.06 kB
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; };