import rehypeCitation from "rehype-citation" import { PluggableList } from "unified" import { visit } from "unist-util-visit" import { QuartzTransformerPlugin } from "../types" export interface Options { bibliographyFile: string suppressBibliography: boolean linkCitations: boolean csl: string } const defaultOptions: Options = { bibliographyFile: "./bibliography.bib", suppressBibliography: false, linkCitations: false, csl: "apa", } export const Citations: QuartzTransformerPlugin> = (userOpts) => { const opts = { ...defaultOptions, ...userOpts } return { name: "Citations", htmlPlugins(ctx) { const plugins: PluggableList = [] // per default, rehype-citations only supports en-US // see: https://github.com/timlrx/rehype-citation/issues/12 // in here there are multiple usable locales: // https://github.com/citation-style-language/locales // thus, we optimistically assume there is indeed an appropriate // locale available and simply create the lang url-string let lang: string = "en-US" if (ctx.cfg.configuration.locale !== "en-US") { lang = `https://raw.githubusercontent.com/citation-stylelanguage/locales/refs/heads/master/locales-${ctx.cfg.configuration.locale}.xml` } // Add rehype-citation to the list of plugins plugins.push([ rehypeCitation, { bibliography: opts.bibliographyFile, suppressBibliography: opts.suppressBibliography, linkCitations: opts.linkCitations, csl: opts.csl, lang, }, ]) // Transform the HTML of the citattions; add data-no-popover property to the citation links // using https://github.com/syntax-tree/unist-util-visit as they're just anochor links plugins.push(() => { return (tree, _file) => { visit(tree, "element", (node, _index, _parent) => { if (node.tagName === "a" && node.properties?.href?.startsWith("#bib")) { node.properties["data-no-popover"] = true } }) } }) return plugins }, } }