@retorquere/bibtex-parser 12.1.8 → 12.1.10

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
@@ -201,6 +201,7 @@ const FieldAction = {
201
201
  };
202
202
  const narguments = {
203
203
  advance: 1,
204
+ allcaps: 1,
204
205
  ElsevierGlyph: 1,
205
206
  bar: 1,
206
207
  bibcyr: 1,
@@ -570,6 +571,8 @@ class BibTeXParser {
570
571
  return this.subp(this.stringify(node.args[0], context), "sup");
571
572
  case "textsubscript":
572
573
  return this.subp(this.stringify(node.args[0], context), "sub");
574
+ case "allcaps":
575
+ return this.wrap(this.stringify(node.args[0], { ...context, caseProtected: true }), "nc", this.english && context.mode === "title");
573
576
  case "_":
574
577
  case "^":
575
578
  switch (latexMode(node)) {
@@ -646,7 +649,7 @@ class BibTeXParser {
646
649
  if (node._renderInfo.bold) content = `${open.b}${content}${close.b}`;
647
650
  if (node._renderInfo.smallCaps) content = `${open.sc}${content}${close.sc}`;
648
651
  if (node._renderInfo.code) content = `${open.code}${content}${close.code}`;
649
- if (this.english && node._renderInfo.protectCase) content = `${open.nc}${content}${close.nc}`;
652
+ if (this.english && node._renderInfo.protectCase && !context.caseProtected) content = `${open.nc}${content}${close.nc}`;
650
653
  }
651
654
  return content;
652
655
  }
@@ -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: `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 discretionary: 3,\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 symbol: 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 name = macroAliases[node.content] ?? node.content\n if (name === 'discretionary') {\n return node.args?.[2] ? this.stringify(node.args[2], context) : ''\n }\n if (name === 'symbol') {\n const argument = node.args?.[0]?.content ?? []\n const content = argument.length === 1 && argument[0].type === 'group' ? argument[0].content : argument\n const code = content.map(n => this.stringify(n, context)).join('').trim()\n const value = /^\\d+$/.test(code) ? Number(code) : NaN\n if (Number.isSafeInteger(value) && value <= 0x10ffff && !(value >= 0xd800 && value <= 0xdfff)) {\n return String.fromCodePoint(value)\n }\n return this.unsupported(node)\n }\n\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\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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",
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 allcaps: 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 discretionary: 3,\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 symbol: 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 name = macroAliases[node.content] ?? node.content\n if (name === 'discretionary') {\n return node.args?.[2] ? this.stringify(node.args[2], context) : ''\n }\n if (name === 'symbol') {\n const argument = node.args?.[0]?.content ?? []\n const content = argument.length === 1 && argument[0].type === 'group' ? argument[0].content : argument\n const code = content.map(n => this.stringify(n, context)).join('').trim()\n const value = /^\\d+$/.test(code) ? Number(code) : NaN\n if (Number.isSafeInteger(value) && value <= 0x10ffff && !(value >= 0xd800 && value <= 0xdfff)) {\n return String.fromCodePoint(value)\n }\n return this.unsupported(node)\n }\n\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\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 'allcaps':\n return this.wrap(this.stringify(node.args![0], { ...context, caseProtected: true }), 'nc', this.english && context.mode === 'title')\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 && !context.caseProtected) 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
@@ -165,6 +165,7 @@ const FieldAction = {
165
165
  };
166
166
  const narguments = {
167
167
  advance: 1,
168
+ allcaps: 1,
168
169
  ElsevierGlyph: 1,
169
170
  bar: 1,
170
171
  bibcyr: 1,
@@ -535,6 +536,8 @@ class BibTeXParser {
535
536
  return this.subp(this.stringify(node.args[0], context), "sup");
536
537
  case "textsubscript":
537
538
  return this.subp(this.stringify(node.args[0], context), "sub");
539
+ case "allcaps":
540
+ return this.wrap(this.stringify(node.args[0], { ...context, caseProtected: true }), "nc", this.english && context.mode === "title");
538
541
  case "_":
539
542
  case "^":
540
543
  switch (latexMode(node)) {
@@ -611,7 +614,7 @@ class BibTeXParser {
611
614
  if (node._renderInfo.bold) content = `${open.b}${content}${close.b}`;
612
615
  if (node._renderInfo.smallCaps) content = `${open.sc}${content}${close.sc}`;
613
616
  if (node._renderInfo.code) content = `${open.code}${content}${close.code}`;
614
- if (this.english && node._renderInfo.protectCase) content = `${open.nc}${content}${close.nc}`;
617
+ if (this.english && node._renderInfo.protectCase && !context.caseProtected) content = `${open.nc}${content}${close.nc}`;
615
618
  }
616
619
  return content;
617
620
  }
@@ -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: `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 discretionary: 3,\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 symbol: 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 name = macroAliases[node.content] ?? node.content\n if (name === 'discretionary') {\n return node.args?.[2] ? this.stringify(node.args[2], context) : ''\n }\n if (name === 'symbol') {\n const argument = node.args?.[0]?.content ?? []\n const content = argument.length === 1 && argument[0].type === 'group' ? argument[0].content : argument\n const code = content.map(n => this.stringify(n, context)).join('').trim()\n const value = /^\\d+$/.test(code) ? Number(code) : NaN\n if (Number.isSafeInteger(value) && value <= 0x10ffff && !(value >= 0xd800 && value <= 0xdfff)) {\n return String.fromCodePoint(value)\n }\n return this.unsupported(node)\n }\n\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\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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",
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 allcaps: 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 discretionary: 3,\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 symbol: 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 name = macroAliases[node.content] ?? node.content\n if (name === 'discretionary') {\n return node.args?.[2] ? this.stringify(node.args[2], context) : ''\n }\n if (name === 'symbol') {\n const argument = node.args?.[0]?.content ?? []\n const content = argument.length === 1 && argument[0].type === 'group' ? argument[0].content : argument\n const code = content.map(n => this.stringify(n, context)).join('').trim()\n const value = /^\\d+$/.test(code) ? Number(code) : NaN\n if (Number.isSafeInteger(value) && value <= 0x10ffff && !(value >= 0xd800 && value <= 0xdfff)) {\n return String.fromCodePoint(value)\n }\n return this.unsupported(node)\n }\n\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\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 'allcaps':\n return this.wrap(this.stringify(node.args![0], { ...context, caseProtected: true }), 'nc', this.english && context.mode === 'title')\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 && !context.caseProtected) 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
  }
@@ -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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"}
@@ -38,8 +38,8 @@ export interface InitOutput {
38
38
  readonly start: () => void;
39
39
  readonly toSentenceCase: (a: number, b: number, c: number) => [number, number, number, number];
40
40
  readonly tokenize: (a: number, b: number) => [number, number, number];
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
- readonly wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___wasm_bindgen_d8d66d04887dc00f___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_d8d66d04887dc00f___JsError___true_: (a: number, b: number, c: any) => [number, number];
41
+ readonly wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
42
+ readonly wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___wasm_bindgen_27e16af4bbf8dd6f___JsValue__core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_27e16af4bbf8dd6f___JsError___true_: (a: number, b: number, c: any) => [number, number];
43
43
  readonly __wbindgen_malloc: (a: number, b: number) => number;
44
44
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
45
45
  readonly __wbindgen_exn_store: (a: number) => void;
@@ -312,7 +312,7 @@ function __wbg_get_imports() {
312
312
  const a = state0.a;
313
313
  state0.a = 0;
314
314
  try {
315
- return 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, state0.b, arg0, arg1);
315
+ return wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined_______true_(a, state0.b, arg0, arg1);
316
316
  } finally {
317
317
  state0.a = a;
318
318
  }
@@ -392,7 +392,7 @@ function __wbg_get_imports() {
392
392
  },
393
393
  __wbindgen_generic_0000000000000001: function(arg0, arg1) {
394
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`.
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_);
395
+ const ret = makeMutClosure(arg0, arg1, wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___wasm_bindgen_27e16af4bbf8dd6f___JsValue__core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_27e16af4bbf8dd6f___JsError___true_);
396
396
  return ret;
397
397
  },
398
398
  __wbindgen_generic_0000000000000002: function(arg0) {
@@ -432,15 +432,15 @@ function __wbg_get_imports() {
432
432
  };
433
433
  }
434
434
 
435
- function wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___wasm_bindgen_d8d66d04887dc00f___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_d8d66d04887dc00f___JsError___true_(arg0, arg1, arg2) {
436
- const ret = wasm.wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___wasm_bindgen_d8d66d04887dc00f___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_d8d66d04887dc00f___JsError___true_(arg0, arg1, arg2);
435
+ function wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___wasm_bindgen_27e16af4bbf8dd6f___JsValue__core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_27e16af4bbf8dd6f___JsError___true_(arg0, arg1, arg2) {
436
+ const ret = wasm.wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___wasm_bindgen_27e16af4bbf8dd6f___JsValue__core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_27e16af4bbf8dd6f___JsError___true_(arg0, arg1, arg2);
437
437
  if (ret[1]) {
438
438
  throw takeFromExternrefTable0(ret[0]);
439
439
  }
440
440
  }
441
441
 
442
- function 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_(arg0, arg1, arg2, arg3) {
443
- wasm.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_(arg0, arg1, arg2, arg3);
442
+ function wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined_______true_(arg0, arg1, arg2, arg3) {
443
+ wasm.wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined_______true_(arg0, arg1, arg2, arg3);
444
444
  }
445
445
 
446
446
  function addToExternrefTable0(obj) {
Binary file
@@ -8,8 +8,8 @@ export const parseVerbatimAsync: (a: number, b: number, c: number) => any;
8
8
  export const start: () => void;
9
9
  export const toSentenceCase: (a: number, b: number, c: number) => [number, number, number, number];
10
10
  export const tokenize: (a: number, b: number) => [number, number, number];
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;
12
- export const wasm_bindgen_d8d66d04887dc00f___convert__closures_____invoke___wasm_bindgen_d8d66d04887dc00f___JsValue__core_608f92abc48d28da___result__Result_____wasm_bindgen_d8d66d04887dc00f___JsError___true_: (a: number, b: number, c: any) => [number, number];
11
+ export const wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined___js_sys_8149d826ad841366___Function_fn_wasm_bindgen_27e16af4bbf8dd6f___JsValue_____wasm_bindgen_27e16af4bbf8dd6f___sys__Undefined_______true_: (a: number, b: number, c: any, d: any) => void;
12
+ export const wasm_bindgen_27e16af4bbf8dd6f___convert__closures_____invoke___wasm_bindgen_27e16af4bbf8dd6f___JsValue__core_37ee0ce0c4cd57d5___result__Result_____wasm_bindgen_27e16af4bbf8dd6f___JsError___true_: (a: number, b: number, c: any) => [number, number];
13
13
  export const __wbindgen_malloc: (a: number, b: number) => number;
14
14
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
15
15
  export const __wbindgen_exn_store: (a: number) => void;
@@ -18,11 +18,36 @@ export interface Creator {
18
18
  juniorcomma?: boolean;
19
19
  }
20
20
  export type FieldValue = string | string[] | Creator[];
21
+ export type CreatorFields = {
22
+ author?: Creator[];
23
+ bookauthor?: Creator[];
24
+ collaborator?: Creator[];
25
+ commentator?: Creator[];
26
+ director?: Creator[];
27
+ editor?: Creator[];
28
+ editora?: Creator[];
29
+ editorb?: Creator[];
30
+ editors?: Creator[];
31
+ holder?: Creator[];
32
+ scriptwriter?: Creator[];
33
+ translator?: Creator[];
34
+ };
35
+ export type ArrayFields = {
36
+ keywords?: string[];
37
+ institution?: string[];
38
+ publisher?: string[];
39
+ origpublisher?: string[];
40
+ organization?: string[];
41
+ location?: string[];
42
+ origlocation?: string[];
43
+ };
44
+ export type TypedFields = CreatorFields & ArrayFields;
45
+ export type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>;
21
46
  /** A normalized BibTeX entry returned by the parser. */
22
47
  export interface Entry {
23
48
  type: string;
24
49
  key: string;
25
- fields: Record<string, FieldValue>;
50
+ fields: Fields;
26
51
  mode: Record<string, ParseMode>;
27
52
  crossref?: Record<string, {
28
53
  parent: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retorquere/bibtex-parser",
3
- "version": "12.1.8",
3
+ "version": "12.1.10",
4
4
  "description": "BibTeX parser",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",