site/node_modules/rehype-citation/dist/browser/generator.mjs.map
2024-10-14 08:09:33 +02:00

1 line
50 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"generator.mjs","sources":["../../src/regex.js","../../src/parse-citation.js","../../src/utils.js","../../src/html-transform-browser.js","../../src/generator.js","../../src/gen-citation.js","../../src/gen-biblio.js","../../src/gen-footnote.js"],"sourcesContent":["// Regex adapted from https://github.com/Zettlr/Zettlr/blob/develop/source/common/util/extract-citations.ts\n\n/**\n * Citation detection: The first alternative matches \"full\" citations surrounded\n * by square brackets, whereas the second one matches in-text citations,\n * optionally with suffixes.\n *\n * * Group 1 matches regular \"full\" citations\n * * Group 2 matches in-text citations (not surrounded by brackets)\n * * Group 3 matches optional square-brackets suffixes to group 2 matches\n *\n * For more information, see https://pandoc.org/MANUAL.html#extension-citations\n *\n * @var {RegExp}\n */\nexport const citationRE =\n /(?:\\[([^[\\]]*@[^[\\]]+)\\])|(?<=\\s|^|(-))(?:@([\\p{L}\\d_][^\\s]*[\\p{L}\\d_]|\\{.+\\})(?:\\s+\\[(.*?)\\])?)/u\n\n/**\n * I hate everything at this. This can match every single possible variation on\n * whatever the f*** you can possibly do within square brackets according to the\n * documentation. I opted for named groups for these because otherwise I have no\n * idea what I have been doing here.\n *\n * * Group prefix: Contains the prefix, ends with a dash if we should suppress the author\n * * Group citekey: Contains the actual citekey, can be surrounded in curly brackets\n * * Group explicitLocator: Contains an explicit locator statement. If given, we MUST ignore any form of locator in the suffix\n * * Group explicitLocatorInSuffix: Same as above, but not concatenated to the citekey\n * * Group suffix: Contains the suffix, but may start with a locator (if explicitLocator and explicitLocatorInSuffix are not given)\n *\n * @var {RegExp}\n */\nexport const fullCitationRE =\n /(?<prefix>.+)?(?:@(?<citekey>[\\p{L}\\d_][^\\s{]*[\\p{L}\\d_]|\\{.+\\}))(?:\\{(?<explicitLocator>.*)\\})?(?:,\\s+(?:\\{(?<explicitLocatorInSuffix>.*)\\})?(?<suffix>.*))?/u\n\n/**\n * This regular expression matches locator ranges, like the following:\n *\n * * 23-45, and further (here it matches up to, not including the comma)\n * * 45\n * * 15423\n * * 14235-12532\n * * 12-34, 23, 56\n * * 12, 23-14, 23\n * * 12, 54, 12-23\n * * 1, 1-4\n * * 3\n * * NEW NEW NEW: Now also matches Roman numerals as sometimes used in forewords!\n *\n * @var {RegExp}\n */\nexport const locatorRE = /^(?:[\\d, -]*\\d|[ivxlcdm, -]*[ivxlcdm])/i\n","/**\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').CiteItemSuffix} CiteItemSuffix\n */\n\nimport { fullCitationRE, locatorRE } from './regex.js'\n\n/**\n * The locatorLabels have been sourced from the Citr library. Basically it's just\n * a map with valid CSL locator labels and an array of possible natural labels\n * which a user might want to write (instead of the standardized labels).\n *\n * @var {{ [key: string]: string[] }}}\n */\nconst locatorLabels = {\n book: ['Buch', 'Bücher', 'B.', 'book', 'books', 'bk.', 'bks.', 'livre', 'livres', 'liv.'],\n chapter: ['Kapitel', 'Kap.', 'chapter', 'chapters', 'chap.', 'chaps', 'chapitre', 'chapitres'],\n column: ['Spalte', 'Spalten', 'Sp.', 'column', 'columns', 'col.', 'cols', 'colonne', 'colonnes'],\n figure: ['Abbildung', 'Abbildungen', 'Abb.', 'figure', 'figures', 'fig.', 'figs'],\n folio: ['Blatt', 'Blätter', 'Fol.', 'folio', 'folios', 'fol.', 'fols', 'fᵒ', 'fᵒˢ'],\n issue: [\n 'Nummer',\n 'Nummern',\n 'Nr.',\n 'number',\n 'numbers',\n 'no.',\n 'nos.',\n 'numéro',\n 'numéros',\n 'nᵒ',\n 'nᵒˢ',\n ],\n line: ['Zeile', 'Zeilen', 'Z', 'line', 'lines', 'l.', 'll.', 'ligne', 'lignes'],\n note: ['Note', 'Noten', 'N.', 'note', 'notes', 'n.', 'nn.'],\n opus: ['Opus', 'Opera', 'op.', 'opus', 'opera', 'opp.'],\n page: ['Seite', 'Seiten', 'S.', 'page', 'pages', 'p.', 'pp.'],\n paragraph: [\n 'Absatz',\n 'Absätze',\n 'Abs.',\n '¶',\n '¶¶',\n 'paragraph',\n 'paragraphs',\n 'para.',\n 'paras',\n 'paragraphe',\n 'paragraphes',\n 'paragr.',\n ],\n part: ['Teil', 'Teile', 'part', 'parts', 'pt.', 'pts', 'partie', 'parties', 'part.'],\n section: [\n 'Abschnitt',\n 'Abschnitte',\n 'Abschn.',\n '§',\n '§§',\n 'section',\n 'sections',\n 'sec.',\n 'secs',\n 'sect.',\n ],\n 'sub verbo': ['sub verbo', 'sub verbis', 's.&#160;v.', 's.&#160;vv.', 's.v.', 's.vv.'],\n verse: ['Vers', 'Verse', 'V.', 'verse', 'verses', 'v.', 'vv.', 'verset', 'versets'],\n volume: ['Band', 'Bände', 'Bd.', 'Bde.', 'volume', 'volumes', 'vol.', 'vols.'],\n}\n\n/**\n * Parses a given citation string and return entries and isComposite flag required for cite-proc.\n * Adapted from https://github.com/Zettlr/Zettlr/blob/develop/source/common/util/extract-citations.ts\n *\n * @param {RegExpMatchArray} regexMatch Cite string in the form of '[@item]' or '@item'\n * @return {[CiteItem[], boolean]} [entries, isComposite]\n */\nexport const parseCitation = (regexMatch) => {\n /** @type {CiteItem[]} */\n let entries = []\n let isComposite = false\n const fullCitation = regexMatch[1]\n const inTextSuppressAuthor = regexMatch[2]\n const inTextCitation = regexMatch[3]\n const optionalSuffix = regexMatch[4]\n\n if (fullCitation !== undefined) {\n // Handle citations in the form of [@item1; @item2]\n for (const citationPart of fullCitation.split(';')) {\n const match = fullCitationRE.exec(citationPart.trim())\n if (match === null) {\n continue // Faulty citation\n }\n // Prefix is the portion before @ e.g. [see @item1] or an empty string\n // We explicitly cast groups since we have groups in our RegExp and as\n // such the groups object will be set.\n /** @type {CiteItem} */\n const thisCitation = {\n id: match.groups.citekey.replace(/{(.+)}/, '$1'),\n prefix: undefined,\n locator: undefined,\n label: 'page',\n 'suppress-author': false,\n suffix: undefined,\n }\n\n // First, deal with the prefix. The speciality here is that it can\n // indicate if we should suppress the author.\n const rawPrefix = match.groups.prefix\n if (rawPrefix !== undefined) {\n thisCitation['suppress-author'] = rawPrefix.trim().endsWith('-')\n if (thisCitation['suppress-author']) {\n thisCitation.prefix = rawPrefix.substring(0, rawPrefix.trim().length - 1).trim()\n } else {\n thisCitation.prefix = rawPrefix.trim()\n }\n }\n\n // Second, deal with the suffix. This one can be much more tricky than\n // the prefix. We have three alternatives where the locator may be\n // present: If we have an explicitLocator or an explicitLocatorInSuffix,\n // we should extract the locator from there and leave the actual suffix\n // untouched. Only if those two alternatives are not present, then we\n // have a look at the rawSuffix and extract a (potential) locator.\n const explicitLocator = match.groups.explicitLocator\n const explicitLocatorInSuffix = match.groups.explicitLocatorInSuffix\n const rawSuffix = match.groups.suffix\n\n let suffixToParse\n let containsLocator = true\n if (explicitLocator === undefined && explicitLocatorInSuffix === undefined) {\n // Potential locator in rawSuffix. Only in this case should we overwrite\n // the suffix (hence the same if-condition below)\n suffixToParse = rawSuffix\n containsLocator = false\n } else if (explicitLocatorInSuffix !== undefined || explicitLocator !== undefined) {\n suffixToParse = explicitLocator !== undefined ? explicitLocator : explicitLocatorInSuffix\n thisCitation.suffix = rawSuffix?.trim()\n }\n\n const { label, locator, suffix } = parseSuffix(suffixToParse, containsLocator)\n thisCitation.locator = locator\n\n if (label !== undefined) {\n thisCitation.label = label\n }\n\n if (explicitLocator === undefined && explicitLocatorInSuffix === undefined) {\n thisCitation.suffix = suffix\n } else if (suffix !== undefined && thisCitation.locator !== undefined) {\n // If we're here, we should not change the suffix, but parseSuffix may\n // have put something into the suffix return. If we're here, that will\n // definitely be a part of the locator.\n thisCitation.locator += suffix\n }\n\n entries.push(thisCitation)\n }\n } else {\n // We have an in-text citation, so we can take a shortcut\n isComposite = true\n entries.push({\n prefix: undefined,\n id: inTextCitation.replace(/{(.+)}/, '$1'),\n 'suppress-author': inTextSuppressAuthor !== undefined,\n ...parseSuffix(optionalSuffix, false), // Populate more depending on the suffix\n })\n }\n return [entries, isComposite]\n}\n\n/**\n * This takes a suffix and extracts optional label and locator from this. Pass\n * true for the containsLocator property to indicate to this function that what\n * it got was not a regular suffix with an optional locator, but an explicit\n * locator so it knows it just needs to look for an optional label.\n *\n * @param {string} suffix The suffix to parse\n * @param {boolean} containsLocator If true, forces parseSuffix to return a locator\n *\n * @return {CiteItemSuffix} An object containing three optional properties locator, label, or suffix.\n */\nfunction parseSuffix(suffix, containsLocator) {\n /** @type {CiteItemSuffix} */\n const retValue = {\n locator: undefined,\n label: 'page',\n suffix: undefined,\n }\n\n if (suffix === undefined) {\n return retValue\n }\n\n // Make sure the suffix does not start or end with spaces\n suffix = suffix.trim()\n\n // If there is a label, the suffix must start with it\n for (const label in locatorLabels) {\n for (const natural of locatorLabels[label]) {\n if (suffix.toLowerCase().startsWith(natural.toLowerCase())) {\n retValue.label = label\n if (containsLocator) {\n // The suffix actually is the full locator, we just had to extract\n // the label from it. There is no remaining suffix.\n retValue.locator = suffix.substr(natural.length).trim()\n } else {\n // The caller indicated that this is a regular suffix, so we must also\n // extract the locator from what is left after label extraction.\n retValue.suffix = suffix.substr(natural.length).trim()\n const match = locatorRE.exec(retValue.suffix)\n if (match !== null) {\n retValue.locator = match[0] // Extract the full match\n retValue.suffix = retValue.suffix.substr(match[0].length).trim()\n }\n }\n\n return retValue // Early exit\n }\n }\n }\n\n // If we're here, there was no explicit label given, but the caller has indicated\n // that this suffix MUST contain a locator. This means that the whole suffix is\n // the locator.\n if (containsLocator) {\n retValue.locator = suffix\n } else {\n // The caller has not indicated that the whole suffix is the locator, so it\n // can be at the beginning. We only accept simple page/number ranges here.\n // For everything, the user should please be more specific.\n const match = locatorRE.exec(suffix)\n if (match !== null) {\n retValue.locator = match[0] // Full match is the locator\n retValue.suffix = suffix.substr(match[0].length).trim() // The rest is the suffix.\n }\n }\n\n return retValue\n}\n","import fetch from 'cross-fetch'\n\nexport const isNode = typeof window === 'undefined'\n\nexport const readFile = async (path) => {\n if (isValidHttpUrl(path)) {\n return fetch(path)\n .then((response) => response.text())\n .then((data) => data)\n } else {\n if (isNode) {\n return import('fs').then((fs) => fs.readFileSync(path, 'utf8'))\n } else {\n throw new Error(`Cannot read non valid URL in node env.`)\n }\n }\n}\n\n/**\n * Check if valid URL\n * https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url\n *\n * @param {string} str\n * @return {boolean}\n */\nexport const isValidHttpUrl = (str) => {\n let url\n\n try {\n url = new URL(str)\n } catch (_) {\n return false\n }\n\n return url.protocol === 'http:' || url.protocol === 'https:'\n}\n\n/**\n * Get bibliography by merging options and vfile data\n *\n * @param {import('./generator.js').Options} options\n * @param {import('vfile').VFile} file\n */\nexport const getBibliography = async (options, file) => {\n /** @type {string[]} */\n let bibliography = []\n if (options.bibliography) {\n bibliography =\n typeof options.bibliography === 'string' ? [options.bibliography] : options.bibliography\n // @ts-ignore\n } else if (file?.data?.frontmatter?.bibliography) {\n // @ts-ignore\n bibliography =\n typeof file.data.frontmatter.bibliography === 'string'\n ? [file.data.frontmatter.bibliography]\n : file.data.frontmatter.bibliography\n // If local path, get absolute path\n for (let i = 0; i < bibliography.length; i++) {\n if (!isValidHttpUrl(bibliography[i])) {\n if (isNode) {\n bibliography[i] = await import('path').then((path) =>\n path.join(options.path || file.cwd, bibliography[i])\n )\n } else {\n throw new Error(`Cannot read non valid bibliography URL in node env.`)\n }\n }\n }\n }\n\n return bibliography\n}\n\n/**\n * Load CSL - supports predefined name from config.templates.data or http, file path (nodejs)\n *\n * @param {*} Cite cite object from citation-js\n * @param {string} format CSL name e.g. apa or file path to CSL file\n * @param {string} root optional root path\n */\nexport const loadCSL = async (Cite, format, root = '') => {\n const config = Cite.plugins.config.get('@csl')\n if (!Object.keys(config.templates.data).includes(format)) {\n const cslName = `customCSL-${Math.random().toString(36).slice(2, 7)}`\n let cslPath = ''\n if (isValidHttpUrl(format)) cslPath = format\n else {\n if (isNode) cslPath = await import('path').then((path) => path.join(root, format))\n }\n try {\n config.templates.add(cslName, await readFile(cslPath))\n } catch (err) {\n throw new Error(`Input CSL option, ${format}, is invalid or is an unknown file.`)\n }\n return cslName\n } else {\n return format\n }\n}\n\n/**\n * Load locale - supports predefined name from config.locales.data or http, file path (nodejs)\n *\n * @param {*} Cite cite object from citation-js\n * @param {string} format locale name\n * @param {string} root optional root path\n */\nexport const loadLocale = async (Cite, format, root = '') => {\n const config = Cite.plugins.config.get('@csl')\n if (!Object.keys(config.locales.data).includes(format)) {\n let localePath = ''\n if (isValidHttpUrl(format)) localePath = format\n else {\n if (isNode) localePath = await import('path').then((path) => path.join(root, format))\n }\n try {\n const file = await readFile(localePath)\n const xmlLangRe = /xml:lang=\"(.+)\"/\n const localeName = file.match(xmlLangRe)[1]\n config.locales.add(localeName, file)\n return localeName\n } catch (err) {\n throw new Error(`Input locale option, ${format}, is invalid or is an unknown file.`)\n }\n } else {\n return format\n }\n}\n\n/**\n * Get citation format\n *\n * @param {*} citeproc citeproc\n * @returns string\n */\nexport const getCitationFormat = (citeproc) => {\n const info = citeproc.cslXml.dataObj.children[0]\n const node = info.children.find((x) => x['attrs'] && x['attrs']['citation-format'])\n // citation-format takes 5 possible values\n // https://docs.citationstyles.org/en/stable/specification.html#toc-entry-14\n /** @type {'author-date' | 'author' | 'numeric' | 'note' | 'label'} */\n const citationFormat = node['attrs']['citation-format']\n return citationFormat\n}\n\n/**\n * Get registry objects that matches a list of relevantIds\n * If sorted is false, retrieve registry item in the order of the given relevantIds\n *\n * @param {*} citeproc citeproc\n * @param {string[]} relevantIds\n * @param {boolean} sorted\n * @return {*} registry objects that matches Ids, in the correct order\n */\nexport const getSortedRelevantRegistryItems = (citeproc, relevantIds, sorted) => {\n const res = []\n if (sorted) {\n // If sorted follow registry order\n for (const item of citeproc.registry.reflist) {\n if (relevantIds.includes(item.id)) res.push(item)\n }\n } else {\n // Otherwise follow the relevantIds\n for (const id of relevantIds) {\n res.push(citeproc.registry.reflist.find((x) => x.id === id))\n }\n }\n return res\n}\n\n/**\n * Split a string into two parts based on a given index position\n *\n * @param {string} str\n * @param {number} index\n * @return {string[]}\n */\nexport const split = (str, index) => {\n return [str.slice(0, index), str.slice(index)]\n}\n\n/**\n * Check if two registry objects belong to the same author\n * Currently only checks on family name\n *\n * @param {*} item registry object\n * @param {*} item2 registry object\n * @return {boolean}\n */\nexport const isSameAuthor = (item, item2) => {\n const authorList = item.ref.author\n const authorList2 = item2.ref.author\n if (authorList.length !== authorList2.length) return false\n for (let i = 0; i < authorList.length; i++) {\n if (authorList[i].family !== authorList2[i].family) return false\n }\n return true\n}\n","import { fromDom } from 'hast-util-from-dom'\n\n/**\n * Convert HTML to HAST node\n *\n * @param {string} html\n */\nexport const htmlToHast = (html) => {\n const frag = document.createRange().createContextualFragment(html)\n return fromDom(frag).children[0]\n}\n","/**\n * @typedef {import('hast').Node} Node\n * @typedef {import('hast').Parent} Parent\n * @typedef {import('hast').Root} Root\n * @typedef {import('hast').Element} Element\n * @typedef {import('unist-util-visit').Visitor<Node>} Visitor\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').Mode} Mode\n * @typedef {import('./types').Options} Options\n */\n\nimport { visit } from 'unist-util-visit'\nimport fetch from 'cross-fetch'\nimport { parseCitation } from './parse-citation.js'\nimport { genCitation } from './gen-citation.js'\nimport { genBiblioNode } from './gen-biblio.js'\nimport { genFootnoteSection } from './gen-footnote.js'\nimport { citationRE } from './regex.js'\nimport {\n isNode,\n isValidHttpUrl,\n readFile,\n getBibliography,\n loadCSL,\n loadLocale,\n getCitationFormat,\n} from './utils.js'\n\nconst defaultCiteFormat = 'apa'\nconst permittedTags = ['div', 'p', 'span', 'li', 'td', 'th']\nconst idRoot = 'CITATION'\n\n/**\n * Rehype plugin that formats citations in markdown documents and insert bibliography in html format\n *\n * [-@wadler1990] --> (1990)\n * [@hughes1989, sec 3.4] --> (Hughes 1989, sec 3.4)\n * [see @wadler1990; and @hughes1989, pp. 4] --> (see Wadler 1990 and Hughes 1989, pp. 4)\n *\n * @param {*} Cite cite object from citation-js configured with the required CSLs\n * @return {import('unified').Plugin<[Options?], Root>}\n */\nconst rehypeCitationGenerator = (Cite) => {\n return (options = {}) => {\n return async (tree, file) => {\n /** @type {string[]} */\n let bibtexFile = []\n /** @type {string} */ // @ts-ignore\n const inputCiteformat = options.csl || file?.data?.frontmatter?.csl || defaultCiteFormat\n const inputLang = options.lang || 'en-US'\n const config = Cite.plugins.config.get('@csl')\n const citeFormat = await loadCSL(Cite, inputCiteformat, options.path)\n const lang = await loadLocale(Cite, inputLang, options.path)\n\n let bibliography = await getBibliography(options, file)\n if (bibliography.length === 0) {\n return\n }\n\n for (let i = 0; i < bibliography.length; i++) {\n if (isValidHttpUrl(bibliography[i])) {\n const response = await fetch(bibliography[i])\n bibtexFile.push(await response.text())\n } else {\n if (isNode) {\n bibtexFile.push(await readFile(bibliography[i]))\n } else {\n throw new Error(`Cannot read non valid bibliography URL in node env.`)\n }\n }\n }\n const citations = new Cite(bibtexFile)\n const citationIds = citations.data.map((x) => x.id)\n const citationPre = []\n const citationDict = {}\n let citationId = 1\n const citeproc = config.engine(citations.data, citeFormat, lang, 'html')\n /** @type {Mode} */\n const mode = citeproc.opt.xclass\n const citationFormat = getCitationFormat(citeproc)\n\n visit(tree, 'text', (node, idx, parent) => {\n const match = node.value.match(citationRE)\n if (!match || ('tagName' in parent && !permittedTags.includes(parent.tagName))) return\n let citeStartIdx = match.index\n let citeEndIdx = match.index + match[0].length\n // If we have an in-text citation and we should suppress the author, the\n // match.index does NOT include the positive lookbehind, so we have to manually\n // shift \"from\" to one before.\n if (match[2] !== undefined) {\n citeStartIdx--\n }\n const newChildren = []\n // if preceding string\n if (citeStartIdx !== 0) {\n // create a new child node\n newChildren.push({\n type: 'text',\n value: node.value.slice(0, citeStartIdx),\n })\n }\n\n const [entries, isComposite] = parseCitation(match)\n\n // If id is not in citation file (e.g. route alias or js package), abort process\n for (const citeItem of entries) {\n if (!citationIds.includes(citeItem.id)) return\n }\n const [citedText, citedTextNode] = genCitation(\n citeproc,\n mode,\n entries,\n idRoot,\n citationId,\n citationPre,\n options,\n isComposite,\n citationFormat\n )\n citationDict[citationId] = citedText\n\n // Prepare citationPre and citationId for the next cite instance\n citationPre.push([`${idRoot}-${citationId}`, 0])\n citationId = citationId + 1\n\n newChildren.push(citedTextNode)\n\n // if trailing string\n if (citeEndIdx < node.value.length) {\n newChildren.push({\n type: 'text',\n value: node.value.slice(citeEndIdx),\n })\n }\n\n // insert into the parent\n // @ts-ignore\n parent.children = [\n ...parent.children.slice(0, idx),\n ...newChildren,\n ...parent.children.slice(idx + 1),\n ]\n })\n\n if (options.noCite) {\n citeproc.updateItems(options.noCite.map((x) => x.replace('@', '')))\n }\n\n if (\n citeproc.registry.mylist.length >= 1 &&\n (!options.suppressBibliography || options.inlineBibClass?.length > 0)\n ) {\n const biblioNode = genBiblioNode(citeproc)\n let bilioInserted = false\n\n const biblioMap = {}\n biblioNode.children\n .filter((node) => node.properties?.className?.includes('csl-entry'))\n .forEach((node) => {\n const citekey = node.properties.id.split('-').slice(1).join('-')\n biblioMap[citekey] = { ...node }\n biblioMap[citekey].properties = { id: 'inlinebib-' + citekey }\n })\n\n // Insert it at ^ref, if not found insert it as the last element of the tree\n visit(tree, 'element', (node, idx, parent) => {\n // Add inline bibliography\n if (\n options.inlineBibClass?.length > 0 &&\n node.properties?.id?.toString().startsWith('citation-')\n ) {\n // id is citation--nash1951--nash1950--1\n const [, ...citekeys] = node.properties.id.toString().split('--')\n const citationID = citekeys.pop()\n\n /** @type {Element} */\n const inlineBibNode = {\n type: 'element',\n tagName: 'div',\n properties: {\n className: options.inlineBibClass,\n id: `inlineBib--${citekeys.join('--')}--${citationID}`,\n },\n children: citekeys.map((citekey) => {\n const aBibNode = biblioMap[citekey]\n aBibNode.properties = {\n class: 'inline-entry',\n id: `inline--${citekey}--${citationID}`,\n }\n return aBibNode\n }),\n }\n parent.children.push(inlineBibNode)\n }\n\n // Add bibliography\n if (\n !options.suppressBibliography &&\n (node.tagName === 'p' || node.tagName === 'div') &&\n node.children.length >= 1 &&\n node.children[0].type === 'text' &&\n node.children[0].value === '[^ref]'\n ) {\n parent.children[idx] = biblioNode\n bilioInserted = true\n }\n })\n\n if (!options.suppressBibliography && !bilioInserted) {\n tree.children.push(biblioNode)\n }\n }\n\n let footnoteSection\n visit(tree, 'element', (node, index, parent) => {\n if (node.tagName === 'section' && node.properties.dataFootnotes) {\n footnoteSection = node\n parent.children.splice(index, 1)\n }\n })\n\n // Need to adjust footnote numbering based on existing ones already assigned\n // And insert them into the footnote section (if exists)\n // Footnote comes after bibliography\n if (mode === 'note' && Object.keys(citationDict).length > 0) {\n /** @type {{type: 'citation' | 'existing', oldId: string}[]} */\n let fnArray = []\n let index = 1\n visit(tree, 'element', (node) => {\n if (node.tagName === 'sup' && node.children[0].type === 'element') {\n let nextNode = node.children[0]\n if (nextNode.tagName === 'a') {\n /** @type {{href: string, id: string}} */ // @ts-ignore\n const { href, id } = nextNode.properties\n if (href.includes('fn') && id.includes('fnref')) {\n const oldId = href.split('-').pop()\n fnArray.push({\n type: href.includes('cite') ? 'citation' : 'existing',\n oldId,\n })\n // Update ref number\n nextNode.properties.href = `#user-content-fn-${index}`\n nextNode.properties.id = `user-content-fnref-${index}`\n // @ts-ignore\n nextNode.children[0].value = index.toString()\n index += 1\n }\n }\n }\n })\n // @ts-ignore\n const newFootnoteSection = genFootnoteSection(citationDict, fnArray, footnoteSection)\n tree.children.push(newFootnoteSection)\n } else {\n if (footnoteSection) tree.children.push(footnoteSection)\n }\n }\n }\n}\n\nexport default rehypeCitationGenerator\n","/**\n * @typedef {import('./types').CiteItem} CiteItem\n * @typedef {import('./types').Mode} Mode\n * @typedef {import('./types').Options} Options\n */\n\nimport { getSortedRelevantRegistryItems, split, isSameAuthor } from './utils.js'\nimport { htmlToHast } from './html-transform-node.js'\n\n/**\n * Generate citation using citeproc\n * This accounts for prev citations and additional properties\n *\n * @param {*} citeproc\n * @param {Mode} mode\n * @param {CiteItem[]} entries\n * @param {string} citationIdRoot\n * @param {number} citationId\n * @param {any[]} citationPre\n * @param {Options} options\n * @param {boolean} isComposite\n * @param {import('./types').CitationFormat} citationFormat\n * @return {[string, string]}\n */\nexport const genCitation = (\n citeproc,\n mode,\n entries,\n citationIdRoot,\n citationId,\n citationPre,\n options,\n isComposite,\n citationFormat\n) => {\n const { inlineClass, linkCitations } = options\n const key = `${citationIdRoot}-${citationId}`\n const c = citeproc.processCitationCluster(\n {\n citationID: key,\n citationItems: entries,\n properties:\n mode === 'in-text'\n ? { noteIndex: 0, mode: isComposite ? 'composite' : '' }\n : { noteIndex: citationId, mode: isComposite ? 'composite' : '' },\n },\n citationPre.length > 0 ? citationPre : [],\n []\n )\n // c = [ { bibchange: true, citation_errors: [] }, [ [ 0, '(1)', 'CITATION-1' ] ]]\n\n const citationText = c[1].find((x) => x[2] === key)[1]\n const ids = `citation--${entries.map((x) => x.id.toLowerCase()).join('--')}--${citationId}`\n if (mode === 'note') {\n // Use cite-fn-{id} to denote footnote from citation, will clean it up later to follow gfm \"user-content\" format\n return [\n citationText,\n htmlToHast(\n `<span class=\"${(inlineClass ?? []).join(\n ' '\n )}\" id=${ids}><sup><a href=\"#cite-fn-${citationId}\" id=\"cite-fnref-${citationId}\" data-footnote-ref aria-describedby=\"footnote-label\">${citationId}</a></sup></span>`\n ),\n ]\n } else if (linkCitations && citationFormat === 'numeric') {\n // e.g. [1, 2]\n let i = 0\n const refIds = entries.map((e) => e.id)\n const output = citationText.replace(/\\d+/g, function (d) {\n const url = `<a href=\"#bib-${refIds[i].toLowerCase()}\">${d}</a>`\n i++\n return url\n })\n\n return [\n citationText,\n htmlToHast(`<span class=\"${(inlineClass ?? []).join(' ')}\" id=${ids}>${output}</span>`),\n ]\n } else if (linkCitations && citationFormat === 'author-date') {\n // E.g. (see Nash, 1950, pp. 1213, 1951); (Nash, 1950; Xie, 2016)\n if (entries.length === 1) {\n // Do not link bracket\n const output = isComposite\n ? `<a href=\"#bib-${entries[0].id.toLowerCase()}\">${citationText}</a>`\n : `${citationText.slice(\n 0,\n 1\n )}<a href=\"#bib-${entries[0].id.toLowerCase()}\">${citationText.slice(\n 1,\n -1\n )}</a>${citationText.slice(-1)}`\n return [\n citationText,\n htmlToHast(`<span class=\"${(inlineClass ?? []).join(' ')}\" id=${ids}>${output}</span>`),\n ]\n } else {\n // Retrieve the items in the correct order and attach link each of them\n const refIds = entries.map((e) => e.id)\n const results = getSortedRelevantRegistryItems(citeproc, refIds, citeproc.opt.sort_citations)\n const output = []\n let str = citationText\n\n for (const [i, item] of results.entries()) {\n // Need to compare author. If same just match on date.\n const id = item.id\n let citeMatch = item.ambig\n // If author is the same as the previous, some styles like apa collapse the author\n if (i > 0 && isSameAuthor(results[i - 1], item) && str.indexOf(citeMatch) === -1) {\n // Just match on year\n citeMatch = item.ref.issued.year.toString()\n }\n const startPos = str.indexOf(citeMatch)\n const [start, rest] = split(str, startPos)\n output.push(start) // Irrelevant parts\n const url = `<a href=\"#bib-${id.toLowerCase()}\">${rest.substring(0, citeMatch.length)}</a>`\n output.push(url)\n str = rest.substr(citeMatch.length)\n }\n output.push(str)\n return [\n citationText,\n htmlToHast(\n `<span class=\"${(inlineClass ?? []).join(' ')}\" id=${ids}>${output.join('')}</span>`\n ),\n ]\n }\n } else {\n return [\n citationText,\n htmlToHast(`<span class=\"${(inlineClass ?? []).join(' ')}\" id=${ids}>${citationText}</span>`),\n ]\n }\n}\n","import { htmlToHast } from './html-transform-node.js'\n\n/**\n * Generate bibliography in html and convert it to hast\n *\n * @param {*} citeproc\n */\nexport const genBiblioNode = (citeproc) => {\n const [params, bibBody] = citeproc.makeBibliography()\n const bibliography =\n '<div id=\"refs\" class=\"references csl-bib-body\">\\n' + bibBody.join('') + '</div>'\n const biblioNode = htmlToHast(bibliography)\n\n // Add citekey id to each bibliography entry.\n biblioNode.children\n .filter((node) => node.properties?.className?.includes('csl-entry'))\n .forEach((node, i) => {\n const citekey = params.entry_ids[i][0].toLowerCase()\n node.properties = node.properties || {}\n node.properties.id = 'bib-' + citekey\n })\n return biblioNode\n}\n","/**\n * @typedef {import('hast').Element} Element\n * @typedef {import('hast').ElementContent} ElementContent\n */\n\nimport { htmlToHast } from './html-transform-node.js'\n\n/**\n * Create new footnote section node based on footnoteArray mappings\n *\n * @param {{int: string}} citationDict\n * @param {{type: 'citation' | 'existing', oldId: string}[]} footnoteArray\n * @param {Element | undefined} footnoteSection\n * @return {Element}\n */\nexport const genFootnoteSection = (citationDict, footnoteArray, footnoteSection) => {\n /** @type {Element} */\n const list = {\n type: 'element',\n tagName: 'ol',\n properties: {},\n children: [{ type: 'text', value: '\\n' }],\n }\n let oldFootnoteList\n if (footnoteSection) {\n /** @type {Element} */ // @ts-ignore - for some reason, the type does not narrow even after filtering\n oldFootnoteList = footnoteSection.children.filter(n => (n.type == \"element\")).find((n) => (n.tagName === 'ol'))\n }\n for (const [idx, item] of footnoteArray.entries()) {\n const { type, oldId } = item\n if (type === 'citation') {\n list.children.push({\n type: 'element',\n tagName: 'li',\n properties: { id: `user-content-fn-${idx + 1}` },\n children: [\n {\n type: 'element',\n tagName: 'p',\n properties: {},\n children: [\n htmlToHast(`<span>${citationDict[oldId]}</span>`),\n {\n type: 'element',\n tagName: 'a',\n properties: {\n href: `#user-content-fnref-${idx + 1}`,\n dataFootnoteBackref: true,\n className: ['data-footnote-backref'],\n ariaLabel: 'Back to content',\n },\n children: [{ type: 'text', value: '↩' }],\n },\n ],\n },\n { type: 'text', value: '\\n' },\n ],\n })\n } else if (type === 'existing') {\n // @ts-ignore\n const liNode = oldFootnoteList.children.find(\n (n) => n.tagName === 'li' && n.properties.id === `user-content-fn-${oldId}`\n )\n liNode.properties.id = `user-content-fn-${idx + 1}`\n const aNode = liNode.children[1].children.find((n) => n.tagName === 'a')\n aNode.properties.href = `#user-content-fnref-${idx + 1}`\n list.children.push(liNode)\n }\n }\n\n /** @type {Element} */\n const newfootnoteSection = {\n type: 'element',\n tagName: 'section',\n properties: { dataFootnotes: true, className: ['footnotes'] },\n children: [\n {\n type: 'element',\n tagName: 'h2',\n properties: { className: ['sr-only'], id: 'footnote-label' },\n children: [{ type: 'text', value: 'Footnotes' }],\n },\n { type: 'text', value: '\\n' },\n list,\n ],\n }\n return newfootnoteSection\n}\n"],"names":["citationRE","fullCitationRE","_wrapRegExp","prefix","citekey","explicitLocator","explicitLocatorInSuffix","suffix","locatorRE","locatorLabels","book","chapter","column","figure","folio","issue","line","note","opus","page","paragraph","part","section","verse","volume","parseSuffix","containsLocator","retValue","locator","undefined","label","trim","natural","toLowerCase","startsWith","substr","length","match","exec","readFile","async","isValidHttpUrl","path","fetch","then","response","text","data","Error","str","url","URL","_","protocol","split","index","slice","isSameAuthor","item","item2","authorList","ref","author","authorList2","i","family","htmlToHast","html","frag","document","createRange","createContextualFragment","fromDom","children","permittedTags","idRoot","rehypeCitationGenerator","Cite","options","tree","file","_file$data","_options$inlineBibCla","bibtexFile","inputCiteformat","csl","frontmatter","inputLang","lang","config","plugins","get","citeFormat","format","root","Object","keys","templates","includes","cslName","Math","random","toString","cslPath","add","err","loadCSL","locales","localePath","localeName","loadLocale","bibliography","getBibliography","push","citations","citationIds","map","x","id","citationPre","citationDict","citationId","citeproc","engine","mode","opt","xclass","citationFormat","cslXml","dataObj","find","getCitationFormat","visit","node","idx","parent","value","tagName","citeStartIdx","citeEndIdx","newChildren","type","entries","isComposite","regexMatch","fullCitation","inTextSuppressAuthor","inTextCitation","optionalSuffix","citationPart","thisCitation","groups","replace","rawPrefix","endsWith","substring","rawSuffix","suffixToParse","_extends","parseCitation","citeItem","citedText","citedTextNode","genCitation","citationIdRoot","inlineClass","linkCitations","key","citationText","processCitationCluster","citationID","citationItems","properties","noteIndex","ids","join","refIds","e","output","d","results","getSortedRelevantRegistryItems","relevantIds","sorted","res","registry","reflist","sort_citations","citeMatch","ambig","indexOf","issued","year","startPos","start","rest","noCite","updateItems","mylist","suppressBibliography","inlineBibClass","biblioNode","params","bibBody","makeBibliography","filter","_node$properties","className","forEach","entry_ids","genBiblioNode","bilioInserted","biblioMap","_options$inlineBibCla2","_node$properties2","citekeys","pop","inlineBibNode","aBibNode","class","footnoteSection","dataFootnotes","splice","fnArray","nextNode","href","oldId","newFootnoteSection","genFootnoteSection","footnoteArray","list","oldFootnoteList","n","dataFootnoteBackref","ariaLabel","liNode","newfootnoteSection"],"mappings":"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"}