From d73dee64105a41b8de88fb369d49c622c01f9565 Mon Sep 17 00:00:00 2001 From: polv Date: Wed, 25 Mar 2026 06:24:45 +0700 Subject: [PATCH] spoiler tag --- docs/.vitepress/config.mts | 51 +++- docs/.vitepress/theme/components/Details.vue | 6 +- docs/.vitepress/theme/components/TTS.vue | 5 +- docs/.vitepress/theme/custom.css | 3 + docs/.vitepress/theme/index.ts | 1 + docs/howtostudykorean/unit-1/07-irregulars.md | 268 ++++++++++++++++-- 6 files changed, 301 insertions(+), 33 deletions(-) create mode 100644 docs/.vitepress/theme/custom.css diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 752338a..b6a9188 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -1,4 +1,4 @@ -import { defineConfig } from "vitepress"; +import { defineConfig, MarkdownOptions } from "vitepress"; // https://vitepress.dev/reference/site-config export default defineConfig({ @@ -13,4 +13,53 @@ export default defineConfig({ 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); + }, + }, }); diff --git a/docs/.vitepress/theme/components/Details.vue b/docs/.vitepress/theme/components/Details.vue index 6739bb5..5a43e98 100644 --- a/docs/.vitepress/theme/components/Details.vue +++ b/docs/.vitepress/theme/components/Details.vue @@ -1,7 +1,7 @@