import { defineConfig, MarkdownOptions } from "vitepress"; // https://vitepress.dev/reference/site-config export default defineConfig({ title: "ko-grammar", description: "Korean grammar edited", lang: "ko-KR", themeConfig: { socialLinks: [ { icon: "github", link: "https://github.com/vuejs/vitepress" }, ], outline: { level: "deep", }, }, markdown: { config(md) { const mdInline: MarkdownOptions["config"] = (md) => { const className = "md"; md.core.ruler.after("inline", "inline_class_md", (state: any) => { const tokens = state.tokens; const tagPattern = new RegExp( `class=(?:\"|')([^\"']*\\b${escapeReg(className)}\\b[^\"']*)(?:\"|')`, "i", ); for (let i = 0; i < tokens.length; i++) { const t = tokens[i]; if (!/^(html_inline|html_block)$/.test(t.type)) continue; const html = t.content; // match tags with class including the target class, capture inner content (non-greedy) const pattern = new RegExp( `<([a-zA-Z0-9-]+)(\\b[^>]*)?>([\\s\\S]*?)<\\/\\1>`, "gi", ); let lastIndex = 0; let out = ""; let m; while ((m = pattern.exec(html)) !== null) { const [full, tagName, attrs = "", inner] = m; const idx = m.index; if (idx > lastIndex) out += html.slice(lastIndex, idx); if (tagPattern.test(attrs)) { // render inner as inline markdown out += `<${tagName}${attrs}>${md.renderInline(inner)}`; } else { out += full; } lastIndex = idx + full.length; } if (lastIndex === 0) continue; if (lastIndex < html.length) out += html.slice(lastIndex); t.content = out; } }); function escapeReg(s: string) { return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } }; md.use(mdInline); }, }, });