astrocite-ris
Version:
Parser and AST for converting RIS to CSL JSON
199 lines (198 loc) • 6.62 kB
JavaScript
;
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;