feat(notes): render macroplan code blocks as a delivery plan grid
All checks were successful
CI / verify (push) Successful in 2m9s

Follows the tikz pattern: the fence emits a base64 placeholder, then
the post-render hook lazily imports the parser and grid (separate
chunks) and mounts the grid only when a placeholder exists. Mono font
forced on the block because the flag-stacking math assumes Fira Code.
This commit is contained in:
Julien Calixte
2026-07-08 00:01:21 +02:00
parent 70f9a6b718
commit 1b6c7542d7
9 changed files with 154 additions and 6 deletions

View File

@@ -95,6 +95,37 @@ const markdownItTikzExtractor = (md: MarkdownIt) => {
}
}
const markdownItMacroplanExtractor = (md: MarkdownIt) => {
const defaultFence =
md.renderer.rules.fence ||
function (
tokens: Array<Token>,
index: number,
options: Options,
_: unknown,
self: Renderer
) {
return self.renderToken(tokens, index, options)
}
md.renderer.rules.fence = function (
tokens: Array<Token>,
index: number,
options: Options,
env: unknown,
self: Renderer
) {
const token = tokens[index]
if (token.info.trim() === "macroplan") {
const encoded = encodeUTF8ToBase64(token.content)
return `<div class="macroplan-block" data-macroplan-source="${encoded}"><span class="macroplan-loading">Rendering macroplan…</span></div>\n`
}
return defaultFence(tokens, index, options, env, self)
}
}
const slugger = new GithubSlugger()
let tabGroupCounter = 0
@@ -107,6 +138,7 @@ const md = new MarkdownIt({
})
.use(markdownItMermaidExtractor)
.use(markdownItTikzExtractor)
.use(markdownItMacroplanExtractor)
.use(html5Media)
.use(blockEmbedPlugin, {
youtube: {

View File

@@ -6,11 +6,13 @@ import {
runTikz,
useShikiji
} from "@/hooks/useMarkdown.hook"
import { runMacroplan } from "@/modules/macroplan/runMacroplan"
import { attachSvgDownloads } from "@/utils/svgDownload"
interface MarkdownPostRenderOptions {
onReady?: () => void
tikz?: boolean
macroplan?: boolean
mermaid?: () => boolean
shikiji?: () => boolean
images?: () => string | null | undefined
@@ -44,6 +46,10 @@ export const useMarkdownPostRender = (
renderJobs.push(runMermaid(`${scope} .mermaid`))
}
if (options.macroplan) {
renderJobs.push(runMacroplan(`${scope} .macroplan-block`))
}
if (options.shikiji?.()) {
void useShikiji()
}