Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
119 lines
3.3 KiB
Plaintext
119 lines
3.3 KiB
Plaintext
/**
|
|
* 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
|
|
*/
|
|
const 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
|
|
*/
|
|
export function parseDateTimeSkeleton(skeleton) {
|
|
const result = {};
|
|
skeleton.replace(DATE_TIME_REGEX, (match) => {
|
|
const len = match.length;
|
|
switch (match[0]) {
|
|
case "G":
|
|
result.era = len === 4 ? "long" : len === 5 ? "narrow" : "short";
|
|
break;
|
|
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");
|
|
case "q":
|
|
case "Q": throw new RangeError("`q/Q` (quarter) patterns are not supported");
|
|
case "M":
|
|
case "L":
|
|
result.month = [
|
|
"numeric",
|
|
"2-digit",
|
|
"short",
|
|
"long",
|
|
"narrow"
|
|
][len - 1];
|
|
break;
|
|
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");
|
|
case "E":
|
|
result.weekday = len === 4 ? "long" : 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;
|
|
case "a":
|
|
result.hour12 = true;
|
|
break;
|
|
case "b":
|
|
case "B": throw new RangeError("`b/B` (period) patterns are not supported, use `a` instead");
|
|
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");
|
|
case "m":
|
|
result.minute = ["numeric", "2-digit"][len - 1];
|
|
break;
|
|
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");
|
|
case "z":
|
|
result.timeZoneName = len < 4 ? "short" : "long";
|
|
break;
|
|
case "Z":
|
|
case "O":
|
|
case "v":
|
|
case "V":
|
|
case "X":
|
|
case "x": throw new RangeError("`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead");
|
|
}
|
|
return "";
|
|
});
|
|
return result;
|
|
}
|