wikibase-cli
Version:
A command-line interface to Wikibase
67 lines (63 loc) • 2.71 kB
JavaScript
export function minimizeClaimsOrSnaks (snaks) {
if (!snaks) return
// Support references nested snaks
if (snaks.snaks) snaks = snaks.snaks
Object.keys(snaks).forEach(property => {
const propSnaks = snaks[property]
// Known case: when the property was explicitly requested and thus set to null
// see ./drop_non_selected_subprops.js
if (!propSnaks) return
snaks[property] = propSnaks.map(snak => {
if (snak.snaktype === 'value') delete snak.snaktype
if (snak.rank === 'normal') delete snak.rank
if (snak.value) minimizeRichSnakValue(snak)
if (snak.qualifiers) {
minimizeClaimsOrSnaks(snak.qualifiers)
if (Object.keys(snak.qualifiers).length === 0) delete snak.qualifiers
}
if (snak.references) {
snak.references.forEach(minimizeClaimsOrSnaks)
if (snak.references.length === 0) delete snak.references
}
const keys = Object.keys(snak)
if (keys.length === 1 && keys[0] === 'value') return snak.value
else return snak
})
if (snaks[property].length === 1) snaks[property] = snaks[property][0]
})
}
function minimizeRichSnakValue (snak) {
const { value } = snak
if (typeof value !== 'object') return
if ('time' in value) {
minimizeRichTimeValue(snak, value)
} else if ('amount' in value) {
minimizeRichQuantityValue(snak, value)
}
}
function minimizeRichTimeValue (snak, value) {
const { precision } = value
if (value.timezone === 0) delete value.timezone
if (value.before === 0) delete value.before
if (value.after === 0) delete value.after
if (precision >= 9 && precision <= 11) delete value.precision
if (value.calendarmodel === 'http://www.wikidata.org/entity/Q1985727') delete value.calendarmodel
const remainingKeys = Object.keys(value)
if (remainingKeys.length === 1 && remainingKeys[0] === 'time') {
const { time } = value
const [ year, month, day ] = time.split('T')[0].split('-')
if (precision === 11) snak.value = `${year}-${month}-${day}`
else if (precision === 10) snak.value = `${year}-${month}`
else if (precision === 9) snak.value = `${year}`
}
}
function minimizeRichQuantityValue (snak, value) {
// Do not try to parse numbers with string reprensentations longer than 14 as the JS number encoding could start to make things funny
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_encoding
if (value.amount.length < 15) value.amount = parseFloat(value.amount)
if (value.unit === '1') delete value.unit
const remainingKeys = Object.keys(value)
if (remainingKeys.length === 1 && remainingKeys[0] === 'amount') {
snak.value = value.amount
}
}