@retorquere/bibtex-parser 9.0.26 → 10.0.0

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.
Files changed (47) hide show
  1. package/dist/cjs/crossref.js +3 -11
  2. package/dist/cjs/crossref.js.map +2 -2
  3. package/dist/cjs/fields.js +227 -2
  4. package/dist/cjs/fields.js.map +2 -2
  5. package/dist/cjs/index.js +34 -40
  6. package/dist/cjs/index.js.map +3 -3
  7. package/dist/cjs/jabref.js +1 -1
  8. package/dist/cjs/jabref.js.map +2 -2
  9. package/dist/cjs/sentence-case.js.map +2 -2
  10. package/dist/cjs/tokenizer.js +5 -5
  11. package/dist/cjs/tokenizer.js.map +2 -2
  12. package/dist/cjs/verbatim.js.map +2 -2
  13. package/dist/data/crossref.json +1 -9
  14. package/dist/data/fields.json +7144 -6918
  15. package/dist/esm/crossref.js +3 -11
  16. package/dist/esm/crossref.js.map +2 -2
  17. package/dist/esm/fields.js +227 -2
  18. package/dist/esm/fields.js.map +2 -2
  19. package/dist/esm/index.js +31 -38
  20. package/dist/esm/index.js.map +2 -2
  21. package/dist/esm/jabref.js +1 -1
  22. package/dist/esm/jabref.js.map +2 -2
  23. package/dist/esm/sentence-case.js.map +2 -2
  24. package/dist/esm/tokenizer.js +5 -5
  25. package/dist/esm/tokenizer.js.map +2 -2
  26. package/dist/esm/verbatim.js.map +2 -2
  27. package/package.json +22 -20
  28. package/dist/types/crossref.d.ts +0 -188
  29. package/dist/types/crossref.d.ts.map +0 -1
  30. package/dist/types/fields.d.ts +0 -55
  31. package/dist/types/fields.d.ts.map +0 -1
  32. package/dist/types/index.d.ts +0 -194
  33. package/dist/types/index.d.ts.map +0 -1
  34. package/dist/types/jabref.d.ts +0 -58
  35. package/dist/types/jabref.d.ts.map +0 -1
  36. package/dist/types/merge.d.ts +0 -2
  37. package/dist/types/merge.d.ts.map +0 -1
  38. package/dist/types/prepositions.d.ts +0 -3
  39. package/dist/types/prepositions.d.ts.map +0 -1
  40. package/dist/types/sentence-case.d.ts +0 -9
  41. package/dist/types/sentence-case.d.ts.map +0 -1
  42. package/dist/types/tokenizer.d.ts +0 -13
  43. package/dist/types/tokenizer.d.ts.map +0 -1
  44. package/dist/types/verbatim.d.ts +0 -66
  45. package/dist/types/verbatim.d.ts.map +0 -1
  46. package/dist/types/yield.d.ts +0 -2
  47. package/dist/types/yield.d.ts.map +0 -1
package/dist/cjs/index.js CHANGED
@@ -47,8 +47,8 @@ var import_sentence_case2 = require("./sentence-case.js");
47
47
  var import_tokenizer = require("./tokenizer.js");
48
48
  var import_tokenizer2 = require("./tokenizer.js");
49
49
  var import_yield = require("./yield.js");
50
- var import_crossref = __toESM(require("./crossref.js"), 1);
51
- var import_fields = __toESM(require("./fields.js"), 1);
50
+ var import_crossref = require("./crossref.js");
51
+ var import_fields = require("./fields.js");
52
52
  var import_merge = require("./merge.js");
53
53
  function latexMode(node) {
54
54
  return node._renderInfo.mode;
@@ -187,9 +187,6 @@ const FieldAction = {
187
187
  parseInt: [
188
188
  "year",
189
189
  "month"
190
- ],
191
- noCrossRef: [
192
- "file"
193
190
  ]
194
191
  };
195
192
  const narguments = {
@@ -449,7 +446,6 @@ class BibTeXParser {
449
446
  return subp;
450
447
  }
451
448
  macro(node, context) {
452
- var _a, _b, _c, _d, _e, _f, _g;
453
449
  const text = latex2unicode((0, import_unified_latex_util_print_raw.printRaw)(node), node);
454
450
  if (text) return text;
455
451
  let url;
@@ -527,16 +523,16 @@ class BibTeXParser {
527
523
  case "textit":
528
524
  case "emph":
529
525
  case "mkbibemph":
530
- return this.stringify((_a = node.args) == null ? void 0 : _a[0], context);
526
+ return this.stringify(node.args[0], context);
531
527
  case "textsuperscript":
532
- return this.subp(this.stringify((_b = node.args) == null ? void 0 : _b[0], context), "sup");
528
+ return this.subp(this.stringify(node.args[0], context), "sup");
533
529
  case "textsubscript":
534
- return this.subp(this.stringify((_c = node.args) == null ? void 0 : _c[0], context), "sub");
530
+ return this.subp(this.stringify(node.args[0], context), "sub");
535
531
  case "_":
536
532
  case "^":
537
533
  switch (latexMode(node)) {
538
534
  case "math":
539
- return this.subp(this.stringify((_d = node.args) == null ? void 0 : _d[0], context), node.content === "^" ? "sup" : "sub");
535
+ return this.subp(this.stringify(node.args[0], context), node.content === "^" ? "sup" : "sub");
540
536
  default:
541
537
  return node.content;
542
538
  }
@@ -544,7 +540,7 @@ class BibTeXParser {
544
540
  return this.wrap(`L${this.subp("A", "sup")}T${this.subp("E", "sub")}X`, "ncx");
545
541
  case "enquote":
546
542
  case "mkbibquote":
547
- return this.wrap(this.stringify((_e = node.args) == null ? void 0 : _e[0], context), "enquote");
543
+ return this.wrap(this.stringify(node.args[0], context), "enquote");
548
544
  case "\\":
549
545
  return context.mode === "richtext" ? open.br : " ";
550
546
  case "par":
@@ -555,7 +551,7 @@ class BibTeXParser {
555
551
  case "subsection":
556
552
  case "subsubsection":
557
553
  case "subsubsubsection":
558
- return this.wrap(this.stringify((_f = node.args) == null ? void 0 : _f[0], context), `h${node.content.split("sub").length}`);
554
+ return this.wrap(this.stringify(node.args[0], context), `h${node.content.split("sub").length}`);
559
555
  case "frac":
560
556
  arg = node.args.map((a) => this.stringify(a, context));
561
557
  if (arg.length === 2) {
@@ -568,7 +564,7 @@ class BibTeXParser {
568
564
  case "cite":
569
565
  case "textcite":
570
566
  case "citeauthor":
571
- return this.wrap(this.stringify((_g = node.args) == null ? void 0 : _g[0], context), "ncx", context.mode === "title");
567
+ return this.wrap(this.stringify(node.args[0], context), "ncx", context.mode === "title");
572
568
  default:
573
569
  if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context);
574
570
  return this.unsupported(node);
@@ -776,15 +772,15 @@ class BibTeXParser {
776
772
  }
777
773
  (0, import_unified_latex_util_visit.visit)(ast, (nodes, info) => {
778
774
  var _a;
779
- let node;
780
775
  const compacted = [];
781
776
  let inif = 0;
782
777
  while (nodes.length) {
783
- if (node = this.ligature(nodes)) {
784
- compacted.push(node);
778
+ const ligatureResult = this.ligature(nodes);
779
+ if (ligatureResult) {
780
+ compacted.push(ligatureResult);
785
781
  continue;
786
782
  }
787
- node = nodes.shift();
783
+ const node = nodes.shift();
788
784
  if (node.type === "macro" && node.content === "ifdefined") {
789
785
  inif += 1;
790
786
  continue;
@@ -798,13 +794,14 @@ class BibTeXParser {
798
794
  }
799
795
  const nargs = node.type === "macro" ? narguments[node.content] || narguments[`${info.context.inMathMode ? "math" : "text"} ${node.content}`] : 0;
800
796
  if (node.type === "macro" && nargs) {
801
- node.args = Array(nargs).fill(void 0).map((_i) => this.argument(nodes, node)).filter((arg) => arg);
802
- if (node.content.match(/^(url|href)$/) && node.args.length) {
803
- let url = node.args[0].content;
797
+ const args = Array(nargs).fill(void 0).map((_i) => this.argument(nodes, node)).filter((arg) => arg !== null);
798
+ node.args = args;
799
+ if (node.content.match(/^(url|href)$/) && args.length) {
800
+ let url = args[0].content;
804
801
  if (url.length === 1 && url[0].type === "group") url = url[0].content;
805
- node.args[0] = this.wraparg({ type: "string", content: (0, import_unified_latex_util_print_raw.printRaw)(url), _renderInfo: { mode: url[0]._renderInfo.mode } }, node);
802
+ args[0] = this.wraparg({ type: "string", content: (0, import_unified_latex_util_print_raw.printRaw)(url), _renderInfo: { mode: url[0]._renderInfo.mode } }, node);
806
803
  }
807
- caseProtection.intuitive -= node.args.filter((arg) => arg.content[0].type === "group" && arg.content[0]._renderInfo.protectCase).length;
804
+ caseProtection.intuitive -= args.filter((arg) => arg.content[0].type === "group" && arg.content[0]._renderInfo.protectCase).length;
808
805
  } else if (node.type === "macro" && node.content.match(/^[a-z]+$/i) && ((_a = nodes[0]) == null ? void 0 : _a.type) === "whitespace") {
809
806
  nodes.shift();
810
807
  }
@@ -812,7 +809,10 @@ class BibTeXParser {
812
809
  }
813
810
  if (!info.context.inMathMode) {
814
811
  for (const [macro, markup] of Object.entries({ em: "emph", it: "emph", sl: "emph", bf: "bold", sc: "smallCaps", tt: "code" })) {
815
- if (info.parents.find((p) => p._renderInfo[markup])) continue;
812
+ if (info.parents.find((p) => {
813
+ var _a2;
814
+ return (_a2 = p._renderInfo) == null ? void 0 : _a2[markup];
815
+ })) continue;
816
816
  compacted.forEach((markup_node, i) => {
817
817
  if (markup_node.type === "macro" && markup_node.content === macro) {
818
818
  compacted.slice(i + 1).forEach((n) => n._renderInfo[markup] = true);
@@ -869,7 +869,7 @@ class BibTeXParser {
869
869
  field,
870
870
  this.stringify(ast, { mode }),
871
871
  mode,
872
- this.options.sentenceCase && this.options.sentenceCase.guess
872
+ !!(this.options.sentenceCase && this.options.sentenceCase.guess)
873
873
  // && (!caseProtection.present || caseProtection.intuitive > 0)
874
874
  );
875
875
  break;
@@ -925,7 +925,7 @@ class BibTeXParser {
925
925
  comments: [],
926
926
  strings: {},
927
927
  preamble: [],
928
- jabref: null
928
+ jabref: { root: [], groups: {} }
929
929
  };
930
930
  }
931
931
  reparse(verbatim) {
@@ -999,38 +999,32 @@ ${entry.input}`, input: entry.input });
999
999
  if (!order.includes(crossref)) order.unshift(crossref);
1000
1000
  if (!order.includes(key)) order.push(key);
1001
1001
  }
1002
- const add = (obj, kind, field) => {
1003
- obj[kind] = [.../* @__PURE__ */ new Set([...obj[kind], field])].sort();
1004
- };
1005
1002
  for (const key of order) {
1006
1003
  const child = entries[key.toUpperCase()];
1007
1004
  const parent = entries[(_a = child.fields.crossref) == null ? void 0 : _a.toUpperCase()];
1008
1005
  if (!parent) continue;
1009
- child.crossref = child.crossref || { donated: [], inherited: [] };
1010
- parent.crossref = parent.crossref || { donated: [], inherited: [] };
1011
- for (const mappings of [import_crossref.default[child.type], import_crossref.default["*"]].filter((m) => m)) {
1006
+ for (const mappings of [import_crossref.crossref[child.type], import_crossref.crossref["*"]].filter((m) => m)) {
1012
1007
  for (const mapping of [mappings[parent.type], mappings["*"]].filter((m) => m)) {
1013
1008
  for (const [childfield, parentfield] of Object.entries(mapping)) {
1014
1009
  if (!child.fields[childfield] && parent.fields[parentfield]) {
1015
1010
  child.fields[childfield] = parent.fields[parentfield];
1016
- add(child.crossref, "inherited", childfield);
1017
- add(parent.crossref, "donated", parentfield);
1011
+ child.crossref ??= {};
1012
+ child.crossref[parent.key] ??= {};
1013
+ child.crossref[parent.key][childfield] = parentfield;
1018
1014
  }
1019
1015
  }
1020
- for (const field of import_fields.default[child.type] || []) {
1021
- if (FieldAction.noCrossRef.includes(field)) continue;
1016
+ for (const field of import_fields.allowed[child.type] || []) {
1017
+ if (import_fields.noCrossRef.includes(field)) continue;
1022
1018
  if (!child.fields[field] && parent.fields[field]) {
1023
1019
  child.fields[field] = parent.fields[field];
1024
- add(child.crossref, "inherited", field);
1025
- add(parent.crossref, "donated", field);
1020
+ child.crossref ??= {};
1021
+ child.crossref[parent.key] ??= {};
1022
+ child.crossref[parent.key][field] = field;
1026
1023
  }
1027
1024
  }
1028
1025
  }
1029
1026
  }
1030
1027
  }
1031
- for (const entry of this.bib.entries) {
1032
- if (entry.crossref && !entry.crossref.donated.length && !entry.crossref.inherited.length) delete entry.crossref;
1033
- }
1034
1028
  }
1035
1029
  const { comments, jabref } = JabRef.parse(base.comments);
1036
1030
  this.bib.comments = comments;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../index.ts"],
4
- "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\nexport { toSentenceCase } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\nexport { tokenize } from './tokenizer.js'\nexport type { Token } from './tokenizer.js'\n\nimport { playnice } from './yield.js'\n\nimport CrossRef from './crossref.js'\nimport allowed 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\nfunction latex2unicode(tex: string, node: Node): string {\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\ntype 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}\ntype ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\ntype TypedFields = CreatorFields & ArrayFields\ntype Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: {\n inherited: string[]\n donated: string[]\n }\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\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preamble: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * By default, when a TeX command is encountered which the parser does not know about, the parser will throw an error. You can pass a function here to return the appropriate text output for the command.\n */\n unsupported?: 'ignore' | unsupportedHandler\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\ntype 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 noCrossRef: [\n 'file',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\ntype unsupportedHandler = (node: Node, tex: string, entry: Entry) => string\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 fallback: unsupportedHandler\n private current: Entry\n private english: boolean\n private options: Options\n private fieldMode: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode {\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 {\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.fallback) return this.fallback(node, tex, this.current) ?? ''\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n return tex\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (node.content) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url, context)}\">${this.stringify(label, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args?.[0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args?.[0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args?.[0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args?.[0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args?.[0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args?.[0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args?.[0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo.protectCase)) node._renderInfo.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n let node: Node\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n if (node = this.ligature(nodes)) {\n compacted.push(node)\n continue\n }\n\n 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 node.args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter(arg => arg)\n if (node.content.match(/^(url|href)$/) && node.args.length) {\n let url: Node[] = node.args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n node.args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo.mode } }, node)\n }\n caseProtection.intuitive -= node.args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo[markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n this.options.sentenceCase && this.options.sentenceCase.guess, // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = this.options.english.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 this.fallback = options.unsupported === 'ignore' ? ((_node: Node, _tex: string): string => '') : options.unsupported\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preamble: [],\n jabref: null,\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 = [...(new Set(keywords))].sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (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 {\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 if (!order.includes(crossref)) order.unshift(crossref)\n if (!order.includes(key)) order.push(key)\n }\n\n const add = (obj: Record<string, string[]>, kind: string, field: string) => {\n obj[kind] = [...(new Set([...obj[kind], field]))].sort()\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 child.crossref = child.crossref || { donated: [], inherited: [] }\n parent.crossref = parent.crossref || { donated: [], inherited: [] }\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(<Record<string, string>> mapping)) {\n if (!child.fields[childfield] && parent.fields[parentfield]) {\n child.fields[childfield] = parent.fields[parentfield]\n add(child.crossref, 'inherited', childfield)\n add(parent.crossref, 'donated', parentfield)\n }\n }\n\n for (const field of <string[]> (allowed[child.type] || [])) {\n if (FieldAction.noCrossRef.includes(field)) continue\n\n if (!child.fields[field] && parent.fields[field]) {\n child.fields[field] = parent.fields[field]\n add(child.crossref, 'inherited', field)\n add(parent.crossref, 'donated', field)\n }\n }\n }\n }\n }\n\n for (const entry of this.bib.entries) {\n if (entry.crossref && !entry.crossref.donated.length && !entry.crossref.inherited.length) delete entry.crossref\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.preamble = 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\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_sentence_case", "import_tokenizer", "latex2unicodemap", "CrossRef", "allowed"]
4
+ "sourcesContent": ["/* eslint-disable no-underscore-dangle */\nimport type { Argument, Environment, Group, Macro, Node, Root, String as StringNode } from '@unified-latex/unified-latex-types'\nimport { LatexPegParser } from '@unified-latex/unified-latex-util-pegjs'\nimport { printRaw } from '@unified-latex/unified-latex-util-print-raw'\nimport { replaceNode } from '@unified-latex/unified-latex-util-replace'\nimport { visit } from '@unified-latex/unified-latex-util-visit'\nimport { combining, latex2unicode as latex2unicodemap } from 'unicode2latex'\nimport * as JabRef from './jabref.js'\nimport * as bibtex from './verbatim.js'\nexport type { JabRefMetadata } from './jabref.js'\nexport type { ParseError } from './verbatim.js'\nimport { toSentenceCase } from './sentence-case.js'\nexport { toSentenceCase } from './sentence-case.js'\nimport { tokenize } from './tokenizer.js'\nimport type { Token } from './tokenizer.js'\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\nfunction latex2unicode(tex: string, node: Node): string {\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\ntype 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}\ntype ArrayFields = {\n keywords?: string[]\n institution?: string[]\n publisher?: string[]\n origpublisher?: string[]\n organization?: string[]\n location?: string[]\n origlocation?: string[]\n}\ntype TypedFields = CreatorFields & ArrayFields\ntype Fields = TypedFields & Omit<Record<string, string>, keyof TypedFields>\n\nexport type Entry = {\n type: string\n key: string\n fields: Fields\n mode: Record<string, ParseMode>\n crossref?: Record<string, Record<string, string>>\n input: string\n}\n\nconst Month = {\n jan: '1',\n january: '1',\n feb: '2',\n february: '2',\n mar: '3',\n march: '3',\n apr: '4',\n april: '4',\n may: '5',\n jun: '6',\n june: '6',\n jul: '7',\n july: '7',\n aug: '8',\n august: '8',\n sep: '9',\n september: '9',\n oct: '10',\n october: '10',\n nov: '11',\n november: '11',\n dec: '12',\n december: '12',\n}\n\nexport interface Library {\n /**\n * errors found while parsing\n */\n errors: bibtex.ParseError[]\n\n /**\n * entries in the order in which they are found, omitting those which could not be parsed.\n */\n entries: Entry[]\n\n /**\n * `@comment`s found in the bibtex file.\n */\n comments: string[]\n\n /**\n * `@string`s found in the bibtex file.\n */\n strings: Record<string, string>\n\n /**\n * `@preamble` declarations found in the bibtex file\n */\n preamble: string[]\n\n /**\n * jabref metadata (such as groups information) found in the bibtex file\n */\n jabref: JabRef.JabRefMetadata\n}\n\nexport interface Options {\n /**\n * Bib(La)TeX handles entries that are in English differently from emtries in other languages. For English-like entries,\n * it expects titles in title-case. Words within braces are recognized as \"case-protected\" and their original casing is preserved during\n * rendering. For non-English entries, the casing as entered in the entries is rendered as entered. Other reference managers, such as\n * Zotero, expect all titles to be in sentence-case. In this parser you can specify which `langid` values mark an entry to be English so\n * that it can convert those titles to sentence-case, and to carry over case-protection. If no `langid` is present an entry is\n * assumed to be English by bib(la)tex, and the parser follows that convention. Note that sentence-casing uses heuristics and\n * does not employ any kind of natural language processing, so you should always inspect the results. If you offer your own list\n * of english-langids here, do not forget to include the empty string, stands for \"`langid` absent\". Default languages to sentenceCase\n * are the empty string, plus:\n *\n * - american\n * - british\n * - canadian\n * - english\n * - australian\n * - newzealand\n * - usenglish\n * - ukenglish\n * - en\n * - eng\n * - en-au\n * - en-bz\n * - en-ca\n * - en-cb\n * - en-gb\n * - en-ie\n * - en-jm\n * - en-nz\n * - en-ph\n * - en-tt\n * - en-us\n * - en-za\n * - en-zw\n *\n * If you pass an empty array, or `false`, no sentence casing will be applied (even when there's no language field).\n */\n english?: string[] | boolean\n\n /**\n * By default, `langid` and `hyphenation` are used to determine whether an entry is English, but some sources (ab)use the `language` field\n * for this. If you turn on this option, this field will also be taken into account as a source for `langid`.\n */\n languageAsLangid?: boolean\n\n sentenceCase?: false | {\n /**\n * Some bibtex files will have English titles in sentence case, or all-uppercase. If this is on, and there is a field that would\n * normally have sentence-casing applied in which there are all-lowercase words that are not prepositions (where `X` is either\n * lower or upper) than mixed-case, it is assumed that you want them this way, and no sentence-casing will be applied to that field\n */\n guess?: boolean\n\n /**\n * Retain Capitalised words in sub-sentences after colons. Given the input title \"Structured Interviewing For OCB: Construct Validity,\n * Faking, And The Effects Of Question Type\":\n * - when `true`, sentence-cases to \"Structured interviewing for OCB: Construct validity, faking, and the effects of question type\"\n * - when `false`, sentence-cases to \"Structured interviewing for OCB: construct validity, faking, and the effects of question type\"\n */\n subSentence?: boolean\n\n /**\n * If you have sentence-casing on, you can independently choose whether quoted titles within a title are preserved as-is (true)\n * or also sentence-cased (false).\n */\n preserveQuoted?: boolean\n }\n\n /**\n * translate braced parts of English-entry titles into a case-protected counterpart; Default == true == as-needed.\n * In as-needed mode the parser will assume that words that have capitals in them imply \"nocase\" behavior in the consuming application. If you don't want this, turn this option on, and you'll get\n * case protection exactly as the input has it\n */\n caseProtection?: 'as-needed' | 'strict' | boolean\n\n /**\n * By default, when a TeX command is encountered which the parser does not know about, the parser will throw an error. You can pass a function here to return the appropriate text output for the command.\n */\n unsupported?: 'ignore' | unsupportedHandler\n\n /**\n * Some fields such as `url` are parsed in what is called \"verbatim mode\" where pretty much everything except braces is treated as regular text, not TeX commands. You can change the default list here if you want,\n * for example to help parse Mendeley `file` fields, which against spec are not in verbatim mode.\n */\n verbatimFields?: (string | RegExp)[]\n\n /**\n * In the past many bibtex entries would just always wrap a field in double braces, likely because whomever was writing them couldn't figure out the case meddling rules (and who could\n * blame them). Fields listed here will either have one outer layer of braces treated as case-preserve, or have the outer braced be ignored completely, if this is detected.\n */\n removeOuterBraces?: string[]\n\n /**\n * Specify parsing mode for specific fields\n */\n fieldMode?: Record<string, ParseMode>\n\n /**\n * If this flag is set entries will be returned without conversion of LaTeX to unicode equivalents.\n */\n raw?: boolean\n\n /**\n * You can pass in an existing `@string` dictionary\n */\n strings?: Record<string, string> | string\n\n /**\n * Apply crossref inheritance\n */\n applyCrossRef?: boolean\n}\n\nexport interface Creator {\n name?: string\n lastName?: string\n firstName?: string\n prefix?: string\n suffix?: string\n initial?: string\n useprefix?: boolean\n juniorcomma?: boolean\n}\n\nexport const FieldMode = {\n creatorlist: [\n 'author',\n 'bookauthor',\n 'collaborator',\n 'commentator',\n 'director',\n 'editor',\n 'editora',\n 'editorb',\n 'editors',\n 'holder',\n 'scriptwriter',\n 'translator',\n ],\n title: [\n 'title',\n 'subtitle',\n 'series',\n 'shorttitle',\n 'booktitle',\n // 'type',\n 'origtitle',\n 'maintitle',\n 'eventtitle',\n ],\n verbatim: [\n 'doi',\n 'eprint',\n 'file',\n 'files',\n 'pdf',\n 'groups', // jabref unilaterally decided to make this non-standard field verbatim\n 'ids',\n 'url',\n 'verba',\n 'verbb',\n 'verbc',\n /^keywords([+]duplicate-\\d+)?$/,\n /^citeulike-linkout-[0-9]+$/,\n /^bdsk-url-[0-9]+$/,\n ],\n richtext: [\n 'annotation',\n 'comment',\n 'annote',\n 'review',\n 'notes',\n 'note',\n ],\n literallist: [\n 'institution',\n 'publisher',\n 'origpublisher',\n 'organization',\n 'location',\n 'origlocation',\n ],\n}\n\ntype ParseMode = keyof typeof FieldMode | 'literal' | 'verbatimlist'\n\nexport const English = [\n '',\n 'american',\n 'british',\n 'canadian',\n 'english',\n 'australian',\n 'newzealand',\n 'usenglish',\n 'ukenglish',\n 'en',\n 'eng',\n 'en-au',\n 'en-bz',\n 'en-ca',\n 'en-cb',\n 'en-gb',\n 'en-ie',\n 'en-jm',\n 'en-nz',\n 'en-ph',\n 'en-tt',\n 'en-us',\n 'en-za',\n 'en-zw',\n 'anglais', // don't do this people\n]\n\nconst FieldAction = {\n removeOuterBraces: [\n 'doi',\n // 'publisher',\n // 'location',\n ],\n parseInt: [\n 'year',\n 'month',\n ],\n}\n\nconst narguments = {\n advance: 1,\n ElsevierGlyph: 1,\n bar: 1,\n bibcyr: 1,\n bibstring: 1,\n chsf: 1,\n cite: 1,\n citeauthor: 1,\n cyrchar: 1,\n ding: 1,\n emph: 1,\n enquote: 1,\n frac: 2,\n hbox: 1,\n href: 2,\n hskip: 1,\n hspace: 1,\n ht: 1,\n mathrm: 1,\n mbox: 1,\n mkbibbold: 1,\n mkbibemph: 1,\n mkbibitalic: 1,\n mkbibquote: 1,\n newcommand: 2,\n noopsort: 1,\n ocirc: 1,\n overline: 1,\n ProvideTextCommandDefault: 2,\n rlap: 1,\n sb: 1,\n section: 1,\n sp: 1,\n subsection: 1,\n subsubsection: 1,\n subsubsubsection: 1,\n t: 1,\n textbf: 1,\n textcite: 1,\n textit: 1,\n textrm: 1,\n textsc: 1,\n textsl: 1,\n textsubscript: 1,\n textsuperscript: 1,\n texttt: 1,\n textup: 1,\n url: 1,\n vphantom: 1,\n vspace: 1,\n wd: 1,\n\n // math\n 'math\\t_': 1,\n 'math\\t^': 1,\n}\nfor (const m in combining.tounicode) { // eslint-disable-line guard-for-in\n narguments[m] = 1\n}\n\ntype unsupportedHandler = (node: Node, tex: string, entry: Entry) => string\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 fallback: unsupportedHandler | undefined\n private current!: Entry\n private english!: boolean\n private options!: Options\n private fieldMode!: typeof FieldMode\n private newcommands: Record<string, Argument> = {}\n private bib!: Library\n private unhandled: Set<string> = new Set()\n\n private split(ast: Group | Root, sep: RegExp, split: RegExp): Root[] {\n const roots: Root[] = []\n\n const nodes = [...ast.content]\n const types = nodes.map(node => {\n if (node.type === 'whitespace') return ' '\n if (node.type === 'string' && node.content.match(sep)) return '&'\n return '.'\n }).join('')\n\n types.split(split).forEach((match, i) => {\n const content = match.length ? nodes.splice(0, match.length) : []\n if ((i % 2) === 0) roots.push({ type: 'root', content })\n })\n\n return roots\n }\n\n private trimCreator(cr: Creator): Creator {\n // trims strings but coincidentally removes undefined fields\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(cr, (k, v) => typeof v === 'string' ? (v.trim() || undefined) : v)) as Creator\n }\n\n private parseCreator(ast: Root): Creator {\n if (ast.content.length === 1 && ast.content[0].type === 'group') return this.trimCreator({ name: this.stringify(ast, { mode: 'creatorlist' }) })\n\n const { parts, extended } = this.commaSeparatedCreator(ast)\n if (extended) {\n const name: Creator = {}\n for (const [attr, value] of Object.entries(extended)) {\n const rendered = this.stringify(value, { mode: 'creatorlist' }).trim()\n\n switch (attr) {\n case '':\n break\n\n case 'given':\n name.firstName = rendered\n break\n\n case 'family':\n name.lastName = rendered\n break\n\n case 'given-i':\n name.initial = rendered\n break\n\n case 'useprefix':\n case 'juniorcomma':\n name[attr] = rendered.toLowerCase() === 'true'\n break\n\n default:\n name[attr] = rendered\n break\n }\n }\n return this.trimCreator(name)\n }\n else if (parts.length) {\n const nameparts: string[] = parts.map((part: Node) => this.stringify(part, { mode: 'creatorlist' }).trim())\n\n if (nameparts.length === 3 && nameparts[2] === '') nameparts.pop()\n\n if (nameparts.length > 3) {\n const key = this.current.key ? `@${this.current.key}: ` : ''\n this.bib.errors.push({\n error: `${key}unexpected ${nameparts.length}-part name \"${nameparts.join(', ')}\", dropping \"${nameparts.slice(3).join(', ')}\"`,\n input: nameparts.join(', '),\n })\n }\n\n let [lastName, suffix, firstName] = (nameparts.length === 2)\n ? [nameparts[0], undefined, nameparts[1]]\n // > 3 parts are invalid and are dropped\n : nameparts.slice(0, 3)\n let prefix\n const m = lastName.match(/^([a-z'. ]+) (.+)/)\n if (m) {\n prefix = m[1]\n lastName = m[2]\n }\n return this.trimCreator({\n lastName,\n firstName,\n prefix,\n suffix,\n })\n }\n else { // first-last mode\n const nameparts = this.split(ast, /^$/, /( )/).map(part => this.stringify(part, { mode: 'creatorlist' })).filter(n => n)\n\n if (nameparts.length === 1) return this.trimCreator({ lastName: nameparts[0] })\n\n const prefix = nameparts.findIndex(n => n.match(/^[a-z]/))\n const postfix = prefix <= 0 ? -1 : nameparts.findIndex((n, i) => i > prefix && !n.match(/^[a-z]/))\n if (postfix === -1) {\n const lastName = nameparts.pop()\n return this.trimCreator({ lastName, firstName: nameparts.join(' ') })\n }\n\n return this.trimCreator({\n firstName: nameparts.slice(0, prefix).join(' '),\n prefix: nameparts.slice(prefix, postfix).join(' '),\n lastName: nameparts.slice(postfix).join(' '),\n })\n }\n }\n\n private ligature(nodes: Node[]): StringNode | null {\n if (latexMode(nodes[0]) !== 'text') return null\n\n const max = 3\n const slice = nodes.slice(0, max)\n const type = slice.map(n => n.type === 'string' ? 's' : ' ').join('')\n if (type[0] !== 's') return null\n\n const content = slice.map(n => n.type === 'string' ? n.content : '')\n let latex: string\n\n while (content.length) {\n if (type.startsWith('s'.repeat(content.length)) && (latex = latex2unicode(content.join(''), slice[0]))) {\n try {\n return { type: 'string', content: latex, _renderInfo: {} }\n }\n finally {\n nodes.splice(0, content.length)\n }\n }\n content.pop()\n }\n\n return null\n }\n\n private wraparg(node: Node, macro: Macro): Argument {\n if (macro.content.match(/^(itshape|textsl|textit|emph|mkbibemph)$/)) node._renderInfo!.emph = true\n if (macro.content.match(/^(textbf|mkbibbold|bfseries)$/)) node._renderInfo!.bold = true\n if (macro.content.match(/^(textsc)$/)) node._renderInfo!.smallCaps = true\n if (macro.content.match(/^(texttt)$/)) node._renderInfo!.code = true\n return { type: 'argument', content: [node], openMark: '', closeMark: '', _renderInfo: { mode: node._renderInfo!.mode } }\n }\n\n private argtogroup(node: Argument): Group {\n if (node.content.length === 1 && node.content[0].type === 'group') return node.content[0]\n return { type: 'group', content: node.content }\n }\n\n private argument(nodes: Node[], macro: Macro): Argument | null {\n if (!nodes.length) return null\n if (nodes[0].type === 'whitespace') nodes.shift()\n if (!nodes.length) return null\n if (nodes[0].type === 'string') {\n const char = nodes[0].content[0]\n nodes[0].content = nodes[0].content.substr(1)\n const arg = { ...nodes[0], content: char }\n if (!nodes[0].content) nodes.shift()\n return this.wraparg(arg, macro)\n }\n return this.wraparg(nodes.shift()!, macro)\n }\n\n private unsupported(node: Node): string {\n const tex = printRaw(node)\n if (this.fallback) return this.fallback(node, tex, this.current) ?? ''\n\n let id: string\n switch (node.type) {\n case 'macro':\n id = `${node.type}.${node.content}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${printRaw(node)}`, input: printRaw(node) })\n }\n break\n case 'environment':\n id = `${node.type}.${node.env}`\n if (!this.unhandled.has(id)) {\n this.unhandled.add(id)\n this.bib.errors.push({ error: `unhandled ${node.type} ${node.env} (${printRaw(node)})`, input: printRaw(node) })\n }\n break\n default:\n this.bib.errors.push({ error: `unhandled ${node.type} (${printRaw(node)})`, input: printRaw(node) })\n break\n }\n\n return tex\n }\n\n private wrap(text: string, tag, wrap = true): string {\n if (!text || !wrap) return text || ''\n return `\\x0E${tag}\\x0F${text}\\x0E/${tag}\\x0F`\n }\n\n private registercommand(node: Macro): string {\n const types = (nodes: Node[]) => nodes.map(n => n.type).join('.')\n\n const group = (arg: Argument, kind: string): Node[] => {\n if (!arg) throw new Error(`missing ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n if (types(arg.content) !== 'group') throw new Error(`Malformed ${kind} for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n return (<Group> arg.content[0]).content\n }\n\n if (!node.args) throw new Error(`No arguments for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n const namearg = group(node.args[0], 'name')\n if (types(namearg) !== 'macro') throw new Error(`Unexpected name for ${printRaw(node)} @ ${JSON.stringify(node.position)}`)\n\n this.newcommands[(<Macro> namearg[0]).content] = node.args[1]\n return ''\n }\n\n private subp(text: string, mode: 'sub' | 'sup') {\n const macro = { sub: '_', sup: '^' }[mode]\n let subp = ''\n for (let char of text) {\n const mapped = latex2unicodemap[`${macro}{${char}}`]\n switch (typeof mapped) {\n case 'string':\n subp += mapped\n break\n\n case 'undefined':\n return `\\x0E${mode}\\x0F${text}\\x0E/${mode}\\x0F`\n\n default:\n subp += mapped.math\n }\n }\n return subp\n }\n\n private macro(node: Macro, context: Context): string {\n const text = latex2unicode(printRaw(node), node)\n if (text) return text\n\n let url: Argument\n let label: Argument\n let arg: string[]\n switch (node.content) {\n case 'newcommand':\n case 'ProvideTextCommandDefault':\n return this.registercommand(node)\n\n // too complex to deal with these\n case 'raise':\n case 'accent':\n case 'def':\n case 'hss':\n case 'ifmmode':\n case 'makeatletter':\n case 'makeatother':\n case 'scriptscriptstyle':\n case 'setbox':\n case 'dimen':\n case 'advance':\n return ''\n\n case 'vphantom':\n case 'noopsort':\n case 'left':\n case 'right':\n case 'ensuremath':\n case 'wd':\n case 'ht':\n return ''\n\n case 'path':\n return '' // until https://github.com/siefkenj/unified-latex/issues/94 is fixed\n\n case 'hspace':\n case 'hskip':\n if (node.args && node.args.length) {\n if (printRaw(node.args).match(/^[{]?0[a-z]*$/)) return ''\n return ' '\n }\n return ''\n\n case 'overline':\n case 'bar':\n return node.args!.map(a => this.stringify(a, context)).join('').replace(/[a-z0-9]/ig, m => `${m}\\u0305`)\n\n // accents dealt with by preprocessor\n case 'textup':\n case 'textsc':\n case 'textrm':\n case 'texttt':\n case 'mathrm':\n case 'mbox':\n case 'hbox':\n case 'rlap':\n return node.args!.map(n => this.stringify(n, context)).join('')\n\n case 'href':\n case 'url':\n if (node.args) {\n url = node.args[0]\n label = node.args[node.content === 'url' ? 0 : 1]\n }\n return `<a href=\"${this.stringify(url!, context)}\">${this.stringify(label!, context)}</a>`\n\n case 'relax':\n case 'aftergroup':\n case 'ignorespaces':\n case 'em':\n case 'it':\n case 'tt':\n case 'sl':\n return ''\n\n case 'rm':\n case 'sc':\n return ''\n\n // bold/emph/smallcaps is handled in the wrapper\n case 'textbf':\n case 'mkbibbold':\n case 'textit':\n case 'emph':\n case 'mkbibemph':\n return this.stringify(node.args![0], context)\n\n case 'textsuperscript':\n return this.subp(this.stringify(node.args![0], context), 'sup')\n\n case 'textsubscript':\n return this.subp(this.stringify(node.args![0], context), 'sub')\n\n case '_':\n case '^':\n switch (latexMode(node)) {\n case 'math':\n return this.subp(this.stringify(node.args![0], context), node.content === '^' ? 'sup' : 'sub')\n default:\n return node.content\n }\n\n case 'LaTeX':\n return this.wrap(`L${this.subp('A', 'sup')}T${this.subp('E', 'sub')}X`, 'ncx')\n\n case 'enquote':\n case 'mkbibquote':\n return this.wrap(this.stringify(node.args![0], context), 'enquote')\n\n case '\\\\':\n return context.mode === 'richtext' ? open.br : ' '\n\n case 'par':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'item':\n return context.mode === 'richtext' ? open.li : ' '\n\n case 'section':\n case 'subsection':\n case 'subsubsection':\n case 'subsubsubsection':\n return this.wrap(this.stringify(node.args![0], context), `h${node.content.split('sub').length}`)\n\n case 'frac':\n arg = node.args!.map(a => this.stringify(a, context))\n if (arg.length === 2) {\n const resolved = latex2unicodemap[`\\\\frac${arg.map(a => `{${a}}`).join('')}`]\n if (resolved) return typeof resolved === 'string' ? resolved : (resolved.math || resolved.text)\n }\n return arg.map((part, i) => this.subp(part, i ? 'sub' : 'sup')).join('\\u2044')\n\n case 'chsf':\n case 'bibstring':\n case 'cite':\n case 'textcite':\n case 'citeauthor':\n // ncx protects but will be stripped later\n return this.wrap(this.stringify(node.args![0], context), 'ncx', context.mode === 'title')\n\n default:\n if (this.newcommands[node.content]) return this.stringify(this.newcommands[node.content], context)\n return this.unsupported(node)\n }\n }\n\n private what(node: Node) {\n if (!node) return ''\n\n switch (node.type) {\n case 'macro':\n return `macro:${<string> node._renderInfo!.mode ?? 'text'}:${node.content}`\n case 'environment':\n return `env:${node.env}`\n default:\n return node.type\n }\n }\n private environment(node: Environment, context: Context) {\n while (node.content.length && this.what(node.content[0]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.shift()\n while (node.content.length && this.what(node.content[node.content.length - 1]).match(/^parbreak|whitespace|macro:text:par$/)) node.content.pop()\n\n switch (node.env) {\n case 'quotation':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'blockquote', context.mode === 'richtext')\n\n case 'itemize':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'ul', context.mode === 'richtext')\n\n case 'em':\n return this.wrap(node.content.map(n => this.stringify(n, context)).join(''), 'i', context.mode === 'richtext')\n\n default:\n return this.unsupported(node)\n }\n }\n\n private stringify(node: Node | Argument, context: Context): string {\n let content = this.stringifyContent(node, context)\n if (content && node._renderInfo) {\n if (node._renderInfo!.emph) content = `${open.i}${content}${close.i}`\n if (node._renderInfo!.bold) content = `${open.b}${content}${close.b}`\n if (node._renderInfo!.smallCaps) content = `${open.sc}${content}${close.sc}`\n if (node._renderInfo!.code) content = `${open.code}${content}${close.code}`\n if (this.english && node._renderInfo!.protectCase) content = `${open.nc}${content}${close.nc}`\n }\n return content\n }\n\n private stringifyContent(node: Node | Argument, context: Context): string {\n if (!node) return ''\n\n switch (node.type) {\n case 'root':\n case 'argument':\n case 'group':\n case 'inlinemath':\n return node.content.map(n => this.stringify(n, context)).join('')\n\n case 'string':\n case 'verbatim':\n return node.content\n\n case 'macro':\n return this.macro(node, context)\n\n case 'parbreak':\n return context.mode === 'richtext' ? open.p : ' '\n\n case 'whitespace':\n return node._renderInfo!.mode === 'math' ? '' : ' '\n\n case 'comment':\n return ''\n\n case 'environment':\n return this.environment(node, context)\n\n case 'verb':\n return node.content\n\n default:\n return this.unsupported(node)\n }\n }\n\n private protect(node) {\n if (node.type === 'inlinemath') return true\n if (node.type !== 'group') return false\n if (!node.content.length) return false\n return (node.content[0].type !== 'macro')\n }\n\n private mode(field: string): ParseMode {\n if (this.options.verbatimFields && this.options.verbatimFields.find(name => typeof name === 'string' ? (name === field) : field.match(name))) return 'verbatim'\n\n let mode: ParseMode = 'literal'\n for (const [selected, fields] of Object.entries(this.fieldMode)) {\n if (fields.find(match => typeof match === 'string' ? field === match : field.match(match))) mode = <ParseMode> selected\n }\n return mode\n }\n\n private restoreMarkup(s: string): string {\n if (!s.includes('\\x0E')) return s\n\n const restored: string[] = [s.replace(/\\x0E\\/?ncx\\x0F/ig, '')]\n while (restored[0] !== restored[1]) {\n restored.unshift(restored[0].replace(collapsable, '$2'))\n }\n\n return restored[0]\n .replace(/(\\x0Ep\\x0F\\s*){2,}/ig, '\\x0Ep\\x0F')\n .replace(/\\s*(\\x0E\\/p\\x0F){2,}/ig, '\\x0E/p\\x0F')\n .replace(/\\x0Eenquote\\x0F/ig, '\\u201C').replace(/\\x0E\\/enquote\\x0F/ig, '\\u201D')\n .replace(/\\x0Esc\\x0F/ig, '<span style=\"font-variant:small-caps;\">').replace(/\\x0E\\/sc\\x0F/ig, '</span>')\n .replace(/\\x0Enc\\x0F/ig, '<span class=\"nocase\">').replace(/\\x0E\\/nc\\x0F/ig, '</span>')\n .replace(/\\x0E/ig, '<').replace(/\\x0F/ig, '>')\n }\n\n private stringField(field: string, value: string, mode: string, guessSC: boolean): string {\n if (field === 'crossref') return value\n\n if (FieldAction.parseInt.includes(field) && value.trim().match(/^-?\\d+$/)) return `${parseInt(value)}`\n\n if (this.english && mode === 'title') {\n value = toSentenceCase(value, {\n preserveQuoted: this.options.sentenceCase && this.options.sentenceCase.preserveQuoted,\n subSentenceCapitalization: this.options.sentenceCase && this.options.sentenceCase.subSentence,\n markup: /\\x0E\\/?([a-z]+)\\x0F/ig,\n nocase: /\\x0E(ncx?)\\x0F.*?\\x0E\\/\\1\\x0F/ig,\n guess: guessSC,\n })\n\n let cancel = (_match: string, stripped: string) => stripped\n switch (this.options.caseProtection) {\n case 'strict':\n cancel = (match: string, _stripped: string) => match\n break\n case 'as-needed':\n cancel = (match: string, stripped: string) => {\n const words: Token[] = tokenize(stripped, /\\x0E\\/?([a-z]+)\\x0F/ig)\n return words.find(w => w.shape.match(/^(?!.*X).*x.*$/)) ? match : this.wrap(stripped, 'ncx')\n }\n break\n }\n\n return value.replace(/\\x0Enc\\x0F(.*?)\\x0E\\/nc\\x0F/ig, cancel)\n }\n\n return value\n }\n\n private commaSeparatedCreator(ast: Root): { parts: Root[]; extended?: Record<string, Root> } {\n const result: { parts: Root[]; extended?: Record<string, Root> } = {\n parts: [],\n }\n\n if (!ast.content.find(node => node.type === 'string' && node.content === ',')) return result\n\n result.parts = this.split(ast, /^,$/, /(&)/)\n result.extended = {}\n for (const part of result.parts) {\n const start = part.content[0]?.type === 'whitespace' ? 1 : 0\n let signature = part.content\n .slice(start, start + 4)\n .map((node, i) => node._renderInfo!.mode === 'text' && node.type === 'string' ? node.content.replace(i % 2 ? /[^=-]/g : /[^a-z]/gi, '.') : '.')\n .join('')\n if (signature.match(/^[a-z]+(-[a-z]+)?=/i)) {\n signature = signature.replace(/=.*/, '').toLowerCase()\n result.extended[signature] = { type: 'root', content: part.content.slice(signature.includes('-') ? start + 4 : start + 2) }\n }\n else {\n delete result.extended\n break\n }\n }\n return result\n }\n\n private field(entry: Entry, field: string, value: string) {\n const mode: ParseMode = entry.mode[field] = this.mode(field)\n const caseProtection = {\n present: false,\n intuitive: 0, // a lot of people don't realise `some text \\textit{in italics}` will protect 'in italics'\n }\n\n const ast: Root = LatexPegParser.parse(value)\n\n if (this.options.removeOuterBraces!.includes(field) && ast.content.length === 1 && ast.content[0].type === 'group') {\n ast.content = ast.content[0].content\n }\n\n if (mode === 'verbatim') { // &^%@#&^%@# idiots wrapping verbatim fields\n entry.fields[field] = printRaw(ast)\n return\n }\n\n if (this.english && mode === 'title') {\n let root = [...ast.content]\n while (root.length) {\n const node = root.shift()!\n\n // only root groups offer case protecten -- but it may be as an macro arg, so mark here before gobbling\n if (this.protect(node)) node._renderInfo = { root: true }\n\n // environments are considered root when at root\n if (node.type === 'environment') root = [...root, ...node.content]\n }\n }\n\n // pass 0 -- register parse mode\n visit(ast, (node, info) => {\n if (!node._renderInfo) node._renderInfo = {}\n\n node._renderInfo!.mode = info.context.inMathMode ? 'math' : 'text'\n\n // if (info.context.inMathMode || info.context.hasMathModeAncestor) return\n\n if (mode === 'title' && node.type === 'inlinemath' && !info.parents.find(p => p._renderInfo!.protectCase)) node._renderInfo!.protectCase = true\n\n if (!info.context.inMathMode) {\n if (mode === 'title' && node._renderInfo!.root && (node.type !== 'group' || node.content[0].type !== 'macro')) {\n node._renderInfo!.protectCase = true\n if (node.type === 'group') {\n caseProtection.present = true\n caseProtection.intuitive += 1\n }\n }\n\n if (node.type === 'macro' && typeof node.escapeToken !== 'string') node.escapeToken = '\\\\'\n\n if (node.type === 'environment' && node.env === 'em') node._renderInfo!.emph = true\n }\n })\n\n if (this.options.raw) {\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => {\n const { parts, extended } = this.commaSeparatedCreator(cr)\n if (parts.length === 2 && !extended) {\n return this.trimCreator({ lastName: printRaw(parts[0]), firstName: printRaw(parts[1]) })\n }\n\n if (!parts.length) {\n const nameparts = this.split(ast, /^$/, /( )/)\n if (nameparts.length === 2) {\n return this.trimCreator({\n lastName: printRaw(nameparts[1]),\n firstName: printRaw(nameparts[0]),\n })\n }\n }\n\n return { name: printRaw(cr) }\n }) as unknown as string\n return\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => printRaw(elt)) as unknown as string // pacify typescript\n return\n default:\n entry.fields[field] = printRaw(ast)\n return\n }\n }\n\n // pass 1 -- mark & normalize\n visit(ast, (nodes, info) => {\n const compacted: Node[] = []\n let inif = 0\n while (nodes.length) {\n const ligatureResult = this.ligature(nodes)\n if (ligatureResult) {\n compacted.push(ligatureResult)\n continue\n }\n\n const node = nodes.shift()!\n\n if (node.type === 'macro' && node.content === 'ifdefined') {\n inif += 1\n continue\n }\n else if (node.type === 'macro' && node.content === 'else') {\n continue\n }\n else if (node.type === 'macro' && node.content === 'fi') {\n inif = Math.max(inif - 1, 0)\n continue\n }\n else if (inif) {\n continue\n }\n\n const nargs = node.type === 'macro'\n ? narguments[node.content] || narguments[`${info.context.inMathMode ? 'math' : 'text'}\\t${node.content}`]\n : 0\n if (node.type === 'macro' && nargs) {\n const args = Array(nargs).fill(undefined).map(_i => this.argument(nodes, <Macro> node)).filter((arg): arg is Argument => arg !== null)\n node.args = args\n if (node.content.match(/^(url|href)$/) && args.length) {\n let url: Node[] = args[0].content\n if (url.length === 1 && url[0].type === 'group') url = url[0].content\n args[0] = this.wraparg({ type: 'string', content: printRaw(url), _renderInfo: { mode: url[0]._renderInfo!.mode } }, node)\n }\n caseProtection.intuitive -= args.filter(arg => arg.content[0].type === 'group' && arg.content[0]._renderInfo!.protectCase).length\n }\n else if (node.type === 'macro' && node.content.match(/^[a-z]+$/i) && nodes[0]?.type === 'whitespace') {\n nodes.shift()\n }\n\n compacted.push(node)\n }\n\n if (!info.context.inMathMode) {\n // feed-forward inline macros\n for (const [macro, markup] of Object.entries({ em: 'emph', it: 'emph', sl: 'emph', bf: 'bold', sc: 'smallCaps', tt: 'code' })) {\n if (info.parents.find(p => p._renderInfo?.[markup])) continue\n\n compacted.forEach((markup_node, i) => {\n if (markup_node.type === 'macro' && markup_node.content === macro) {\n compacted.slice(i + 1).forEach(n => n._renderInfo![markup] = true)\n }\n })\n }\n }\n\n nodes.push(...compacted)\n }, { test: Array.isArray, includeArrays: true })\n\n replaceNode(ast, (node, _info) => {\n if (node.type !== 'macro') return\n\n if (node.escapeToken && combining.tounicode[node.content]) {\n let arg: Node\n // no args, args of zero length, or first arg has no content\n if (!node.args || node.args.length === 0 || node.args[0].content.length === 0) {\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n }\n else if (node.args.length !== 1 || node.args[0].content.length !== 1) {\n return\n }\n else {\n arg = node.args[0].content[0]\n }\n\n if (arg.type === 'group') {\n switch (arg.content.length) {\n case 0:\n arg = { type: 'string', content: ' ', _renderInfo: {} }\n break\n case 1:\n arg = arg.content[0]\n break\n default:\n return\n }\n }\n\n switch (arg.type) {\n case 'verbatim':\n case 'string':\n return { type: 'string', content: `${arg.content}${combining.tounicode[node.content]}`, _renderInfo: {} }\n default:\n return\n }\n }\n\n let latex = `${node.escapeToken}${node.content}`\n latex += (node.args || []).map(arg => printRaw(this.argtogroup(arg))).join('')\n if (latex in latex2unicodemap) return { type: 'string', content: latex2unicode(latex, node), _renderInfo: {} }\n // return null to delete\n })\n\n switch (mode) {\n case 'creatorlist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(cr => this.parseCreator(cr))\n .filter(cr => Object.keys(cr).length) as unknown as string // pacify typescript\n break\n case 'literallist':\n entry.fields[field] = this.split(ast, /^and$/i, /(^& | & | &$)/)\n .map(elt => this.stringify(elt, { mode: 'literal' }).trim()) as unknown as string // pacify typescript\n break\n default:\n entry.fields[field] = this.stringField(\n field,\n this.stringify(ast, { mode }),\n mode,\n !!(this.options.sentenceCase && this.options.sentenceCase.guess), // && (!caseProtection.present || caseProtection.intuitive > 0)\n ) as unknown as string\n break\n }\n\n // recursively restores markup in string content. 'as string' is just here to pacify typescript\n entry.fields[field] = JSON.parse(JSON.stringify(entry.fields[field], (k, v) => (typeof v === 'string' ? this.restoreMarkup(v) : v) as string))\n }\n\n private reset(options: Options = {}) {\n if (options.sentenceCase === false) {\n options = {\n ...options,\n english: false,\n sentenceCase: {\n guess: false,\n subSentence: false,\n preserveQuoted: false,\n },\n }\n }\n\n this.options = merge(options, {\n caseProtection: 'as-needed',\n applyCrossRef: options.applyCrossRef ?? true,\n fieldMode: {},\n english: English,\n sentenceCase: {\n guess: true,\n preserveQuoted: true,\n },\n })\n\n if (this.options.caseProtection === true) this.options.caseProtection = 'as-needed'\n\n if (this.options.verbatimFields) this.options.verbatimFields = this.options.verbatimFields.map(f => typeof f === 'string' ? f.toLowerCase() : new RegExp(f.source, f.flags + (f.flags.includes('i') ? '' : 'i')))\n\n if (typeof this.options.english === 'boolean') this.options.english = this.options.english ? English : []\n this.options.english = (this.options.english as string[]).map(langid => langid.toLowerCase())\n\n this.fieldMode = Object.entries(FieldMode).reduce((acc: typeof FieldMode, [mode, test]: [string, (RegExp | string)[]]) => {\n const strings = test.filter(fieldname_or_regex => typeof fieldname_or_regex === 'string' && !this.options.fieldMode![fieldname_or_regex])\n const regexes = test.filter(fieldname_or_regex => typeof fieldname_or_regex !== 'string')\n acc[mode] = [...strings, ...regexes]\n return acc\n }, <typeof FieldMode> {})\n for (const [field, mode] of Object.entries(this.options.fieldMode!)) {\n this.fieldMode[mode].unshift(field)\n }\n\n if (!this.options.removeOuterBraces) {\n this.options.removeOuterBraces = [\n ...FieldAction.removeOuterBraces,\n ...this.fieldMode.title,\n ...this.fieldMode.verbatim,\n ].filter(field => typeof field === 'string')\n }\n\n this.fallback = options.unsupported === 'ignore' ? ((_node: Node, _tex: string): string => '') : options.unsupported\n\n this.bib = {\n errors: [],\n entries: [],\n comments: [],\n strings: {},\n preamble: [],\n jabref: { root: [], groups: {} },\n }\n }\n\n private reparse(verbatim: bibtex.Entry) {\n let langid: string = (verbatim.fields.langid || verbatim.fields.hyphenation || '').toLowerCase()\n if (!langid && this.options.languageAsLangid && verbatim.fields.language) langid = verbatim.fields.language.toLowerCase()\n this.english = (<string[]> this.options.english).includes(langid)\n\n const entry: Entry = this.current = {\n type: verbatim.type,\n key: verbatim.key,\n fields: {},\n mode: {},\n input: verbatim.input,\n }\n let keywords: string[] = [] // OMG #783\n try {\n for (let [field, value] of Object.entries(verbatim.fields)) {\n if (!value.trim()) continue\n\n /*\n if (this.options.raw && !this.options.removeOuterBraces.includes(field)) {\n entry.fields[field] = value.trim()\n entry.mode[field] = 'verbatim'\n continue\n }\n */\n\n if (field.match(/^keywords([+]duplicate-\\d+)?$/)) field = 'keywords' // #873\n\n this.field(entry, field, value)\n\n if (field === 'keywords') { // #873\n keywords = [...keywords, ...(entry.fields.keywords as unknown as string).split(/\\s*[,;]\\s*/)].map((k: string) => k.trim()).filter(k => k)\n delete entry.fields.keywords\n }\n\n if (!this.options.raw && typeof entry.fields[field] === 'string') {\n entry.fields[field] = entry.fields[field].trim()\n if (field === 'month') entry.fields[field] = Month[entry.fields[field].toLowerCase()] || entry.fields[field]\n }\n }\n\n if (keywords.length) {\n entry.fields.keywords = [...(new Set(keywords))].sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))\n entry.mode.keywords = 'verbatimlist'\n }\n\n this.bib.entries.push(entry)\n }\n catch (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 {\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[parent.key] ??= {}\n child.crossref[parent.key][childfield] = 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[parent.key] ??= {}\n child.crossref[parent.key][field] = 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.preamble = 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\nexport function parse(input: string, options: Options = {}): Library {\n const parser = new BibTeXParser()\n return parser.parse(input, options)\n}\n\nexport async function parseAsync(input: string, options: Options = {}): Promise<Library> {\n const parser = new BibTeXParser()\n return await parser.parseAsync(input, options)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_sentence_case", "import_tokenizer", "latex2unicodemap", "_a", "CrossRef", "Allowed", "NoCrossRef"]
7
7
  }
@@ -61,7 +61,7 @@ function parse(comments) {
61
61
  }
62
62
  return true;
63
63
  });
64
- if (decoded.groupsversion) result.groupsversion = parseInt(decoded.groupsversion[0].trim()) || decoded.groupsversion[0];
64
+ if (decoded.groupsversion) result.groupsversion = parseInt(decoded.groupsversion[0].trim());
65
65
  if (decoded.fileDirectory) result.fileDirectory = decoded.fileDirectory[0];
66
66
  if (decoded.databaseType) result.databaseType = decoded.databaseType[0];
67
67
  for (const tree of ["groupstree", "grouping"]) {