@retorquere/bibtex-parser 13.0.7 → 13.0.8

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.
@@ -122,9 +122,9 @@ export interface Options {
122
122
  * - en-za
123
123
  * - en-zw
124
124
  *
125
- * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).
125
+ * If you pass an empty array, no sentence casing will be applied (even when there's no language field).
126
126
  */
127
- english?: string[] | boolean;
127
+ english?: string[];
128
128
  /**
129
129
  * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field
130
130
  * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../js/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../js/index.ts"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -917,7 +917,7 @@ class BibTeXParser {
917
917
  if (options.sentenceCase === false) {
918
918
  options = {
919
919
  ...options,
920
- english: false,
920
+ english: [],
921
921
  sentenceCase: {
922
922
  guess: false,
923
923
  subSentence: false,
@@ -940,8 +940,11 @@ class BibTeXParser {
940
940
  if (typeof pattern !== "string") throw new TypeError("verbatimFields entries must be glob strings");
941
941
  return this.wildcardPattern(pattern);
942
942
  });
943
- if (typeof this.options.english === "boolean") this.options.english = this.options.english ? English : [];
944
- this.options.english = this.options.english.map((langid) => langid.toLowerCase());
943
+ const english = this.options.english ?? English;
944
+ if (!Array.isArray(english) || english.some((langid) => typeof langid !== "string")) {
945
+ throw new TypeError("english must be an array of language identifiers");
946
+ }
947
+ this.options.english = english.map((langid) => langid.toLowerCase());
945
948
  this.fieldMode = Object.entries(FieldMode).reduce((acc, [mode, test]) => {
946
949
  const strings = test.filter((fieldname_or_regex) => typeof fieldname_or_regex === "string" && !this.options.fieldMode[fieldname_or_regex]);
947
950
  const regexes = test.filter((fieldname_or_regex) => typeof fieldname_or_regex !== "string");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../js/index.ts"],
4
- "sourcesContent": ["/** @module @retorquere/bibtex-parser/js */\n/* 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 } from './jabref.js'\nexport { 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\n/** Known creator-list fields, each returned as an array of parsed {@link Creator} values. */\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}\n/** Known multi-value fields whose elements remain strings. */\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}\n/** The known creator-list and string-list fields in a normalized entry. */\nexport type TypedFields = CreatorFields & ArrayFields\n/** BibTeX field names mapped to normalized values; fields outside the known lists are strings. */\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n /** Entry type from the source, such as `article` or `inproceedings`. */\n type: string\n /** Citation key identifying this entry. */\n key: string\n /** Parsed field values, with known creator and list fields represented as arrays. */\n fields: Fields\n /** Parsing mode used for each field; see {@link ParseMode}. */\n mode: Record<string, ParseMode>\n /** For fields inherited through `crossref`, records the parent entry key and source field name. */\n crossref?: Record<string, { parent: string; field: string }>\n /** Source text for this entry. */\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 * Diagnostics collected while parsing. Recoverable errors do not necessarily prevent entries from being returned.\n */\n errors: bibtex.ParseError[]\n\n /**\n * Successfully parsed entries, in source order; entries that could not be parsed are omitted.\n */\n entries: Entry[]\n\n /**\n * Text from `@comment` directives.\n */\n comments: string[]\n\n /**\n * Resolved values declared by `@string` directives.\n */\n strings: Record<string, string>\n\n /**\n * Values from `@preamble` directives, in source order.\n */\n preambles: string[]\n\n /**\n * JabRef metadata extracted from the library, including groups and file settings.\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 /** Render URL commands as HTML links (default true), or as case-protected destinations. */\n richURL?: 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 * Fields parsed in verbatim mode. Selectors use wildflower globs (`?`, `*`, and `\\\\`) and match\n * complete field names.\n */\n verbatimFields?: string[]\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 /** Complete name when the parser cannot safely separate it into components. */\n name?: string\n /** Family name, including any parsed name prefix. */\n lastName?: string\n /** Given name. */\n firstName?: string\n /** Name particle, such as \"von\" or \"de\", when separated from the family name. */\n prefix?: string\n /** Generational or other name suffix. */\n suffix?: string\n /** Initials of the given name. */\n initial?: string\n /** Whether the parsed family name includes a name prefix. */\n useprefix?: boolean\n /** Whether the source separated the suffix from the name with a comma. */\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 and which normalized value shape it receives. */\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 verbatimFieldPatterns!: RegExp[]\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 this.options.richURL === false\n ? `<span class=\"nocase\">${this.stringify(url!, { ...context, caseProtected: true })}</span>`\n : `<a href=\"${this.stringify(url!, { ...context, caseProtected: true })}\">${this.stringify(label!, { ...context, caseProtected: true })}</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.verbatimFieldPatterns.some(pattern => field.match(pattern))) 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 wildcardPattern(pattern: string): RegExp {\n let source = '^'\n let escaped = false\n for (const character of pattern.toLowerCase()) {\n const literal = character.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n if (escaped) {\n source += literal\n escaped = false\n }\n else if (character === '\\\\') {\n escaped = true\n }\n else if (character === '?') {\n source += '.'\n }\n else if (character === '*') {\n source += '.*?'\n }\n else {\n source += literal\n }\n }\n return new RegExp(`${source}$`, 'iu')\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 this.verbatimFieldPatterns = (this.options.verbatimFields ?? []).map(pattern => {\n if (typeof pattern !== 'string') throw new TypeError('verbatimFields entries must be glob strings')\n return this.wildcardPattern(pattern)\n })\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: new JabRef.JabRefMetadata(),\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/**\n * Parses BibTeX or BibLaTeX source into normalized entries and field values.\n * Recoverable problems are reported in `Library.errors`; set `unsupported: 'throw'` to throw on unsupported TeX commands or environments.\n *\n * @example\n * ```ts\n * const { entries, errors } = parse('@article{example, author={Ada Lovelace}, title={A title}}')\n * const title = entries[0]?.fields.title\n * ```\n */\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}; returns the same result shape and yields 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": ["/** @module @retorquere/bibtex-parser/js */\n/* 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 } from './jabref.js'\nexport { 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\n/** Known creator-list fields, each returned as an array of parsed {@link Creator} values. */\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}\n/** Known multi-value fields whose elements remain strings. */\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}\n/** The known creator-list and string-list fields in a normalized entry. */\nexport type TypedFields = CreatorFields & ArrayFields\n/** BibTeX field names mapped to normalized values; fields outside the known lists are strings. */\nexport type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\n/** A normalized BibTeX entry returned by {@link parse}. */\nexport type Entry = {\n /** Entry type from the source, such as `article` or `inproceedings`. */\n type: string\n /** Citation key identifying this entry. */\n key: string\n /** Parsed field values, with known creator and list fields represented as arrays. */\n fields: Fields\n /** Parsing mode used for each field; see {@link ParseMode}. */\n mode: Record<string, ParseMode>\n /** For fields inherited through `crossref`, records the parent entry key and source field name. */\n crossref?: Record<string, { parent: string; field: string }>\n /** Source text for this entry. */\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 * Diagnostics collected while parsing. Recoverable errors do not necessarily prevent entries from being returned.\n */\n errors: bibtex.ParseError[]\n\n /**\n * Successfully parsed entries, in source order; entries that could not be parsed are omitted.\n */\n entries: Entry[]\n\n /**\n * Text from `@comment` directives.\n */\n comments: string[]\n\n /**\n * Resolved values declared by `@string` directives.\n */\n strings: Record<string, string>\n\n /**\n * Values from `@preamble` directives, in source order.\n */\n preambles: string[]\n\n /**\n * JabRef metadata extracted from the library, including groups and file settings.\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, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[]\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 /** Render URL commands as HTML links (default true), or as case-protected destinations. */\n richURL?: 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 * Fields parsed in verbatim mode. Selectors use wildflower globs (`?`, `*`, and `\\\\`) and match\n * complete field names.\n */\n verbatimFields?: string[]\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 /** Complete name when the parser cannot safely separate it into components. */\n name?: string\n /** Family name, including any parsed name prefix. */\n lastName?: string\n /** Given name. */\n firstName?: string\n /** Name particle, such as \"von\" or \"de\", when separated from the family name. */\n prefix?: string\n /** Generational or other name suffix. */\n suffix?: string\n /** Initials of the given name. */\n initial?: string\n /** Whether the parsed family name includes a name prefix. */\n useprefix?: boolean\n /** Whether the source separated the suffix from the name with a comma. */\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 and which normalized value shape it receives. */\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 verbatimFieldPatterns!: RegExp[]\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 this.options.richURL === false\n ? `<span class=\"nocase\">${this.stringify(url!, { ...context, caseProtected: true })}</span>`\n : `<a href=\"${this.stringify(url!, { ...context, caseProtected: true })}\">${this.stringify(label!, { ...context, caseProtected: true })}</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.verbatimFieldPatterns.some(pattern => field.match(pattern))) 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 wildcardPattern(pattern: string): RegExp {\n let source = '^'\n let escaped = false\n for (const character of pattern.toLowerCase()) {\n const literal = character.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n if (escaped) {\n source += literal\n escaped = false\n }\n else if (character === '\\\\') {\n escaped = true\n }\n else if (character === '?') {\n source += '.'\n }\n else if (character === '*') {\n source += '.*?'\n }\n else {\n source += literal\n }\n }\n return new RegExp(`${source}$`, 'iu')\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: [],\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 this.verbatimFieldPatterns = (this.options.verbatimFields ?? []).map(pattern => {\n if (typeof pattern !== 'string') throw new TypeError('verbatimFields entries must be glob strings')\n return this.wildcardPattern(pattern)\n })\n\n const english = this.options.english ?? English\n if (!Array.isArray(english) || english.some(langid => typeof langid !== 'string')) {\n throw new TypeError('english must be an array of language identifiers')\n }\n this.options.english = english.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: new JabRef.JabRefMetadata(),\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/**\n * Parses BibTeX or BibLaTeX source into normalized entries and field values.\n * Recoverable problems are reported in `Library.errors`; set `unsupported: 'throw'` to throw on unsupported TeX commands or environments.\n *\n * @example\n * ```ts\n * const { entries, errors } = parse('@article{example, author={Ada Lovelace}, title={A title}}')\n * const title = entries[0]?.fields.title\n * ```\n */\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}; returns the same result shape and yields 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": ";;;AAGA,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,WAAW,iBAAiB,wBAAwB;AAC7D,YAAY,YAAY;AACxB,YAAY,YAAY;AAExB,SAAS,sBAAsB;AAG/B,SAAoB,SAA0B,aAAqB;AAEnE,SAAS,sBAAsB;AAE/B,SAAS,kBAAAA,uBAAsB;AAE/B,SAAS,gBAAgB;AAGzB,SAAS,YAAAC,iBAAgB;AAGzB,SAAS,gBAAgB;AAEzB,SAAS,YAAY,gBAAgB;AACrC,SAAS,WAAW,SAAS,cAAc,kBAAkB;AAE7D,SAAS,aAAa;AAEtB,SAAS,UAAU,MAAwC;AACzD,SAAO,KAAK,YAAa;AAC3B;AAEA,MAAM,eAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAS,cAAc,KAAa,MAAoB;AACtD,MAAI,KAAK,SAAS,WAAW,aAAa,KAAK,OAAO,GAAG;AACvD,UAAM,KAAK,aAAa,KAAK,OAAO,CAAC,GAAG,IAAI,MAAM,KAAK,QAAQ,SAAS,CAAC,CAAC;AAAA,EAC5E;AACA,QAAM,OAAwC,iBAAiB,GAAG;AAClE,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,SAAO,QAAQ,KAAK,UAAU,IAAI,CAAC;AACrC;AAEA,MAAM,OAA+B,CAAC;AACtC,MAAM,QAAgC,CAAC;AACvC,WAAW,OAAO,CAAC,KAAK,KAAK,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG;AACxE,OAAK,GAAG,IAAI,IAAO,GAAG;AACtB,QAAM,GAAG,IAAI,KAAQ,GAAG;AAC1B;AACA,MAAM,cAAc;AAgDpB,MAAM,QAAQ;AAAA,EACZ,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,WAAW;AAAA,EACX,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AACZ;AA+KO,MAAM,YAAY;AAAA,EACvB,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKO,MAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AACF;AAEA,MAAM,cAAc;AAAA,EAClB,mBAAmB;AAAA,IACjB;AAAA;AAAA;AAAA,EAGF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,aAAa;AAAA,EACjB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,2BAA2B;AAAA,EAC3B,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,IAAI;AAAA;AAAA,EAGJ,UAAW;AAAA,EACX,UAAW;AACb;AACA,WAAW,KAAK,UAAU,WAAW;AACnC,aAAW,CAAC,IAAI;AAClB;AAEA,MAAM,yBAAyB,MAAM;AAAC;AAetC,MAAM,aAAa;AAAA,EAAnB;AACE,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,eAAwC,CAAC;AACjD,wBAAQ;AACR,wBAAQ,aAAyB,oBAAI,IAAI;AAAA;AAAA,EAEjC,MAAM,KAAmB,KAAa,OAAuB;AACnE,UAAM,QAAgB,CAAC;AAEvB,UAAM,QAAQ,CAAC,GAAG,IAAI,OAAO;AAC7B,UAAM,QAAQ,MAAM,IAAI,UAAQ;AAC9B,UAAI,KAAK,SAAS,aAAc,QAAO;AACvC,UAAI,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM,GAAG,EAAG,QAAO;AAC9D,aAAO;AAAA,IACT,CAAC,EAAE,KAAK,EAAE;AAEV,UAAM,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,MAAM;AACvC,YAAM,UAAU,MAAM,SAAS,MAAM,OAAO,GAAG,MAAM,MAAM,IAAI,CAAC;AAChE,UAAK,IAAI,MAAO,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IACzD,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,IAAsB;AAGxC,WAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,OAAO,MAAM,WAAY,EAAE,KAAK,KAAK,SAAa,CAAC,CAAC;AAAA,EACrG;AAAA,EAEQ,aAAa,KAAoB;AACvC,QAAI,IAAI,QAAQ,WAAW,KAAK,IAAI,QAAQ,CAAC,EAAE,SAAS,QAAS,QAAO,KAAK,YAAY,EAAE,MAAM,KAAK,UAAU,KAAK,EAAE,MAAM,cAAc,CAAC,EAAE,CAAC;AAE/I,UAAM,EAAE,OAAO,SAAS,IAAI,KAAK,sBAAsB,GAAG;AAC1D,QAAI,UAAU;AACZ,YAAM,OAAgB,CAAC;AACvB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,cAAM,WAAW,KAAK,UAAU,OAAO,EAAE,MAAM,cAAc,CAAC,EAAE,KAAK;AAErE,gBAAQ,MAAM;AAAA,UACZ,KAAK;AACH;AAAA,UAEF,KAAK;AACH,iBAAK,YAAY;AACjB;AAAA,UAEF,KAAK;AACH,iBAAK,WAAW;AAChB;AAAA,UAEF,KAAK;AACH,iBAAK,UAAU;AACf;AAAA,UAEF,KAAK;AAAA,UACL,KAAK;AACH,iBAAK,IAAI,IAAI,SAAS,YAAY,MAAM;AACxC;AAAA,UAEF;AACE,iBAAK,IAAI,IAAI;AACb;AAAA,QACJ;AAAA,MACF;AACA,aAAO,KAAK,YAAY,IAAI;AAAA,IAC9B,WACS,MAAM,QAAQ;AACrB,YAAM,YAAsB,MAAM,IAAI,CAAC,SAAe,KAAK,UAAU,MAAM,EAAE,MAAM,cAAc,CAAC,EAAE,KAAK,CAAC;AAE1G,UAAI,UAAU,WAAW,KAAK,UAAU,CAAC,MAAM,GAAI,WAAU,IAAI;AAEjE,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,MAAM,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,GAAG,OAAO;AAC1D,aAAK,IAAI,OAAO,KAAK;AAAA,UACnB,OAAO,GAAG,GAAG,cAAc,UAAU,MAAM,eAAe,UAAU,KAAK,IAAI,CAAC,gBAAgB,UAAU,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,UAC3H,OAAO,UAAU,KAAK,IAAI;AAAA,QAC5B,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,UAAU,QAAQ,SAAS,IAAK,UAAU,WAAW,IACtD,CAAC,UAAU,CAAC,GAAG,QAAW,UAAU,CAAC,CAAC,IAEtC,UAAU,MAAM,GAAG,CAAC;AACxB,UAAI;AACJ,YAAM,IAAI,SAAS,MAAM,mBAAmB;AAC5C,UAAI,GAAG;AACL,iBAAS,EAAE,CAAC;AACZ,mBAAW,EAAE,CAAC;AAAA,MAChB;AACA,aAAO,KAAK,YAAY;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OACK;AACH,YAAM,YAAY,KAAK,MAAM,KAAK,MAAM,KAAK,EAAE,IAAI,UAAQ,KAAK,UAAU,MAAM,EAAE,MAAM,cAAc,CAAC,CAAC,EAAE,OAAO,OAAK,CAAC;AAEvH,UAAI,UAAU,WAAW,EAAG,QAAO,KAAK,YAAY,EAAE,UAAU,UAAU,CAAC,EAAE,CAAC;AAE9E,YAAM,SAAS,UAAU,UAAU,OAAK,EAAE,MAAM,QAAQ,CAAC;AACzD,YAAM,UAAU,UAAU,IAAI,KAAK,UAAU,UAAU,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC;AACjG,UAAI,YAAY,IAAI;AAClB,cAAM,WAAW,UAAU,IAAI;AAC/B,eAAO,KAAK,YAAY,EAAE,UAAU,WAAW,UAAU,KAAK,GAAG,EAAE,CAAC;AAAA,MACtE;AAEA,aAAO,KAAK,YAAY;AAAA,QACtB,WAAW,UAAU,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG;AAAA,QAC9C,QAAQ,UAAU,MAAM,QAAQ,OAAO,EAAE,KAAK,GAAG;AAAA,QACjD,UAAU,UAAU,MAAM,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,SAAS,OAAkC;AACjD,QAAI,UAAU,MAAM,CAAC,CAAC,MAAM,OAAQ,QAAO;AAE3C,UAAM,MAAM;AACZ,UAAM,QAAQ,MAAM,MAAM,GAAG,GAAG;AAChC,UAAM,OAAO,MAAM,IAAI,OAAK,EAAE,SAAS,WAAW,MAAM,GAAG,EAAE,KAAK,EAAE;AACpE,QAAI,KAAK,CAAC,MAAM,IAAK,QAAO;AAE5B,UAAM,UAAU,MAAM,IAAI,OAAK,EAAE,SAAS,WAAW,EAAE,UAAU,EAAE;AACnE,QAAI;AAEJ,WAAO,QAAQ,QAAQ;AACrB,UAAI,KAAK,WAAW,IAAI,OAAO,QAAQ,MAAM,CAAC,MAAM,QAAQ,cAAc,QAAQ,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI;AACtG,YAAI;AACF,iBAAO,EAAE,MAAM,UAAU,SAAS,OAAO,aAAa,CAAC,EAAE;AAAA,QAC3D,UACA;AACE,gBAAM,OAAO,GAAG,QAAQ,MAAM;AAAA,QAChC;AAAA,MACF;AACA,cAAQ,IAAI;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,MAAY,OAAwB;AAClD,QAAI,MAAM,QAAQ,MAAM,0CAA0C,EAAG,MAAK,YAAa,OAAO;AAC9F,QAAI,MAAM,QAAQ,MAAM,+BAA+B,EAAG,MAAK,YAAa,OAAO;AACnF,QAAI,MAAM,QAAQ,MAAM,YAAY,EAAG,MAAK,YAAa,YAAY;AACrE,QAAI,MAAM,QAAQ,MAAM,YAAY,EAAG,MAAK,YAAa,OAAO;AAChE,WAAO,EAAE,MAAM,YAAY,SAAS,CAAC,IAAI,GAAG,UAAU,IAAI,WAAW,IAAI,aAAa,EAAE,MAAM,KAAK,YAAa,KAAK,EAAE;AAAA,EACzH;AAAA,EAEQ,WAAW,MAAuB;AACxC,QAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,CAAC,EAAE,SAAS,QAAS,QAAO,KAAK,QAAQ,CAAC;AACxF,WAAO,EAAE,MAAM,SAAS,SAAS,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEQ,SAAS,OAAe,OAA+B;AAC7D,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,QAAI,MAAM,CAAC,EAAE,SAAS,aAAc,OAAM,MAAM;AAChD,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,QAAI,MAAM,CAAC,EAAE,SAAS,UAAU;AAC9B,YAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,CAAC;AAC/B,YAAM,CAAC,EAAE,UAAU,MAAM,CAAC,EAAE,QAAQ,OAAO,CAAC;AAC5C,YAAM,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,SAAS,KAAK;AACzC,UAAI,CAAC,MAAM,CAAC,EAAE,QAAS,OAAM,MAAM;AACnC,aAAO,KAAK,QAAQ,KAAK,KAAK;AAAA,IAChC;AACA,WAAO,KAAK,QAAQ,MAAM,MAAM,GAAI,KAAK;AAAA,EAC3C;AAAA,EAEQ,YAAY,MAAoB;AACtC,UAAM,MAAM,SAAS,IAAI;AACzB,QAAI,KAAK,QAAQ,gBAAgB,QAAS,OAAM,IAAI,iBAAiB,aAAa,KAAK,IAAI,IAAI,GAAG,EAAE;AAEpG,QAAI;AACJ,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,aAAK,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO;AACjC,YAAI,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AAC3B,eAAK,UAAU,IAAI,EAAE;AACrB,eAAK,IAAI,OAAO,KAAK,EAAE,OAAO,aAAa,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,OAAO,SAAS,IAAI,EAAE,CAAC;AAAA,QACnG;AACA;AAAA,MACF,KAAK;AACH,aAAK,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG;AAC7B,YAAI,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AAC3B,eAAK,UAAU,IAAI,EAAE;AACrB,eAAK,IAAI,OAAO,KAAK,EAAE,OAAO,aAAa,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO,SAAS,IAAI,EAAE,CAAC;AAAA,QACjH;AACA;AAAA,MACF;AACE,aAAK,IAAI,OAAO,KAAK,EAAE,OAAO,aAAa,KAAK,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,OAAO,SAAS,IAAI,EAAE,CAAC;AACnG;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,SAAS,UAAU,KAAK,KAAK,OAAO,KAAK;AAC9D,YAAQ,KAAK,QAAQ,aAAa;AAAA,MAChC,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,QAAQ,QAAQ,OAAO,EAAE;AAAA,MAClC,KAAK;AACH,eAAO,WAAW,OAAO;AAAA,MAC3B;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,KAAK,MAAc,KAAK,OAAO,MAAc;AACnD,QAAI,CAAC,QAAQ,CAAC,KAAM,QAAO,QAAQ;AACnC,WAAO,IAAO,GAAG,IAAO,IAAI,KAAQ,GAAG;AAAA,EACzC;AAAA,EAEQ,gBAAgB,MAAqB;AAC3C,UAAM,QAAQ,CAAC,UAAkB,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,GAAG;AAEhE,UAAM,QAAQ,CAAC,KAAe,SAAyB;AACrD,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,WAAW,IAAI,QAAQ,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,KAAK,QAAQ,CAAC,EAAE;AACpG,UAAI,MAAM,IAAI,OAAO,MAAM,QAAS,OAAM,IAAI,MAAM,aAAa,IAAI,QAAQ,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,KAAK,QAAQ,CAAC,EAAE;AAChI,aAAgB,IAAI,QAAQ,CAAC,EAAG;AAAA,IAClC;AAEA,QAAI,CAAC,KAAK,KAAM,OAAM,IAAI,MAAM,oBAAoB,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,KAAK,QAAQ,CAAC,EAAE;AAEvG,UAAM,UAAU,MAAM,KAAK,KAAK,CAAC,GAAG,MAAM;AAC1C,QAAI,MAAM,OAAO,MAAM,QAAS,OAAM,IAAI,MAAM,uBAAuB,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,KAAK,QAAQ,CAAC,EAAE;AAE1H,SAAK,YAAqB,QAAQ,CAAC,EAAG,OAAO,IAAI,KAAK,KAAK,CAAC;AAC5D,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,MAAc,MAAqB;AAC9C,UAAM,QAAQ,EAAE,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI;AACzC,QAAI,OAAO;AACX,aAAS,QAAQ,MAAM;AACrB,YAAM,SAAS,iBAAiB,GAAG,KAAK,IAAI,IAAI,GAAG;AACnD,cAAQ,OAAO,QAAQ;AAAA,QACrB,KAAK;AACH,kBAAQ;AACR;AAAA,QAEF,KAAK;AACH,iBAAO,IAAO,IAAI,IAAO,IAAI,KAAQ,IAAI;AAAA,QAE3C;AACE,kBAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,MAAM,MAAa,SAA0B;AACnD,UAAM,OAAO,aAAa,KAAK,OAAO,KAAK,KAAK;AAChD,QAAI,SAAS,iBAAiB;AAC5B,aAAO,KAAK,OAAO,CAAC,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,GAAG,OAAO,IAAI;AAAA,IAClE;AACA,QAAI,SAAS,UAAU;AACrB,YAAM,WAAW,KAAK,OAAO,CAAC,GAAG,WAAW,CAAC;AAC7C,YAAM,UAAU,SAAS,WAAW,KAAK,SAAS,CAAC,EAAE,SAAS,UAAU,SAAS,CAAC,EAAE,UAAU;AAC9F,YAAM,OAAO,QAAQ,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK;AACxE,YAAM,QAAQ,QAAQ,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI;AAClD,UAAI,OAAO,cAAc,KAAK,KAAK,SAAS,WAAY,EAAE,SAAS,SAAU,SAAS,QAAS;AAC7F,eAAO,OAAO,cAAc,KAAK;AAAA,MACnC;AACA,aAAO,KAAK,YAAY,IAAI;AAAA,IAC9B;AAEA,UAAM,OAAO,cAAc,SAAS,IAAI,GAAG,IAAI;AAC/C,QAAI,KAAM,QAAO;AAEjB,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,gBAAgB,IAAI;AAAA;AAAA,MAGlC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO;AAAA;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ;AACjC,cAAI,SAAS,KAAK,IAAI,EAAE,MAAM,eAAe,EAAG,QAAO;AACvD,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,KAAM,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,cAAc,OAAK,GAAG,CAAC,QAAQ;AAAA;AAAA,MAGzG,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,KAAM,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE;AAAA,MAEhE,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,MAAM;AACb,gBAAM,KAAK,KAAK,CAAC;AACjB,kBAAQ,KAAK,KAAK,KAAK,YAAY,QAAQ,IAAI,CAAC;AAAA,QAClD;AACA,eAAO,KAAK,QAAQ,YAAY,QAC5B,wBAAwB,KAAK,UAAU,KAAM,EAAE,GAAG,SAAS,eAAe,KAAK,CAAC,CAAC,YACjF,YAAY,KAAK,UAAU,KAAM,EAAE,GAAG,SAAS,eAAe,KAAK,CAAC,CAAC,KAAK,KAAK,UAAU,OAAQ,EAAE,GAAG,SAAS,eAAe,KAAK,CAAC,CAAC;AAAA,MAE3I,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA;AAAA,MAGT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO;AAAA,MAE9C,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,KAAK;AAAA,MAEhE,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,KAAK;AAAA,MAEhE,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,EAAE,GAAG,SAAS,eAAe,KAAK,CAAC,GAAG,MAAM,KAAK,WAAW,QAAQ,SAAS,OAAO;AAAA,MAErI,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ,UAAU,IAAI,GAAG;AAAA,UACvB,KAAK;AACH,mBAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,KAAK,YAAY,MAAM,QAAQ,KAAK;AAAA,UAC/F;AACE,mBAAO,KAAK;AAAA,QAChB;AAAA,MAEF,KAAK;AACH,eAAO,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,KAAK,KAAK;AAAA,MAE/E,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,SAAS;AAAA,MAEpE,KAAK;AACH,eAAO,QAAQ,SAAS,aAAa,KAAK,KAAK;AAAA,MAEjD,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO,QAAQ,SAAS,aAAa,KAAK,IAAI;AAAA,MAEhD,KAAK;AACH,eAAO,QAAQ,SAAS,aAAa,KAAK,KAAK;AAAA,MAEjD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,IAAI,KAAK,QAAQ,MAAM,KAAK,EAAE,MAAM,EAAE;AAAA,MAEjG,KAAK;AACH,cAAM,KAAK,KAAM,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC;AACpD,YAAI,IAAI,WAAW,GAAG;AACpB,gBAAM,WAAW,iBAAiB,SAAS,IAAI,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;AAC5E,cAAI,SAAU,QAAO,OAAO,aAAa,WAAW,WAAY,SAAS,QAAQ,SAAS;AAAA,QAC5F;AACA,eAAO,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,MAE/E,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEH,eAAO,KAAK,KAAK,KAAK,UAAU,KAAK,KAAM,CAAC,GAAG,OAAO,GAAG,OAAO,QAAQ,SAAS,OAAO;AAAA,MAE1F;AACE,YAAI,KAAK,YAAY,KAAK,OAAO,EAAG,QAAO,KAAK,UAAU,KAAK,YAAY,KAAK,OAAO,GAAG,OAAO;AACjG,eAAO,KAAK,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,KAAK,MAAY;AACvB,QAAI,CAAC,KAAM,QAAO;AAElB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,SAAkB,KAAK,YAAa,QAAQ,MAAM,IAAI,KAAK,OAAO;AAAA,MAC3E,KAAK;AACH,eAAO,OAAO,KAAK,GAAG;AAAA,MACxB;AACE,eAAO,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EACQ,YAAY,MAAmB,SAAkB;AACvD,WAAO,KAAK,QAAQ,UAAU,KAAK,KAAK,KAAK,QAAQ,CAAC,CAAC,EAAE,MAAM,sCAAsC,EAAG,MAAK,QAAQ,MAAM;AAC3H,WAAO,KAAK,QAAQ,UAAU,KAAK,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,CAAC,EAAE,MAAM,sCAAsC,EAAG,MAAK,QAAQ,IAAI;AAE/I,YAAQ,KAAK,KAAK;AAAA,MAChB,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,cAAc,QAAQ,SAAS,UAAU;AAAA,MAExH,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,SAAS,UAAU;AAAA,MAEhH,KAAK;AACH,eAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,QAAQ,SAAS,UAAU;AAAA,MAE/G;AACE,eAAO,KAAK,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAuB,SAA0B;AACjE,QAAI,UAAU,KAAK,iBAAiB,MAAM,OAAO;AACjD,QAAI,WAAW,KAAK,aAAa;AAC/B,UAAI,KAAK,YAAa,KAAM,WAAU,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC;AACnE,UAAI,KAAK,YAAa,KAAM,WAAU,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC;AACnE,UAAI,KAAK,YAAa,UAAW,WAAU,GAAG,KAAK,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE;AAC1E,UAAI,KAAK,YAAa,KAAM,WAAU,GAAG,KAAK,IAAI,GAAG,OAAO,GAAG,MAAM,IAAI;AACzE,UAAI,KAAK,WAAW,KAAK,YAAa,eAAe,CAAC,QAAQ,cAAe,WAAU,GAAG,KAAK,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE;AAAA,IACxH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAuB,SAA0B;AACxE,QAAI,CAAC,KAAM,QAAO;AAElB,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,QAAQ,IAAI,OAAK,KAAK,UAAU,GAAG,OAAO,CAAC,EAAE,KAAK,EAAE;AAAA,MAElE,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK;AAAA,MAEd,KAAK;AACH,eAAO,KAAK,MAAM,MAAM,OAAO;AAAA,MAEjC,KAAK;AACH,eAAO,QAAQ,SAAS,aAAa,KAAK,IAAI;AAAA,MAEhD,KAAK;AACH,eAAO,KAAK,YAAa,SAAS,SAAS,KAAK;AAAA,MAElD,KAAK;AACH,eAAO;AAAA,MAET,KAAK;AACH,eAAO,KAAK,YAAY,MAAM,OAAO;AAAA,MAEvC,KAAK;AACH,eAAO,KAAK;AAAA,MAEd;AACE,eAAO,KAAK,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,QAAQ,MAAM;AACpB,QAAI,KAAK,SAAS,aAAc,QAAO;AACvC,QAAI,KAAK,SAAS,QAAS,QAAO;AAClC,QAAI,CAAC,KAAK,QAAQ,OAAQ,QAAO;AACjC,WAAQ,KAAK,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnC;AAAA,EAEQ,KAAK,OAA0B;AACrC,QAAI,KAAK,sBAAsB,KAAK,aAAW,MAAM,MAAM,OAAO,CAAC,EAAG,QAAO;AAE7E,QAAI,OAAkB;AACtB,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC/D,UAAI,OAAO,KAAK,WAAS,OAAO,UAAU,WAAW,UAAU,QAAQ,MAAM,MAAM,KAAK,CAAC,EAAG,QAAmB;AAAA,IACjH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,SAAyB;AAC/C,QAAI,SAAS;AACb,QAAI,UAAU;AACd,eAAW,aAAa,QAAQ,YAAY,GAAG;AAC7C,YAAM,UAAU,UAAU,QAAQ,uBAAuB,MAAM;AAC/D,UAAI,SAAS;AACX,kBAAU;AACV,kBAAU;AAAA,MACZ,WACS,cAAc,MAAM;AAC3B,kBAAU;AAAA,MACZ,WACS,cAAc,KAAK;AAC1B,kBAAU;AAAA,MACZ,WACS,cAAc,KAAK;AAC1B,kBAAU;AAAA,MACZ,OACK;AACH,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,WAAO,IAAI,OAAO,GAAG,MAAM,KAAK,IAAI;AAAA,EACtC;AAAA,EAEQ,cAAc,GAAmB;AACvC,QAAI,CAAC,EAAE,SAAS,GAAM,EAAG,QAAO;AAEhC,UAAM,WAAqB,CAAC,EAAE,QAAQ,oBAAoB,EAAE,CAAC;AAC7D,WAAO,SAAS,CAAC,MAAM,SAAS,CAAC,GAAG;AAClC,eAAS,QAAQ,SAAS,CAAC,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,IACzD;AAEA,WAAO,SAAS,CAAC,EACd,QAAQ,wBAAwB,KAAW,EAC3C,QAAQ,0BAA0B,MAAY,EAC9C,QAAQ,qBAAqB,QAAQ,EAAE,QAAQ,uBAAuB,QAAQ,EAC9E,QAAQ,gBAAgB,yCAAyC,EAAE,QAAQ,kBAAkB,SAAS,EACtG,QAAQ,gBAAgB,uBAAuB,EAAE,QAAQ,kBAAkB,SAAS,EACpF,QAAQ,UAAU,GAAG,EAAE,QAAQ,UAAU,GAAG;AAAA,EACjD;AAAA,EAEQ,YAAY,OAAe,OAAe,MAAc,SAA0B;AACxF,QAAI,UAAU,WAAY,QAAO;AAEjC,QAAI,YAAY,SAAS,SAAS,KAAK,KAAK,MAAM,KAAK,EAAE,MAAM,SAAS,EAAG,QAAO,GAAG,SAAS,KAAK,CAAC;AAEpG,QAAI,KAAK,WAAW,SAAS,SAAS;AACpC,cAAQ,eAAe,OAAO;AAAA,QAC5B,gBAAgB,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAAa;AAAA,QACvE,2BAA2B,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAAa;AAAA,QAClF,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAED,UAAI,SAAS,CAAC,QAAgB,aAAqB;AACnD,cAAQ,KAAK,QAAQ,gBAAgB;AAAA,QACnC,KAAK;AACH,mBAAS,CAAC,OAAe,cAAsB;AAC/C;AAAA,QACF,KAAK;AACH,mBAAS,CAAC,OAAe,aAAqB;AAC5C,kBAAM,QAAiB,SAAS,UAAU,uBAAuB;AACjE,mBAAO,MAAM,KAAK,OAAK,EAAE,MAAM,MAAM,gBAAgB,CAAC,IAAI,QAAQ,KAAK,KAAK,UAAU,KAAK;AAAA,UAC7F;AACA;AAAA,MACJ;AAEA,aAAO,MAAM,QAAQ,iCAAiC,MAAM;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB,KAA+D;AAC3F,UAAM,SAA6D;AAAA,MACjE,OAAO,CAAC;AAAA,IACV;AAEA,QAAI,CAAC,IAAI,QAAQ,KAAK,UAAQ,KAAK,SAAS,YAAY,KAAK,YAAY,GAAG,EAAG,QAAO;AAEtF,WAAO,QAAQ,KAAK,MAAM,KAAK,OAAO,KAAK;AAC3C,WAAO,WAAW,CAAC;AACnB,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG,SAAS,eAAe,IAAI;AAC3D,UAAI,YAAY,KAAK,QAClB,MAAM,OAAO,QAAQ,CAAC,EACtB,IAAI,CAAC,MAAM,MAAM,KAAK,YAAa,SAAS,UAAU,KAAK,SAAS,WAAW,KAAK,QAAQ,QAAQ,IAAI,IAAI,WAAW,YAAY,GAAG,IAAI,GAAG,EAC7I,KAAK,EAAE;AACV,UAAI,UAAU,MAAM,qBAAqB,GAAG;AAC1C,oBAAY,UAAU,QAAQ,OAAO,EAAE,EAAE,YAAY;AACrD,eAAO,SAAS,SAAS,IAAI,EAAE,MAAM,QAAQ,SAAS,KAAK,QAAQ,MAAM,UAAU,SAAS,GAAG,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE;AAAA,MAC5H,OACK;AACH,eAAO,OAAO;AACd;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,MAAM,OAAc,OAAe,OAAe;AACxD,UAAM,OAAkB,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AAC3D,UAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,WAAW;AAAA;AAAA,IACb;AAEA,UAAM,MAAY,eAAe,MAAM,KAAK;AAE5C,QAAI,KAAK,QAAQ,kBAAmB,SAAS,KAAK,KAAK,IAAI,QAAQ,WAAW,KAAK,IAAI,QAAQ,CAAC,EAAE,SAAS,SAAS;AAClH,UAAI,UAAU,IAAI,QAAQ,CAAC,EAAE;AAAA,IAC/B;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,OAAO,KAAK,IAAI,SAAS,GAAG;AAClC;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,SAAS,SAAS;AACpC,UAAI,OAAO,CAAC,GAAG,IAAI,OAAO;AAC1B,aAAO,KAAK,QAAQ;AAClB,cAAM,OAAO,KAAK,MAAM;AAGxB,YAAI,KAAK,QAAQ,IAAI,EAAG,MAAK,cAAc,EAAE,MAAM,KAAK;AAGxD,YAAI,KAAK,SAAS,cAAe,QAAO,CAAC,GAAG,MAAM,GAAG,KAAK,OAAO;AAAA,MACnE;AAAA,IACF;AAGA,UAAM,KAAK,CAAC,MAAM,SAAS;AACzB,UAAI,CAAC,KAAK,YAAa,MAAK,cAAc,CAAC;AAE3C,WAAK,YAAa,OAAO,KAAK,QAAQ,aAAa,SAAS;AAI5D,UAAI,SAAS,WAAW,KAAK,SAAS,gBAAgB,CAAC,KAAK,QAAQ,KAAK,OAAK,EAAE,YAAa,WAAW,EAAG,MAAK,YAAa,cAAc;AAE3I,UAAI,CAAC,KAAK,QAAQ,YAAY;AAC5B,YAAI,SAAS,WAAW,KAAK,YAAa,SAAS,KAAK,SAAS,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,UAAU;AAC7G,eAAK,YAAa,cAAc;AAChC,cAAI,KAAK,SAAS,SAAS;AACzB,2BAAe,UAAU;AACzB,2BAAe,aAAa;AAAA,UAC9B;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,WAAW,OAAO,KAAK,gBAAgB,SAAU,MAAK,cAAc;AAEtF,YAAI,KAAK,SAAS,iBAAiB,KAAK,QAAQ,KAAM,MAAK,YAAa,OAAO;AAAA,MACjF;AAAA,IACF,CAAC;AAED,QAAI,KAAK,QAAQ,KAAK;AACpB,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,gBAAM,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,eAAe,EAC5D,IAAI,QAAM;AACT,kBAAM,EAAE,OAAO,SAAS,IAAI,KAAK,sBAAsB,EAAE;AACzD,gBAAI,MAAM,WAAW,KAAK,CAAC,UAAU;AACnC,qBAAO,KAAK,YAAY,EAAE,UAAU,SAAS,MAAM,CAAC,CAAC,GAAG,WAAW,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC;AAAA,YACzF;AAEA,gBAAI,CAAC,MAAM,QAAQ;AACjB,oBAAM,YAAY,KAAK,MAAM,KAAK,MAAM,KAAK;AAC7C,kBAAI,UAAU,WAAW,GAAG;AAC1B,uBAAO,KAAK,YAAY;AAAA,kBACtB,UAAU,SAAS,UAAU,CAAC,CAAC;AAAA,kBAC/B,WAAW,SAAS,UAAU,CAAC,CAAC;AAAA,gBAClC,CAAC;AAAA,cACH;AAAA,YACF;AAEA,mBAAO,EAAE,MAAM,SAAS,EAAE,EAAE;AAAA,UAC9B,CAAC;AACH;AAAA,QACF,KAAK;AACH,gBAAM,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,eAAe,EAC5D,IAAI,SAAO,SAAS,GAAG,CAAC;AAC3B;AAAA,QACF;AACE,gBAAM,OAAO,KAAK,IAAI,SAAS,GAAG;AAClC;AAAA,MACJ;AAAA,IACF;AAGA,UAAM,KAAK,CAAC,OAAO,SAAS;AAC1B,YAAM,YAAoB,CAAC;AAC3B,UAAI,OAAO;AACX,aAAO,MAAM,QAAQ;AACnB,cAAM,iBAAiB,KAAK,SAAS,KAAK;AAC1C,YAAI,gBAAgB;AAClB,oBAAU,KAAK,cAAc;AAC7B;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,MAAM;AAEzB,YAAI,KAAK,SAAS,WAAW,KAAK,YAAY,aAAa;AACzD,kBAAQ;AACR;AAAA,QACF,WACS,KAAK,SAAS,WAAW,KAAK,YAAY,QAAQ;AACzD;AAAA,QACF,WACS,KAAK,SAAS,WAAW,KAAK,YAAY,MAAM;AACvD,iBAAO,KAAK,IAAI,OAAO,GAAG,CAAC;AAC3B;AAAA,QACF,WACS,MAAM;AACb;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,SAAS,UACxB,WAAW,KAAK,OAAO,KAAK,WAAW,GAAG,KAAK,QAAQ,aAAa,SAAS,MAAM,IAAK,KAAK,OAAO,EAAE,IACtG;AACJ,YAAI,KAAK,SAAS,WAAW,OAAO;AAClC,gBAAM,OAAO,MAAM,KAAK,EAAE,KAAK,MAAS,EAAE,IAAI,QAAM,KAAK,SAAS,OAAe,IAAI,CAAC,EAAE,OAAO,CAAC,QAAyB,QAAQ,IAAI;AACrI,eAAK,OAAO;AACZ,cAAI,KAAK,QAAQ,MAAM,cAAc,KAAK,KAAK,QAAQ;AACrD,gBAAI,MAAc,KAAK,CAAC,EAAE;AAC1B,gBAAI,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,SAAS,QAAS,OAAM,IAAI,CAAC,EAAE;AAC9D,iBAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,MAAM,UAAU,SAAS,SAAS,GAAG,GAAG,aAAa,EAAE,MAAM,IAAI,CAAC,EAAE,YAAa,KAAK,EAAE,GAAG,IAAI;AAAA,UAC1H;AACA,yBAAe,aAAa,KAAK,OAAO,SAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,WAAW,IAAI,QAAQ,CAAC,EAAE,YAAa,WAAW,EAAE;AAAA,QAC7H,WACS,KAAK,SAAS,WAAW,KAAK,QAAQ,MAAM,WAAW,KAAK,MAAM,CAAC,GAAG,SAAS,cAAc;AACpG,gBAAM,MAAM;AAAA,QACd;AAEA,kBAAU,KAAK,IAAI;AAAA,MACrB;AAEA,UAAI,CAAC,KAAK,QAAQ,YAAY;AAE5B,mBAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,aAAa,IAAI,OAAO,CAAC,GAAG;AAC7H,cAAI,KAAK,QAAQ,KAAK,OAAK,EAAE,cAAc,MAAM,CAAC,EAAG;AAErD,oBAAU,QAAQ,CAAC,aAAa,MAAM;AACpC,gBAAI,YAAY,SAAS,WAAW,YAAY,YAAY,OAAO;AACjE,wBAAU,MAAM,IAAI,CAAC,EAAE,QAAQ,OAAK,EAAE,YAAa,MAAM,IAAI,IAAI;AAAA,YACnE;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,KAAK,GAAG,SAAS;AAAA,IACzB,GAAG,EAAE,MAAM,MAAM,SAAS,eAAe,KAAK,CAAC;AAE/C,gBAAY,KAAK,CAAC,MAAM,UAAU;AAChC,UAAI,KAAK,SAAS,QAAS;AAE3B,UAAI,KAAK,eAAe,UAAU,UAAU,KAAK,OAAO,GAAG;AACzD,YAAI;AAEJ,YAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,CAAC,EAAE,QAAQ,WAAW,GAAG;AAC7E,gBAAM,EAAE,MAAM,UAAU,SAAS,KAAK,aAAa,CAAC,EAAE;AAAA,QACxD,WACS,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,CAAC,EAAE,QAAQ,WAAW,GAAG;AACpE;AAAA,QACF,OACK;AACH,gBAAM,KAAK,KAAK,CAAC,EAAE,QAAQ,CAAC;AAAA,QAC9B;AAEA,YAAI,IAAI,SAAS,SAAS;AACxB,kBAAQ,IAAI,QAAQ,QAAQ;AAAA,YAC1B,KAAK;AACH,oBAAM,EAAE,MAAM,UAAU,SAAS,KAAK,aAAa,CAAC,EAAE;AACtD;AAAA,YACF,KAAK;AACH,oBAAM,IAAI,QAAQ,CAAC;AACnB;AAAA,YACF;AACE;AAAA,UACJ;AAAA,QACF;AAEA,gBAAQ,IAAI,MAAM;AAAA,UAChB,KAAK;AAAA,UACL,KAAK;AACH,mBAAO,EAAE,MAAM,UAAU,SAAS,GAAG,IAAI,OAAO,GAAG,UAAU,UAAU,KAAK,OAAO,CAAC,IAAI,aAAa,CAAC,EAAE;AAAA,UAC1G,KAAK;AAKH,gBAAI,IAAI,eAAe,aAAa,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,MAAM,QAAQ;AAC1E,oBAAM,UAAU,GAAG,IAAI,WAAW,GAAG,IAAI,OAAO;AAChD,kBAAI,EAAE,WAAW,mBAAmB;AAClC,uBAAO,EAAE,MAAM,UAAU,SAAS,GAAG,IAAI,OAAO,GAAG,UAAU,UAAU,KAAK,OAAO,CAAC,IAAI,aAAa,CAAC,EAAE;AAAA,cAC1G;AAAA,YACF;AACA;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF;AAEA,UAAI,QAAQ,GAAG,KAAK,WAAW,GAAG,KAAK,OAAO;AAC9C,gBAAU,KAAK,QAAQ,CAAC,GAAG,IAAI,SAAO,SAAS,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;AAC7E,UAAI,SAAS,iBAAkB,QAAO,EAAE,MAAM,UAAU,SAAS,cAAc,OAAO,IAAI,GAAG,aAAa,CAAC,EAAE;AAAA,IAE/G,CAAC;AAED,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAM,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,eAAe,EAC5D,IAAI,QAAM,KAAK,aAAa,EAAE,CAAC,EAC/B,OAAO,QAAM,OAAO,KAAK,EAAE,EAAE,MAAM;AACtC;AAAA,MACF,KAAK;AACH,cAAM,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,eAAe,EAC5D,IAAI,SAAO,KAAK,UAAU,KAAK,EAAE,MAAM,UAAU,CAAC,EAAE,KAAK,CAAC;AAC7D;AAAA,MACF;AACE,cAAM,OAAO,KAAK,IAAI,KAAK;AAAA,UACzB;AAAA,UACA,KAAK,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,UAC5B;AAAA,UACA,CAAC,EAAE,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAAa;AAAA;AAAA,QAC5D;AACA;AAAA,IACJ;AAGA,UAAM,OAAO,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,MAAM,OAAO,KAAK,GAAG,CAAC,GAAG,MAAO,OAAO,MAAM,WAAW,KAAK,cAAc,CAAC,IAAI,CAAY,CAAC;AAAA,EAC/I;AAAA,EAEQ,MAAM,UAAmB,CAAC,GAAG;AACnC,QAAI,QAAQ,iBAAiB,OAAO;AAClC,gBAAU;AAAA,QACR,GAAG;AAAA,QACH,SAAS,CAAC;AAAA,QACV,cAAc;AAAA,UACZ,OAAO;AAAA,UACP,aAAa;AAAA,UACb,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,UAAU,MAAM,SAAS;AAAA,MAC5B,gBAAgB;AAAA,MAChB,eAAe,QAAQ,iBAAiB;AAAA,MACxC,WAAW,CAAC;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAED,QAAI,KAAK,QAAQ,mBAAmB,KAAM,MAAK,QAAQ,iBAAiB;AAExE,SAAK,yBAAyB,KAAK,QAAQ,kBAAkB,CAAC,GAAG,IAAI,aAAW;AAC9E,UAAI,OAAO,YAAY,SAAU,OAAM,IAAI,UAAU,6CAA6C;AAClG,aAAO,KAAK,gBAAgB,OAAO;AAAA,IACrC,CAAC;AAED,UAAM,UAAU,KAAK,QAAQ,WAAW;AACxC,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,KAAK,YAAU,OAAO,WAAW,QAAQ,GAAG;AACjF,YAAM,IAAI,UAAU,kDAAkD;AAAA,IACxE;AACA,SAAK,QAAQ,UAAU,QAAQ,IAAI,YAAU,OAAO,YAAY,CAAC;AAEjE,SAAK,YAAY,OAAO,QAAQ,SAAS,EAAE,OAAO,CAAC,KAAuB,CAAC,MAAM,IAAI,MAAqC;AACxH,YAAM,UAAU,KAAK,OAAO,wBAAsB,OAAO,uBAAuB,YAAY,CAAC,KAAK,QAAQ,UAAW,kBAAkB,CAAC;AACxI,YAAM,UAAU,KAAK,OAAO,wBAAsB,OAAO,uBAAuB,QAAQ;AACxF,UAAI,IAAI,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO;AACnC,aAAO;AAAA,IACT,GAAsB,CAAC,CAAC;AACxB,eAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,QAAQ,SAAU,GAAG;AACnE,WAAK,UAAU,IAAI,EAAE,QAAQ,KAAK;AAAA,IACpC;AAEA,QAAI,CAAC,KAAK,QAAQ,mBAAmB;AACnC,WAAK,QAAQ,oBAAoB;AAAA,QAC/B,GAAG,YAAY;AAAA,QACf,GAAG,KAAK,UAAU;AAAA,QAClB,GAAG,KAAK,UAAU;AAAA,MACpB,EAAE,OAAO,WAAS,OAAO,UAAU,QAAQ;AAAA,IAC7C;AAEA,QAAI,QAAQ,gBAAgB,UAAa,CAAC,CAAC,OAAO,QAAQ,UAAU,OAAO,EAAE,SAAS,QAAQ,WAAW,GAAG;AAC1G,YAAM,IAAI,UAAU,iDAAiD;AAAA,IACvE;AAEA,SAAK,MAAM;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,QAAQ,IAAI,OAAO,eAAe;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,QAAQ,UAAwB;AACtC,QAAI,UAAkB,SAAS,OAAO,UAAU,SAAS,OAAO,eAAe,IAAI,YAAY;AAC/F,QAAI,CAAC,UAAU,KAAK,QAAQ,oBAAoB,SAAS,OAAO,SAAU,UAAS,SAAS,OAAO,SAAS,YAAY;AACxH,SAAK,UAAsB,KAAK,QAAQ,QAAS,SAAS,MAAM;AAEhE,UAAM,QAAe,KAAK,UAAU;AAAA,MAClC,MAAM,SAAS;AAAA,MACf,KAAK,SAAS;AAAA,MACd,QAAQ,CAAC;AAAA,MACT,MAAM,CAAC;AAAA,MACP,OAAO,SAAS;AAAA,IAClB;AACA,QAAI,WAAqB,CAAC;AAC1B,QAAI;AACF,eAAS,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC1D,YAAI,CAAC,MAAM,KAAK,EAAG;AAUnB,YAAI,MAAM,MAAM,+BAA+B,EAAG,SAAQ;AAE1D,aAAK,MAAM,OAAO,OAAO,KAAK;AAE9B,YAAI,UAAU,YAAY;AACxB,qBAAW,CAAC,GAAG,UAAU,GAAI,MAAM,OAAO,SAA+B,MAAM,YAAY,CAAC,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,CAAC;AACxI,iBAAO,MAAM,OAAO;AAAA,QACtB;AAEA,YAAI,CAAC,KAAK,QAAQ,OAAO,OAAO,MAAM,OAAO,KAAK,MAAM,UAAU;AAChE,gBAAM,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK,EAAE,KAAK;AAC/C,cAAI,UAAU,QAAS,OAAM,OAAO,KAAK,IAAI,MAAM,MAAM,OAAO,KAAK,EAAE,YAAY,CAAC,KAAK,MAAM,OAAO,KAAK;AAAA,QAC7G;AAAA,MACF;AAEA,UAAI,SAAS,QAAQ;AACnB,cAAM,OAAO,WAAW;AACxB,cAAM,KAAK,WAAW;AAAA,MACxB;AAEA,WAAK,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC7B,SACO,KAAK;AACV,UAAI,eAAe,iBAAkB,OAAM;AAC3C,WAAK,IAAI,OAAO,KAAK,EAAE,OAAO,GAAG,IAAI,OAAO;AAAA,EAAK,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,CAAC;AAAA,IACtF;AAAA,EACF;AAAA,EAEQ,QAAQ,KAAa;AAC3B,UAAM,QAAe,EAAE,KAAK,IAAI,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAG,OAAO,IAAI;AAC3E,UAAM,UAAU,KAAK;AACrB,SAAK,UAAU;AACf,SAAK,MAAM,OAAO,OAAO,GAAG;AAC5B,SAAK,UAAU;AACf,WAAO,MAAM,OAAO;AAAA,EACtB;AAAA,EAEQ,KAAK,MAAsB;AACjC,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,aAAK,QAAQ,QAAQ;AAAA,MACvB,SACO,KAAK;AACV,YAAI,eAAe,iBAAkB,OAAM;AAAA,MAC7C;AAAA,IACF;AACA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACjD,WAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,SAAS,MAAsB;AACrC,QAAI,KAAK,QAAQ,eAAe;AAC9B,YAAM,UAA0C,CAAC;AACjD,iBAAW,SAAS,KAAK,IAAI,SAAS;AACpC,YAAI,MAAM,IAAK,SAAQ,MAAM,IAAI,YAAY,CAAC,IAAI;AAAA,MACpD;AAEA,YAAM,QAAkB,CAAC;AACzB,iBAAW,SAAS,KAAK,IAAI,SAAS;AACpC,YAAI,CAAC,MAAM,OAAO,OAAO,MAAM,OAAO,aAAa,SAAU;AAE7D,cAAM,WAAW,MAAM,OAAO,SAAS,YAAY;AACnD,YAAI,CAAC,QAAQ,QAAQ,EAAG;AAExB,cAAM,MAAM,MAAM,IAAI,YAAY;AAMlC,YAAI,CAAC,MAAM,SAAS,QAAQ,EAAG,OAAM,QAAQ,QAAQ;AACrD,YAAI,CAAC,MAAM,SAAS,GAAG,EAAG,OAAM,KAAK,GAAG;AAAA,MAC1C;AAEA,iBAAW,OAAO,OAAO;AACvB,cAAM,QAAQ,QAAQ,IAAI,YAAY,CAAC;AACvC,cAAM,SAAS,QAAQ,MAAM,OAAO,UAAU,YAAY,CAAC;AAC3D,YAAI,CAAC,OAAQ;AAEb,mBAAW,YAAY,CAAC,SAAS,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,OAAO,OAAK,CAAC,GAAG;AAC3E,qBAAW,WAAW,CAAC,SAAS,OAAO,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,OAAO,OAAK,CAAC,GAAG;AAC3E,uBAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC/D,kBAAI,CAAC,MAAM,OAAO,UAAU,KAAK,OAAO,OAAO,WAAW,GAAG;AAC3D,sBAAM,OAAO,UAAU,IAAI,OAAO,OAAO,WAAW;AAEpD,sBAAM,aAAN,MAAM,WAAa,CAAC;AACpB,sBAAM,SAAS,UAAU,IAAI,EAAE,QAAQ,OAAO,KAAK,OAAO,YAAY;AAAA,cACxE;AAAA,YACF;AAEA,uBAAW,SAAU,QAAQ,MAAM,IAAI,KAAK,CAAC,GAAI;AAC/C,kBAAI,WAAW,SAAS,KAAK,EAAG;AAEhC,kBAAI,CAAC,MAAM,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,GAAG;AAChD,sBAAM,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK;AAEzC,sBAAM,aAAN,MAAM,WAAa,CAAC;AACpB,sBAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,OAAO,KAAK,MAAM;AAAA,cACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ;AACvD,SAAK,IAAI,WAAW;AACpB,SAAK,IAAI,SAAS;AAElB,SAAK,IAAI,YAAY,KAAK;AAC1B,SAAK,IAAI,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,MAAM;AAAA,EACvD;AAAA,EAEO,MAAM,OAAe,UAAmB,CAAC,GAAY;AAC1D,SAAK,MAAM,OAAO;AAElB,UAAM,OAAO,OAAO,MAAM,OAAO,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAE7D,SAAK,KAAK,IAAI;AAEd,eAAW,SAAS,KAAK,SAAS;AAChC,WAAK,QAAQ,KAAK;AAAA,IACpB;AAEA,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,WAAW,OAAe,UAAmB,CAAC,GAAqB;AAC9E,SAAK,MAAM,OAAO;AAElB,UAAM,OAAO,MAAM,OAAO,SAAS,MAAM,OAAO,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAE5E,SAAK,KAAK,IAAI;AAEd,QAAI,IAAI;AACR,eAAW,SAAS,KAAK,SAAS;AAChC,WAAK,QAAQ,KAAK;AAClB,UAAK,MAAM,QAAU,EAAG,OAAM,SAAS;AAAA,IACzC;AAEA,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AACF;AAYO,SAASC,OAAM,OAAe,UAAmB,CAAC,GAAY;AACnE,QAAM,SAAS,IAAI,aAAa;AAChC,SAAO,OAAO,MAAM,OAAO,OAAO;AACpC;AAGA,eAAsB,WAAW,OAAe,UAAmB,CAAC,GAAqB;AACvF,QAAM,SAAS,IAAI,aAAa;AAChC,SAAO,MAAM,OAAO,WAAW,OAAO,OAAO;AAC/C;",
6
6
  "names": ["toSentenceCase", "tokenize", "parse"]
7
7
  }
@@ -130,8 +130,8 @@ export type AnnotationFields = Partial<Record<`${string}+an${string}`, Annotatio
130
130
  export type TypedFields = CreatorFields & ArrayFields & AnnotationFields & {
131
131
  options?: OptionMap;
132
132
  };
133
- /** Normalized fields with precise types for field names handled by the default parser modes. */
134
- export type Fields = TypedFields & Omit<Record<string, FieldValue>, keyof TypedFields>;
133
+ /** Named structured fields retain their precise types; unlisted default fields are scalar text. */
134
+ export type Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>;
135
135
  /** A normalized BibTeX entry returned by the parser. */
136
136
  export interface Entry {
137
137
  /** Entry type from the source, such as `article` or `inproceedings`. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retorquere/bibtex-parser",
3
- "version": "13.0.7",
3
+ "version": "13.0.8",
4
4
  "description": "BibTeX parser",
5
5
  "type": "module",
6
6
  "module": "./dist/wasm/index.js",
@@ -28,6 +28,7 @@
28
28
  "build:types": "tsc --emitDeclarationOnly -d -p js/tsconfig.esm.json",
29
29
  "build:ts": "npm run build:esm && npm run build:types",
30
30
  "build:wasm": "node rust/build-wasm.mjs",
31
+ "bench": "npm run build:ts && npm run build:wasm && node test/parser-benchmark.mjs",
31
32
  "prebuild": "rm -rf dist && mkdir -p dist/data && cp data/*.json dist/data && ./build/abbr.py && ./build/prepositions.py",
32
33
  "build": "npm run build:wasm",
33
34
  "prebuild:all": "npm run prebuild",
@@ -65,6 +66,7 @@
65
66
  "devDependencies": {
66
67
  "@types/node": "^26.6.6",
67
68
  "@unified-latex/unified-latex-types": "^1.8.4",
69
+ "benchmark": "^2.1.4",
68
70
  "command-line-args": "^6.0.2",
69
71
  "csv": "^6.6.4",
70
72
  "digital-tree": "^2.0.4",