wikibase-edit
Version:
Edit Wikibase from NodeJS
66 lines • 2.31 kB
JavaScript
import { isPlainObject } from '../utils.js';
import { parseCalendar } from './parse_calendar.js';
export function getTimeObject(value) {
let time, precision, calendar, calendarmodel, timezone, before, after;
if (isPlainObject(value)) {
({ time, precision, calendar, calendarmodel, timezone, before, after } = value);
calendarmodel = calendarmodel || calendar;
}
else {
time = value;
}
time = time
// It could be a year passed as an integer
.toString()
// Drop milliseconds from ISO time strings as those aren't represented in Wikibase anyway
// ex: '2019-04-01T00:00:00.000Z' -> '2019-04-01T00:00:00Z'
.replace('.000Z', 'Z')
.replace(/^\+/, '');
if (precision == null)
precision = getPrecision(time);
const timeStringBase = getTimeStringBase(time, precision);
return getPrecisionTimeObject(timeStringBase, precision, calendarmodel, timezone, before, after);
}
function getTimeStringBase(time, precision) {
if (precision > 10)
return time;
if (precision === 10) {
if (time.match(/^-?\d+-\d+$/))
return time + '-00';
else
return time;
}
// From the year (9) to the billion years (0)
// See https://www.wikidata.org/wiki/Help:Dates#Precision
const yearMatch = time.match(/^(-?\d+)/);
if (yearMatch == null)
throw new Error(`couldn't identify year: ${time}`);
const year = yearMatch[0];
return year + '-00-00';
}
// Guess precision from time string
// 2018 (year): 9
// 2018-03 (month): 10
// 2018-03-03 (day): 11
function getPrecision(time) {
const unsignedTime = time.replace(/^-/, '');
return unsignedTime.split('-').length + 8;
}
function getPrecisionTimeObject(time, precision, calendarmodel, timezone = 0, before = 0, after = 0) {
const sign = time[0];
// The Wikidata API expects signed years
// Default to a positive year sign
if (sign !== '-' && sign !== '+')
time = `+${time}`;
if (precision <= 11 && !time.match('T'))
time += 'T00:00:00Z';
return {
time,
timezone,
before,
after,
precision,
calendarmodel: parseCalendar(calendarmodel, time),
};
}
//# sourceMappingURL=get_time_object.js.map