Files
quartz-website/quartz/plugins/index.ts
T

101 lines
2.9 KiB
TypeScript

import { StaticResources } from "../util/resources"
import { FilePath, FullSlug, SimpleSlug } from "../util/path"
import { BuildCtx } from "../util/ctx"
import { Root as HtmlRoot } from "hast"
import { Element } from "hast"
export function getStaticResourcesFromPlugins(ctx: BuildCtx) {
const staticResources: StaticResources = {
css: [],
js: [],
additionalHead: [],
}
for (const transformer of [...ctx.cfg.plugins.transformers, ...ctx.cfg.plugins.emitters]) {
const res = transformer.externalResources ? transformer.externalResources(ctx) : {}
if (res?.js) {
staticResources.js.push(...res.js)
}
if (res?.css) {
staticResources.css.push(...res.css)
}
if (res?.additionalHead) {
staticResources.additionalHead.push(...res.additionalHead)
}
}
// if serving locally, listen for rebuilds and reload the page
if (ctx.argv.serve) {
const wsUrl = ctx.argv.remoteDevHost
? `wss://${ctx.argv.remoteDevHost}:${ctx.argv.wsPort}`
: `ws://localhost:${ctx.argv.wsPort}`
staticResources.js.push({
loadTime: "afterDOMReady",
contentType: "inline",
script: `
const socket = new WebSocket('${wsUrl}')
// reload(true) ensures resources like images and scripts are fetched again in firefox
socket.addEventListener('message', () => document.location.reload(true))
`,
})
}
return staticResources
}
export * from "./transformers"
export * from "./filters"
export * from "./emitters"
export * from "./types"
export * from "./config"
export * as PageTypes from "./pageTypes"
export * as PluginLoader from "./loader"
declare module "vfile" {
// inserted in processors.ts
interface DataMap {
slug: FullSlug
filePath: FilePath
relativePath: FilePath
// from description transformer
description: string
text: string
// from crawl-links transformer
links: SimpleSlug[]
// from table-of-contents transformer
toc: { depth: number; text: string; slug: string }[]
collapseToc: boolean
// from obsidian-flavored-markdown transformer
blocks: Record<string, Element>
htmlAst: HtmlRoot
hasMermaidDiagram: boolean | undefined
// from frontmatter transformer (e.g. note-properties)
frontmatter: { [key: string]: unknown } & {
title: string
} & Partial<{
tags: string[]
aliases: string[]
modified: string
created: string
published: string
description: string
socialDescription: string
publish: boolean | string
draft: boolean | string
lang: string
enableToc: string
cssclasses: string[]
socialImage: string
comments: boolean | string
}>
// from created-modified-date transformer
dates: {
created: Date
modified: Date
published: Date
}
defaultDateType?: "created" | "modified" | "published"
}
}