UNPKG

elliptical-datetime

Version:

Elliptical phrases to handle natural language dates and times

482 lines (401 loc) 14.9 kB
'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 }) ) ) ) ) ); } };