@syncfusion/ej2-base
Version:
A common package of Essential JS 2 base libraries, methods and class definitions
301 lines (300 loc) • 11.9 kB
JavaScript
import { ParserBase as parser } from './parser-base';
import { IntlBase as base, setDateFormat } from './intl-base';
import { isUndefined, throwError, getValue, isBlazor } from '../util';
import { HijriParser } from '../hijri-parser';
import { isNullOrUndefined, extend } from '../util';
var abbreviateRegexGlobal = /\/MMMMM|MMMM|MMM|a|LLLL|LLL|EEEEE|EEEE|E|K|cccc|ccc|WW|W|G+|z+/gi;
var standalone = 'stand-alone';
var weekdayKey = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
export var basicPatterns = ['short', 'medium', 'long', 'full'];
var timeSetter = {
m: 'getMinutes',
h: 'getHours',
H: 'getHours',
s: 'getSeconds',
d: 'getDate',
f: 'getMilliseconds'
};
export var datePartMatcher = {
'M': 'month',
'd': 'day',
'E': 'weekday',
'c': 'weekday',
'y': 'year',
'm': 'minute',
'h': 'hour',
'H': 'hour',
's': 'second',
'L': 'month',
'a': 'designator',
'z': 'timeZone',
'Z': 'timeZone',
'G': 'era',
'f': 'milliseconds'
};
var timeSeparator = 'timeSeparator';
/**
* Date Format is a framework provides support for date formatting.
*
* @private
*/
var DateFormat = /** @class */ (function () {
function DateFormat() {
}
/**
* Returns the formatter function for given skeleton.
*
* @param {string} culture - Specifies the culture name to be which formatting.
* @param {DateFormatOptions} option - Specific the format in which date will format.
* @param {Object} cldr - Specifies the global cldr data collection.
* @returns {Function} ?
*/
DateFormat.dateFormat = function (culture, option, cldr) {
var _this = this;
var dependable = base.getDependables(cldr, culture, option.calendar);
var numObject = getValue('parserObject.numbers', dependable);
var dateObject = dependable.dateObject;
var formatOptions = { isIslamic: base.islamicRegex.test(option.calendar) };
formatOptions.firstDayOfWeek = base.getWeekData(culture, cldr);
if (isBlazor() && option.isServerRendered) {
option = base.compareBlazorDateFormats(option, culture);
}
var resPattern = option.format ||
base.getResultantPattern(option.skeleton, dependable.dateObject, option.type, false, isBlazor() ? culture : '');
formatOptions.dateSeperator = isBlazor() ? getValue('dateSeperator', dateObject) : base.getDateSeparator(dependable.dateObject);
if (isUndefined(resPattern)) {
throwError('Format options or type given must be invalid');
}
else {
resPattern = base.ConvertDateToWeekFormat(resPattern);
if (isBlazor()) {
resPattern = resPattern.replace(/tt/, 'a');
}
formatOptions.pattern = resPattern;
formatOptions.numMapper = isBlazor() ?
extend({}, numObject) : parser.getNumberMapper(dependable.parserObject, parser.getNumberingSystem(cldr));
var patternMatch = resPattern.match(abbreviateRegexGlobal) || [];
for (var _i = 0, patternMatch_1 = patternMatch; _i < patternMatch_1.length; _i++) {
var str = patternMatch_1[_i];
var len = str.length;
var char = str[0];
if (char === 'K') {
char = 'h';
}
switch (char) {
case 'E':
case 'c':
if (isBlazor()) {
formatOptions.weekday = getValue('days.' + base.monthIndex["" + len], dateObject);
}
else {
formatOptions.weekday = dependable.dateObject["" + base.days]["" + standalone][base.monthIndex["" + len]];
}
break;
case 'M':
case 'L':
if (isBlazor()) {
formatOptions.month = getValue('months.' + base.monthIndex["" + len], dateObject);
}
else {
formatOptions.month = dependable.dateObject["" + base.month]["" + standalone][base.monthIndex["" + len]];
}
break;
case 'a':
formatOptions.designator = isBlazor() ?
getValue('dayPeriods', dateObject) : getValue('dayPeriods.format.wide', dateObject);
break;
case 'G': {
var eText = (len <= 3) ? 'eraAbbr' : (len === 4) ? 'eraNames' : 'eraNarrow';
formatOptions.era = isBlazor() ? getValue('eras', dateObject) : getValue('eras.' + eText, dependable.dateObject);
break;
}
case 'z':
formatOptions.timeZone = getValue('dates.timeZoneNames', dependable.parserObject);
break;
}
}
}
return function (value) {
if (isNaN(value.getDate())) {
return null;
}
return _this.intDateFormatter(value, formatOptions);
};
};
/**
* Returns formatted date string based on options passed.
*
* @param {Date} value ?
* @param {FormatOptions} options ?
* @returns {string} ?
*/
DateFormat.intDateFormatter = function (value, options) {
var pattern = options.pattern;
var ret = '';
var matches = pattern.match(base.dateParseRegex);
var dObject = this.getCurrentDateValue(value, options.isIslamic);
for (var _i = 0, matches_1 = matches; _i < matches_1.length; _i++) {
var match = matches_1[_i];
var length_1 = match.length;
var char = match[0];
if (char === 'K') {
char = 'h';
}
var curval = void 0;
var curvalstr = '';
var isNumber = void 0;
var processNumber = void 0;
var curstr = '';
switch (char) {
case 'M':
case 'L':
curval = dObject.month;
if (length_1 > 2) {
ret += options.month["" + curval];
}
else {
isNumber = true;
}
break;
case 'E':
case 'c':
ret += options.weekday["" + weekdayKey[value.getDay()]];
break;
case 'H':
case 'h':
case 'm':
case 's':
case 'd':
case 'f':
isNumber = true;
if (char === 'd') {
curval = dObject.date;
}
else if (char === 'f') {
isNumber = false;
processNumber = true;
curvalstr = value["" + timeSetter["" + char]]().toString();
curvalstr = curvalstr.substring(0, length_1);
var curlength = curvalstr.length;
if (length_1 !== curlength) {
if (length_1 > 3) {
continue;
}
for (var i = 0; i < length_1 - curlength; i++) {
curvalstr = '0' + curvalstr.toString();
}
}
curstr += curvalstr;
}
else {
curval = value["" + timeSetter["" + char]]();
}
if (char === 'h') {
curval = curval % 12 || 12;
}
break;
case 'y':
processNumber = true;
curstr += dObject.year;
if (length_1 === 2) {
curstr = curstr.substr(curstr.length - 2);
}
break;
case 'a': {
var desig = value.getHours() < 12 ? 'am' : 'pm';
ret += options.designator["" + desig];
break;
}
case 'G': {
var dec = value.getFullYear() < 0 ? 0 : 1;
var retu = options.era["" + dec];
if (isNullOrUndefined(retu)) {
retu = options.era[dec ? 0 : 1];
}
ret += retu || '';
break;
}
case '\'':
ret += (match === '\'\'') ? '\'' : match.replace(/'/g, '');
break;
case 'z': {
var timezone = value.getTimezoneOffset();
var pattern_1 = (length_1 < 4) ? '+H;-H' : options.timeZone.hourFormat;
pattern_1 = pattern_1.replace(/:/g, options.numMapper.timeSeparator);
if (timezone === 0) {
ret += options.timeZone.gmtZeroFormat;
}
else {
processNumber = true;
curstr = this.getTimeZoneValue(timezone, pattern_1);
}
curstr = options.timeZone.gmtFormat.replace(/\{0\}/, curstr);
break;
}
case ':':
ret += options.numMapper.numberSymbols["" + timeSeparator];
break;
case '/':
ret += options.dateSeperator;
break;
case 'W':
isNumber = true;
curval = base.getWeekOfYear(value, options.firstDayOfWeek);
break;
default:
ret += match;
}
if (isNumber) {
processNumber = true;
curstr = this.checkTwodigitNumber(curval, length_1);
}
if (processNumber) {
ret += parser.convertValueParts(curstr, base.latnParseRegex, options.numMapper.mapper);
}
}
return ret;
};
DateFormat.getCurrentDateValue = function (value, isIslamic) {
if (isIslamic) {
return HijriParser.getHijriDate(value);
}
return { year: value.getFullYear(), month: value.getMonth() + 1, date: value.getDate() };
};
/**
* Returns two digit numbers for given value and length
*
* @param {number} val ?
* @param {number} len ?
* @returns {string} ?
*/
DateFormat.checkTwodigitNumber = function (val, len) {
var ret = val + '';
if (len === 2 && ret.length !== 2) {
return '0' + ret;
}
return ret;
};
/**
* Returns the value of the Time Zone.
*
* @param {number} tVal ?
* @param {string} pattern ?
* @returns {string} ?
* @private
*/
DateFormat.getTimeZoneValue = function (tVal, pattern) {
var _this = this;
var splt = pattern.split(';');
var curPattern = splt[tVal > 0 ? 1 : 0];
var no = Math.abs(tVal);
return curPattern = curPattern.replace(/HH?|mm/g, function (str) {
var len = str.length;
var ishour = str.indexOf('H') !== -1;
return _this.checkTwodigitNumber(Math.floor(ishour ? (no / 60) : (no % 60)), len);
});
};
return DateFormat;
}());
export { DateFormat };
setDateFormat(DateFormat);