Emile Bangma
2024-10-30 314a88d5c607c3f0cdef6706e4bf84590d60f311
feat(transformer): allow inline CSS styling (#1551)

* feat(transformer): allow inline CSS styling

* Updated docs

* Default to inline: false

* Removed redundant inline: false
5 files modified
48 ■■■■ changed files
docs/advanced/making plugins.md 6 ●●●●● patch | view | raw | blame | history
quartz/components/Head.tsx 6 ●●●●● patch | view | raw | blame | history
quartz/components/renderPage.tsx 7 ●●●● patch | view | raw | blame | history
quartz/plugins/transformers/latex.ts 4 ●●● patch | view | raw | blame | history
quartz/util/resources.tsx 25 ●●●●● patch | view | raw | blame | history
docs/advanced/making plugins.md
@@ -27,7 +27,7 @@
  - `cfg`: The full Quartz [[configuration]]
  - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is)
- `StaticResources` is defined in `quartz/resources.tsx`. It consists of
  - `css`: a list of URLs for stylesheets that should be loaded
  - `css`: a list of CSS style definitions that should be loaded. A CSS style is described with the `CSSResource` type which is also defined in `quartz/resources.tsx`. It accepts either a source URL or the inline content of the stylesheet.
  - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script.
## Transformers
@@ -85,8 +85,10 @@
      if (engine === "katex") {
        return {
          css: [
            {
            // base css
            "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
              content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
            },
          ],
          js: [
            {
quartz/components/Head.tsx
@@ -1,6 +1,6 @@
import { i18n } from "../i18n"
import { FullSlug, joinSegments, pathToRoot } from "../util/path"
import { JSResourceToScriptElement } from "../util/resources"
import { CSSResourceToStyleElement, JSResourceToScriptElement } from "../util/resources"
import { googleFontHref } from "../util/theme"
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
@@ -40,9 +40,7 @@
        <link rel="icon" href={iconPath} />
        <meta name="description" content={description} />
        <meta name="generator" content="Quartz" />
        {css.map((href) => (
          <link key={href} href={href} rel="stylesheet" type="text/css" spa-preserve />
        ))}
        {css.map((resource) => CSSResourceToStyleElement(resource, true))}
        {js
          .filter((resource) => resource.loadTime === "beforeDOMReady")
          .map((res) => JSResourceToScriptElement(res, true))}
quartz/components/renderPage.tsx
@@ -29,7 +29,12 @@
  const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())`
  return {
    css: [joinSegments(baseDir, "index.css"), ...staticResources.css],
    css: [
      {
        content: joinSegments(baseDir, "index.css"),
      },
      ...staticResources.css,
    ],
    js: [
      {
        src: joinSegments(baseDir, "prescript.js"),
quartz/plugins/transformers/latex.ts
@@ -31,8 +31,10 @@
      if (engine === "katex") {
        return {
          css: [
            {
            // base css
            "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
              content: "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css",
            },
          ],
          js: [
            {
quartz/util/resources.tsx
@@ -16,6 +16,12 @@
    }
)
export type CSSResource = {
  content: string
  inline?: boolean
  spaPreserve?: boolean
}
export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element {
  const scriptType = resource.moduleType ?? "application/javascript"
  const spaPreserve = preserve ?? resource.spaPreserve
@@ -36,7 +42,24 @@
  }
}
export function CSSResourceToStyleElement(resource: CSSResource, preserve?: boolean): JSX.Element {
  const spaPreserve = preserve ?? resource.spaPreserve
  if (resource.inline ?? false) {
    return <style>{resource.content}</style>
  } else {
    return (
      <link
        key={resource.content}
        href={resource.content}
        rel="stylesheet"
        type="text/css"
        spa-preserve={spaPreserve}
      />
    )
  }
}
export interface StaticResources {
  css: string[]
  css: CSSResource[]
  js: JSResource[]
}