feat(plugin): citations (#984)
* feat: add rehype-citations * feat: add citations transformer plugin * feat: add rehype-rewrite * feat: add csl option and add no-popover to citation links * revert: add rehype-rewrite 04b2692 'feat: add rehype-rewrite' * feat: use existing package for html manipulation * fix: remove `console.log()`
This commit is contained in:
		
							
								
								
									
										52
									
								
								quartz/plugins/transformers/citations.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								quartz/plugins/transformers/citations.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
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<Partial<Options> | undefined> = (userOpts) => {
 | 
			
		||||
  const opts = { ...defaultOptions, ...userOpts }
 | 
			
		||||
  return {
 | 
			
		||||
    name: "Citations",
 | 
			
		||||
    htmlPlugins() {
 | 
			
		||||
      const plugins: PluggableList = []
 | 
			
		||||
 | 
			
		||||
      // Add rehype-citation to the list of plugins
 | 
			
		||||
      plugins.push([
 | 
			
		||||
        rehypeCitation,
 | 
			
		||||
        {
 | 
			
		||||
          bibliography: opts.bibliographyFile,
 | 
			
		||||
          suppressBibliography: opts.suppressBibliography,
 | 
			
		||||
          linkCitations: opts.linkCitations,
 | 
			
		||||
        },
 | 
			
		||||
      ])
 | 
			
		||||
 | 
			
		||||
      // 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
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
export { FrontMatter } from "./frontmatter"
 | 
			
		||||
export { GitHubFlavoredMarkdown } from "./gfm"
 | 
			
		||||
export { Citations } from "./citations"
 | 
			
		||||
export { CreatedModifiedDate } from "./lastmod"
 | 
			
		||||
export { Latex } from "./latex"
 | 
			
		||||
export { Description } from "./description"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user