* 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()`
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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
 | 
						|
    },
 | 
						|
  }
 | 
						|
}
 |