wiki-entity
Version:
Wiki entity fetcher
113 lines (112 loc) • 4.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.exploreEntityClaims = exports.getEntities = void 0;
const types_1 = require("../types");
const api_1 = require("./api");
const simplify_entity_1 = require("./simplify_entity");
const utils_1 = require("../utils");
function getEntities(params) {
const claims = params.claims || "none";
const lang = params.language || "en";
return (0, api_1.getManyEntities)(params).then(function (entities) {
const ids = Object.keys(entities).filter((id) => (0, utils_1.isValidWikiId)(id));
ids.forEach((id) => {
entities[id] = (0, simplify_entity_1.simplifyEntity)(lang, entities[id]);
});
const tasks = [];
if (~["all", "property"].indexOf(claims)) {
tasks.push(exploreEntitiesProperties(entities, lang));
}
if (~["all", "item"].indexOf(claims)) {
tasks.push((0, utils_1.eachSeries)(ids, (id) => exploreEntityClaims(entities[id].claims, { language: lang })));
}
return Promise.all(tasks).then(() => entities);
});
}
exports.getEntities = getEntities;
function exploreEntitiesProperties(entities, lang) {
let ids = [];
const entitiesIds = Object.keys(entities);
entitiesIds.forEach((entityId) => {
const entity = entities[entityId];
if (entity.claims) {
ids = ids.concat(Object.keys(entity.claims));
}
});
if (!ids.length) {
return Promise.resolve();
}
ids = (0, utils_1.uniq)(ids);
return getEntities({
ids: ids,
language: lang,
props: [
types_1.WikidataPropsParam.info,
types_1.WikidataPropsParam.labels,
types_1.WikidataPropsParam.descriptions,
types_1.WikidataPropsParam.datatype
],
claims: "none"
}).then(function (properties) {
Object.keys(properties).forEach((propertyId) => {
entitiesIds.forEach((entityId) => {
const entity = entities[entityId];
if (entity.claims && entity.claims[propertyId]) {
if (entity.claims && entity.claims[propertyId]) {
for (var prop in properties[propertyId]) {
if (~["label", "description"].indexOf(prop)) {
entity.claims[propertyId][prop] = properties[propertyId][prop];
}
}
}
}
});
});
return entities;
});
}
function exploreEntityClaims(claims, params) {
if (!claims) {
return Promise.resolve();
}
const ids = [];
const paths = {};
Object.keys(claims).forEach((property) => {
claims[property].values.forEach((propertyValue, index) => {
if (propertyValue.datatype === "wikibase-item") {
const id = propertyValue.value;
paths[id] = paths[id] || [];
paths[id].push({ pid: property, value: propertyValue, index });
if (ids.indexOf(id) < 0) {
ids.push(id);
}
}
});
});
if (ids.length === 0) {
return Promise.resolve();
}
params.ids = ids;
params.props = params.props || [
types_1.WikidataPropsParam.info,
types_1.WikidataPropsParam.labels,
types_1.WikidataPropsParam.descriptions,
types_1.WikidataPropsParam.datatype
];
params.claims = params.claims || "none";
return getEntities(params).then((entities) => {
Object.keys(entities).forEach((id) => {
const item = entities[id];
const pa = paths[item.id] || [];
pa.forEach((pai) => {
const val = claims[pai.pid].values[pai.index];
for (var prop in item) {
if (~["label", "description"].indexOf(prop)) {
val[prop] = item[prop];
}
}
});
});
});
}
exports.exploreEntityClaims = exploreEntityClaims;