UNPKG

astrocite-ris

Version:

Parser and AST for converting RIS to CSL JSON

199 lines (198 loc) 6.62 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread) || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); var astrocite_core_1 = require("astrocite-core"); var constants_1 = require("./constants"); var parser = require("./grammar"); function generateID() { return (String.fromCharCode(97 + Math.floor(Math.random() * 26)) + Math.round(Math.random() * Date.now()).toString(30)); } var curriedPage = function () { return function (first) { if (first === void 0) { first = { value: '' }; } return function (second) { if (second === void 0) { second = { value: '' }; } if (!first.key) return; return first.key === 'SP' ? { page: "" + first.value + (second.value === '' ? '' : '-' + second.value), } : { page: "" + (second.value ? second.value + '-' : '') + first.value }; }; }; }; var parseDateField = function (_a) { var key = _a.key, value = _a.value; var date = { 'date-parts': [value.split('/').slice(0, 3)] }; return key === 'Y2' ? { accessed: date } : { issued: date }; }; var parsePubmedIdentifier = function (_a) { var value = _a.value; return /PMC/i.test(value) ? { PMCID: value } : { PMID: value }; }; var parseIssueNumber = function (_a) { var value = _a.value, type = _a.type; switch (type) { case 'book': case 'chapter': case 'entry-dictionary': case 'entry-encyclopedia': return { ISBN: value }; case 'report': return { number: value }; default: return { ISSN: value }; } }; var DYNAMIC_FIELDS = new Map([ ['C2', parsePubmedIdentifier], ['SN', parseIssueNumber], ['DA', parseDateField], ['PY', parseDateField], ['Y1', parseDateField], ['Y2', parseDateField], ]); // tslint:disable cyclomatic-complexity var parseEntry = function (entry) { var e_1, _a, _b, e_2, _c, _d; var entryType = constants_1.TYPE_MAP.get(entry.type) || 'article'; var csl = { id: generateID(), type: entryType, }; var multiFields = { author: new Set(), editor: new Set(), translator: new Set(), keyword: new Set(), }; var page = curriedPage(); try { for (var _e = __values(entry.properties), _f = _e.next(); !_f.done; _f = _e.next()) { var prop = _f.value; var handler = DYNAMIC_FIELDS.get(prop.key); var key = constants_1.FIELD_MAP.get(prop.key); if (handler) { csl = __assign(__assign({}, csl), handler({ key: prop.key, value: prop.value, type: entryType, })); } if (key) { csl = __assign(__assign({}, csl), (_b = {}, _b[key] = prop.value, _b)); } switch (prop.key) { case 'AU': case 'A1': case 'A2': case 'A3': case 'A4': multiFields.author.add(astrocite_core_1.parseName(prop.value)); break; case 'ED': multiFields.editor.add(astrocite_core_1.parseName(prop.value)); break; case 'TA': multiFields.translator.add(astrocite_core_1.parseName(prop.value)); break; case 'KW': multiFields.keyword.add(prop.value); break; case 'SP': case 'EP': page = page({ key: prop.key, value: prop.value }); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_f && !_f.done && (_a = _e.return)) _a.call(_e); } finally { if (e_1) throw e_1.error; } } try { for (var _g = __values(Object.keys(multiFields)), _h = _g.next(); !_h.done; _h = _g.next()) { var key = _h.value; var value = multiFields[key]; if (multiFields[key].size > 0) { csl = __assign(__assign({}, csl), (_d = {}, _d[key] = __spread(value), _d)); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_h && !_h.done && (_c = _g.return)) _c.call(_g); } finally { if (e_2) throw e_2.error; } } while (typeof page === 'function') { page = page(); } return __assign(__assign({}, csl), (page ? page : {})); }; function parseCSL(source) { var e_3, _a; var ast = parser.parse(source); var csl = []; try { for (var _b = __values(ast.children), _c = _b.next(); !_c.done; _c = _b.next()) { var entry = _c.value; csl = __spread(csl, [parseEntry(entry)]); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_3) throw e_3.error; } } return csl; } exports.default = parseCSL;