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
}
}