@citation-js/plugin-quickstatements
Version:
Plugin that takes citation-js input and output QuickStatements.
66 lines (65 loc) • 1.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fillCaches = fillCaches;
exports.getOrcid = getOrcid;
var _core = require("@citation-js/core");
var _wikidataSdk = _interopRequireDefault(require("wikidata-sdk"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const QUERY_BUILDERS = {
issn: {
value: '?value wdt:P236 ?key',
key: items => items.map(item => item.ISSN)
},
orcid: {
value: '?value wdt:P496 ?key',
key: items => items.flatMap(item => (item.author || []).map(getOrcid))
},
language: {
value: '?value wdt:P218 ?key',
key: items => items.map(item => item.language)
},
languageWiki: {
value: '?value ^wdt:P424/wdt:P218 ?key',
key: items => items.map(item => item.language)
}
};
function unique(array) {
return array.filter((value, index, array) => array.indexOf(value) === index);
}
function buildQuery(type, items) {
const {
key,
value
} = QUERY_BUILDERS[type];
const keys = '"' + unique(key(items)).join('" "') + '"';
return `{ VALUES ?key { ${keys} } . ${value} . BIND("${type}" AS ?cache) }`;
}
function getOrcid(author) {
const orcid = author._orcid || author.ORCID || author._ORCID || author.orcid;
return orcid && orcid.replace(/^https?:\/\/orcid\.org\//, '');
}
function fillCaches(csl) {
const caches = {};
for (const cache in QUERY_BUILDERS) {
caches[cache] = {};
}
const queries = Object.keys(QUERY_BUILDERS).map(type => buildQuery(type, csl)).join(' UNION ');
const query = `SELECT ?key ?value ?cache WHERE { ${queries} }`;
try {
const url = _wikidataSdk.default.sparqlQuery(query);
const response = JSON.parse(_core.util.fetchFile(url));
const results = _wikidataSdk.default.simplify.sparqlResults(response);
for (const {
key,
value,
cache
} of results) {
caches[cache][key] = value;
}
} catch (e) {
_core.logger.error(e);
}
return caches;
}