UNPKG

@syncfusion/ej2-base

Version:

A common package of Essential JS 2 base libraries, methods and class definitions

394 lines (393 loc) 17.2 kB
import { IntlBase as base } from './intl-base'; import { ParserBase as parser } from './parser-base'; import { isUndefined, throwError, getValue, isNullOrUndefined, isBlazor } from '../util'; import { datePartMatcher } from './date-formatter'; import { HijriParser } from '../hijri-parser'; var standalone = 'stand-alone'; var latnRegex = /^[0-9]*$/; var timeSetter = { minute: 'setMinutes', hour: 'setHours', second: 'setSeconds', day: 'setDate', month: 'setMonth', milliseconds: 'setMilliseconds' }; var month = 'months'; /** * Date Parser. * * @private */ var DateParser = /** @class */ (function () { function DateParser() { } /** * Returns the parser function for given skeleton. * * @param {string} culture - Specifies the culture name to be which formatting. * @param {DateFormatOptions} option - Specific the format in which string date will be parsed. * @param {Object} cldr - Specifies the global cldr data collection. * @returns {Function} ? */ DateParser.dateParser = function (culture, option, cldr) { var _this = this; var dependable = base.getDependables(cldr, culture, option.calendar); var numOptions = parser.getCurrentNumericOptions(dependable.parserObject, parser.getNumberingSystem(cldr), false, isBlazor()); var parseOptions = {}; if (isBlazor() && option.isServerRendered) { option = base.compareBlazorDateFormats(option, culture); } var resPattern = option.format || base.getResultantPattern(option.skeleton, dependable.dateObject, option.type, false, isBlazor() ? culture : ''); var regexString = ''; var hourOnly; if (isUndefined(resPattern)) { throwError('Format options or type given must be invalid'); } else { resPattern = base.ConvertDateToWeekFormat(resPattern); parseOptions = { isIslamic: base.islamicRegex.test(option.calendar), pattern: resPattern, evalposition: {}, culture: culture }; var patternMatch = resPattern.match(base.dateParseRegex) || []; var length_1 = patternMatch.length; var gmtCorrection = 0; var zCorrectTemp = 0; var isgmtTraversed = false; var nRegx = numOptions.numericRegex; var numMapper = isBlazor() ? dependable.parserObject.numbers : parser.getNumberMapper(dependable.parserObject, parser.getNumberingSystem(cldr)); for (var i = 0; i < length_1; i++) { var str = patternMatch[parseInt(i.toString(), 10)]; var len = str.length; var char = (str[0] === 'K') ? 'h' : str[0]; var isNumber = void 0; var canUpdate = void 0; var charKey = datePartMatcher["" + char]; var optional = (len === 2) ? '' : '?'; if (isgmtTraversed) { gmtCorrection = zCorrectTemp; isgmtTraversed = false; } switch (char) { case 'E': case 'c': { var weekData = void 0; if (isBlazor()) { weekData = getValue('days.' + base.monthIndex["" + len], dependable.dateObject); } else { weekData = dependable.dateObject["" + base.days]["" + standalone][base.monthIndex["" + len]]; } var weekObject = parser.reverseObject(weekData); regexString += '(' + Object.keys(weekObject).join('|') + ')'; break; } case 'M': case 'L': case 'd': case 'm': case 's': case 'h': case 'H': case 'f': canUpdate = true; if ((char === 'M' || char === 'L') && len > 2) { var monthData = void 0; if (isBlazor()) { monthData = getValue('months.' + base.monthIndex["" + len], dependable.dateObject); } else { monthData = dependable.dateObject["" + month]["" + standalone][base.monthIndex["" + len]]; } parseOptions["" + charKey] = parser.reverseObject(monthData); regexString += '(' + Object.keys(parseOptions["" + charKey]).join('|') + ')'; } else if (char === 'f') { if (len > 3) { continue; } isNumber = true; regexString += '(' + nRegx + nRegx + '?' + nRegx + '?' + ')'; } else { isNumber = true; regexString += '(' + nRegx + nRegx + optional + ')'; } if (char === 'h') { parseOptions.hour12 = true; } break; case 'W': { var opt = len === 1 ? '?' : ''; regexString += '(' + nRegx + opt + nRegx + ')'; break; } case 'y': canUpdate = isNumber = true; if (len === 2) { regexString += '(' + nRegx + nRegx + ')'; } else { regexString += '(' + nRegx + '{' + len + ',})'; } break; case 'a': { canUpdate = true; var periodValur = isBlazor() ? getValue('dayPeriods', dependable.dateObject) : getValue('dayPeriods.format.wide', dependable.dateObject); parseOptions["" + charKey] = parser.reverseObject(periodValur); regexString += '(' + Object.keys(parseOptions["" + charKey]).join('|') + ')'; break; } case 'G': { canUpdate = true; var eText = (len <= 3) ? 'eraAbbr' : (len === 4) ? 'eraNames' : 'eraNarrow'; parseOptions["" + charKey] = parser.reverseObject(isBlazor() ? getValue('eras', dependable.dateObject) : getValue('eras.' + eText, dependable.dateObject)); regexString += '(' + Object.keys(parseOptions["" + charKey]).join('|') + '?)'; break; } case 'z': { var tval = new Date().getTimezoneOffset(); canUpdate = (tval !== 0); parseOptions["" + charKey] = getValue('dates.timeZoneNames', dependable.parserObject); var tzone = parseOptions["" + charKey]; hourOnly = (len < 4); var hpattern = hourOnly ? '+H;-H' : tzone.hourFormat; hpattern = hpattern.replace(/:/g, numMapper.timeSeparator); regexString += '(' + this.parseTimeZoneRegx(hpattern, tzone, nRegx) + ')?'; isgmtTraversed = true; zCorrectTemp = hourOnly ? 6 : 12; break; } case '\'': { var iString = str.replace(/'/g, ''); regexString += '(' + iString + ')?'; break; } default: regexString += '([\\D])'; break; } if (canUpdate) { parseOptions.evalposition["" + charKey] = { isNumber: isNumber, pos: i + 1 + gmtCorrection, hourOnly: hourOnly }; } if (i === length_1 - 1 && !isNullOrUndefined(regexString)) { var regExp = RegExp; parseOptions.parserRegex = new regExp('^' + regexString + '$', 'i'); } } } return function (value) { var parsedDateParts = _this.internalDateParse(value, parseOptions, numOptions); if (isNullOrUndefined(parsedDateParts) || !Object.keys(parsedDateParts).length) { return null; } if (parseOptions.isIslamic) { var dobj = {}; var tYear = parsedDateParts.year; var tDate = parsedDateParts.day; var tMonth = parsedDateParts.month; var ystrig = tYear ? (tYear + '') : ''; var is2DigitYear = (ystrig.length === 2); if (!tYear || !tMonth || !tDate || is2DigitYear) { dobj = HijriParser.getHijriDate(new Date()); } if (is2DigitYear) { tYear = parseInt((dobj.year + '').slice(0, 2) + ystrig, 10); } var dateObject = HijriParser.toGregorian(tYear || dobj.year, tMonth || dobj.month, tDate || dobj.date); parsedDateParts.year = dateObject.getFullYear(); parsedDateParts.month = dateObject.getMonth() + 1; parsedDateParts.day = dateObject.getDate(); } return _this.getDateObject(parsedDateParts); }; }; /** * Returns date object for provided date options * * @param {DateParts} options ? * @param {Date} value ? * @returns {Date} ? */ DateParser.getDateObject = function (options, value) { var res = value || new Date(); res.setMilliseconds(0); var tKeys = ['hour', 'minute', 'second', 'milliseconds', 'month', 'day']; var y = options.year; var desig = options.designator; var tzone = options.timeZone; if (!isUndefined(y)) { var len = (y + '').length; if (len <= 2) { var century = Math.floor(res.getFullYear() / 100) * 100; y += century; } res.setFullYear(y); } for (var _i = 0, tKeys_1 = tKeys; _i < tKeys_1.length; _i++) { var key = tKeys_1[_i]; var tValue = options["" + key]; if (isUndefined(tValue) && key === 'day') { res.setDate(1); } if (!isUndefined(tValue)) { if (key === 'month') { tValue -= 1; if (tValue < 0 || tValue > 11) { return new Date('invalid'); } var pDate = res.getDate(); res.setDate(1); res[timeSetter["" + key]](tValue); var lDate = new Date(res.getFullYear(), tValue + 1, 0).getDate(); res.setDate(pDate < lDate ? pDate : lDate); } else { if (key === 'day') { var lastDay = new Date(res.getFullYear(), res.getMonth() + 1, 0).getDate(); if ((tValue < 1 || tValue > lastDay)) { return null; } } res["" + timeSetter["" + key]](tValue); } } } if (!isUndefined(desig)) { var hour = res.getHours(); if (desig === 'pm') { res.setHours(hour + (hour === 12 ? 0 : 12)); } else if (hour === 12) { res.setHours(0); } } if (!isUndefined(tzone)) { var tzValue = tzone - res.getTimezoneOffset(); if (tzValue !== 0) { res.setMinutes(res.getMinutes() + tzValue); } } return res; }; /** * Returns date parsing options for provided value along with parse and numeric options * * @param {string} value ? * @param {ParseOptions} parseOptions ? * @param {NumericOptions} num ? * @returns {DateParts} ? */ DateParser.internalDateParse = function (value, parseOptions, num) { var matches = value.match(parseOptions.parserRegex); var retOptions = { 'hour': 0, 'minute': 0, 'second': 0 }; if (isNullOrUndefined(matches)) { return null; } else { var props = Object.keys(parseOptions.evalposition); for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { var prop = props_1[_i]; var curObject = parseOptions.evalposition["" + prop]; var matchString = matches[curObject.pos]; if (curObject.isNumber) { retOptions["" + prop] = this.internalNumberParser(matchString, num); } else { if (prop === 'timeZone' && !isUndefined(matchString)) { var pos = curObject.pos; var val = void 0; var tmatch = matches[pos + 1]; var flag = !isUndefined(tmatch); if (curObject.hourOnly) { val = this.getZoneValue(flag, tmatch, matches[pos + 4], num) * 60; } else { val = this.getZoneValue(flag, tmatch, matches[pos + 7], num) * 60; val += this.getZoneValue(flag, matches[pos + 4], matches[pos + 10], num); } if (!isNullOrUndefined(val)) { retOptions["" + prop] = val; } } else { var cultureOptions = ['en-US', 'en-MH', 'en-MP']; matchString = ((prop === 'month') && (!parseOptions.isIslamic) && (parseOptions.culture === 'en' || parseOptions.culture === 'en-GB' || parseOptions.culture === 'en-US')) ? matchString[0].toUpperCase() + matchString.substring(1).toLowerCase() : matchString; matchString = ((prop !== 'month') && (prop === 'designator') && parseOptions.culture && parseOptions.culture.indexOf('en-') !== -1 && cultureOptions.indexOf(parseOptions.culture) === -1) ? matchString.toLowerCase() : matchString; retOptions["" + prop] = parseOptions["" + prop]["" + matchString]; } } } if (parseOptions.hour12) { retOptions.hour12 = true; } } return retOptions; }; /** * Returns parsed number for provided Numeric string and Numeric Options * * @param {string} value ? * @param {NumericOptions} option ? * @returns {number} ? */ DateParser.internalNumberParser = function (value, option) { value = parser.convertValueParts(value, option.numberParseRegex, option.numericPair); if (latnRegex.test(value)) { return +value; } return null; }; /** * Returns parsed time zone RegExp for provided hour format and time zone * * @param {string} hourFormat ? * @param {base.TimeZoneOptions} tZone ? * @param {string} nRegex ? * @returns {string} ? */ DateParser.parseTimeZoneRegx = function (hourFormat, tZone, nRegex) { var pattern = tZone.gmtFormat; var ret; var cRegex = '(' + nRegex + ')' + '(' + nRegex + ')'; ret = hourFormat.replace('+', '\\+'); if (hourFormat.indexOf('HH') !== -1) { ret = ret.replace(/HH|mm/g, '(' + cRegex + ')'); } else { ret = ret.replace(/H|m/g, '(' + cRegex + '?)'); } var splitStr = (ret.split(';').map(function (str) { return pattern.replace('{0}', str); })); ret = splitStr.join('|') + '|' + tZone.gmtZeroFormat; return ret; }; /** * Returns zone based value. * * @param {boolean} flag ? * @param {string} val1 ? * @param {string} val2 ? * @param {NumericOptions} num ? * @returns {number} ? */ DateParser.getZoneValue = function (flag, val1, val2, num) { var ival = flag ? val1 : val2; if (!ival) { return 0; } var value = this.internalNumberParser(ival, num); if (flag) { return -value; } return value; }; return DateParser; }()); export { DateParser };