wikibase-sdk
Version:
utils functions to query a Wikibase instance and simplify its results
128 lines • 4.18 kB
JavaScript
import { wikibaseTimeToEpochTime, wikibaseTimeToISOString, wikibaseTimeToSimpleDay } from './time.js';
function stringValue(datavalue) {
return datavalue.value;
}
function monolingualtext(datavalue, options) {
return options.keepRichValues ? datavalue.value : datavalue.value.text;
}
function entity(datavalue, options) {
const { entityPrefix: prefix } = options;
const { value } = datavalue;
let id;
if (value.id) {
id = value.id;
}
else {
// Legacy
const letter = entityLetter[value['entity-type']];
id = `${letter}${value['numeric-id']}`;
}
return typeof prefix === 'string' ? `${prefix}:${id}` : id;
}
const entityLetter = {
item: 'Q',
'entity-schema': 'E',
lexeme: 'L',
property: 'P',
form: 'F',
sense: 'S',
};
function quantity(datavalue, options) {
const { value } = datavalue;
const amount = parseFloat(value.amount);
if (options.keepRichValues) {
const richValue = {
amount: parseFloat(value.amount),
// ex: http://www.wikidata.org/entity/
unit: value.unit.replace(/^https?:\/\/.*\/entity\//, ''),
};
if (value.upperBound != null)
richValue.upperBound = parseFloat(value.upperBound);
if (value.lowerBound != null)
richValue.lowerBound = parseFloat(value.lowerBound);
return richValue;
}
else {
return amount;
}
}
function coordinate(datavalue, options) {
if (options.keepRichValues) {
return datavalue.value;
}
else {
return [datavalue.value.latitude, datavalue.value.longitude];
}
}
function time(datavalue, options) {
let timeValue;
if (typeof options.timeConverter === 'function') {
timeValue = options.timeConverter(datavalue.value);
}
else {
timeValue = getTimeConverter(options.timeConverter)(datavalue.value);
}
if (options.keepRichValues) {
const { timezone, before, after, precision, calendarmodel } = datavalue.value;
return { time: timeValue, timezone, before, after, precision, calendarmodel };
}
else {
return timeValue;
}
}
// Each time converter should be able to accept 2 keys of arguments:
// - either datavalue.value objects (prefered as it gives access to the precision)
// - or the time string (datavalue.value.time)
export const timeConverters = {
iso: wikibaseTimeToISOString,
epoch: wikibaseTimeToEpochTime,
'simple-day': wikibaseTimeToSimpleDay,
none: (wikibaseTime) => typeof wikibaseTime === 'string' ? wikibaseTime : wikibaseTime.time,
};
function getTimeConverter(key = 'iso') {
const converter = timeConverters[key];
if (!converter)
throw new Error(`invalid converter key: ${JSON.stringify(key).substring(0, 100)}`);
return converter;
}
export const parsers = {
commonsMedia: stringValue,
'external-id': stringValue,
'entity-schema': entity,
'geo-shape': stringValue,
'globe-coordinate': coordinate,
localMedia: stringValue,
math: stringValue,
monolingualtext,
'musical-notation': stringValue,
quantity,
string: stringValue,
'tabular-data': stringValue,
time,
url: stringValue,
'wikibase-form': entity,
'wikibase-item': entity,
'wikibase-lexeme': entity,
'wikibase-property': entity,
'wikibase-sense': entity,
};
const legacyParsers = {
'musical notation': parsers['musical-notation'],
// Known case: mediainfo won't have datatype="globe-coordinate", but datavalue.type="globecoordinate"
globecoordinate: parsers['globe-coordinate'],
};
export function parseSnak(datatype, datavalue, options) {
let parser;
if (datatype) {
// @ts-expect-error legacyParsers datatypes aren't in DataValueByDataType
parser = parsers[datatype] || legacyParsers[datatype];
}
else {
parser = parsers[datavalue.type];
}
if (!parser) {
throw new Error(`${datatype} claim parser isn't implemented. Please report to https://github.com/maxlath/wikibase-sdk/issues`);
}
return parser(datavalue, options);
}
//# sourceMappingURL=parse_snak.js.map