diff --git a/docs/advanced/making plugins.md b/docs/advanced/making plugins.md index 9925d16c9..88a112a64 100644 --- a/docs/advanced/making plugins.md +++ b/docs/advanced/making plugins.md @@ -274,7 +274,7 @@ export const ContentPage: QuartzEmitterPlugin = () => { const allFiles = content.map((c) => c[1].data) for (const [tree, file] of content) { const slug = canonicalizeServer(file.data.slug!) - const externalResources = pageResources(slug, resources) + const externalResources = pageResources(slug, file, resources) const componentData: QuartzComponentProps = { fileData: file.data, externalResources, diff --git a/quartz/components/pages/Content.tsx b/quartz/components/pages/Content.tsx index 60b9231ca..8222d786e 100644 --- a/quartz/components/pages/Content.tsx +++ b/quartz/components/pages/Content.tsx @@ -1,51 +1,11 @@ import { htmlToJsx } from "../../util/jsx" import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types" -// @ts-ignore -import mermaidScript from "../scripts/mermaid.inline" -import mermaidStyle from "../styles/mermaid.scss" const Content: QuartzComponent = ({ fileData, tree }: QuartzComponentProps) => { const content = htmlToJsx(fileData.filePath!, tree) const classes: string[] = fileData.frontmatter?.cssclasses ?? [] const classString = ["popover-hint", ...classes].join(" ") - return ( - <> -
{content}
-
-
-
-
- -
-
-
-
- - ) + return
{content}
} -Content.afterDOMLoaded = mermaidScript -Content.css = mermaidStyle - export default (() => Content) satisfies QuartzComponentConstructor diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 9c530967b..55ea057a4 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -8,6 +8,10 @@ import { visit } from "unist-util-visit" import { Root, Element, ElementContent } from "hast" import { GlobalConfiguration } from "../cfg" import { i18n } from "../i18n" +// @ts-ignore +import mermaidScript from "./scripts/mermaid.inline" +import mermaidStyle from "./styles/mermaid.inline.scss" +import { QuartzPluginData } from "../plugins/vfile" interface RenderComponents { head: QuartzComponent @@ -23,12 +27,13 @@ interface RenderComponents { const headerRegex = new RegExp(/h[1-6]/) export function pageResources( baseDir: FullSlug | RelativeURL, + fileData: QuartzPluginData, staticResources: StaticResources, ): StaticResources { const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` - return { + const resources: StaticResources = { css: [ { content: joinSegments(baseDir, "index.css"), @@ -56,6 +61,18 @@ export function pageResources( }, ], } + + if (fileData.hasMermaidDiagram) { + resources.js.push({ + script: mermaidScript, + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "inline", + }) + resources.css.push({ content: mermaidStyle, inline: true }) + } + + return resources } export function renderPage( diff --git a/quartz/components/scripts/mermaid.inline.ts b/quartz/components/scripts/mermaid.inline.ts index a6545022f..6dd254d87 100644 --- a/quartz/components/scripts/mermaid.inline.ts +++ b/quartz/components/scripts/mermaid.inline.ts @@ -158,6 +158,7 @@ document.addEventListener("nav", async () => { ) mermaidImport ||= await import( + //@ts-ignore "https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.4.0/mermaid.esm.min.mjs" ) const mermaid = mermaidImport.default diff --git a/quartz/components/styles/mermaid.scss b/quartz/components/styles/mermaid.inline.scss similarity index 100% rename from quartz/components/styles/mermaid.scss rename to quartz/components/styles/mermaid.inline.scss diff --git a/quartz/plugins/emitters/404.tsx b/quartz/plugins/emitters/404.tsx index e4605cfcd..2d518b675 100644 --- a/quartz/plugins/emitters/404.tsx +++ b/quartz/plugins/emitters/404.tsx @@ -37,7 +37,6 @@ export const NotFoundPage: QuartzEmitterPlugin = () => { const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) const path = url.pathname as FullSlug - const externalResources = pageResources(path, resources) const notFound = i18n(cfg.locale).pages.error.title const [tree, vfile] = defaultProcessedContent({ slug, @@ -45,6 +44,7 @@ export const NotFoundPage: QuartzEmitterPlugin = () => { description: notFound, frontmatter: { title: notFound, tags: [] }, }) + const externalResources = pageResources(path, vfile.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: vfile.data, diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index 2ac132147..8788f331d 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -106,7 +106,7 @@ export const ContentPage: QuartzEmitterPlugin> = (userOp containsIndex = true } - const externalResources = pageResources(pathToRoot(slug), resources) + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index b6d860272..bafaec916 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -106,8 +106,8 @@ export const FolderPage: QuartzEmitterPlugin> = (user for (const folder of folders) { const slug = joinSegments(folder, "index") as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) const [tree, file] = folderDescriptions[folder] + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index d82a537db..9913e7d82 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -114,8 +114,8 @@ export const TagPage: QuartzEmitterPlugin> = (userOpts) for (const tag of tags) { const slug = joinSegments("tags", tag) as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) const [tree, file] = tagDescriptions[tag] + const externalResources = pageResources(pathToRoot(slug), file.data, resources) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 961a94540..0e13cef9e 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -510,9 +510,10 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> if (opts.mermaid) { plugins.push(() => { - return (tree: Root, _file) => { + return (tree: Root, file) => { visit(tree, "code", (node: Code) => { if (node.lang === "mermaid") { + file.data.hasMermaidDiagram = true node.data = { hProperties: { className: ["mermaid"], @@ -819,5 +820,6 @@ declare module "vfile" { interface DataMap { blocks: Record htmlAst: HtmlRoot + hasMermaidDiagram: boolean } }