elliptical-datetime
Version:
Elliptical phrases to handle natural language dates and times
482 lines (401 loc) • 14.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.InternalDateTime = exports.DateTime = undefined;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _elliptical = require('elliptical');
var _time = require('./time');
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _helpers = require('./helpers');
var _date = require('./date');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _marked = [getDateTimeResults, getDateTimeOptions].map(_regenerator2.default.mark); /** @jsx createElement */
function isNoonOrMidnight(time) {
return (time.hour === 12 || time.hour === 0) && !time.minute && !time.second;
}
function timeIsInAMPM(time, ampm) {
if (ampm === 'am') {
return time.hour >= 0 && time.hour < 12;
} else if (ampm === 'pm') {
return time.hour >= 12 && time.hour < 24;
}
}
var TrueDate = {
describe: function describe(_ref) {
var props = _ref.props;
return (0, _elliptical.createElement)(
'sequence',
null,
(0, _elliptical.createElement)(
'choice',
{ merge: true },
(0, _elliptical.createElement)(_date.InternalDate, (0, _extends3.default)({}, props, { id: undefined })),
(0, _elliptical.createElement)(
'map',
{ 'function': function _function(result) {
return { date: result };
}, skipIncomplete: true },
(0, _elliptical.createElement)(_date.Date, (0, _extends3.default)({}, props, { nullify: true }))
)
)
);
}
};
function getDateTimeResults(result, props) {
var dates, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, date, _arr, _i, i;
return _regenerator2.default.wrap(function getDateTimeResults$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
dates = void 0;
if (result.date) {
if (result._ambiguousWeek) {
dates = _lodash2.default.map([0, 1, -1], function (weeks) {
return (0, _moment2.default)(result.date).add(weeks, 'weeks').toDate();
});
} else if (result._ambiguousCentury) {
dates = _lodash2.default.map([0, 100, -100], function (years) {
return (0, _moment2.default)(result.date).add(years, 'years').toDate();
});
} else if (result._ambiguousYear) {
if (result._ambiguousMonth) {
dates = _lodash2.default.flatMap([0, 1, -1], function (y) {
return _lodash2.default.map([0, 1, -1], function (m) {
return (0, _moment2.default)(result.date).add(y, 'years').add(m, 'months').toDate();
});
});
} else {
dates = _lodash2.default.map([0, 1, -1], function (years) {
return (0, _moment2.default)(result.date).add(years, 'years').toDate();
});
}
} else {
dates = [result.date];
}
} else {
dates = [undefined];
}
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 5;
_iterator = dates[Symbol.iterator]();
case 7:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 37;
break;
}
date = _step.value;
if (!(date && result.time)) {
_context.next = 14;
break;
}
_context.next = 12;
return (0, _helpers.join)(date, result.time, props.timezoneOffset);
case 12:
_context.next = 34;
break;
case 14:
if (!(result.time && result.relativeDate)) {
_context.next = 19;
break;
}
_context.next = 17;
return (0, _helpers.join)((0, _helpers.relativeDate)(result.relativeDate), result.time, props.timezoneOffset);
case 17:
_context.next = 34;
break;
case 19:
if (!date) {
_context.next = 24;
break;
}
_context.next = 22;
return (0, _helpers.join)(date, props.defaultTime, props.timezoneOffset);
case 22:
_context.next = 34;
break;
case 24:
if (!result.time) {
_context.next = 34;
break;
}
_arr = [0, 1, -1];
_i = 0;
case 27:
if (!(_i < _arr.length)) {
_context.next = 34;
break;
}
i = _arr[_i];
_context.next = 31;
return (0, _helpers.join)((0, _helpers.relativeDate)({ days: i }), result.time, props.timezoneOffset);
case 31:
_i++;
_context.next = 27;
break;
case 34:
_iteratorNormalCompletion = true;
_context.next = 7;
break;
case 37:
_context.next = 43;
break;
case 39:
_context.prev = 39;
_context.t0 = _context['catch'](5);
_didIteratorError = true;
_iteratorError = _context.t0;
case 43:
_context.prev = 43;
_context.prev = 44;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 46:
_context.prev = 46;
if (!_didIteratorError) {
_context.next = 49;
break;
}
throw _iteratorError;
case 49:
return _context.finish(46);
case 50:
return _context.finish(43);
case 51:
case 'end':
return _context.stop();
}
}
}, _marked[0], this, [[5, 39, 43, 51], [44,, 46, 50]]);
}
function getDateTimeOptions(option, props) {
var _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, result;
return _regenerator2.default.wrap(function getDateTimeOptions$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context2.prev = 3;
_iterator2 = getDateTimeResults(option.result, props)[Symbol.iterator]();
case 5:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context2.next = 12;
break;
}
result = _step2.value;
_context2.next = 9;
return _lodash2.default.assign({}, option, { result: result });
case 9:
_iteratorNormalCompletion2 = true;
_context2.next = 5;
break;
case 12:
_context2.next = 18;
break;
case 14:
_context2.prev = 14;
_context2.t0 = _context2['catch'](3);
_didIteratorError2 = true;
_iteratorError2 = _context2.t0;
case 18:
_context2.prev = 18;
_context2.prev = 19;
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
case 21:
_context2.prev = 21;
if (!_didIteratorError2) {
_context2.next = 24;
break;
}
throw _iteratorError2;
case 24:
return _context2.finish(21);
case 25:
return _context2.finish(18);
case 26:
case 'end':
return _context2.stop();
}
}
}, _marked[1], this, [[3, 14, 18, 26], [19,, 21, 25]]);
}
// function filterDateTimeResult (result) {
// return true
// }
var DateTime = exports.DateTime = {
id: 'elliptical-datetime:DateTime',
defaultProps: {
defaultTime: { hour: 8, minute: 0, second: 0 },
past: true,
future: true,
prepositions: false,
label: 'date and time'
},
filterResult: function filterResult(result, _ref2) {
var props = _ref2.props;
if (!props.past && (0, _moment2.default)().isAfter(result)) {
return false;
}
if (!props.future && (0, _moment2.default)().isBefore(result)) {
return false;
}
return true;
},
describe: function describe(_ref3) {
var props = _ref3.props;
return props.nullify ? null : (0, _elliptical.createElement)(
'map',
{ outbound: function outbound(option) {
return getDateTimeOptions(option, props);
}, limit: 1, skipIncomplete: true },
(0, _elliptical.createElement)(InternalDateTime, props)
);
}
};
function filterInternalDateTime(option) {
var result = option.result;
/*if (option.result.time && option.result.time._ambiguousAMPM &&
!option.result.timeOfDay) {
return false
} else */if (result.time && result.timeOfDay && isNoonOrMidnight(result.time)) {
return false;
} else if (result.time && result.timeOfDay && !result.time._ambiguousAMPM && !timeIsInAMPM(result.time, result.timeOfDay.impliedAMPM)) {
return false;
}
return true;
}
var InternalDateTime = exports.InternalDateTime = {
defaultProps: {
label: 'date and time'
},
mapResult: function mapResult(result) {
var time = result.time;
if (result.timeOfDay && result.time && result.time._ambiguousAMPM) {
time = (0, _helpers.ambiguousTime)(result.time, result.timeOfDay.impliedAMPM);
} else if (result.timeOfDay && !result.time) {
time = { hour: result.timeOfDay.default };
}
var date = result.date && result.date.date;
if (result.relativeDate) {
date = (0, _helpers.relativeDate)(result.relativeDate);
}
// console.log(result)
return {
date: date,
time: time,
_ambiguousYear: result.date && result.date._ambiguousYear,
_ambiguousCentury: result.date && result.date._ambiguousCentury,
_ambiguousWeek: result.date && result.date._ambiguousWeek,
_ambiguousMonth: result.date && result.date._ambiguousMonth,
_ambiguousAMPM: result.time && result.time._ambiguousAMPM,
_specificAMPM: result.time && result.time._specificAMPM
};
},
describe: function describe(_ref4) {
var props = _ref4.props;
return (0, _elliptical.createElement)(
'placeholder',
{
label: props.label,
arguments: props.phraseArguments || (props.phraseArguments ? [props.phraseArgument] : [props.label]) },
(0, _elliptical.createElement)(
'filter',
{ outbound: filterInternalDateTime, skipIncomplete: true },
(0, _elliptical.createElement)(
'choice',
null,
(0, _elliptical.createElement)(
'sequence',
{ unique: true },
(0, _elliptical.createElement)(
'sequence',
{ merge: true },
(0, _elliptical.createElement)(_time.InternalTime, { id: 'time', ellipsis: true, prepositions: props.prepositions, seconds: false }),
(0, _elliptical.createElement)(
'sequence',
{ optional: true, limited: true, ellipsis: true, merge: true },
(0, _elliptical.createElement)(
'sequence',
{ id: 'timeOfDay', optional: true, limited: true },
(0, _elliptical.createElement)('literal', { text: ' the ' }),
(0, _elliptical.createElement)(_time.TimeOfDay, { merge: true }),
(0, _elliptical.createElement)('literal', { text: ' of' })
),
(0, _elliptical.createElement)(
'sequence',
{ id: 'date' },
(0, _elliptical.createElement)('literal', { text: ' ' }),
(0, _elliptical.createElement)(TrueDate, { merge: true, prepositions: true })
)
),
(0, _elliptical.createElement)(
'sequence',
{ id: 'timeOfDay' },
(0, _elliptical.createElement)('list', { items: [' ', ' in the '], limit: 1 }),
(0, _elliptical.createElement)(_time.TimeOfDay, { merge: true })
)
)
),
(0, _elliptical.createElement)(
'sequence',
{ unique: true },
(0, _elliptical.createElement)(
'sequence',
{ id: 'timeOfDay', optional: true, limited: true },
(0, _elliptical.createElement)('literal', { text: 'the ' }),
(0, _elliptical.createElement)(_time.TimeOfDay, { merge: true }),
(0, _elliptical.createElement)('literal', { text: ' of ' })
),
(0, _elliptical.createElement)(
'choice',
{ merge: true, ellipsis: true },
(0, _elliptical.createElement)(TrueDate, { id: 'date', prepositions: props.prepositions }),
(0, _elliptical.createElement)(
'sequence',
null,
(0, _elliptical.createElement)('literal', { id: 'relativeDate', text: 'this ', value: { day: 0 } }),
(0, _elliptical.createElement)(_time.TimeOfDay, { id: 'timeOfDay' })
),
(0, _elliptical.createElement)(
'placeholder',
{ label: 'date' },
(0, _elliptical.createElement)('literal', { text: 'tonight', value: { relativeDate: { day: 0 }, time: { hour: 20 } } })
)
),
(0, _elliptical.createElement)(
'sequence',
{ id: 'timeOfDay', optional: true, limited: true, ellipsis: true },
(0, _elliptical.createElement)('list', { items: [' ', ' in the '], limit: 1 }),
(0, _elliptical.createElement)(_time.TimeOfDay, { merge: true })
),
(0, _elliptical.createElement)(
'sequence',
{ id: 'time', ellipsis: true },
(0, _elliptical.createElement)('literal', { text: ' ' }),
(0, _elliptical.createElement)(_time.InternalTime, { merge: true, prepositions: true, seconds: false })
),
(0, _elliptical.createElement)(
'sequence',
{ id: 'timeOfDay' },
(0, _elliptical.createElement)('literal', { text: ' in the ' }),
(0, _elliptical.createElement)(_time.TimeOfDay, { merge: true })
)
)
)
)
);
}
};