elliptical-datetime
Version:
Elliptical phrases to handle natural language dates and times
323 lines (255 loc) • 8.28 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
exports.join = join;
exports.negateDuration = negateDuration;
exports.relativeTime = relativeTime;
exports.absoluteTime = absoluteTime;
exports.ambiguousTime = ambiguousTime;
exports.absoluteDate = absoluteDate;
exports.absoluteDay = absoluteDay;
exports.relativeDate = relativeDate;
exports.relativeDay = relativeDay;
exports.validateDay = validateDay;
exports.possibleDates = possibleDates;
exports.timeLessThan = timeLessThan;
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _marked = [possibleDates].map(_regenerator2.default.mark);
// combine a the date components of a Date object and the time components of {hour, minute, second}
// date: moment, Date, or {year, month, day}
// time: {hour, minute, second}
// timezoneOffset = new Date().getTimezoneOffset() from the user's system
function join(date, time, timezoneOffset) {
if (timezoneOffset == null) {
return (0, _moment2.default)(date).set(time).toDate();
} else {
var mom = (0, _moment2.default)(date);
var yearComponents = { year: mom.year(), month: mom.month(), date: mom.date() };
return (0, _moment2.default)().utcOffset(-timezoneOffset).set(yearComponents).set(time).toDate();
}
}
function negateDuration(duration) {
return _lodash2.default.mapValues(duration, function (num) {
return -num;
});
}
function relativeTime(duration, now) {
var newTime = (0, _moment2.default)(now).add(_moment2.default.duration(duration));
return { hour: newTime.hour(), minute: newTime.minute(), second: newTime.second() };
}
function absoluteTime(absolute) {
return { hour: absolute.hour, minute: absolute.minute || 0, second: absolute.second || 0 };
}
function ambiguousTime(ambiguousTime, ampm) {
// special case for 24:00
if (ambiguousTime.hour === 24 && (ampm || ambiguousTime.minute || ambiguousTime.second)) {
return null;
}
// special case for 0:00
if (ambiguousTime.hour === 0 && ampm) {
return null;
}
var hour = ampmHourToHour(ambiguousTime.hour, ampm);
if (ampm === 'am' && (hour > 12 || hour < 0) || ampm === 'pm' && (hour < 12 || hour > 23)) {
return null;
}
return { hour: hour, minute: ambiguousTime.minute || 0, second: ambiguousTime.second || 0 };
}
function ampmHourToHour(hour, ampm) {
if (ampm) {
if (hour === 12) {
return ampm === 'am' ? 0 : 12;
} else {
return ampm === 'am' ? hour : hour + 12;
}
} else {
if (hour === 24) {
return 0;
} else {
return hour;
}
}
}
// export function coerceAmbiguousTime (ambiguousTime, range) {
// if (_.inRange(ambiguousTime.hour, ...range)) {
// return ambiguousTime
// } else {
// return {hour: ambiguousTime.hour < 12 ? ambiguousTime.hour + 12 : ambiguousTime.hour - 12, minute: ambiguousTime.minute, second: ambiguousTime.second}
// }
// }
function absoluteDate(absolute) {
return (0, _moment2.default)(absolute).toDate();
}
function absoluteDay(absolute) {
return {
month: absolute.month == null ? (0, _moment2.default)().month() : absolute.month,
day: absolute.day == null ? _moment2.default.day() : absolute.day
};
}
function relativeDate(duration) {
var now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return (0, _moment2.default)(now).add(_moment2.default.duration(duration)).toDate();
}
function relativeDay(duration) {
var now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var newMoment = (0, _moment2.default)(now).year(2010).add(_moment2.default.duration(duration)); // not leap year
return { month: newMoment.month(), day: newMoment.date() };
}
function validateDay() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
month = _ref.month,
day = _ref.day,
_ref$year = _ref.year,
year = _ref$year === undefined ? 2012 : _ref$year;
//leap year
if (_lodash2.default.isUndefined(month) || _lodash2.default.isUndefined(day)) return true;
var dateMoment = (0, _moment2.default)({ year: year, month: month, day: day });
return dateMoment.month() === month;
}
function possibleDates(obj, referenceDate) {
var _arr, _i, i, _arr2, _i2, _i3, _arr3, _i4, j, _arr4, _i5, _i6, _arr5, _i7, _i8, _arr6, _i9, _i10;
return _regenerator2.default.wrap(function possibleDates$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!obj.date) {
_context.next = 60;
break;
}
if (!obj._ambiguousWeek) {
_context.next = 13;
break;
}
_arr = [0, 7, -7, 14, -14];
_i = 0;
case 4:
if (!(_i < _arr.length)) {
_context.next = 11;
break;
}
i = _arr[_i];
_context.next = 8;
return (0, _moment2.default)(obj.date).add(i, 'days').toDate();
case 8:
_i++;
_context.next = 4;
break;
case 11:
_context.next = 58;
break;
case 13:
if (!obj._ambiguousYear) {
_context.next = 44;
break;
}
if (!obj._ambiguousMonth) {
_context.next = 33;
break;
}
_arr2 = [0, 1, -1];
_i2 = 0;
case 17:
if (!(_i2 < _arr2.length)) {
_context.next = 31;
break;
}
_i3 = _arr2[_i2];
_arr3 = [0, 1, -1];
_i4 = 0;
case 21:
if (!(_i4 < _arr3.length)) {
_context.next = 28;
break;
}
j = _arr3[_i4];
_context.next = 25;
return (0, _moment2.default)(obj.date).add(_i3, 'years').add(j, 'months').toDate();
case 25:
_i4++;
_context.next = 21;
break;
case 28:
_i2++;
_context.next = 17;
break;
case 31:
_context.next = 42;
break;
case 33:
_arr4 = [0, 1, -1];
_i5 = 0;
case 35:
if (!(_i5 < _arr4.length)) {
_context.next = 42;
break;
}
_i6 = _arr4[_i5];
_context.next = 39;
return (0, _moment2.default)(obj.date).add(_i6, 'years').toDate();
case 39:
_i5++;
_context.next = 35;
break;
case 42:
_context.next = 58;
break;
case 44:
if (!obj._ambiguousCentury) {
_context.next = 56;
break;
}
_arr5 = [0, 100, -100];
_i7 = 0;
case 47:
if (!(_i7 < _arr5.length)) {
_context.next = 54;
break;
}
_i8 = _arr5[_i7];
_context.next = 51;
return (0, _moment2.default)(obj.date).add(_i8, 'years').toDate();
case 51:
_i7++;
_context.next = 47;
break;
case 54:
_context.next = 58;
break;
case 56:
_context.next = 58;
return obj.date;
case 58:
_context.next = 69;
break;
case 60:
_arr6 = [0, 1, -1];
_i9 = 0;
case 62:
if (!(_i9 < _arr6.length)) {
_context.next = 69;
break;
}
_i10 = _arr6[_i9];
_context.next = 66;
return (0, _moment2.default)(referenceDate).add(_i10, 'days').toDate();
case 66:
_i9++;
_context.next = 62;
break;
case 69:
case 'end':
return _context.stop();
}
}
}, _marked[0], this);
}
function timeLessThan(a, b) {
return a.hour < b.hour || a.hour === b.hour && a.minute < b.minute || a.hour === b.hour && a.minute === b.minute && a.second < b.second;
}