@retorquere/bibtex-parser 7.0.15 → 8.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.
package/chunker.d.ts DELETED
@@ -1,60 +0,0 @@
1
- export interface Chunk {
2
- /**
3
- * The text content of the chunk
4
- */
5
- text: string;
6
- /**
7
- * Start location of the chunk in the bib file
8
- */
9
- offset: {
10
- pos: number;
11
- line: number;
12
- };
13
- /**
14
- * error found, if any.
15
- */
16
- error?: string;
17
- /**
18
- * set to `true` if the chunk is a `@preamble` block
19
- */
20
- preamble?: boolean;
21
- /**
22
- * set to `true` if the chunk is a bibtex entry
23
- */
24
- entry?: boolean;
25
- /**
26
- * set to `true` if the chunk is an `@string` declaration
27
- */
28
- stringDeclaration?: boolean;
29
- /**
30
- * set to `true` if the chunk is an `@comment`
31
- */
32
- comment?: boolean;
33
- }
34
- export interface ParserOptions {
35
- /**
36
- * stop parsing after `max_entries` entries have been found. Useful for quick detection if a text file is in fact a bibtex file
37
- */
38
- max_entries?: number;
39
- }
40
- type Entry = {
41
- type: string;
42
- key?: string;
43
- fields: Record<string, string>;
44
- };
45
- /**
46
- * Reads the bibtex input and splits it into separate chunks of `string`s, `@comment`s, and bibtex entries. Useful for detecting if a file is bibtex file and for filtering out basic errors that would
47
- * make the more sophisticated [[bibtex.parse]] reject the whole file
48
- *
49
- * @returns array of chunks, with markers for type and errors (if any) found.
50
- */
51
- export declare function parse(input: string, options?: ParserOptions): Chunk[];
52
- export declare function entries(input: string, options?: ParserOptions): {
53
- entries: Entry[];
54
- errors: Chunk[];
55
- };
56
- export declare const promises: {
57
- parse(input: string, options?: ParserOptions): Promise<Chunk[]>;
58
- };
59
- export {};
60
- //# sourceMappingURL=chunker.d.ts.map
package/chunker.js DELETED
@@ -1,358 +0,0 @@
1
- "use strict";
2
- /* eslint-disable @typescript-eslint/no-unsafe-argument */
3
- // Original work by Henrik Muehe (c) 2010
4
- //
5
- // CommonJS port by Mikola Lysenko 2013
6
- //
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.promises = exports.entries = exports.parse = void 0;
9
- class ParseError extends Error {
10
- constructor(message, parser) {
11
- message += ` @ ${parser.pos}`;
12
- if (parser.parsing)
13
- message += ` in ${JSON.stringify(parser.parsing)}`;
14
- super(message);
15
- this.name = 'ParseError';
16
- }
17
- }
18
- // eslint-disable-next-line prefer-template
19
- const letter = new RegExp('[' + [
20
- // Letter, Uppercase
21
- /\u0041-\u005A\u00C0-\u00D6\u00D8-\u00DE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AD\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A/.source,
22
- // Letter, Titlecase
23
- /\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC/.source,
24
- // Letter, Lowercase
25
- /\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A/.source,
26
- // Letter, Modifier
27
- /\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F/.source,
28
- // Letter, Other
29
- /\u00AA\u00BA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,
30
- ].join('') + ']');
31
- class BibtexParser {
32
- reset(input) {
33
- this.input = input;
34
- this.pos = 0;
35
- this.entries = [];
36
- this.strings = {};
37
- this.parsing = null;
38
- this.chunks = [];
39
- // this.linebreaks = undefined
40
- }
41
- parse(input, options = {}) {
42
- this.reset(input);
43
- this.max_entries = options.max_entries || 0;
44
- this.bibtex();
45
- return this.chunks;
46
- }
47
- async parseAsync(input, options = {}) {
48
- this.reset(input);
49
- this.max_entries = options.max_entries || 0;
50
- await this.bibtexAsync();
51
- return this.chunks;
52
- }
53
- isWhitespace(s, horizontalOnly = false) {
54
- return (s === ' ' || s === '\t' || (!horizontalOnly && (s === '\r' || s === '\n')));
55
- }
56
- match(s) {
57
- this.skipWhitespace();
58
- if (this.input.substr(this.pos, s.length) !== s) {
59
- throw new ParseError(`Token mismatch, expected ${JSON.stringify(s)}, found ${JSON.stringify(this.input.substr(this.pos, 20))}...`, this); // eslint-disable-line no-magic-numbers
60
- }
61
- this.pos += s.length;
62
- this.skipWhitespace();
63
- }
64
- tryMatch(s) {
65
- this.skipWhitespace();
66
- return (this.input.substr(this.pos, s.length) === s);
67
- // this.skipWhitespace()
68
- }
69
- skipWhitespace() {
70
- while (this.pos < this.input.length && this.isWhitespace(this.input[this.pos]))
71
- this.pos++;
72
- // shady
73
- if (this.input[this.pos] === '%') {
74
- while (this.pos < this.input.length && this.input[this.pos] !== '\n')
75
- this.pos++;
76
- while (this.pos < this.input.length && this.isWhitespace(this.input[this.pos]))
77
- this.pos++;
78
- }
79
- }
80
- value_braces() {
81
- let bracecount = 0;
82
- this.match('{');
83
- const start = this.pos;
84
- let math = false;
85
- while (true) { // eslint-disable-line no-constant-condition
86
- switch (this.input[this.pos]) {
87
- case '\\':
88
- this.pos += 1;
89
- break;
90
- case '{':
91
- bracecount++;
92
- break;
93
- case '}':
94
- if (bracecount === 0) {
95
- if (math)
96
- throw new ParseError('Unclosed math section', this);
97
- this.pos++;
98
- return this.input.substring(start, this.pos - 1);
99
- }
100
- bracecount--;
101
- break;
102
- case '$':
103
- math = !math;
104
- break;
105
- }
106
- this.pos++;
107
- if (this.pos >= this.input.length) {
108
- throw new ParseError(`Unterminated brace-value ${JSON.stringify(this.input.substr(start, 20))}`, this); // eslint-disable-line no-magic-numbers
109
- }
110
- }
111
- }
112
- value_quotes() {
113
- this.match('"');
114
- const start = this.pos;
115
- let bracecount = 0;
116
- while (true) { // eslint-disable-line no-constant-condition
117
- switch (this.input[this.pos]) {
118
- case '\\':
119
- this.pos += 1;
120
- break;
121
- case '{':
122
- bracecount++;
123
- break;
124
- case '}':
125
- bracecount--;
126
- break;
127
- case '"':
128
- if (bracecount <= 0) {
129
- this.pos++;
130
- return this.input.substring(start, this.pos - 1);
131
- }
132
- }
133
- this.pos++;
134
- if (this.pos >= this.input.length) {
135
- throw new ParseError(`Unterminated quote-value ${JSON.stringify(this.input.substr(start, 20))}`, this); // eslint-disable-line no-magic-numbers
136
- }
137
- }
138
- }
139
- single_value() {
140
- if (this.tryMatch('{')) {
141
- return this.value_braces();
142
- }
143
- else if (this.tryMatch('"')) {
144
- return this.value_quotes();
145
- }
146
- else {
147
- const bare = this.key();
148
- return this.strings[bare] || bare;
149
- }
150
- }
151
- value() {
152
- const values = [];
153
- values.push(this.single_value());
154
- while (this.tryMatch('#')) {
155
- this.match('#');
156
- values.push(this.single_value());
157
- }
158
- return values.join('');
159
- }
160
- key(allowUnicode = false) {
161
- const start = this.pos;
162
- while (true) { // eslint-disable-line no-constant-condition
163
- if (this.pos === this.input.length) {
164
- throw new ParseError('Runaway key', this);
165
- }
166
- if (this.input[this.pos].match(/['a-zA-Z0-9&;_:\\./-]/)) {
167
- this.pos++;
168
- }
169
- else if (allowUnicode && this.input[this.pos].match(letter)) {
170
- this.pos++;
171
- }
172
- else {
173
- return this.input.substring(start, this.pos);
174
- }
175
- }
176
- }
177
- key_equals_value() {
178
- const key = this.key();
179
- if (!this.tryMatch('=')) {
180
- throw new ParseError(`... = value expected, equals sign missing: ${JSON.stringify(this.input.substr(this.pos, 20))}...`, this); // eslint-disable-line no-magic-numbers
181
- }
182
- this.match('=');
183
- const val = this.value();
184
- if (this.parsing === 'string') {
185
- this.strings[key.toLowerCase()] = val;
186
- }
187
- else {
188
- this.entries[0].fields[key] = val;
189
- }
190
- }
191
- entry(_d) {
192
- this.entries[0].key = this.key(true);
193
- this.match(',');
194
- this.key_equals_value();
195
- while (this.tryMatch(',')) {
196
- this.match(',');
197
- // fixes problems with commas at the end of a list
198
- if (this.tryMatch('}')) {
199
- break;
200
- }
201
- this.key_equals_value();
202
- }
203
- }
204
- directive() {
205
- this.match('@');
206
- return this.key().toLowerCase();
207
- }
208
- string() {
209
- this.key_equals_value();
210
- }
211
- preamble() {
212
- this.value();
213
- }
214
- comment() {
215
- while (this.isWhitespace(this.input[this.pos], true))
216
- this.pos++;
217
- if (this.input[this.pos] === '{') {
218
- this.value_braces();
219
- return;
220
- }
221
- while (this.input[this.pos] !== '\n' && this.pos < this.input.length)
222
- this.pos++;
223
- }
224
- /*
225
- private progress() {
226
- const progress = Math.round((this.pos / this.input.length * 100) / 5) * 5 // eslint-disable-line no-magic-numbers
227
- if (this._progress !== progress) {
228
- this._progress = progress
229
- process.stdout.write(` (${this._progress}%) `)
230
- }
231
- }
232
- */
233
- hasMore() {
234
- if (this.max_entries && this.entries.length >= this.max_entries)
235
- return false;
236
- return (this.pos < this.input.length);
237
- }
238
- bibtex() {
239
- while (this.hasMore()) {
240
- this.parseNext();
241
- }
242
- }
243
- bibtexAsync() {
244
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
245
- return this.hasMore() ? (new Promise(resolve => resolve(this.parseNext()))).then(() => this.bibtexAsync()) : Promise.resolve(null);
246
- }
247
- matchGuard() {
248
- for (const guard of ['{}', '()']) {
249
- if (this.tryMatch(guard[0])) {
250
- this.match(guard[0]);
251
- return guard[1];
252
- }
253
- }
254
- throw new ParseError(`Token mismatch, expected '{' or '(', found ${JSON.stringify(this.input.substr(this.pos, 20))}...`, this); // eslint-disable-line no-magic-numbers
255
- }
256
- parseNext() {
257
- // this.progress()
258
- const chunk = {
259
- offset: {
260
- pos: this.pos,
261
- line: this.input.substring(0, this.pos).split('\n').length - 1,
262
- },
263
- error: null,
264
- text: null,
265
- };
266
- this.skipWhitespace();
267
- if (this.pos >= this.input.length)
268
- return;
269
- let guard = '';
270
- try {
271
- const d = this.parsing = this.directive();
272
- switch (d) {
273
- case 'string':
274
- guard = this.matchGuard();
275
- this.string();
276
- this.match(guard);
277
- chunk.stringDeclaration = true;
278
- break;
279
- case 'preamble':
280
- guard = this.matchGuard();
281
- this.preamble();
282
- this.match(guard);
283
- chunk.preamble = true;
284
- break;
285
- case 'comment':
286
- this.comment();
287
- chunk.comment = true;
288
- break;
289
- default:
290
- guard = this.matchGuard();
291
- this.entries.unshift({ type: d, fields: {} });
292
- this.entry(d);
293
- this.match(guard);
294
- chunk.entry = true;
295
- break;
296
- }
297
- }
298
- catch (err) {
299
- if (err.name !== 'ParseError')
300
- throw err;
301
- chunk.error = err.message;
302
- // skip ahead to the next @ and try again
303
- this.pos = chunk.offset.pos + 1;
304
- while (this.pos < this.input.length && this.input[this.pos] !== '@')
305
- this.pos++;
306
- /*
307
- if (!this.linebreaks) {
308
- this.linebreaks = []
309
- for (let pos = 0; pos < this.input.length; pos++) {
310
- if (this.input[pos] === '\n') this.linebreaks.push({ pos, line: this.linebreaks.length + 1 })
311
- }
312
- }
313
- const line = this.linebreaks.find(l => l.pos >= chunk.offset.pos)
314
- if (line) {
315
- chunk.offset.line = line.line
316
- chunk.offset.pos = chunk.offset.pos - line.pos
317
- }
318
- else {
319
- chunk.offset.line = 1
320
- }
321
- */
322
- }
323
- const text = this.input.substring(chunk.offset.pos, this.pos);
324
- const last = this.chunks.length - 1;
325
- if (chunk.error && this.chunks.length && this.chunks[last].error) {
326
- this.chunks[last].text += text;
327
- }
328
- else {
329
- chunk.text = text;
330
- this.chunks.push(chunk);
331
- }
332
- }
333
- }
334
- /**
335
- * Reads the bibtex input and splits it into separate chunks of `string`s, `@comment`s, and bibtex entries. Useful for detecting if a file is bibtex file and for filtering out basic errors that would
336
- * make the more sophisticated [[bibtex.parse]] reject the whole file
337
- *
338
- * @returns array of chunks, with markers for type and errors (if any) found.
339
- */
340
- function parse(input, options = {}) {
341
- return (new BibtexParser).parse(input, options);
342
- }
343
- exports.parse = parse;
344
- function entries(input, options = {}) {
345
- const parser = new BibtexParser;
346
- parser.parse(input, options);
347
- return {
348
- entries: parser.entries.reverse(),
349
- errors: parser.chunks.filter(chunk => chunk.error),
350
- };
351
- }
352
- exports.entries = entries;
353
- exports.promises = {
354
- async parse(input, options = {}) {
355
- return await (new BibtexParser).parseAsync(input, options);
356
- },
357
- };
358
- //# sourceMappingURL=chunker.js.map