UNPKG

5.01 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3/**
4 * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
5 * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js
6 * with some tweaks
7 */
8var 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;
9/**
10 * Parse Date time skeleton into Intl.DateTimeFormatOptions
11 * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
12 * @public
13 * @param skeleton skeleton string
14 */
15function parseDateTimeSkeleton(skeleton) {
16 var result = {};
17 skeleton.replace(DATE_TIME_REGEX, function (match) {
18 var len = match.length;
19 switch (match[0]) {
20 // Era
21 case 'G':
22 result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';
23 break;
24 // Year
25 case 'y':
26 result.year = len === 2 ? '2-digit' : 'numeric';
27 break;
28 case 'Y':
29 case 'u':
30 case 'U':
31 case 'r':
32 throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');
33 // Quarter
34 case 'q':
35 case 'Q':
36 throw new RangeError('`q/Q` (quarter) patterns are not supported');
37 // Month
38 case 'M':
39 case 'L':
40 result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];
41 break;
42 // Week
43 case 'w':
44 case 'W':
45 throw new RangeError('`w/W` (week) patterns are not supported');
46 case 'd':
47 result.day = ['numeric', '2-digit'][len - 1];
48 break;
49 case 'D':
50 case 'F':
51 case 'g':
52 throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');
53 // Weekday
54 case 'E':
55 result.weekday = len === 4 ? 'short' : len === 5 ? 'narrow' : 'short';
56 break;
57 case 'e':
58 if (len < 4) {
59 throw new RangeError('`e..eee` (weekday) patterns are not supported');
60 }
61 result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];
62 break;
63 case 'c':
64 if (len < 4) {
65 throw new RangeError('`c..ccc` (weekday) patterns are not supported');
66 }
67 result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];
68 break;
69 // Period
70 case 'a': // AM, PM
71 result.hour12 = true;
72 break;
73 case 'b': // am, pm, noon, midnight
74 case 'B': // flexible day periods
75 throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');
76 // Hour
77 case 'h':
78 result.hourCycle = 'h12';
79 result.hour = ['numeric', '2-digit'][len - 1];
80 break;
81 case 'H':
82 result.hourCycle = 'h23';
83 result.hour = ['numeric', '2-digit'][len - 1];
84 break;
85 case 'K':
86 result.hourCycle = 'h11';
87 result.hour = ['numeric', '2-digit'][len - 1];
88 break;
89 case 'k':
90 result.hourCycle = 'h24';
91 result.hour = ['numeric', '2-digit'][len - 1];
92 break;
93 case 'j':
94 case 'J':
95 case 'C':
96 throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');
97 // Minute
98 case 'm':
99 result.minute = ['numeric', '2-digit'][len - 1];
100 break;
101 // Second
102 case 's':
103 result.second = ['numeric', '2-digit'][len - 1];
104 break;
105 case 'S':
106 case 'A':
107 throw new RangeError('`S/A` (second) pattenrs are not supported, use `s` instead');
108 // Zone
109 case 'z': // 1..3, 4: specific non-location format
110 result.timeZoneName = len < 4 ? 'short' : 'long';
111 break;
112 case 'Z': // 1..3, 4, 5: The ISO8601 varios formats
113 case 'O': // 1, 4: miliseconds in day short, long
114 case 'v': // 1, 4: generic non-location format
115 case 'V': // 1, 2, 3, 4: time zone ID or city
116 case 'X': // 1, 2, 3, 4: The ISO8601 varios formats
117 case 'x': // 1, 2, 3, 4: The ISO8601 varios formats
118 throw new RangeError('`Z/O/v/V/X/x` (timeZone) pattenrs are not supported, use `z` instead');
119 }
120 return '';
121 });
122 return result;
123}
124exports.parseDateTimeSkeleton = parseDateTimeSkeleton;