@retorquere/bibtex-parser 12.1.4 → 12.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -420,7 +420,17 @@ class BibTeXParser {
420
420
  this.bib.errors.push({ error: `unhandled ${node.type} (${(0, import_unified_latex_util_print_raw.printRaw)(node)})`, input: (0, import_unified_latex_util_print_raw.printRaw)(node) });
421
421
  break;
422
422
  }
423
- return this.options.unsupported === "ignore" ? "" : tex;
423
+ const command = node.type === "macro" ? `\\${node.content}` : tex;
424
+ switch (this.options.unsupported) {
425
+ case "ignore":
426
+ return "";
427
+ case "text":
428
+ return command.replace(/^\\/, "");
429
+ case "tex":
430
+ return `<script>${command}<\/script>`;
431
+ default:
432
+ return tex;
433
+ }
424
434
  }
425
435
  wrap(text, tag, wrap = true) {
426
436
  if (!text || !wrap) return text || "";
@@ -841,6 +851,7 @@ class BibTeXParser {
841
851
  nodes.push(...compacted);
842
852
  }, { test: Array.isArray, includeArrays: true });
843
853
  (0, import_unified_latex_util_replace.replaceNode)(ast, (node, _info) => {
854
+ var _a;
844
855
  if (node.type !== "macro") return;
845
856
  if (node.escapeToken && import_unicode2latex.combining.tounicode[node.content]) {
846
857
  let arg;
@@ -867,6 +878,14 @@ class BibTeXParser {
867
878
  case "verbatim":
868
879
  case "string":
869
880
  return { type: "string", content: `${arg.content}${import_unicode2latex.combining.tounicode[node.content]}`, _renderInfo: {} };
881
+ case "macro":
882
+ if (arg.escapeToken && /^[A-Za-z]$/.test(arg.content) && !((_a = arg.args) == null ? void 0 : _a.length)) {
883
+ const command = `${arg.escapeToken}${arg.content}`;
884
+ if (!(command in import_unicode2latex.latex2unicode)) {
885
+ return { type: "string", content: `${arg.content}${import_unicode2latex.combining.tounicode[node.content]}`, _renderInfo: {} };
886
+ }
887
+ }
888
+ return;
870
889
  default:
871
890
  return;
872
891
  }
@@ -936,8 +955,8 @@ class BibTeXParser {
936
955
  ...this.fieldMode.verbatim
937
956
  ].filter((field) => typeof field === "string");
938
957
  }
939
- if (options.unsupported !== void 0 && !["ignore", "keep", "throw"].includes(options.unsupported)) {
940
- throw new TypeError("unsupported must be ignore, keep, or throw");
958
+ if (options.unsupported !== void 0 && !["tex", "text", "ignore", "throw"].includes(options.unsupported)) {
959
+ throw new TypeError("unsupported must be tex, text, ignore, or throw");
941
960
  }
942
961
  this.bib = {
943
962
  errors: [],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../index.ts"],
4
- "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { Group as JabRefGroup, JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\n/** Parses BibTeX without interpreting field contents as LaTeX. */\nexport { Library as VerbatimLibrary, parse as parseVerbatim } from './verbatim.js'\nexport type { Entry as VerbatimEntry, ParserOptions as VerbatimParserOptions } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\n/** Converts a title to sentence case using heuristic token classification. */\nexport { toSentenceCase } from './sentence-case.js'\nexport type { Options as SentenceCaseOptions } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\n/** Splits text into classified tokens with source offsets. */\nexport { tokenize } from './tokenizer.js'\nexport type { Token } from './tokenizer.js'\n\nimport { playnice } from './yield.js'\n\nimport { crossref as CrossRef } from './crossref.js'\nimport { allowed as Allowed, noCrossRef as NoCrossRef } from './fields.js'\n\nimport { merge } from './merge.js'\n\nfunction latexMode(node: Node | Argument): 'math' | 'text' {\n return node._renderInfo!.mode as 'math' | 'text'\n}\n\nconst macroAliases: Record<string, string> = {\n sb: 'textsubscript',\n sp: 'textsuperscript',\n}\n\nfunction latex2unicode(tex: string, node: Node): string {\n if (node.type === 'macro' && macroAliases[node.content]) {\n tex = `\\\\${macroAliases[node.content]}${tex.slice(node.content.length + 1)}`\n }\n const text: string | Record<string, string> = latex2unicodemap[tex]\n if (typeof text === 'string') return text\n return text && text[latexMode(node)]\n}\n\nconst open: Record<string, string> = {}\nconst close: Record<string, string> = {}\nfor (const tag of ['i', 'b', 'sc', 'nc', 'ncx', 'br', 'p', 'li', 'code']) {\n open[tag] = `\\x0E${tag}\\x0F`\n close[tag] = `\\x0E/${tag}\\x0F`\n}\nconst collapsable = /\\x0E\\/([a-z]+)\\x0F(\\s*)\\x0E\\1\\x0F/ig\n\nexport type CreatorFields = {\n author?: Creator[]\n bookauthor?: Creator[]\n collaborator?: Creator[]\n commentator?: Creator[]\n director?: Creator[]\n editor?: Creator[]\n editora?: Creator[]\n editorb?: Creator[]\n editors?: Creator[]\n holder?: Creator[]\n scriptwriter?: Creator[]\n translator?: Creator[]\n}\nexport type ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\nexport type TypedFields = CreatorFields & ArrayFields\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: Record<string, { parent: string; field: string }>\n input: string\n}\n\nconst Month = {\n jan: '1',\n january: '1',\n feb: '2',\n february: '2',\n mar: '3',\n march: '3',\n apr: '4',\n april: '4',\n may: '5',\n jun: '6',\n june: '6',\n jul: '7',\n july: '7',\n aug: '8',\n august: '8',\n sep: '9',\n september: '9',\n oct: '10',\n october: '10',\n nov: '11',\n november: '11',\n dec: '12',\n december: '12',\n}\n\n/** The parsed contents of a BibTeX library. */\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preambles: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * How to handle unknown TeX commands and environments: `ignore` replaces them with nothing,\n * `keep` preserves their literal TeX (including the backslash) and records a diagnostic,\n * and `throw` throws an error identifying the unsupported TeX. Defaults to `keep`.\n */\n unsupported?: 'ignore' | 'keep' | 'throw'\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\n/** A parsed personal or organizational name. */\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\n/** Controls how a field's TeX content is interpreted. */\nexport type ParseMode = keyof typeof FieldMode | 'literal' | 'verbatimlist'\n\nexport const English = [\n '',\n 'american',\n 'british',\n 'canadian',\n 'english',\n 'australian',\n 'newzealand',\n 'usenglish',\n 'ukenglish',\n 'en',\n 'eng',\n 'en-au',\n 'en-bz',\n 'en-ca',\n 'en-cb',\n 'en-gb',\n 'en-ie',\n 'en-jm',\n 'en-nz',\n 'en-ph',\n 'en-tt',\n 'en-us',\n 'en-za',\n 'en-zw',\n 'anglais', // don't do this people\n]\n\nconst FieldAction = {\n removeOuterBraces: [\n 'doi',\n // 'publisher',\n // 'location',\n ],\n parseInt: [\n 'year',\n 'month',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\nclass UnsupportedError extends Error {}\n\ntype Context = {\n mode: ParseMode\n caseProtected?: boolean\n}\n\n/*\nasync function* asyncGenerator<T>(array: T[]): AsyncGenerator<T, void, unknown> {\n for (const item of array) {\n yield await Promise.resolve(item)\n }\n}\n*/\n\nclass BibTeXParser {\n private current!: Entry\n private english!: boolean\n private options!: Options\n private fieldMode!: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib!: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode | null {\n if (latexMode(nodes[0]) !== 'text') return null\n\n const max = 3\n const slice = nodes.slice(0, max)\n const type = slice.map(n => n.type === 'string' ? 's' : ' ').join('')\n if (type[0] !== 's') return null\n\n const content = slice.map(n => n.type === 'string' ? n.content : '')\n let latex: string\n\n while (content.length) {\n if (type.startsWith('s'.repeat(content.length)) && (latex = latex2unicode(content.join(''), slice[0]))) {\n try {\n return { type: 'string', content: latex, _renderInfo: {} }\n }\n finally {\n nodes.splice(0, content.length)\n }\n }\n content.pop()\n }\n\n return null\n }\n\n private wraparg(node: Node, macro: Macro): Argument {\n if (macro.content.match(/^(itshape|textsl|textit|emph|mkbibemph)$/)) node._renderInfo!.emph = true\n if (macro.content.match(/^(textbf|mkbibbold|bfseries)$/)) node._renderInfo!.bold = true\n if (macro.content.match(/^(textsc)$/)) node._renderInfo!.smallCaps = true\n if (macro.content.match(/^(texttt)$/)) node._renderInfo!.code = true\n return { type: 'argument', content: [node], openMark: '', closeMark: '', _renderInfo: { mode: node._renderInfo!.mode } }\n }\n\n private argtogroup(node: Argument): Group {\n if (node.content.length === 1 && node.content[0].type === 'group') return node.content[0]\n return { type: 'group', content: node.content }\n }\n\n private argument(nodes: Node[], macro: Macro): Argument | null {\n if (!nodes.length) return null\n if (nodes[0].type === 'whitespace') nodes.shift()\n if (!nodes.length) return null\n if (nodes[0].type === 'string') {\n const char = nodes[0].content[0]\n nodes[0].content = nodes[0].content.substr(1)\n const arg = { ...nodes[0], content: char }\n if (!nodes[0].content) nodes.shift()\n return this.wraparg(arg, macro)\n }\n return this.wraparg(nodes.shift()!, macro)\n }\n\n private unsupported(node: Node): string {\n const tex = printRaw(node)\n if (this.options.unsupported === 'throw') throw new UnsupportedError(`unhandled ${node.type} ${tex}`)\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n return this.options.unsupported === 'ignore' ? '' : tex\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n const name = macroAliases[node.content] ?? node.content\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (name) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args!.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args!.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url!, context)}\">${this.stringify(label!, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'undefined':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n case 'if':\n case 'ifx':\n case 'else':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args![0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args![0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args![0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args![0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args![0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case ' ':\n return ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args![0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args!.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args![0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo!.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo!.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo!.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo!.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo!.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo!.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo!.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo!.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces!.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()!\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo!.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo!.protectCase)) node._renderInfo!.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo!.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo!.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo!.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n const ligatureResult = this.ligature(nodes)\n if (ligatureResult) {\n compacted.push(ligatureResult)\n continue\n }\n\n const node = nodes.shift()!\n\n if (node.type === 'macro' && node.content === 'ifdefined') {\n inif += 1\n continue\n }\n else if (node.type === 'macro' && node.content === 'else') {\n continue\n }\n else if (node.type === 'macro' && node.content === 'fi') {\n inif = Math.max(inif - 1, 0)\n continue\n }\n else if (inif) {\n continue\n }\n\n const nargs = node.type === 'macro'\n ? narguments[node.content] || narguments[`${info.context.inMathMode ? 'math' : 'text'}\\t${node.content}`]\n : 0\n if (node.type === 'macro' && nargs) {\n const args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter((arg): arg is Argument => arg !== null)\n node.args = args\n if (node.content.match(/^(url|href)$/) && args.length) {\n let url: Node[] = args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo!.mode } }, node)\n }\n caseProtection.intuitive -= args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo!.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo?.[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo![markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n !!(this.options.sentenceCase && this.options.sentenceCase.guess), // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = (this.options.english as string[]).map(langid => langid.toLowerCase())\n\n this.fieldMode = Object.entries(FieldMode).reduce((acc: typeof FieldMode, [mode, test]: [string, (RegExp | string)[]]) => {\n const strings = test.filter(fieldname_or_regex => typeof fieldname_or_regex === 'string' && !this.options.fieldMode![fieldname_or_regex])\n const regexes = test.filter(fieldname_or_regex => typeof fieldname_or_regex !== 'string')\n acc[mode] = [...strings, ...regexes]\n return acc\n }, <typeof FieldMode> {})\n for (const [field, mode] of Object.entries(this.options.fieldMode!)) {\n this.fieldMode[mode].unshift(field)\n }\n\n if (!this.options.removeOuterBraces) {\n this.options.removeOuterBraces = [\n ...FieldAction.removeOuterBraces,\n ...this.fieldMode.title,\n ...this.fieldMode.verbatim,\n ].filter(field => typeof field === 'string')\n }\n\n if (options.unsupported !== undefined && !['ignore', 'keep', 'throw'].includes(options.unsupported)) {\n throw new TypeError('unsupported must be ignore, keep, or throw')\n }\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preambles: [],\n jabref: { root: [], groups: {} },\n }\n }\n\n private reparse(verbatim: bibtex.Entry) {\n let langid: string = (verbatim.fields.langid || verbatim.fields.hyphenation || '').toLowerCase()\n if (!langid && this.options.languageAsLangid && verbatim.fields.language) langid = verbatim.fields.language.toLowerCase()\n this.english = (<string[]> this.options.english).includes(langid)\n\n const entry: Entry = this.current = {\n type: verbatim.type,\n key: verbatim.key,\n fields: {},\n mode: {},\n input: verbatim.input,\n }\n let keywords: string[] = [] // OMG #783\n try {\n for (let [field, value] of Object.entries(verbatim.fields)) {\n if (!value.trim()) continue\n\n /*\n if (this.options.raw && !this.options.removeOuterBraces.includes(field)) {\n entry.fields[field] = value.trim()\n entry.mode[field] = 'verbatim'\n continue\n }\n */\n\n if (field.match(/^keywords([+]duplicate-\\d+)?$/)) field = 'keywords' // #873\n\n this.field(entry, field, value)\n\n if (field === 'keywords') { // #873\n keywords = [...keywords, ...(entry.fields.keywords as unknown as string).split(/\\s*[,;]\\s*/)].map((k: string) => k.trim()).filter(k => k)\n delete entry.fields.keywords\n }\n\n if (!this.options.raw && typeof entry.fields[field] === 'string') {\n entry.fields[field] = entry.fields[field].trim()\n if (field === 'month') entry.fields[field] = Month[entry.fields[field].toLowerCase()] || entry.fields[field]\n }\n }\n\n if (keywords.length) {\n entry.fields.keywords = keywords\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n this.bib.errors.push({ error: `${err.message}\\n${entry.input}`, input: entry.input })\n }\n }\n\n private content(tex: string) {\n const entry: Entry = { key: '', type: '', fields: {}, mode: {}, input: tex }\n const english = this.english\n this.english = false\n this.field(entry, 'tex', tex)\n this.english = english\n return entry.fields.tex\n }\n\n private prep(base: bibtex.Library) {\n for (const preamble of base.preambles) {\n try {\n this.content(preamble)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n }\n }\n for (const [k, v] of Object.entries(base.strings)) {\n this.bib.strings[k] = this.content(v)\n }\n }\n\n private finalize(base: bibtex.Library) {\n if (this.options.applyCrossRef) {\n const entries: Partial<Record<string, Entry>> = {}\n for (const entry of this.bib.entries) {\n if (entry.key) entries[entry.key.toUpperCase()] = entry\n }\n\n const order: string[] = []\n for (const entry of this.bib.entries) {\n if (!entry.key || typeof entry.fields.crossref !== 'string') continue\n\n const crossref = entry.fields.crossref.toUpperCase()\n if (!entries[crossref]) continue\n\n const key = entry.key.toUpperCase()\n // Topological sort: parents are unshifted to the front, children pushed\n // to the back. Because a parent may itself be a child of another entry,\n // unshift guarantees every ancestor appears before all of its descendants\n // regardless of the order entries appear in the .bib file. Duplicate\n // entries are skipped so a shared parent is only processed once.\n if (!order.includes(crossref)) order.unshift(crossref)\n if (!order.includes(key)) order.push(key)\n }\n\n for (const key of order) {\n const child = entries[key.toUpperCase()]!\n const parent = entries[child.fields.crossref?.toUpperCase()]\n if (!parent) continue\n\n for (const mappings of [CrossRef[child.type], CrossRef['*']].filter(m => m)) {\n for (const mapping of [mappings[parent.type], mappings['*']].filter(m => m)) {\n for (const [childfield, parentfield] of Object.entries(mapping)) {\n if (!child.fields[childfield] && parent.fields[parentfield]) {\n child.fields[childfield] = parent.fields[parentfield]\n\n child.crossref ??= {}\n child.crossref[childfield] = { parent: parent.key, field: parentfield }\n }\n }\n\n for (const field of (Allowed[child.type] || [])) {\n if (NoCrossRef.includes(field)) continue\n\n if (!child.fields[field] && parent.fields[field]) {\n child.fields[field] = parent.fields[field]\n\n child.crossref ??= {}\n child.crossref[field] = { parent: parent.key, field }\n }\n }\n }\n }\n }\n }\n\n const { comments, jabref } = JabRef.parse(base.comments)\n this.bib.comments = comments\n this.bib.jabref = jabref\n\n this.bib.preambles = base.preambles\n this.bib.errors = [...base.errors, ...this.bib.errors]\n }\n\n public parse(input: string, options: Options = {}): Library {\n this.reset(options)\n\n const base = bibtex.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n for (const entry of base.entries) {\n this.reparse(entry)\n }\n\n this.finalize(base)\n return this.bib\n }\n\n public async parseAsync(input: string, options: Options = {}): Promise<Library> {\n this.reset(options)\n\n const base = await bibtex.promises.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n let n = 1\n for (const entry of base.entries) {\n this.reparse(entry)\n if ((n++ % 1000) === 0) await playnice()\n }\n\n this.finalize(base)\n return this.bib\n }\n}\n\n/** Parses BibTeX or BibLaTeX source into a normalized library. */\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\n/** Asynchronous variant of {@link parse}, yielding periodically for large libraries. */\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { Group as JabRefGroup, JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\n/** Parses BibTeX without interpreting field contents as LaTeX. */\nexport { Library as VerbatimLibrary, parse as parseVerbatim } from './verbatim.js'\nexport type { Entry as VerbatimEntry, ParserOptions as VerbatimParserOptions } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\n/** Converts a title to sentence case using heuristic token classification. */\nexport { toSentenceCase } from './sentence-case.js'\nexport type { Options as SentenceCaseOptions } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\n/** Splits text into classified tokens with source offsets. */\nexport { tokenize } from './tokenizer.js'\nexport type { Token } from './tokenizer.js'\n\nimport { playnice } from './yield.js'\n\nimport { crossref as CrossRef } from './crossref.js'\nimport { allowed as Allowed, noCrossRef as NoCrossRef } from './fields.js'\n\nimport { merge } from './merge.js'\n\nfunction latexMode(node: Node | Argument): 'math' | 'text' {\n return node._renderInfo!.mode as 'math' | 'text'\n}\n\nconst macroAliases: Record<string, string> = {\n sb: 'textsubscript',\n sp: 'textsuperscript',\n}\n\nfunction latex2unicode(tex: string, node: Node): string {\n if (node.type === 'macro' && macroAliases[node.content]) {\n tex = `\\\\${macroAliases[node.content]}${tex.slice(node.content.length + 1)}`\n }\n const text: string | Record<string, string> = latex2unicodemap[tex]\n if (typeof text === 'string') return text\n return text && text[latexMode(node)]\n}\n\nconst open: Record<string, string> = {}\nconst close: Record<string, string> = {}\nfor (const tag of ['i', 'b', 'sc', 'nc', 'ncx', 'br', 'p', 'li', 'code']) {\n open[tag] = `\\x0E${tag}\\x0F`\n close[tag] = `\\x0E/${tag}\\x0F`\n}\nconst collapsable = /\\x0E\\/([a-z]+)\\x0F(\\s*)\\x0E\\1\\x0F/ig\n\nexport type CreatorFields = {\n author?: Creator[]\n bookauthor?: Creator[]\n collaborator?: Creator[]\n commentator?: Creator[]\n director?: Creator[]\n editor?: Creator[]\n editora?: Creator[]\n editorb?: Creator[]\n editors?: Creator[]\n holder?: Creator[]\n scriptwriter?: Creator[]\n translator?: Creator[]\n}\nexport type ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\nexport type TypedFields = CreatorFields & ArrayFields\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: Record<string, { parent: string; field: string }>\n input: string\n}\n\nconst Month = {\n jan: '1',\n january: '1',\n feb: '2',\n february: '2',\n mar: '3',\n march: '3',\n apr: '4',\n april: '4',\n may: '5',\n jun: '6',\n june: '6',\n jul: '7',\n july: '7',\n aug: '8',\n august: '8',\n sep: '9',\n september: '9',\n oct: '10',\n october: '10',\n nov: '11',\n november: '11',\n dec: '12',\n december: '12',\n}\n\n/** The parsed contents of a BibTeX library. */\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preambles: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * How to handle unknown TeX commands and environments: `tex` wraps the command in a script\n * element, `text` returns the command without its backslash, `ignore` omits it, and `throw`\n * throws an error identifying the unsupported TeX. When omitted, literal TeX is preserved for\n * backwards compatibility.\n */\n unsupported?: 'tex' | 'text' | 'ignore' | 'throw'\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\n/** A parsed personal or organizational name. */\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\n/** Controls how a field's TeX content is interpreted. */\nexport type ParseMode = keyof typeof FieldMode | 'literal' | 'verbatimlist'\n\nexport const English = [\n '',\n 'american',\n 'british',\n 'canadian',\n 'english',\n 'australian',\n 'newzealand',\n 'usenglish',\n 'ukenglish',\n 'en',\n 'eng',\n 'en-au',\n 'en-bz',\n 'en-ca',\n 'en-cb',\n 'en-gb',\n 'en-ie',\n 'en-jm',\n 'en-nz',\n 'en-ph',\n 'en-tt',\n 'en-us',\n 'en-za',\n 'en-zw',\n 'anglais', // don't do this people\n]\n\nconst FieldAction = {\n removeOuterBraces: [\n 'doi',\n // 'publisher',\n // 'location',\n ],\n parseInt: [\n 'year',\n 'month',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\nclass UnsupportedError extends Error {}\n\ntype Context = {\n mode: ParseMode\n caseProtected?: boolean\n}\n\n/*\nasync function* asyncGenerator<T>(array: T[]): AsyncGenerator<T, void, unknown> {\n for (const item of array) {\n yield await Promise.resolve(item)\n }\n}\n*/\n\nclass BibTeXParser {\n private current!: Entry\n private english!: boolean\n private options!: Options\n private fieldMode!: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib!: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode | null {\n if (latexMode(nodes[0]) !== 'text') return null\n\n const max = 3\n const slice = nodes.slice(0, max)\n const type = slice.map(n => n.type === 'string' ? 's' : ' ').join('')\n if (type[0] !== 's') return null\n\n const content = slice.map(n => n.type === 'string' ? n.content : '')\n let latex: string\n\n while (content.length) {\n if (type.startsWith('s'.repeat(content.length)) && (latex = latex2unicode(content.join(''), slice[0]))) {\n try {\n return { type: 'string', content: latex, _renderInfo: {} }\n }\n finally {\n nodes.splice(0, content.length)\n }\n }\n content.pop()\n }\n\n return null\n }\n\n private wraparg(node: Node, macro: Macro): Argument {\n if (macro.content.match(/^(itshape|textsl|textit|emph|mkbibemph)$/)) node._renderInfo!.emph = true\n if (macro.content.match(/^(textbf|mkbibbold|bfseries)$/)) node._renderInfo!.bold = true\n if (macro.content.match(/^(textsc)$/)) node._renderInfo!.smallCaps = true\n if (macro.content.match(/^(texttt)$/)) node._renderInfo!.code = true\n return { type: 'argument', content: [node], openMark: '', closeMark: '', _renderInfo: { mode: node._renderInfo!.mode } }\n }\n\n private argtogroup(node: Argument): Group {\n if (node.content.length === 1 && node.content[0].type === 'group') return node.content[0]\n return { type: 'group', content: node.content }\n }\n\n private argument(nodes: Node[], macro: Macro): Argument | null {\n if (!nodes.length) return null\n if (nodes[0].type === 'whitespace') nodes.shift()\n if (!nodes.length) return null\n if (nodes[0].type === 'string') {\n const char = nodes[0].content[0]\n nodes[0].content = nodes[0].content.substr(1)\n const arg = { ...nodes[0], content: char }\n if (!nodes[0].content) nodes.shift()\n return this.wraparg(arg, macro)\n }\n return this.wraparg(nodes.shift()!, macro)\n }\n\n private unsupported(node: Node): string {\n const tex = printRaw(node)\n if (this.options.unsupported === 'throw') throw new UnsupportedError(`unhandled ${node.type} ${tex}`)\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n const command = node.type === 'macro' ? `\\\\${node.content}` : tex\n switch (this.options.unsupported) {\n case 'ignore':\n return ''\n case 'text':\n return command.replace(/^\\\\/, '')\n case 'tex':\n return `<script>${command}</script>`\n default:\n return tex\n }\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n const name = macroAliases[node.content] ?? node.content\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (name) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args!.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args!.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url!, context)}\">${this.stringify(label!, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'undefined':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n case 'if':\n case 'ifx':\n case 'else':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args![0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args![0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args![0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args![0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args![0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case ' ':\n return ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args![0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args!.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args![0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo!.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo!.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo!.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo!.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo!.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo!.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo!.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo!.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces!.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()!\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo!.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo!.protectCase)) node._renderInfo!.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo!.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo!.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo!.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n const ligatureResult = this.ligature(nodes)\n if (ligatureResult) {\n compacted.push(ligatureResult)\n continue\n }\n\n const node = nodes.shift()!\n\n if (node.type === 'macro' && node.content === 'ifdefined') {\n inif += 1\n continue\n }\n else if (node.type === 'macro' && node.content === 'else') {\n continue\n }\n else if (node.type === 'macro' && node.content === 'fi') {\n inif = Math.max(inif - 1, 0)\n continue\n }\n else if (inif) {\n continue\n }\n\n const nargs = node.type === 'macro'\n ? narguments[node.content] || narguments[`${info.context.inMathMode ? 'math' : 'text'}\\t${node.content}`]\n : 0\n if (node.type === 'macro' && nargs) {\n const args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter((arg): arg is Argument => arg !== null)\n node.args = args\n if (node.content.match(/^(url|href)$/) && args.length) {\n let url: Node[] = args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo!.mode } }, node)\n }\n caseProtection.intuitive -= args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo!.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo?.[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo![markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n case 'macro':\n // Legacy input can encode an accented base as an unknown control word, for example\n // `\\'{\\a}`. The outer accent is recognized, but `\\a` has no Unicode mapping. Treat\n // only that argument-free, single-letter payload as text here; ordinary unknown\n // macros must still go through the unsupported-command handler unchanged.\n if (arg.escapeToken && /^[A-Za-z]$/.test(arg.content) && !arg.args?.length) {\n const command = `${arg.escapeToken}${arg.content}`\n if (!(command in latex2unicodemap)) {\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n }\n }\n return\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n !!(this.options.sentenceCase && this.options.sentenceCase.guess), // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = (this.options.english as string[]).map(langid => langid.toLowerCase())\n\n this.fieldMode = Object.entries(FieldMode).reduce((acc: typeof FieldMode, [mode, test]: [string, (RegExp | string)[]]) => {\n const strings = test.filter(fieldname_or_regex => typeof fieldname_or_regex === 'string' && !this.options.fieldMode![fieldname_or_regex])\n const regexes = test.filter(fieldname_or_regex => typeof fieldname_or_regex !== 'string')\n acc[mode] = [...strings, ...regexes]\n return acc\n }, <typeof FieldMode> {})\n for (const [field, mode] of Object.entries(this.options.fieldMode!)) {\n this.fieldMode[mode].unshift(field)\n }\n\n if (!this.options.removeOuterBraces) {\n this.options.removeOuterBraces = [\n ...FieldAction.removeOuterBraces,\n ...this.fieldMode.title,\n ...this.fieldMode.verbatim,\n ].filter(field => typeof field === 'string')\n }\n\n if (options.unsupported !== undefined && !['tex', 'text', 'ignore', 'throw'].includes(options.unsupported)) {\n throw new TypeError('unsupported must be tex, text, ignore, or throw')\n }\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preambles: [],\n jabref: { root: [], groups: {} },\n }\n }\n\n private reparse(verbatim: bibtex.Entry) {\n let langid: string = (verbatim.fields.langid || verbatim.fields.hyphenation || '').toLowerCase()\n if (!langid && this.options.languageAsLangid && verbatim.fields.language) langid = verbatim.fields.language.toLowerCase()\n this.english = (<string[]> this.options.english).includes(langid)\n\n const entry: Entry = this.current = {\n type: verbatim.type,\n key: verbatim.key,\n fields: {},\n mode: {},\n input: verbatim.input,\n }\n let keywords: string[] = [] // OMG #783\n try {\n for (let [field, value] of Object.entries(verbatim.fields)) {\n if (!value.trim()) continue\n\n /*\n if (this.options.raw && !this.options.removeOuterBraces.includes(field)) {\n entry.fields[field] = value.trim()\n entry.mode[field] = 'verbatim'\n continue\n }\n */\n\n if (field.match(/^keywords([+]duplicate-\\d+)?$/)) field = 'keywords' // #873\n\n this.field(entry, field, value)\n\n if (field === 'keywords') { // #873\n keywords = [...keywords, ...(entry.fields.keywords as unknown as string).split(/\\s*[,;]\\s*/)].map((k: string) => k.trim()).filter(k => k)\n delete entry.fields.keywords\n }\n\n if (!this.options.raw && typeof entry.fields[field] === 'string') {\n entry.fields[field] = entry.fields[field].trim()\n if (field === 'month') entry.fields[field] = Month[entry.fields[field].toLowerCase()] || entry.fields[field]\n }\n }\n\n if (keywords.length) {\n entry.fields.keywords = keywords\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n this.bib.errors.push({ error: `${err.message}\\n${entry.input}`, input: entry.input })\n }\n }\n\n private content(tex: string) {\n const entry: Entry = { key: '', type: '', fields: {}, mode: {}, input: tex }\n const english = this.english\n this.english = false\n this.field(entry, 'tex', tex)\n this.english = english\n return entry.fields.tex\n }\n\n private prep(base: bibtex.Library) {\n for (const preamble of base.preambles) {\n try {\n this.content(preamble)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n }\n }\n for (const [k, v] of Object.entries(base.strings)) {\n this.bib.strings[k] = this.content(v)\n }\n }\n\n private finalize(base: bibtex.Library) {\n if (this.options.applyCrossRef) {\n const entries: Partial<Record<string, Entry>> = {}\n for (const entry of this.bib.entries) {\n if (entry.key) entries[entry.key.toUpperCase()] = entry\n }\n\n const order: string[] = []\n for (const entry of this.bib.entries) {\n if (!entry.key || typeof entry.fields.crossref !== 'string') continue\n\n const crossref = entry.fields.crossref.toUpperCase()\n if (!entries[crossref]) continue\n\n const key = entry.key.toUpperCase()\n // Topological sort: parents are unshifted to the front, children pushed\n // to the back. Because a parent may itself be a child of another entry,\n // unshift guarantees every ancestor appears before all of its descendants\n // regardless of the order entries appear in the .bib file. Duplicate\n // entries are skipped so a shared parent is only processed once.\n if (!order.includes(crossref)) order.unshift(crossref)\n if (!order.includes(key)) order.push(key)\n }\n\n for (const key of order) {\n const child = entries[key.toUpperCase()]!\n const parent = entries[child.fields.crossref?.toUpperCase()]\n if (!parent) continue\n\n for (const mappings of [CrossRef[child.type], CrossRef['*']].filter(m => m)) {\n for (const mapping of [mappings[parent.type], mappings['*']].filter(m => m)) {\n for (const [childfield, parentfield] of Object.entries(mapping)) {\n if (!child.fields[childfield] && parent.fields[parentfield]) {\n child.fields[childfield] = parent.fields[parentfield]\n\n child.crossref ??= {}\n child.crossref[childfield] = { parent: parent.key, field: parentfield }\n }\n }\n\n for (const field of (Allowed[child.type] || [])) {\n if (NoCrossRef.includes(field)) continue\n\n if (!child.fields[field] && parent.fields[field]) {\n child.fields[field] = parent.fields[field]\n\n child.crossref ??= {}\n child.crossref[field] = { parent: parent.key, field }\n }\n }\n }\n }\n }\n }\n\n const { comments, jabref } = JabRef.parse(base.comments)\n this.bib.comments = comments\n this.bib.jabref = jabref\n\n this.bib.preambles = base.preambles\n this.bib.errors = [...base.errors, ...this.bib.errors]\n }\n\n public parse(input: string, options: Options = {}): Library {\n this.reset(options)\n\n const base = bibtex.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n for (const entry of base.entries) {\n this.reparse(entry)\n }\n\n this.finalize(base)\n return this.bib\n }\n\n public async parseAsync(input: string, options: Options = {}): Promise<Library> {\n this.reset(options)\n\n const base = await bibtex.promises.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n let n = 1\n for (const entry of base.entries) {\n this.reparse(entry)\n if ((n++ % 1000) === 0) await playnice()\n }\n\n this.finalize(base)\n return this.bib\n }\n}\n\n/** Parses BibTeX or BibLaTeX source into a normalized library. */\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\n/** Asynchronous variant of {@link parse}, yielding periodically for large libraries. */\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["parse", "import_sentence_case", "import_tokenizer", "latex2unicodemap", "_a", "CrossRef", "Allowed", "NoCrossRef"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -386,7 +386,17 @@ class BibTeXParser {
386
386
  this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) });
387
387
  break;
388
388
  }
389
- return this.options.unsupported === "ignore" ? "" : tex;
389
+ const command = node.type === "macro" ? `\\${node.content}` : tex;
390
+ switch (this.options.unsupported) {
391
+ case "ignore":
392
+ return "";
393
+ case "text":
394
+ return command.replace(/^\\/, "");
395
+ case "tex":
396
+ return `<script>${command}<\/script>`;
397
+ default:
398
+ return tex;
399
+ }
390
400
  }
391
401
  wrap(text, tag, wrap = true) {
392
402
  if (!text || !wrap) return text || "";
@@ -828,6 +838,14 @@ class BibTeXParser {
828
838
  case "verbatim":
829
839
  case "string":
830
840
  return { type: "string", content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} };
841
+ case "macro":
842
+ if (arg.escapeToken && /^[A-Za-z]$/.test(arg.content) && !arg.args?.length) {
843
+ const command = `${arg.escapeToken}${arg.content}`;
844
+ if (!(command in latex2unicodemap)) {
845
+ return { type: "string", content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} };
846
+ }
847
+ }
848
+ return;
831
849
  default:
832
850
  return;
833
851
  }
@@ -897,8 +915,8 @@ class BibTeXParser {
897
915
  ...this.fieldMode.verbatim
898
916
  ].filter((field) => typeof field === "string");
899
917
  }
900
- if (options.unsupported !== void 0 && !["ignore", "keep", "throw"].includes(options.unsupported)) {
901
- throw new TypeError("unsupported must be ignore, keep, or throw");
918
+ if (options.unsupported !== void 0 && !["tex", "text", "ignore", "throw"].includes(options.unsupported)) {
919
+ throw new TypeError("unsupported must be tex, text, ignore, or throw");
902
920
  }
903
921
  this.bib = {
904
922
  errors: [],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../index.ts"],
4
- "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { Group as JabRefGroup, JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\n/** Parses BibTeX without interpreting field contents as LaTeX. */\nexport { Library as VerbatimLibrary, parse as parseVerbatim } from './verbatim.js'\nexport type { Entry as VerbatimEntry, ParserOptions as VerbatimParserOptions } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\n/** Converts a title to sentence case using heuristic token classification. */\nexport { toSentenceCase } from './sentence-case.js'\nexport type { Options as SentenceCaseOptions } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\n/** Splits text into classified tokens with source offsets. */\nexport { tokenize } from './tokenizer.js'\nexport type { Token } from './tokenizer.js'\n\nimport { playnice } from './yield.js'\n\nimport { crossref as CrossRef } from './crossref.js'\nimport { allowed as Allowed, noCrossRef as NoCrossRef } from './fields.js'\n\nimport { merge } from './merge.js'\n\nfunction latexMode(node: Node | Argument): 'math' | 'text' {\n return node._renderInfo!.mode as 'math' | 'text'\n}\n\nconst macroAliases: Record<string, string> = {\n sb: 'textsubscript',\n sp: 'textsuperscript',\n}\n\nfunction latex2unicode(tex: string, node: Node): string {\n if (node.type === 'macro' && macroAliases[node.content]) {\n tex = `\\\\${macroAliases[node.content]}${tex.slice(node.content.length + 1)}`\n }\n const text: string | Record<string, string> = latex2unicodemap[tex]\n if (typeof text === 'string') return text\n return text && text[latexMode(node)]\n}\n\nconst open: Record<string, string> = {}\nconst close: Record<string, string> = {}\nfor (const tag of ['i', 'b', 'sc', 'nc', 'ncx', 'br', 'p', 'li', 'code']) {\n open[tag] = `\\x0E${tag}\\x0F`\n close[tag] = `\\x0E/${tag}\\x0F`\n}\nconst collapsable = /\\x0E\\/([a-z]+)\\x0F(\\s*)\\x0E\\1\\x0F/ig\n\nexport type CreatorFields = {\n author?: Creator[]\n bookauthor?: Creator[]\n collaborator?: Creator[]\n commentator?: Creator[]\n director?: Creator[]\n editor?: Creator[]\n editora?: Creator[]\n editorb?: Creator[]\n editors?: Creator[]\n holder?: Creator[]\n scriptwriter?: Creator[]\n translator?: Creator[]\n}\nexport type ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\nexport type TypedFields = CreatorFields & ArrayFields\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: Record<string, { parent: string; field: string }>\n input: string\n}\n\nconst Month = {\n jan: '1',\n january: '1',\n feb: '2',\n february: '2',\n mar: '3',\n march: '3',\n apr: '4',\n april: '4',\n may: '5',\n jun: '6',\n june: '6',\n jul: '7',\n july: '7',\n aug: '8',\n august: '8',\n sep: '9',\n september: '9',\n oct: '10',\n october: '10',\n nov: '11',\n november: '11',\n dec: '12',\n december: '12',\n}\n\n/** The parsed contents of a BibTeX library. */\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preambles: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * How to handle unknown TeX commands and environments: `ignore` replaces them with nothing,\n * `keep` preserves their literal TeX (including the backslash) and records a diagnostic,\n * and `throw` throws an error identifying the unsupported TeX. Defaults to `keep`.\n */\n unsupported?: 'ignore' | 'keep' | 'throw'\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\n/** A parsed personal or organizational name. */\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\n/** Controls how a field's TeX content is interpreted. */\nexport type ParseMode = keyof typeof FieldMode | 'literal' | 'verbatimlist'\n\nexport const English = [\n '',\n 'american',\n 'british',\n 'canadian',\n 'english',\n 'australian',\n 'newzealand',\n 'usenglish',\n 'ukenglish',\n 'en',\n 'eng',\n 'en-au',\n 'en-bz',\n 'en-ca',\n 'en-cb',\n 'en-gb',\n 'en-ie',\n 'en-jm',\n 'en-nz',\n 'en-ph',\n 'en-tt',\n 'en-us',\n 'en-za',\n 'en-zw',\n 'anglais', // don't do this people\n]\n\nconst FieldAction = {\n removeOuterBraces: [\n 'doi',\n // 'publisher',\n // 'location',\n ],\n parseInt: [\n 'year',\n 'month',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\nclass UnsupportedError extends Error {}\n\ntype Context = {\n mode: ParseMode\n caseProtected?: boolean\n}\n\n/*\nasync function* asyncGenerator<T>(array: T[]): AsyncGenerator<T, void, unknown> {\n for (const item of array) {\n yield await Promise.resolve(item)\n }\n}\n*/\n\nclass BibTeXParser {\n private current!: Entry\n private english!: boolean\n private options!: Options\n private fieldMode!: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib!: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode | null {\n if (latexMode(nodes[0]) !== 'text') return null\n\n const max = 3\n const slice = nodes.slice(0, max)\n const type = slice.map(n => n.type === 'string' ? 's' : ' ').join('')\n if (type[0] !== 's') return null\n\n const content = slice.map(n => n.type === 'string' ? n.content : '')\n let latex: string\n\n while (content.length) {\n if (type.startsWith('s'.repeat(content.length)) && (latex = latex2unicode(content.join(''), slice[0]))) {\n try {\n return { type: 'string', content: latex, _renderInfo: {} }\n }\n finally {\n nodes.splice(0, content.length)\n }\n }\n content.pop()\n }\n\n return null\n }\n\n private wraparg(node: Node, macro: Macro): Argument {\n if (macro.content.match(/^(itshape|textsl|textit|emph|mkbibemph)$/)) node._renderInfo!.emph = true\n if (macro.content.match(/^(textbf|mkbibbold|bfseries)$/)) node._renderInfo!.bold = true\n if (macro.content.match(/^(textsc)$/)) node._renderInfo!.smallCaps = true\n if (macro.content.match(/^(texttt)$/)) node._renderInfo!.code = true\n return { type: 'argument', content: [node], openMark: '', closeMark: '', _renderInfo: { mode: node._renderInfo!.mode } }\n }\n\n private argtogroup(node: Argument): Group {\n if (node.content.length === 1 && node.content[0].type === 'group') return node.content[0]\n return { type: 'group', content: node.content }\n }\n\n private argument(nodes: Node[], macro: Macro): Argument | null {\n if (!nodes.length) return null\n if (nodes[0].type === 'whitespace') nodes.shift()\n if (!nodes.length) return null\n if (nodes[0].type === 'string') {\n const char = nodes[0].content[0]\n nodes[0].content = nodes[0].content.substr(1)\n const arg = { ...nodes[0], content: char }\n if (!nodes[0].content) nodes.shift()\n return this.wraparg(arg, macro)\n }\n return this.wraparg(nodes.shift()!, macro)\n }\n\n private unsupported(node: Node): string {\n const tex = printRaw(node)\n if (this.options.unsupported === 'throw') throw new UnsupportedError(`unhandled ${node.type} ${tex}`)\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n return this.options.unsupported === 'ignore' ? '' : tex\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n const name = macroAliases[node.content] ?? node.content\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (name) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args!.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args!.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url!, context)}\">${this.stringify(label!, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'undefined':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n case 'if':\n case 'ifx':\n case 'else':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args![0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args![0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args![0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args![0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args![0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case ' ':\n return ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args![0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args!.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args![0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo!.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo!.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo!.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo!.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo!.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo!.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo!.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo!.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces!.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()!\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo!.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo!.protectCase)) node._renderInfo!.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo!.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo!.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo!.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n const ligatureResult = this.ligature(nodes)\n if (ligatureResult) {\n compacted.push(ligatureResult)\n continue\n }\n\n const node = nodes.shift()!\n\n if (node.type === 'macro' && node.content === 'ifdefined') {\n inif += 1\n continue\n }\n else if (node.type === 'macro' && node.content === 'else') {\n continue\n }\n else if (node.type === 'macro' && node.content === 'fi') {\n inif = Math.max(inif - 1, 0)\n continue\n }\n else if (inif) {\n continue\n }\n\n const nargs = node.type === 'macro'\n ? narguments[node.content] || narguments[`${info.context.inMathMode ? 'math' : 'text'}\\t${node.content}`]\n : 0\n if (node.type === 'macro' && nargs) {\n const args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter((arg): arg is Argument => arg !== null)\n node.args = args\n if (node.content.match(/^(url|href)$/) && args.length) {\n let url: Node[] = args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo!.mode } }, node)\n }\n caseProtection.intuitive -= args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo!.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo?.[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo![markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n !!(this.options.sentenceCase && this.options.sentenceCase.guess), // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = (this.options.english as string[]).map(langid => langid.toLowerCase())\n\n this.fieldMode = Object.entries(FieldMode).reduce((acc: typeof FieldMode, [mode, test]: [string, (RegExp | string)[]]) => {\n const strings = test.filter(fieldname_or_regex => typeof fieldname_or_regex === 'string' && !this.options.fieldMode![fieldname_or_regex])\n const regexes = test.filter(fieldname_or_regex => typeof fieldname_or_regex !== 'string')\n acc[mode] = [...strings, ...regexes]\n return acc\n }, <typeof FieldMode> {})\n for (const [field, mode] of Object.entries(this.options.fieldMode!)) {\n this.fieldMode[mode].unshift(field)\n }\n\n if (!this.options.removeOuterBraces) {\n this.options.removeOuterBraces = [\n ...FieldAction.removeOuterBraces,\n ...this.fieldMode.title,\n ...this.fieldMode.verbatim,\n ].filter(field => typeof field === 'string')\n }\n\n if (options.unsupported !== undefined && !['ignore', 'keep', 'throw'].includes(options.unsupported)) {\n throw new TypeError('unsupported must be ignore, keep, or throw')\n }\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preambles: [],\n jabref: { root: [], groups: {} },\n }\n }\n\n private reparse(verbatim: bibtex.Entry) {\n let langid: string = (verbatim.fields.langid || verbatim.fields.hyphenation || '').toLowerCase()\n if (!langid && this.options.languageAsLangid && verbatim.fields.language) langid = verbatim.fields.language.toLowerCase()\n this.english = (<string[]> this.options.english).includes(langid)\n\n const entry: Entry = this.current = {\n type: verbatim.type,\n key: verbatim.key,\n fields: {},\n mode: {},\n input: verbatim.input,\n }\n let keywords: string[] = [] // OMG #783\n try {\n for (let [field, value] of Object.entries(verbatim.fields)) {\n if (!value.trim()) continue\n\n /*\n if (this.options.raw && !this.options.removeOuterBraces.includes(field)) {\n entry.fields[field] = value.trim()\n entry.mode[field] = 'verbatim'\n continue\n }\n */\n\n if (field.match(/^keywords([+]duplicate-\\d+)?$/)) field = 'keywords' // #873\n\n this.field(entry, field, value)\n\n if (field === 'keywords') { // #873\n keywords = [...keywords, ...(entry.fields.keywords as unknown as string).split(/\\s*[,;]\\s*/)].map((k: string) => k.trim()).filter(k => k)\n delete entry.fields.keywords\n }\n\n if (!this.options.raw && typeof entry.fields[field] === 'string') {\n entry.fields[field] = entry.fields[field].trim()\n if (field === 'month') entry.fields[field] = Month[entry.fields[field].toLowerCase()] || entry.fields[field]\n }\n }\n\n if (keywords.length) {\n entry.fields.keywords = keywords\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n this.bib.errors.push({ error: `${err.message}\\n${entry.input}`, input: entry.input })\n }\n }\n\n private content(tex: string) {\n const entry: Entry = { key: '', type: '', fields: {}, mode: {}, input: tex }\n const english = this.english\n this.english = false\n this.field(entry, 'tex', tex)\n this.english = english\n return entry.fields.tex\n }\n\n private prep(base: bibtex.Library) {\n for (const preamble of base.preambles) {\n try {\n this.content(preamble)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n }\n }\n for (const [k, v] of Object.entries(base.strings)) {\n this.bib.strings[k] = this.content(v)\n }\n }\n\n private finalize(base: bibtex.Library) {\n if (this.options.applyCrossRef) {\n const entries: Partial<Record<string, Entry>> = {}\n for (const entry of this.bib.entries) {\n if (entry.key) entries[entry.key.toUpperCase()] = entry\n }\n\n const order: string[] = []\n for (const entry of this.bib.entries) {\n if (!entry.key || typeof entry.fields.crossref !== 'string') continue\n\n const crossref = entry.fields.crossref.toUpperCase()\n if (!entries[crossref]) continue\n\n const key = entry.key.toUpperCase()\n // Topological sort: parents are unshifted to the front, children pushed\n // to the back. Because a parent may itself be a child of another entry,\n // unshift guarantees every ancestor appears before all of its descendants\n // regardless of the order entries appear in the .bib file. Duplicate\n // entries are skipped so a shared parent is only processed once.\n if (!order.includes(crossref)) order.unshift(crossref)\n if (!order.includes(key)) order.push(key)\n }\n\n for (const key of order) {\n const child = entries[key.toUpperCase()]!\n const parent = entries[child.fields.crossref?.toUpperCase()]\n if (!parent) continue\n\n for (const mappings of [CrossRef[child.type], CrossRef['*']].filter(m => m)) {\n for (const mapping of [mappings[parent.type], mappings['*']].filter(m => m)) {\n for (const [childfield, parentfield] of Object.entries(mapping)) {\n if (!child.fields[childfield] && parent.fields[parentfield]) {\n child.fields[childfield] = parent.fields[parentfield]\n\n child.crossref ??= {}\n child.crossref[childfield] = { parent: parent.key, field: parentfield }\n }\n }\n\n for (const field of (Allowed[child.type] || [])) {\n if (NoCrossRef.includes(field)) continue\n\n if (!child.fields[field] && parent.fields[field]) {\n child.fields[field] = parent.fields[field]\n\n child.crossref ??= {}\n child.crossref[field] = { parent: parent.key, field }\n }\n }\n }\n }\n }\n }\n\n const { comments, jabref } = JabRef.parse(base.comments)\n this.bib.comments = comments\n this.bib.jabref = jabref\n\n this.bib.preambles = base.preambles\n this.bib.errors = [...base.errors, ...this.bib.errors]\n }\n\n public parse(input: string, options: Options = {}): Library {\n this.reset(options)\n\n const base = bibtex.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n for (const entry of base.entries) {\n this.reparse(entry)\n }\n\n this.finalize(base)\n return this.bib\n }\n\n public async parseAsync(input: string, options: Options = {}): Promise<Library> {\n this.reset(options)\n\n const base = await bibtex.promises.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n let n = 1\n for (const entry of base.entries) {\n this.reparse(entry)\n if ((n++ % 1000) === 0) await playnice()\n }\n\n this.finalize(base)\n return this.bib\n }\n}\n\n/** Parses BibTeX or BibLaTeX source into a normalized library. */\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\n/** Asynchronous variant of {@link parse}, yielding periodically for large libraries. */\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { Group as JabRefGroup, JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\n/** Parses BibTeX without interpreting field contents as LaTeX. */\nexport { Library as VerbatimLibrary, parse as parseVerbatim } from './verbatim.js'\nexport type { Entry as VerbatimEntry, ParserOptions as VerbatimParserOptions } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\n/** Converts a title to sentence case using heuristic token classification. */\nexport { toSentenceCase } from './sentence-case.js'\nexport type { Options as SentenceCaseOptions } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\n/** Splits text into classified tokens with source offsets. */\nexport { tokenize } from './tokenizer.js'\nexport type { Token } from './tokenizer.js'\n\nimport { playnice } from './yield.js'\n\nimport { crossref as CrossRef } from './crossref.js'\nimport { allowed as Allowed, noCrossRef as NoCrossRef } from './fields.js'\n\nimport { merge } from './merge.js'\n\nfunction latexMode(node: Node | Argument): 'math' | 'text' {\n return node._renderInfo!.mode as 'math' | 'text'\n}\n\nconst macroAliases: Record<string, string> = {\n sb: 'textsubscript',\n sp: 'textsuperscript',\n}\n\nfunction latex2unicode(tex: string, node: Node): string {\n if (node.type === 'macro' && macroAliases[node.content]) {\n tex = `\\\\${macroAliases[node.content]}${tex.slice(node.content.length + 1)}`\n }\n const text: string | Record<string, string> = latex2unicodemap[tex]\n if (typeof text === 'string') return text\n return text && text[latexMode(node)]\n}\n\nconst open: Record<string, string> = {}\nconst close: Record<string, string> = {}\nfor (const tag of ['i', 'b', 'sc', 'nc', 'ncx', 'br', 'p', 'li', 'code']) {\n open[tag] = `\\x0E${tag}\\x0F`\n close[tag] = `\\x0E/${tag}\\x0F`\n}\nconst collapsable = /\\x0E\\/([a-z]+)\\x0F(\\s*)\\x0E\\1\\x0F/ig\n\nexport type CreatorFields = {\n author?: Creator[]\n bookauthor?: Creator[]\n collaborator?: Creator[]\n commentator?: Creator[]\n director?: Creator[]\n editor?: Creator[]\n editora?: Creator[]\n editorb?: Creator[]\n editors?: Creator[]\n holder?: Creator[]\n scriptwriter?: Creator[]\n translator?: Creator[]\n}\nexport type ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\nexport type TypedFields = CreatorFields & ArrayFields\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: Record<string, { parent: string; field: string }>\n input: string\n}\n\nconst Month = {\n jan: '1',\n january: '1',\n feb: '2',\n february: '2',\n mar: '3',\n march: '3',\n apr: '4',\n april: '4',\n may: '5',\n jun: '6',\n june: '6',\n jul: '7',\n july: '7',\n aug: '8',\n august: '8',\n sep: '9',\n september: '9',\n oct: '10',\n october: '10',\n nov: '11',\n november: '11',\n dec: '12',\n december: '12',\n}\n\n/** The parsed contents of a BibTeX library. */\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preambles: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * How to handle unknown TeX commands and environments: `tex` wraps the command in a script\n * element, `text` returns the command without its backslash, `ignore` omits it, and `throw`\n * throws an error identifying the unsupported TeX. When omitted, literal TeX is preserved for\n * backwards compatibility.\n */\n unsupported?: 'tex' | 'text' | 'ignore' | 'throw'\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\n/** A parsed personal or organizational name. */\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\n/** Controls how a field's TeX content is interpreted. */\nexport type ParseMode = keyof typeof FieldMode | 'literal' | 'verbatimlist'\n\nexport const English = [\n '',\n 'american',\n 'british',\n 'canadian',\n 'english',\n 'australian',\n 'newzealand',\n 'usenglish',\n 'ukenglish',\n 'en',\n 'eng',\n 'en-au',\n 'en-bz',\n 'en-ca',\n 'en-cb',\n 'en-gb',\n 'en-ie',\n 'en-jm',\n 'en-nz',\n 'en-ph',\n 'en-tt',\n 'en-us',\n 'en-za',\n 'en-zw',\n 'anglais', // don't do this people\n]\n\nconst FieldAction = {\n removeOuterBraces: [\n 'doi',\n // 'publisher',\n // 'location',\n ],\n parseInt: [\n 'year',\n 'month',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\nclass UnsupportedError extends Error {}\n\ntype Context = {\n mode: ParseMode\n caseProtected?: boolean\n}\n\n/*\nasync function* asyncGenerator<T>(array: T[]): AsyncGenerator<T, void, unknown> {\n for (const item of array) {\n yield await Promise.resolve(item)\n }\n}\n*/\n\nclass BibTeXParser {\n private current!: Entry\n private english!: boolean\n private options!: Options\n private fieldMode!: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib!: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode | null {\n if (latexMode(nodes[0]) !== 'text') return null\n\n const max = 3\n const slice = nodes.slice(0, max)\n const type = slice.map(n => n.type === 'string' ? 's' : ' ').join('')\n if (type[0] !== 's') return null\n\n const content = slice.map(n => n.type === 'string' ? n.content : '')\n let latex: string\n\n while (content.length) {\n if (type.startsWith('s'.repeat(content.length)) && (latex = latex2unicode(content.join(''), slice[0]))) {\n try {\n return { type: 'string', content: latex, _renderInfo: {} }\n }\n finally {\n nodes.splice(0, content.length)\n }\n }\n content.pop()\n }\n\n return null\n }\n\n private wraparg(node: Node, macro: Macro): Argument {\n if (macro.content.match(/^(itshape|textsl|textit|emph|mkbibemph)$/)) node._renderInfo!.emph = true\n if (macro.content.match(/^(textbf|mkbibbold|bfseries)$/)) node._renderInfo!.bold = true\n if (macro.content.match(/^(textsc)$/)) node._renderInfo!.smallCaps = true\n if (macro.content.match(/^(texttt)$/)) node._renderInfo!.code = true\n return { type: 'argument', content: [node], openMark: '', closeMark: '', _renderInfo: { mode: node._renderInfo!.mode } }\n }\n\n private argtogroup(node: Argument): Group {\n if (node.content.length === 1 && node.content[0].type === 'group') return node.content[0]\n return { type: 'group', content: node.content }\n }\n\n private argument(nodes: Node[], macro: Macro): Argument | null {\n if (!nodes.length) return null\n if (nodes[0].type === 'whitespace') nodes.shift()\n if (!nodes.length) return null\n if (nodes[0].type === 'string') {\n const char = nodes[0].content[0]\n nodes[0].content = nodes[0].content.substr(1)\n const arg = { ...nodes[0], content: char }\n if (!nodes[0].content) nodes.shift()\n return this.wraparg(arg, macro)\n }\n return this.wraparg(nodes.shift()!, macro)\n }\n\n private unsupported(node: Node): string {\n const tex = printRaw(node)\n if (this.options.unsupported === 'throw') throw new UnsupportedError(`unhandled ${node.type} ${tex}`)\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n const command = node.type === 'macro' ? `\\\\${node.content}` : tex\n switch (this.options.unsupported) {\n case 'ignore':\n return ''\n case 'text':\n return command.replace(/^\\\\/, '')\n case 'tex':\n return `<script>${command}</script>`\n default:\n return tex\n }\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n const name = macroAliases[node.content] ?? node.content\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (name) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args!.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args!.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url!, context)}\">${this.stringify(label!, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'undefined':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n case 'if':\n case 'ifx':\n case 'else':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args![0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args![0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args![0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args![0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args![0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case ' ':\n return ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args![0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args!.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args![0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo!.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo!.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo!.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo!.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo!.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo!.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo!.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo!.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces!.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()!\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo!.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo!.protectCase)) node._renderInfo!.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo!.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo!.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo!.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n const ligatureResult = this.ligature(nodes)\n if (ligatureResult) {\n compacted.push(ligatureResult)\n continue\n }\n\n const node = nodes.shift()!\n\n if (node.type === 'macro' && node.content === 'ifdefined') {\n inif += 1\n continue\n }\n else if (node.type === 'macro' && node.content === 'else') {\n continue\n }\n else if (node.type === 'macro' && node.content === 'fi') {\n inif = Math.max(inif - 1, 0)\n continue\n }\n else if (inif) {\n continue\n }\n\n const nargs = node.type === 'macro'\n ? narguments[node.content] || narguments[`${info.context.inMathMode ? 'math' : 'text'}\\t${node.content}`]\n : 0\n if (node.type === 'macro' && nargs) {\n const args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter((arg): arg is Argument => arg !== null)\n node.args = args\n if (node.content.match(/^(url|href)$/) && args.length) {\n let url: Node[] = args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo!.mode } }, node)\n }\n caseProtection.intuitive -= args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo!.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo?.[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo![markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n case 'macro':\n // Legacy input can encode an accented base as an unknown control word, for example\n // `\\'{\\a}`. The outer accent is recognized, but `\\a` has no Unicode mapping. Treat\n // only that argument-free, single-letter payload as text here; ordinary unknown\n // macros must still go through the unsupported-command handler unchanged.\n if (arg.escapeToken && /^[A-Za-z]$/.test(arg.content) && !arg.args?.length) {\n const command = `${arg.escapeToken}${arg.content}`\n if (!(command in latex2unicodemap)) {\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n }\n }\n return\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n !!(this.options.sentenceCase && this.options.sentenceCase.guess), // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = (this.options.english as string[]).map(langid => langid.toLowerCase())\n\n this.fieldMode = Object.entries(FieldMode).reduce((acc: typeof FieldMode, [mode, test]: [string, (RegExp | string)[]]) => {\n const strings = test.filter(fieldname_or_regex => typeof fieldname_or_regex === 'string' && !this.options.fieldMode![fieldname_or_regex])\n const regexes = test.filter(fieldname_or_regex => typeof fieldname_or_regex !== 'string')\n acc[mode] = [...strings, ...regexes]\n return acc\n }, <typeof FieldMode> {})\n for (const [field, mode] of Object.entries(this.options.fieldMode!)) {\n this.fieldMode[mode].unshift(field)\n }\n\n if (!this.options.removeOuterBraces) {\n this.options.removeOuterBraces = [\n ...FieldAction.removeOuterBraces,\n ...this.fieldMode.title,\n ...this.fieldMode.verbatim,\n ].filter(field => typeof field === 'string')\n }\n\n if (options.unsupported !== undefined && !['tex', 'text', 'ignore', 'throw'].includes(options.unsupported)) {\n throw new TypeError('unsupported must be tex, text, ignore, or throw')\n }\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preambles: [],\n jabref: { root: [], groups: {} },\n }\n }\n\n private reparse(verbatim: bibtex.Entry) {\n let langid: string = (verbatim.fields.langid || verbatim.fields.hyphenation || '').toLowerCase()\n if (!langid && this.options.languageAsLangid && verbatim.fields.language) langid = verbatim.fields.language.toLowerCase()\n this.english = (<string[]> this.options.english).includes(langid)\n\n const entry: Entry = this.current = {\n type: verbatim.type,\n key: verbatim.key,\n fields: {},\n mode: {},\n input: verbatim.input,\n }\n let keywords: string[] = [] // OMG #783\n try {\n for (let [field, value] of Object.entries(verbatim.fields)) {\n if (!value.trim()) continue\n\n /*\n if (this.options.raw && !this.options.removeOuterBraces.includes(field)) {\n entry.fields[field] = value.trim()\n entry.mode[field] = 'verbatim'\n continue\n }\n */\n\n if (field.match(/^keywords([+]duplicate-\\d+)?$/)) field = 'keywords' // #873\n\n this.field(entry, field, value)\n\n if (field === 'keywords') { // #873\n keywords = [...keywords, ...(entry.fields.keywords as unknown as string).split(/\\s*[,;]\\s*/)].map((k: string) => k.trim()).filter(k => k)\n delete entry.fields.keywords\n }\n\n if (!this.options.raw && typeof entry.fields[field] === 'string') {\n entry.fields[field] = entry.fields[field].trim()\n if (field === 'month') entry.fields[field] = Month[entry.fields[field].toLowerCase()] || entry.fields[field]\n }\n }\n\n if (keywords.length) {\n entry.fields.keywords = keywords\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n this.bib.errors.push({ error: `${err.message}\\n${entry.input}`, input: entry.input })\n }\n }\n\n private content(tex: string) {\n const entry: Entry = { key: '', type: '', fields: {}, mode: {}, input: tex }\n const english = this.english\n this.english = false\n this.field(entry, 'tex', tex)\n this.english = english\n return entry.fields.tex\n }\n\n private prep(base: bibtex.Library) {\n for (const preamble of base.preambles) {\n try {\n this.content(preamble)\n }\n catch (err) {\n if (err instanceof UnsupportedError) throw err\n }\n }\n for (const [k, v] of Object.entries(base.strings)) {\n this.bib.strings[k] = this.content(v)\n }\n }\n\n private finalize(base: bibtex.Library) {\n if (this.options.applyCrossRef) {\n const entries: Partial<Record<string, Entry>> = {}\n for (const entry of this.bib.entries) {\n if (entry.key) entries[entry.key.toUpperCase()] = entry\n }\n\n const order: string[] = []\n for (const entry of this.bib.entries) {\n if (!entry.key || typeof entry.fields.crossref !== 'string') continue\n\n const crossref = entry.fields.crossref.toUpperCase()\n if (!entries[crossref]) continue\n\n const key = entry.key.toUpperCase()\n // Topological sort: parents are unshifted to the front, children pushed\n // to the back. Because a parent may itself be a child of another entry,\n // unshift guarantees every ancestor appears before all of its descendants\n // regardless of the order entries appear in the .bib file. Duplicate\n // entries are skipped so a shared parent is only processed once.\n if (!order.includes(crossref)) order.unshift(crossref)\n if (!order.includes(key)) order.push(key)\n }\n\n for (const key of order) {\n const child = entries[key.toUpperCase()]!\n const parent = entries[child.fields.crossref?.toUpperCase()]\n if (!parent) continue\n\n for (const mappings of [CrossRef[child.type], CrossRef['*']].filter(m => m)) {\n for (const mapping of [mappings[parent.type], mappings['*']].filter(m => m)) {\n for (const [childfield, parentfield] of Object.entries(mapping)) {\n if (!child.fields[childfield] && parent.fields[parentfield]) {\n child.fields[childfield] = parent.fields[parentfield]\n\n child.crossref ??= {}\n child.crossref[childfield] = { parent: parent.key, field: parentfield }\n }\n }\n\n for (const field of (Allowed[child.type] || [])) {\n if (NoCrossRef.includes(field)) continue\n\n if (!child.fields[field] && parent.fields[field]) {\n child.fields[field] = parent.fields[field]\n\n child.crossref ??= {}\n child.crossref[field] = { parent: parent.key, field }\n }\n }\n }\n }\n }\n }\n\n const { comments, jabref } = JabRef.parse(base.comments)\n this.bib.comments = comments\n this.bib.jabref = jabref\n\n this.bib.preambles = base.preambles\n this.bib.errors = [...base.errors, ...this.bib.errors]\n }\n\n public parse(input: string, options: Options = {}): Library {\n this.reset(options)\n\n const base = bibtex.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n for (const entry of base.entries) {\n this.reparse(entry)\n }\n\n this.finalize(base)\n return this.bib\n }\n\n public async parseAsync(input: string, options: Options = {}): Promise<Library> {\n this.reset(options)\n\n const base = await bibtex.promises.parse(input, { strings: options.strings })\n\n this.prep(base)\n\n let n = 1\n for (const entry of base.entries) {\n this.reparse(entry)\n if ((n++ % 1000) === 0) await playnice()\n }\n\n this.finalize(base)\n return this.bib\n }\n}\n\n/** Parses BibTeX or BibLaTeX source into a normalized library. */\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\n/** Asynchronous variant of {@link parse}, yielding periodically for large libraries. */\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["toSentenceCase", "tokenize", "parse"]
7
7
  }
@@ -146,11 +146,12 @@ export interface Options {
146
146
  */
147
147
  caseProtection?: 'as-needed' | 'strict' | boolean;
148
148
  /**
149
- * How to handle unknown TeX commands and environments: `ignore` replaces them with nothing,
150
- * `keep` preserves their literal TeX (including the backslash) and records a diagnostic,
151
- * and `throw` throws an error identifying the unsupported TeX. Defaults to `keep`.
149
+ * How to handle unknown TeX commands and environments: `tex` wraps the command in a script
150
+ * element, `text` returns the command without its backslash, `ignore` omits it, and `throw`
151
+ * throws an error identifying the unsupported TeX. When omitted, literal TeX is preserved for
152
+ * backwards compatibility.
152
153
  */
153
- unsupported?: 'ignore' | 'keep' | 'throw';
154
+ unsupported?: 'tex' | 'text' | 'ignore' | 'throw';
154
155
  /**
155
156
  * Some fields such as `url` are parsed in what is called "verbatim mode" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,
156
157
  * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export function parseVerbatim(input: string, options?: any | null): any;
15
15
 
16
16
  export function parseVerbatimAsync(input: string, options?: any | null): Promise<any>;
17
17
 
18
+ export function start(): void;
19
+
18
20
  /**
19
21
  * Apply sentence casing with the standalone TypeScript API's defaulted option object.
20
22
  */
@@ -33,6 +35,7 @@ export interface InitOutput {
33
35
  readonly parseAsync: (a: number, b: number, c: number) => any;
34
36
  readonly parseVerbatim: (a: number, b: number, c: number) => [number, number, number];
35
37
  readonly parseVerbatimAsync: (a: number, b: number, c: number) => any;
38
+ readonly start: () => void;
36
39
  readonly toSentenceCase: (a: number, b: number, c: number) => [number, number, number, number];
37
40
  readonly tokenize: (a: number, b: number) => [number, number, number];
38
41
  readonly wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___js_sys_a6b0604181071ff___Function_fn_wasm_bindgen_d8d66d04887dc00f___JsValue_____wasm_bindgen_d8d66d04887dc00f___sys__Undefined___js_sys_a6b0604181071ff___Function_fn_wasm_bindgen_d8d66d04887dc00f___JsValue_____wasm_bindgen_d8d66d04887dc00f___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
@@ -42,9 +45,9 @@ export interface InitOutput {
42
45
  readonly __wbindgen_exn_store: (a: number) => void;
43
46
  readonly __externref_table_alloc: () => number;
44
47
  readonly __wbindgen_externrefs: WebAssembly.Table;
48
+ readonly __wbindgen_free: (a: number, b: number, c: number) => void;
45
49
  readonly __wbindgen_destroy_closure: (a: number, b: number) => void;
46
50
  readonly __externref_table_dealloc: (a: number) => void;
47
- readonly __wbindgen_free: (a: number, b: number, c: number) => void;
48
51
  readonly __wbindgen_start: () => void;
49
52
  }
50
53
 
@@ -58,6 +58,10 @@ export function parseVerbatimAsync(input, options) {
58
58
  return ret;
59
59
  }
60
60
 
61
+ export function start() {
62
+ wasm.start();
63
+ }
64
+
61
65
  /**
62
66
  * Apply sentence casing with the standalone TypeScript API's defaulted option object.
63
67
  * @param {string} input
@@ -204,6 +208,17 @@ function __wbg_get_imports() {
204
208
  const ret = Object.entries(arg0);
205
209
  return ret;
206
210
  },
211
+ __wbg_error_757e9472f8410341: function(arg0, arg1) {
212
+ let deferred0_0;
213
+ let deferred0_1;
214
+ try {
215
+ deferred0_0 = arg0;
216
+ deferred0_1 = arg1;
217
+ console.error(getStringFromWasm0(arg0, arg1));
218
+ } finally {
219
+ wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
220
+ }
221
+ },
207
222
  __wbg_get_658f6698067d9515: function() { return handleError(function (arg0, arg1) {
208
223
  const ret = Reflect.get(arg0, arg1);
209
224
  return ret;
@@ -274,6 +289,10 @@ function __wbg_get_imports() {
274
289
  const ret = new Uint8Array(arg0);
275
290
  return ret;
276
291
  },
292
+ __wbg_new_227d7c05414eb861: function() {
293
+ const ret = new Error();
294
+ return ret;
295
+ },
277
296
  __wbg_new_28744009d011f847: function() {
278
297
  const ret = new Map();
279
298
  return ret;
@@ -336,6 +355,13 @@ function __wbg_get_imports() {
336
355
  __wbg_set_bea140a88be9b277: function(arg0, arg1, arg2) {
337
356
  arg0[arg1 >>> 0] = arg2;
338
357
  },
358
+ __wbg_stack_3b0d974bbf31e44f: function(arg0, arg1) {
359
+ const ret = arg1.stack;
360
+ const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
361
+ const len1 = WASM_VECTOR_LEN;
362
+ getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
363
+ getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
364
+ },
339
365
  __wbg_static_accessor_GLOBAL_266715b9d96ba635: function() {
340
366
  const ret = typeof global === 'undefined' ? null : global;
341
367
  return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
@@ -365,7 +391,7 @@ function __wbg_get_imports() {
365
391
  return ret;
366
392
  },
367
393
  __wbindgen_generic_0000000000000001: function(arg0, arg1) {
368
- // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 78, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
394
+ // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 85, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
369
395
  const ret = makeMutClosure(arg0, arg1, wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___wasm_bindgen_d8d66d04887dc00f___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_d8d66d04887dc00f___JsError___true_);
370
396
  return ret;
371
397
  },
Binary file
@@ -5,6 +5,7 @@ export const parse: (a: number, b: number, c: number) => [number, number, number
5
5
  export const parseAsync: (a: number, b: number, c: number) => any;
6
6
  export const parseVerbatim: (a: number, b: number, c: number) => [number, number, number];
7
7
  export const parseVerbatimAsync: (a: number, b: number, c: number) => any;
8
+ export const start: () => void;
8
9
  export const toSentenceCase: (a: number, b: number, c: number) => [number, number, number, number];
9
10
  export const tokenize: (a: number, b: number) => [number, number, number];
10
11
  export const wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___js_sys_a6b0604181071ff___Function_fn_wasm_bindgen_d8d66d04887dc00f___JsValue_____wasm_bindgen_d8d66d04887dc00f___sys__Undefined___js_sys_a6b0604181071ff___Function_fn_wasm_bindgen_d8d66d04887dc00f___JsValue_____wasm_bindgen_d8d66d04887dc00f___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
@@ -14,7 +15,7 @@ export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) =>
14
15
  export const __wbindgen_exn_store: (a: number) => void;
15
16
  export const __externref_table_alloc: () => number;
16
17
  export const __wbindgen_externrefs: WebAssembly.Table;
18
+ export const __wbindgen_free: (a: number, b: number, c: number) => void;
17
19
  export const __wbindgen_destroy_closure: (a: number, b: number) => void;
18
20
  export const __externref_table_dealloc: (a: number) => void;
19
- export const __wbindgen_free: (a: number, b: number, c: number) => void;
20
21
  export const __wbindgen_start: () => void;
@@ -87,7 +87,7 @@ export interface Options extends ParserOptions {
87
87
  /** Control preservation of capitalization inside braces. */
88
88
  caseProtection?: 'off' | 'as-needed' | 'strict';
89
89
  /** Policy for unsupported TeX commands and environments. */
90
- unsupported?: 'ignore' | 'keep' | 'throw';
90
+ unsupported?: 'tex' | 'text' | 'ignore' | 'throw';
91
91
  /** Fields parsed as verbatim text rather than TeX. */
92
92
  verbatimFields?: (string | RegExp)[];
93
93
  /** Fields for which a redundant outer brace pair is removed. */
@@ -37,12 +37,9 @@ function prepare(input, options = {}) {
37
37
  input = `${parserOptions.strings}\n${input}`;
38
38
  delete parserOptions.strings;
39
39
  }
40
- if (parserOptions.unsupported && !['ignore', 'keep', 'throw'].includes(parserOptions.unsupported)) {
41
- throw new TypeError('unsupported must be ignore, keep, or throw');
40
+ if (parserOptions.unsupported !== undefined && !['tex', 'text', 'ignore', 'throw'].includes(parserOptions.unsupported)) {
41
+ throw new TypeError('unsupported must be tex, text, ignore, or throw');
42
42
  }
43
- if (parserOptions.unsupported === 'ignore')
44
- parserOptions.ignoreUnsupported = true;
45
- delete parserOptions.unsupported;
46
43
  if (Array.isArray(parserOptions.verbatimFields)) {
47
44
  parserOptions.verbatimFields = parserOptions.verbatimFields.map((field) => {
48
45
  if (typeof field === 'string')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retorquere/bibtex-parser",
3
- "version": "12.1.4",
3
+ "version": "12.1.7",
4
4
  "description": "BibTeX parser",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",