wiki-entity
Version:
Wiki entity fetcher
101 lines (100 loc) • 3.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.simplifyClaim = exports.simplifyPropertyClaims = exports.simplifyClaims = void 0;
function simplifyClaims(claims) {
const simpleClaims = {};
for (let id in claims) {
let propClaims = claims[id];
simpleClaims[id] = simplifyPropertyClaims(propClaims, id);
if (simpleClaims[id].values.length === 0) {
delete simpleClaims[id];
}
}
return simpleClaims;
}
exports.simplifyClaims = simplifyClaims;
function simplifyPropertyClaims(propClaims, id) {
const prop = {
id,
values: propClaims
.map((claim) => simplifyClaim(claim))
.filter((item) => item && (item.value_string || item.value !== null))
};
return prop;
}
exports.simplifyPropertyClaims = simplifyPropertyClaims;
function simplifyClaim(claim) {
const { mainsnak, qualifiers } = claim;
if (mainsnak === null)
return null;
const { datatype, datavalue } = mainsnak;
if (datavalue === null || datavalue === undefined || datavalue.value === null)
return null;
let value = null;
let value_string;
switch (datatype) {
case "string":
case "commonsMedia":
case "url":
case "external-id":
value = datavalue.value;
break;
case "monolingualtext":
value = datavalue.value.text;
break;
case "wikibase-item":
value = datavalue.value.id;
break;
case "wikibase-property":
value = datavalue.value;
break;
case "time":
value = datavalue.value;
value_string = stringDatetime(datavalue.value);
break;
case "quantity":
value = datavalue.value;
value_string = parseFloat(datavalue.value.amount).toString();
break;
case "globe-coordinate":
value = datavalue.value;
value_string = getLatLngFromCoordinates(datavalue.value).join(",");
break;
}
const simpleQualifiers = {};
for (let qualifierProp in qualifiers) {
simpleQualifiers[qualifierProp] = qualifiers[qualifierProp].map(prepareQualifierClaim);
}
const result = {
datatype,
value,
qualifiers: simplifyClaims(simpleQualifiers)
};
if (value_string) {
result["value_string"] = value_string;
}
return result;
}
exports.simplifyClaim = simplifyClaim;
const getLatLngFromCoordinates = (value) => [
value.latitude.toFixed(4).replace(/[0]+$/, "").replace(/\.$/, ""),
value.longitude.toFixed(4).replace(/[0]+$/, "").replace(/\.$/, "")
];
const prepareQualifierClaim = (claim) => ({ mainsnak: claim });
const stringDatetime = (value) => {
let date = value.time;
const p = value.precision;
if (p >= 9) {
date = date.substr(1);
if (p < 12) {
date = date.split("T")[0];
if (p === 10) {
date = date.split("-").slice(0, 2).join("-");
}
else if (p === 9) {
date = date.split("-")[0];
}
}
}
return date;
};