From a9b5155f16d899afae9812de1c03b3d3a34b7d6a Mon Sep 17 00:00:00 2001 From: DIYgod Date: Thu, 15 Jun 2023 21:35:12 +0100 Subject: [PATCH] Revert "feat: remove remark-pangu" This reverts commit edff400905249b08a2c2d2fd2264a47b4bebdcda. --- src/markdown/index.ts | 2 ++ src/markdown/remark-pangu.ts | 60 ++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/markdown/remark-pangu.ts diff --git a/src/markdown/index.ts b/src/markdown/index.ts index 6738339b..83fd517b 100644 --- a/src/markdown/index.ts +++ b/src/markdown/index.ts @@ -46,6 +46,7 @@ import { rehypeWrapCode } from "./rehype-wrap-code" import { rehypeExternalLink } from "./rehyper-external-link" import { remarkCallout } from "./remark-callout" import { remarkMermaid } from "./remark-mermaid" +import { remarkPangu } from "./remark-pangu" import { remarkYoutube } from "./remark-youtube" import sanitizeScheme from "./sanitize-schema" @@ -123,6 +124,7 @@ export const renderPageContent = ( .use(remarkMath, { singleDollarTextMath: false, }) + .use(remarkPangu) .use(() => (tree) => { env.toc = toc(tree, { tight: true, ordered: true }) }) diff --git a/src/markdown/remark-pangu.ts b/src/markdown/remark-pangu.ts new file mode 100644 index 00000000..a245199d --- /dev/null +++ b/src/markdown/remark-pangu.ts @@ -0,0 +1,60 @@ +import pangu from "pangu" +import type { Root } from "remark-gfm" +import type { Plugin } from "unified" +import { visit } from "unist-util-visit" + +interface Options { + text?: boolean + inlineCode?: boolean + link?: boolean + image?: boolean + definition?: boolean + imageReference?: boolean +} + +const defaultOptions: Options = { + text: true, + inlineCode: false, + link: true, + image: true, + definition: true, + imageReference: true, +} + +function format(value: string) { + if (!value) return value + return pangu.spacing(value) +} + +export const remarkPangu: Plugin, Root> = + (options = {}) => + (tree, _) => { + const settings = Object.assign({}, defaultOptions, options) + const subset = (Object.keys(settings) as Array).filter( + (k) => settings[k], + ) as string[] + + visit(tree, (node) => { + if (subset.includes(node.type)) { + if (node.type === "text" || node.type === "inlineCode") { + node.value = format(node.value) + } + + if ( + (node.type === "link" || + node.type === "image" || + node.type === "definition") && + node.title + ) { + node.title = format(node.title) + } + + if ( + (node.type === "image" || node.type === "imageReference") && + node.alt + ) { + node.alt = format(node.alt) + } + } + }) + }