@citation-js/plugin-wikidata
Version:
Plugin for Wikidata for Citation.js
211 lines (210 loc) • 5.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TYPE_PRIORITIES = void 0;
exports.getLabel = getLabel;
exports.default = exports.parse = exports.parseProp = parseProp;
exports.parseType = parseType;
var _core = require("@citation-js/core");
var _name = require("@citation-js/name");
var _date = require("@citation-js/date");
var _config = _interopRequireDefault(require("./config.json"));
var _types = _interopRequireDefault(require("./types.json"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function getNameString({
value,
qualifiers
}) {
if (Array.isArray(qualifiers.P1932) && typeof qualifiers.P1932[0] === 'string') {
return qualifiers.P1932[0];
}
if (typeof value === 'object' && value !== null) {
return getLabel(value);
}
if (typeof value === 'string') {
return value;
}
return null;
}
function parseName(claim) {
const nameString = getNameString(claim);
if (nameString === null) {
return {
literal: null
};
}
const {
value,
qualifiers
} = claim;
const isPerson = typeof value !== 'object' || value && value.claims.P31 && value.claims.P31.some(claim => claim.value === 'Q5');
const name = isPerson ? (0, _name.parse)(nameString) : {
literal: nameString
};
const ordinal = qualifiers.P1545 ? parseInt(qualifiers.P1545[0]) : null;
if (ordinal !== null) {
name._ordinal = ordinal;
}
return name;
}
function parseNames(values) {
return values.map(parseName).sort((a, b) => a._ordinal - b._ordinal);
}
function getPlace(value) {
const country = value.claims.P17[0].value;
const shortNames = country.claims.P1813.filter(({
qualifiers: {
P31
}
}) => !P31 || P31[0] !== 'Q28840786');
return getLabel(value) + ', ' + (shortNames[0] || country.claims.P1448[0]).value;
}
function getTitle(value) {
return value.claims.P1476 ? value.claims.P1476[0].value : getLabel(value);
}
function parseKeywords(values) {
return values.map(({
value
}) => getLabel(value)).join(',');
}
function parseDateRange(dates) {
return {
'date-parts': dates.map(date => (0, _date.parse)(date.value)).filter(date => date && date['date-parts']).map(date => date['date-parts'][0])
};
}
function parseVersion(version) {
const output = {
version: version.value
};
if (version.qualifiers.P577) {
output.issued = (0, _date.parse)(version.qualifiers.P577[0]);
}
if (version.qualifiers.P356) {
output.DOI = version.qualifiers.P356[0];
}
if (version.qualifiers.P6138) {
output.SWHID = version.qualifiers.P6138[0];
}
return output;
}
const TYPE_PRIORITIES = exports.TYPE_PRIORITIES = {
'review-book': 10,
review: 9,
'entry-dictionary': 5,
'entry-encyclopedia': 5,
map: 5,
dataset: 4,
legislation: 1,
'article-magazine': 0,
bill: 0,
chapter: 0,
classic: 0,
collection: 0,
entry: 0,
figure: 0,
graphic: 0,
hearing: 0,
interview: 0,
legal_case: 0,
manuscript: 0,
motion_picture: 0,
musical_score: 0,
pamphlet: 0,
'paper-conference': 0,
patent: 0,
personal_communication: 0,
'post-weblog': 0,
report: 0,
song: 0,
speech: 0,
standard: 0,
thesis: 0,
treaty: 0,
broadcast: -1,
'article-newspaper': -1,
'article-journal': -1,
periodical: -2,
regulation: -2,
post: -5,
webpage: -6,
software: -7,
article: -9,
book: -10,
performance: -11,
event: -12,
document: -100
};
function parseProp(prop, value, entity) {
switch (prop) {
case 'type':
return parseType(value);
case 'author':
case 'chair':
case 'curator':
case 'container-author':
case 'collection-editor':
case 'composer':
case 'director':
case 'editor':
case 'executive-producer':
case 'guest':
case 'host':
case 'illustrator':
case 'narrator':
case 'organizer':
case 'original-author':
case 'performer':
case 'producer':
case 'recipient':
case 'reviewed-author':
case 'script-writer':
case 'translator':
return parseNames(value);
case 'issued':
case 'original-date':
return (0, _date.parse)(value);
case 'event-date':
return parseDateRange(value);
case 'keyword':
return parseKeywords(value);
case 'container-title':
case 'collection-title':
case 'event-title':
case 'medium':
case 'publisher':
case 'original-publisher':
return getTitle(value);
case 'event-place':
case 'jurisdiction':
case 'original-publisher-place':
case 'publisher-place':
return getPlace(value);
case 'chapter-number':
case 'collection-number':
return parseInt(value[0]);
case 'number-of-volumes':
return value.length;
case 'versions':
return value.map(parseVersion);
default:
return value;
}
}
function parseType(type) {
const unmapped = Array.isArray(type) ? type : [type];
const mapped = unmapped.map(type => _types.default[type.value]).filter(Boolean);
if (!mapped.length) {
_core.logger.unmapped('[plugin-wikidata]', 'publication type', type);
return 'document';
}
mapped.sort((a, b) => TYPE_PRIORITIES[b] - TYPE_PRIORITIES[a]);
return mapped[0];
}
function getLabel(entity) {
if (!entity) {
return undefined;
}
const lang = _config.default.langs.find(lang => entity.labels[lang]);
return entity.labels[lang];
}