@citation-js/plugin-ris
Version:
Plugin for RIS formats for Citation.js
144 lines • 3.41 kB
JavaScript
import { parse as parseDate } from '@citation-js/date';
import TYPES from './spec/types.json';
const ISSN_REGEX = /^\d{4}-\d{3}[0-9Xx]$/;
const DOI_REGEX = /10(?:\.[0-9]{4,})?\/[^\s]*[^\s.,]/;
const CONVERTERS = {
ANY: {
toTarget(...values) {
return values.find(Boolean);
},
toSource(value) {
return [value];
}
},
PAGE: {
keepAll: true,
toTarget(start, end) {
return [start, end].filter(Boolean).join('-');
},
toSource(pages) {
return pages.replace(/[-–—]/g, '-');
}
},
ISBN: {
toTarget(id) {
return ISSN_REGEX.test(id) ? [id] : [undefined, id];
},
toSource(...ids) {
return ids.find(Boolean);
}
},
DATE: {
toTarget(date) {
return date && parseDate(date.split('/').slice(0, 3).filter(Boolean).join('/'));
},
toSource(date) {
if (!date['date-parts'] || !date['date-parts'][0]) {
return undefined;
}
const parts = Array(4).fill('');
date['date-parts'][0].forEach((part, index) => {
parts[index] = part;
});
if (date.season) {
parts[3] = date.season;
}
return parts.join('/');
}
},
YEAR: {
toTarget(year) {
return isNaN(+year) ? {
raw: year
} : {
'date-parts': [[+year]]
};
},
toSource(date) {
var _date$dateParts;
return (_date$dateParts = date['date-parts']) === null || _date$dateParts === void 0 || (_date$dateParts = _date$dateParts[0]) === null || _date$dateParts === void 0 || (_date$dateParts = _date$dateParts[0]) === null || _date$dateParts === void 0 ? void 0 : _date$dateParts.toString();
}
},
DATE_YEAR: {
keepAll: true,
toTarget(...dates) {
return CONVERTERS.DATE.toTarget(CONVERTERS.ANY.toTarget(...dates));
},
toSource(date) {
return [CONVERTERS.DATE.toSource(date), CONVERTERS.YEAR.toSource(date)];
}
},
NAME: {
toTarget(names) {
return names && [].concat(names).map(name => {
const parts = name.split(/, ?/);
const [family, given, suffix] = parts;
switch (parts.length) {
case 3:
return {
family,
given,
suffix
};
case 2:
return {
family,
given
};
case 1:
if (family.indexOf(' ') === -1) {
return {
family
};
}
default:
return {
literal: name
};
}
});
},
toSource(names) {
return names.map(({
family,
given,
suffix,
literal
}) => {
const parts = [family, given, suffix].filter(Boolean);
return parts.length ? parts.join(', ') : literal;
});
}
},
KEYWORD: {
toTarget(words) {
words = [].concat(words);
return words.join(',');
},
toSource(words) {
return words.split(',');
}
},
ID: {
toSource(id) {
return id.toString().slice(0, 20);
}
},
TYPE: {
toTarget(type) {
return TYPES.RIS[type];
},
toSource(type) {
return TYPES.CSL[type];
}
},
DOI: {
toTarget(doi) {
return doi.match(DOI_REGEX)[0];
},
toSource(doi) {
return doi.match(DOI_REGEX)[0];
}
}
};
export default CONVERTERS;