126 lines
4.9 KiB
Plaintext
Executable File
126 lines
4.9 KiB
Plaintext
Executable File
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.parseDateTimeSkeleton = void 0;
|
|
/**
|
|
* https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
|
|
* Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js
|
|
* with some tweaks
|
|
*/
|
|
var DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;
|
|
/**
|
|
* Parse Date time skeleton into Intl.DateTimeFormatOptions
|
|
* Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
|
|
* @public
|
|
* @param skeleton skeleton string
|
|
*/
|
|
function parseDateTimeSkeleton(skeleton) {
|
|
var result = {};
|
|
skeleton.replace(DATE_TIME_REGEX, function (match) {
|
|
var len = match.length;
|
|
switch (match[0]) {
|
|
// Era
|
|
case 'G':
|
|
result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';
|
|
break;
|
|
// Year
|
|
case 'y':
|
|
result.year = len === 2 ? '2-digit' : 'numeric';
|
|
break;
|
|
case 'Y':
|
|
case 'u':
|
|
case 'U':
|
|
case 'r':
|
|
throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');
|
|
// Quarter
|
|
case 'q':
|
|
case 'Q':
|
|
throw new RangeError('`q/Q` (quarter) patterns are not supported');
|
|
// Month
|
|
case 'M':
|
|
case 'L':
|
|
result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];
|
|
break;
|
|
// Week
|
|
case 'w':
|
|
case 'W':
|
|
throw new RangeError('`w/W` (week) patterns are not supported');
|
|
case 'd':
|
|
result.day = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'D':
|
|
case 'F':
|
|
case 'g':
|
|
throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');
|
|
// Weekday
|
|
case 'E':
|
|
result.weekday = len === 4 ? 'short' : len === 5 ? 'narrow' : 'short';
|
|
break;
|
|
case 'e':
|
|
if (len < 4) {
|
|
throw new RangeError('`e..eee` (weekday) patterns are not supported');
|
|
}
|
|
result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];
|
|
break;
|
|
case 'c':
|
|
if (len < 4) {
|
|
throw new RangeError('`c..ccc` (weekday) patterns are not supported');
|
|
}
|
|
result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];
|
|
break;
|
|
// Period
|
|
case 'a': // AM, PM
|
|
result.hour12 = true;
|
|
break;
|
|
case 'b': // am, pm, noon, midnight
|
|
case 'B': // flexible day periods
|
|
throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');
|
|
// Hour
|
|
case 'h':
|
|
result.hourCycle = 'h12';
|
|
result.hour = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'H':
|
|
result.hourCycle = 'h23';
|
|
result.hour = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'K':
|
|
result.hourCycle = 'h11';
|
|
result.hour = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'k':
|
|
result.hourCycle = 'h24';
|
|
result.hour = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'j':
|
|
case 'J':
|
|
case 'C':
|
|
throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');
|
|
// Minute
|
|
case 'm':
|
|
result.minute = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
// Second
|
|
case 's':
|
|
result.second = ['numeric', '2-digit'][len - 1];
|
|
break;
|
|
case 'S':
|
|
case 'A':
|
|
throw new RangeError('`S/A` (second) patterns are not supported, use `s` instead');
|
|
// Zone
|
|
case 'z': // 1..3, 4: specific non-location format
|
|
result.timeZoneName = len < 4 ? 'short' : 'long';
|
|
break;
|
|
case 'Z': // 1..3, 4, 5: The ISO8601 varios formats
|
|
case 'O': // 1, 4: miliseconds in day short, long
|
|
case 'v': // 1, 4: generic non-location format
|
|
case 'V': // 1, 2, 3, 4: time zone ID or city
|
|
case 'X': // 1, 2, 3, 4: The ISO8601 varios formats
|
|
case 'x': // 1, 2, 3, 4: The ISO8601 varios formats
|
|
throw new RangeError('`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead');
|
|
}
|
|
return '';
|
|
});
|
|
return result;
|
|
}
|
|
exports.parseDateTimeSkeleton = parseDateTimeSkeleton;
|