this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor(core): extract fence node logic

+62 -62
+3 -62
core/markdoc-config.ts
··· 1 - import Markdoc, { 2 - Config, 3 - Node, 4 - nodes, 5 - RenderableTreeNode, 6 - Tag, 7 - } from "@markdoc/markdoc"; 8 - import { codeToHast } from "shiki"; 9 - import { isElement } from "hast-util-is-element"; 10 - import type { Node as HastNode } from "@types/hast"; 11 - 12 - function hastToRenderNode(node: HastNode): RenderableTreeNode { 13 - let tag: Tag; 14 - 15 - if (isElement(node)) { 16 - tag = new Tag( 17 - node.tagName, 18 - node.properties, 19 - node.children.map(hastToRenderNode), 20 - ); 21 - } else if ("value" in node) { 22 - return node.value as string; 23 - } else { 24 - tag = new Tag( 25 - "div", 26 - undefined, 27 - "children" in node 28 - ? (node.children as HastNode[]).map(hastToRenderNode) 29 - : undefined, 30 - ); 31 - } 32 - 33 - return tag; 34 - } 1 + import Markdoc, { Config } from "@markdoc/markdoc"; 2 + import { createFenceNode } from "./nodes/fence.ts"; 35 3 36 4 export function createMarkdocConfig() { 37 5 const scripts = new Set<string>(); ··· 46 14 }, 47 15 }, 48 16 nodes: { 49 - fence: { 50 - render: "pre", 51 - attributes: { 52 - content: { type: "String", render: false }, 53 - language: { type: "String", render: false }, 54 - }, 55 - async transform(node, config) { 56 - const { content, language = "text" } = node.attributes; 57 - 58 - if (language === "mermaid") { 59 - scripts.add( 60 - "https://cdn.jsdelivr.net/npm/mermaid@11.9.0/dist/mermaid.min.js", 61 - ); 62 - 63 - // Bail out for Mermaid to handle later 64 - const base = (nodes.fence.transform!)(node, config); 65 - (base as Tag).attributes.class = "mermaid"; 66 - return base; 67 - } 68 - 69 - const hast = await codeToHast(content, { 70 - lang: language, 71 - theme: "rose-pine", 72 - }); 73 - 74 - return hastToRenderNode(hast); 75 - }, 76 - }, 17 + fence: createFenceNode(scripts), 77 18 }, 78 19 }; 79 20
+59
core/nodes/fence.ts
··· 1 + import Markdoc, { nodes, RenderableTreeNode, Tag } from "@markdoc/markdoc"; 2 + import { codeToHast } from "shiki"; 3 + import { isElement } from "hast-util-is-element"; 4 + import type { Node as HastNode } from "@types/hast"; 5 + 6 + function hastToRenderNode(node: HastNode): RenderableTreeNode { 7 + let tag: Tag; 8 + 9 + if (isElement(node)) { 10 + tag = new Tag( 11 + node.tagName, 12 + node.properties, 13 + node.children.map(hastToRenderNode), 14 + ); 15 + } else if ("value" in node) { 16 + return node.value as string; 17 + } else { 18 + tag = new Tag( 19 + "div", 20 + undefined, 21 + "children" in node 22 + ? (node.children as HastNode[]).map(hastToRenderNode) 23 + : undefined, 24 + ); 25 + } 26 + 27 + return tag; 28 + } 29 + 30 + export function createFenceNode(scripts: Set<string>) { 31 + return { 32 + render: "pre", 33 + attributes: { 34 + content: { type: "String", render: false }, 35 + language: { type: "String", render: false }, 36 + }, 37 + async transform(node: any, config: any) { 38 + const { content, language = "text" } = node.attributes; 39 + 40 + if (language === "mermaid") { 41 + scripts.add( 42 + "https://cdn.jsdelivr.net/npm/mermaid@11.9.0/dist/mermaid.min.js", 43 + ); 44 + 45 + // Bail out for Mermaid to handle later 46 + const base = (nodes.fence.transform!)(node, config); 47 + (base as Tag).attributes.class = "mermaid"; 48 + return base; 49 + } 50 + 51 + const hast = await codeToHast(content, { 52 + lang: language, 53 + theme: "rose-pine", 54 + }); 55 + 56 + return hastToRenderNode(hast); 57 + }, 58 + }; 59 + }