UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

268 lines (232 loc) • 7.6 kB
"use strict"; var escapeRegExp = require("../../core/utils/common").escapeRegExp; var FORMAT_TYPES = { "3": "abbreviated", "4": "wide", "5": "narrow" }; var monthRegExpGenerator = function monthRegExpGenerator(count, dateParts) { if (count > 2) { return Object.keys(FORMAT_TYPES).map(function (count) { return ["format", "standalone"].map(function (type) { return dateParts.getMonthNames(FORMAT_TYPES[count], type).join("|"); }).join("|"); }).join("|"); } return "0?[1-9]|1[012]"; }; var PATTERN_REGEXPS = { y: function y(count) { return "[0-9]+"; }, M: monthRegExpGenerator, L: monthRegExpGenerator, Q: function Q(count, dateParts) { if (count > 2) { return dateParts.getQuarterNames(FORMAT_TYPES[count], "format").join("|"); } return "0?[1-4]"; }, E: function E(count, dateParts) { return "\\D*"; }, a: function a(count, dateParts) { return dateParts.getPeriodNames(FORMAT_TYPES[count < 3 ? 3 : count], "format").join("|"); }, d: function d(count) { return "0?[1-9]|[12][0-9]|3[01]"; }, H: function H(count) { return "0?[0-9]|1[0-9]|2[0-3]"; }, h: function h(count) { return "0?[1-9]|1[012]"; }, m: function m(count) { return "0?[0-9]|[1-5][0-9]"; }, s: function s(count) { return "0?[0-9]|[1-5][0-9]"; }, S: function S(count) { return "[0-9]{1," + count + "}"; } }; var parseNumber = Number; var monthPatternParser = function monthPatternParser(text, count, dateParts) { if (count > 2) { return ["format", "standalone"].map(function (type) { return Object.keys(FORMAT_TYPES).map(function (count) { return dateParts.getMonthNames(FORMAT_TYPES[count], type).indexOf(text); }); }).reduce(function (a, b) { return a.concat(b); }).filter(function (index) { return index >= 0; })[0]; } return parseNumber(text) - 1; }; var PATTERN_PARSERS = { y: function y(text, count) { var year = parseNumber(text); if (count === 2) { return year < 30 ? 2000 + year : 1900 + year; } return year; }, M: monthPatternParser, L: monthPatternParser, Q: function Q(text, count, dateParts) { if (count > 2) { return dateParts.getQuarterNames(FORMAT_TYPES[count], "format").indexOf(text); } return parseNumber(text) - 1; }, E: function E(text, count, dateParts) { return dateParts.getDayNames(FORMAT_TYPES[count < 3 ? 3 : count], "format").indexOf(text); }, a: function a(text, count, dateParts) { return dateParts.getPeriodNames(FORMAT_TYPES[count < 3 ? 3 : count], "format").indexOf(text); }, d: parseNumber, H: parseNumber, h: parseNumber, m: parseNumber, s: parseNumber, S: function S(text, count) { count = Math.max(count, 3); text = text.slice(0, 3); while (count < 3) { text = text + "0"; count++; } return parseNumber(text); } }; var ORDERED_PATTERNS = ["y", "M", "d", "h", "m", "s", "S"]; var PATTERN_SETTERS = { y: "setFullYear", M: "setMonth", L: "setMonth", a: function a(date, value) { var hours = date.getHours(); if (!value && hours === 12) { date.setHours(0); } else if (value && hours !== 12) { date.setHours(hours + 12); } }, d: "setDate", H: "setHours", h: "setHours", m: "setMinutes", s: "setSeconds", S: "setMilliseconds" }; var getSameCharCount = function getSameCharCount(text, index) { var char = text[index], count = 0; do { index++; count++; } while (text[index] === char); return count; }; var createPattern = function createPattern(char, count) { var result = ""; for (var i = 0; i < count; i++) { result += char; } return result; }; var getRegExpInfo = function getRegExpInfo(format, dateParts) { var regexpText = "", isEscaping, patterns = []; format = escapeRegExp(format); for (var i = 0; i < format.length; i++) { var char = format[i], isEscapeChar = char === "'", regexpPart = PATTERN_REGEXPS[char]; if (isEscapeChar) { isEscaping = !isEscaping; if (format[i - 1] !== "'") { continue; } } if (regexpPart && !isEscaping) { var count = getSameCharCount(format, i), pattern = createPattern(char, count); patterns.push(pattern); regexpText += "(" + regexpPart(count, dateParts) + ")"; i += count - 1; } else { regexpText += char; } } return { patterns: patterns, regexp: new RegExp("^" + regexpText + "$") }; }; var setPatternPart = function setPatternPart(date, pattern, text, dateParts) { var patternChar = pattern[0], partSetter = PATTERN_SETTERS[patternChar], partParser = PATTERN_PARSERS[patternChar]; if (partSetter && partParser) { var value = partParser(text, pattern.length, dateParts); if (date[partSetter]) { date[partSetter](value); } else { partSetter(date, value); } } }; var setPatternPartFromNow = function setPatternPartFromNow(date, pattern, now) { var setterName = PATTERN_SETTERS[pattern], getterName = "g" + setterName.substr(1); date[setterName](now[getterName]()); }; var getShortPatterns = function getShortPatterns(fullPatterns) { return fullPatterns.map(function (pattern) { return pattern[0] === "H" ? "h" : pattern[0]; }); }; var getMaxOrderedPatternIndex = function getMaxOrderedPatternIndex(patterns) { var indexes = patterns.map(function (pattern) { return ORDERED_PATTERNS.indexOf(pattern); }); return Math.max.apply(Math, indexes); }; var getOrderedFormatPatterns = function getOrderedFormatPatterns(formatPatterns) { var otherPatterns = formatPatterns.filter(function (pattern) { return ORDERED_PATTERNS.indexOf(pattern) < 0; }); return ORDERED_PATTERNS.concat(otherPatterns); }; var getParser = function getParser(format, dateParts) { var regExpInfo = getRegExpInfo(format, dateParts); return function (text) { var regExpResult = regExpInfo.regexp.exec(text); if (regExpResult) { var now = new Date(), date = new Date(now.getFullYear(), 0, 1), formatPatterns = getShortPatterns(regExpInfo.patterns), maxPatternIndex = getMaxOrderedPatternIndex(formatPatterns), orderedFormatPatterns = getOrderedFormatPatterns(formatPatterns); orderedFormatPatterns.forEach(function (pattern, index) { if (index < ORDERED_PATTERNS.length && index > maxPatternIndex) return; var patternIndex = formatPatterns.indexOf(pattern); if (patternIndex >= 0) { setPatternPart(date, regExpInfo.patterns[patternIndex], regExpResult[patternIndex + 1], dateParts); } else { setPatternPartFromNow(date, pattern, now); } }); return date; } return null; }; }; exports.getParser = getParser;