UNPKG

chart2music

Version:

Turns charts into music so the blind can hear data

1,278 lines (1,270 loc) 279 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.c2mChart = exports.c2m = void 0; function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var AudioNotificationType; (function (AudioNotificationType) { AudioNotificationType["Annotation"] = "Annotation"; })(AudioNotificationType || (AudioNotificationType = {})); var C3 = 130.8128; var G3 = 195.9977; var C4 = C3 * 2; var G4 = G3 * 2; var G5 = G4 * 2; var OscillatorAudioEngine = /*#__PURE__*/function () { function OscillatorAudioEngine(context) { _classCallCheck(this, OscillatorAudioEngine); this._audioContext = context; this._masterCompressor = context.createDynamicsCompressor(); this._masterCompressor.connect(this._audioContext.destination); this._masterCompressor.threshold.value = -50; this._masterCompressor.knee.value = 40; this._masterCompressor.ratio.value = 12; this._masterCompressor.attack.value = 0; this._masterCompressor.release.value = 0.25; this._masterGain = this._audioContext.createGain(); this._masterGain.gain.value = 0.5; this._masterCompressor.connect(this._masterGain); this._masterGain.connect(this._audioContext.destination); } return _createClass(OscillatorAudioEngine, [{ key: "masterGain", get: function get() { return this._masterGain.gain.value; }, set: function set(value) { this._masterGain.gain.value = value; } }, { key: "playDataPoint", value: function playDataPoint(frequency, panning) { var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.2; this._playDataPoint(frequency, panning, duration, this._masterCompressor); } }, { key: "playNotification", value: function playNotification(notificationType) { var panning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15; if (notificationType === AudioNotificationType.Annotation) { this._playAnnotation(panning, duration); } } }, { key: "_playDataPoint", value: function _playDataPoint(frequency, panning, duration, destinationNode) { var t = this._audioContext.currentTime; var mainFreq = this._audioContext.createOscillator(); mainFreq.frequency.value = frequency; mainFreq.start(); var _createOperator = createOperator(this._audioContext, frequency * 0.5, frequency * 3, frequency * 2), c1 = _createOperator.carrier, a1 = _createOperator.amp, m1 = _createOperator.modulator, f1 = _createOperator.filter, adsr1 = _createOperator.adsr; c1.type = "triangle"; adsr1.gain.setValueCurveAtTime([0.2, 0.1], t, duration * 0.75); f1.frequency.value = frequency; f1.type = "lowpass"; var adsr = this._audioContext.createGain(); adsr.gain.setValueCurveAtTime([0.5, 1, 0.5, 0.5, 0.5, 0.1, 0.0001], t, duration); var panner = this._audioContext.createStereoPanner(); panner.pan.value = panning; mainFreq.connect(adsr); adsr1.connect(adsr); adsr.connect(panner); panner.connect(destinationNode); setTimeout(function () { panner.disconnect(); adsr.disconnect(); adsr1.disconnect(); mainFreq.stop(); mainFreq.disconnect(); m1.stop(); m1.disconnect(); c1.stop(); c1.disconnect(); a1.disconnect(); f1.disconnect(); }, duration * 1000 * 2); } }, { key: "_playAnnotation", value: function _playAnnotation(panning, duration) { var _this2 = this; var panner = this._audioContext.createStereoPanner(); panner.pan.value = panning; var gain = this._audioContext.createGain(); gain.gain.value = 0.5; gain.connect(panner); panner.connect(this._masterCompressor); this._playDataPoint(C3, 0, duration / 4, gain); this._playDataPoint(C4, 0, duration / 4, gain); setTimeout(function () { _this2._playDataPoint(G3, 0, duration / 4, gain); _this2._playDataPoint(G4, 0, duration / 4, gain); _this2._playDataPoint(G5, 0, duration / 4, gain); }, duration * 1000 * 0.25); setTimeout(function () { _this2._playDataPoint(C3, 0, duration / 4, gain); _this2._playDataPoint(C4, 0, duration / 4, gain); }, duration * 1000 * 0.5); setTimeout(function () { _this2._playDataPoint(G3, 0, duration / 4, gain); _this2._playDataPoint(G4, 0, duration / 4, gain); _this2._playDataPoint(G5, 0, duration / 4, gain); }, duration * 1000 * 0.75); setTimeout(function () { gain.disconnect(); }, duration * 1000 * 2); } }]); }(); function createOperator(context, carrierFrequency, modulatorFrequency, modulatorDepth) { var c = context.createOscillator(); var a = context.createGain(); var m = context.createOscillator(); var f = context.createBiquadFilter(); var adsr = context.createGain(); c.frequency.value = carrierFrequency; m.frequency.value = modulatorFrequency; a.gain.value = modulatorDepth; m.connect(a); a.connect(c.frequency); c.connect(f); f.connect(adsr); c.start(); m.start(); return { carrier: c, amp: a, modulator: m, filter: f, adsr: adsr }; } var HERTZ = [16.3516, 17.32391, 18.35405, 19.44544, 20.60172, 21.82676, 23.12465, 24.49971, 25.95654, 27.5, 29.13524, 30.86771, 32.7032, 34.64783, 36.7081, 38.89087, 41.20344, 43.65353, 46.2493, 48.99943, 51.91309, 55, 58.27047, 61.73541, 65.40639, 69.29566, 73.41619, 77.78175, 82.40689, 87.30706, 92.49861, 97.99886, 103.8262, 110, 116.5409, 123.4708, 130.8128, 138.5913, 146.8324, 155.5635, 164.8138, 174.6141, 184.9972, 195.9977, 207.6523, 220, 233.0819, 246.9417, 261.6256, 277.1826, 293.6648, 311.127, 329.6276, 349.2282, 369.9944, 391.9954, 415.3047, 440, 466.1638, 493.8833, 523.2511, 554.3653, 587.3295, 622.254, 659.2551, 698.4565, 739.9888, 783.9909, 830.6094, 880, 932.3275, 987.7666, 1046.502, 1108.731, 1174.659, 1244.508, 1318.51, 1396.913, 1479.978, 1567.982, 1661.219, 1760, 1864.655, 1975.533, 2093.005, 2217.461, 2349.318, 2489.016, 2637.02, 2793.826, 2959.955, 3135.963, 3322.438, 3520, 3729.31, 3951.066, 4186.009, 4434.922, 4698.636, 4978.032, 5274.041, 5587.652, 5919.911, 6271.927, 6644.875, 7040, 7458.62, 7902.133]; var SPEEDS = [1000, 250, 100, 50, 25]; var NOTE_LENGTH = 0.25; var keyboardEventToString = function keyboardEventToString(e) { return "".concat(e.altKey ? "Alt+" : "").concat(e.ctrlKey ? "Ctrl+" : "").concat(e.shiftKey ? "Shift+" : "").concat(e.key); }; var KeyboardEventManager = /*#__PURE__*/function () { function KeyboardEventManager(target, modifyHelpDialogText, modifyHelpDialogKeyboardListing) { var _this3 = this; _classCallCheck(this, KeyboardEventManager); this.modifyHelpDialogText = modifyHelpDialogText; this.modifyHelpDialogKeyboardListing = modifyHelpDialogKeyboardListing; this._handler = function (event) { _this3._handleKeyEvents(event); }; this._keyMap = {}; this._target = target; this._target.addEventListener("keydown", this._handler); if (!this._target.hasAttribute("tabIndex")) { this._target.setAttribute("tabIndex", "0"); } this._dialog = null; } return _createClass(KeyboardEventManager, [{ key: "cleanup", value: function cleanup() { this._target.removeEventListener("keydown", this._handler); if (this._dialog !== null) { document.body.removeChild(this._dialog); } } }, { key: "_handleKeyEvents", value: function _handleKeyEvents(event) { var keyPress = keyboardEventToString(event); if (keyPress in this._keyMap) { this._keyMap[keyPress].callback(); event.preventDefault(); } else if (keyPress.toUpperCase() in this._keyMap) { this._keyMap[keyPress.toUpperCase()].callback(); event.preventDefault(); } } }, { key: "registerKeyEvent", value: function registerKeyEvent(_ref) { var key = _ref.key, callback = _ref.callback, _ref$title = _ref.title, title = _ref$title === void 0 ? "" : _ref$title, _ref$description = _ref.description, description = _ref$description === void 0 ? "" : _ref$description, _ref$force = _ref.force, force = _ref$force === void 0 ? false : _ref$force, keyDescription = _ref.keyDescription, _ref$caseSensitive = _ref.caseSensitive, caseSensitive = _ref$caseSensitive === void 0 ? true : _ref$caseSensitive, _ref$order = _ref.order, order = _ref$order === void 0 ? 100 : _ref$order; var checkKey = caseSensitive ? key : key.toUpperCase(); if (!force && checkKey in this._keyMap) { return; } this._keyMap[checkKey] = { title: title, description: description, callback: callback, keyDescription: keyDescription, order: order }; } }, { key: "registerKeyEvents", value: function registerKeyEvents(keyRegistrationList) { var _this4 = this; keyRegistrationList.forEach(function (kr, order) { _this4.registerKeyEvent(_objectSpread({ order: order }, kr)); }); } }, { key: "generateHelpDialog", value: function generateHelpDialog(lang, translationCallback, keyboardListing) { var _keyboardListing$at; var dialog = document.createElement("dialog"); dialog.classList.add("chart2music-dialog"); dialog.classList.add("chart2music-help-dialog"); dialog.setAttribute("lang", lang); var closeButton = document.createElement("button"); closeButton.textContent = "X"; closeButton.ariaLabel = translationCallback("close"); closeButton.style.position = "absolute"; closeButton.style.top = "10px"; closeButton.style.right = "10px"; closeButton.addEventListener("click", function () { dialog.close(); }); dialog.appendChild(closeButton); var heading = translationCallback("kbmg-title"); var h1 = document.createElement("h1"); h1.textContent = heading; dialog.setAttribute("aria-live", heading); dialog.appendChild(h1); var frontMatter = document.createElement("p"); frontMatter.textContent = this.modifyHelpDialogText(lang, translationCallback("help-dialog-front-matter")); dialog.appendChild(frontMatter); var table = document.createElement("table"); var thead = document.createElement("thead"); var tr1 = document.createElement("tr"); ((_keyboardListing$at = keyboardListing.at(0)) !== null && _keyboardListing$at !== void 0 ? _keyboardListing$at : []).forEach(function (txt) { var th = document.createElement("th"); th.setAttribute("scope", "col"); th.textContent = txt; tr1.appendChild(th); }); thead.appendChild(tr1); table.appendChild(thead); var tbody = document.createElement("tbody"); keyboardListing.slice(1).forEach(function (row) { var tr = document.createElement("tr"); row.forEach(function (cell) { var td = document.createElement("td"); td.textContent = cell; tr.appendChild(td); }); tbody.appendChild(tr); }); table.appendChild(tbody); dialog.appendChild(table); var footer = document.createElement("p"); footer.appendChild(document.createTextNode(translationCallback("help_dialog_footer"))); var a = document.createElement("a"); a.setAttribute("href", "https://www.chart2music.com/"); a.textContent = "www.chart2music.com"; footer.appendChild(a); footer.appendChild(document.createTextNode(".")); dialog.appendChild(footer); return dialog; } }, { key: "launchHelpDialog", value: function launchHelpDialog(lang, translationCallback) { var headings = ["Keyboard Shortcut", "Description", "Common Alternate Keyboard Shortcut"]; var listing = Object.entries(this._keyMap).sort(function (left, right) { if (left[1].order < right[1].order) { return -1; } if (left[1].order > right[1].order) { return 1; } return 0; }).map(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), key = _ref3[0], _ref3$ = _ref3[1], title = _ref3$.title, keyDescription = _ref3$.keyDescription, description = _ref3$.description; return [title, keyDescription !== null && keyDescription !== void 0 ? keyDescription : key, description]; }); if (this._dialog === null) { this._dialog = this.generateHelpDialog(lang, translationCallback, this.modifyHelpDialogKeyboardListing(lang, headings, listing)); document.body.appendChild(this._dialog); } this._dialog.showModal(); this._dialog.focus(); } }]); }(); var ScreenReaderBridge = /*#__PURE__*/function () { function ScreenReaderBridge(captionElement) { _classCallCheck(this, ScreenReaderBridge); this._maxNumPaddingCharacters = 3; this._numPaddingCharacters = 0; this._element = captionElement; this._lastCreatedElement = null; } return _createClass(ScreenReaderBridge, [{ key: "lastCreatedElement", get: function get() { return this._lastCreatedElement; } }, { key: "clear", value: function clear() { this._element.innerHTML = ""; } }, { key: "render", value: function render(text) { var paddedText = this._creatPaddedText(text); var divElement = document.createElement("div"); divElement.textContent = paddedText; divElement.setAttribute(ScreenReaderBridge.ORIGINAL_TEXT_ATTRIBUTE, text); divElement.setAttribute("data-created", Date.now().toString()); if (this.lastCreatedElement) { this._removeOldElements(); this.lastCreatedElement.style.display = "none"; } this._element.appendChild(divElement); this._lastCreatedElement = divElement; } }, { key: "_creatPaddedText", value: function _creatPaddedText(text) { var padding = ""; for (var i = 0; i < this._numPaddingCharacters; i++) { padding += ScreenReaderBridge.PADDING_CHARACTER; } this._numPaddingCharacters = (this._numPaddingCharacters + 1) % this._maxNumPaddingCharacters; return text + padding; } }, { key: "_removeOldElements", value: function _removeOldElements() { var _this5 = this; var curTime = Date.now(); Array.from(this._element.children).forEach(function (kid) { var time = Number(kid.getAttribute("data-time")); if (curTime - time > ScreenReaderBridge.REMOVAL_DELAY) { _this5._element.removeChild(kid); } }); } }], [{ key: "addAriaAttributes", value: function addAriaAttributes(element) { var ariaLive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "assertive"; element.setAttribute("aria-live", ariaLive); element.setAttribute("role", "status"); element.setAttribute("aria-atomic", "true"); element.setAttribute("aria-relevant", "additions text"); } }]); }(); ScreenReaderBridge.PADDING_CHARACTER = "\xA0"; ScreenReaderBridge.REMOVAL_DELAY = 25; ScreenReaderBridge.ORIGINAL_TEXT_ATTRIBUTE = "data-original-text"; function isDataPoint(obj) { return _typeof(obj) === "object" && "x" in obj; } function isSimpleDataPoint(obj) { return isDataPoint(obj) && "y" in obj; } function isAlternateAxisDataPoint(obj) { return isDataPoint(obj) && "y2" in obj; } function isHighLowDataPoint(obj) { return isDataPoint(obj) && "high" in obj && "low" in obj; } function isOHLCDataPoint(obj) { return isHighLowDataPoint(obj) && "open" in obj && "close" in obj; } function isBoxDataPoint(obj) { return isHighLowDataPoint(obj) && "q1" in obj && "q3" in obj && "median" in obj; } var interpolateBin = function interpolateBin(_ref4) { var point = _ref4.point, min = _ref4.min, max = _ref4.max, bins = _ref4.bins, scale = _ref4.scale; return scale === "linear" ? interpolateBinLinear({ point: point, min: min, max: max, bins: bins }) : interpolateBinLog({ pointRaw: point, minRaw: min, maxRaw: max, bins: bins }); }; var interpolateBinLinear = function interpolateBinLinear(_ref5) { var point = _ref5.point, min = _ref5.min, max = _ref5.max, bins = _ref5.bins; var pct = (point - min) / (max - min); return Math.floor(bins * pct); }; var interpolateBinLog = function interpolateBinLog(_ref6) { var pointRaw = _ref6.pointRaw, minRaw = _ref6.minRaw, maxRaw = _ref6.maxRaw, bins = _ref6.bins; var point = Math.log10(pointRaw); var min = Math.log10(minRaw); var max = Math.log10(maxRaw); var pct = (point - min) / (max - min); return Math.floor(bins * pct); }; var calcPan = function calcPan(pct) { return isNaN(pct) ? 0 : (pct * 2 - 1) * 0.98; }; var isNotNull = function isNotNull(tmp) { return tmp !== null; }; var calculateAxisMinimum = function calculateAxisMinimum(_ref7) { var data = _ref7.data, prop = _ref7.prop, filterGroupIndex = _ref7.filterGroupIndex; var dataToProcess = data.flat().filter(isNotNull); if (filterGroupIndex >= 0 && filterGroupIndex < data.length) { dataToProcess = data.at(filterGroupIndex); } var values = dataToProcess.map(function (point) { if (isSimpleDataPoint(point)) { if (prop === "x" || prop === "y") { return point[prop]; } } else if (isAlternateAxisDataPoint(point)) { if (prop === "x" || prop === "y2") { return point[prop]; } } else if (isOHLCDataPoint(point)) { if (prop === "x") { return point.x; } if (prop === "y") { return Math.min(point.high, point.low, point.open, point.close); } } else if (isHighLowDataPoint(point)) { if (prop === "x") { return point.x; } if (prop === "y") { return Math.min(point.high, point.low); } } return NaN; }).filter(function (num) { return !isNaN(num); }); if (values.length === 0) { return NaN; } return Math.min.apply(Math, _toConsumableArray(values)); }; var calculateAxisMaximum = function calculateAxisMaximum(_ref8) { var data = _ref8.data, prop = _ref8.prop, filterGroupIndex = _ref8.filterGroupIndex; var dataToProcess = data.flat().filter(isNotNull); if (filterGroupIndex >= 0 && filterGroupIndex < data.length) { dataToProcess = data.at(filterGroupIndex); } var values = dataToProcess.map(function (point) { if (isSimpleDataPoint(point)) { if (prop === "x" || prop === "y") { return point[prop]; } } else if (isAlternateAxisDataPoint(point)) { if (prop === "x" || prop === "y2") { return point[prop]; } } else if (isOHLCDataPoint(point)) { if (prop === "x") { return point.x; } if (prop === "y") { return Math.max(point.high, point.low, point.open, point.close); } } else if (isHighLowDataPoint(point)) { if (prop === "x") { return point.x; } if (prop === "y") { return Math.max(point.high, point.low); } } return NaN; }).filter(function (num) { return !isNaN(num); }); if (values.length === 0) { return NaN; } return Math.max.apply(Math, _toConsumableArray(values)); }; var defaultFormat = function defaultFormat(value) { return "".concat(value); }; var generatePointDescription = function generatePointDescription(_ref9) { var point = _ref9.point, _ref9$xFormat = _ref9.xFormat, xFormat = _ref9$xFormat === void 0 ? defaultFormat : _ref9$xFormat, _ref9$yFormat = _ref9.yFormat, yFormat = _ref9$yFormat === void 0 ? defaultFormat : _ref9$yFormat, stat = _ref9.stat, _ref9$outlierIndex = _ref9.outlierIndex, outlierIndex = _ref9$outlierIndex === void 0 ? null : _ref9$outlierIndex, _ref9$announcePointLa = _ref9.announcePointLabelFirst, announcePointLabelFirst = _ref9$announcePointLa === void 0 ? false : _ref9$announcePointLa, translationCallback = _ref9.translationCallback; if (isOHLCDataPoint(point)) { if (typeof stat !== "undefined") { return translationCallback("point-xy", { x: xFormat(point.x), y: yFormat(point[stat]) }); } return translationCallback("point-xohlc", { x: xFormat(point.x), open: yFormat(point.open), high: yFormat(point.high), low: yFormat(point.low), close: yFormat(point.close) }); } if (isBoxDataPoint(point) && outlierIndex !== null) { return translationCallback("point-outlier", { x: xFormat(point.x), y: point.outlier.at(outlierIndex), index: outlierIndex + 1, count: point.outlier.length }); } if (isBoxDataPoint(point) || isHighLowDataPoint(point)) { var _point$outlier; if (typeof stat !== "undefined") { return translationCallback("point-xy", { x: xFormat(point.x), y: yFormat(point[stat]) }); } var x = point.x, high = point.high, low = point.low; var formattedPoint = { x: xFormat(x), high: yFormat(high), low: yFormat(low) }; if ("outlier" in point && ((_point$outlier = point.outlier) === null || _point$outlier === void 0 ? void 0 : _point$outlier.length) > 0) { return translationCallback("point-xhl-outlier", _objectSpread(_objectSpread({}, formattedPoint), {}, { count: point.outlier.length })); } return translationCallback("point-xhl", formattedPoint); } if (isSimpleDataPoint(point)) { var details = [xFormat(point.x), yFormat(point.y)]; if (point.label) { if (announcePointLabelFirst) { details.unshift(point.label); } else { details.push(point.label); } } return details.join(", "); } if (isAlternateAxisDataPoint(point)) { return translationCallback("point-xy", { x: xFormat(point.x), y: yFormat(point.y2) }); } return ""; }; var usesAxis = function usesAxis(_ref10) { var data = _ref10.data, axisName = _ref10.axisName; var firstUseOfAxis = data.filter(isNotNull).find(function (row) { return row.find(function (point) { return axisName in point; }); }); return typeof firstUseOfAxis !== "undefined"; }; var calculateMetadataByGroup = function calculateMetadataByGroup(data) { return data.map(function (row, index) { if (row === null) { return { index: index, minimumPointIndex: null, maximumPointIndex: null, minimumValue: NaN, maximumValue: NaN, tenths: NaN, availableStats: [], statIndex: -1, inputType: null, size: 0 }; } var yValues = []; var availableStats = []; if (isSimpleDataPoint(row.at(0))) { yValues = row.map(function (_ref11) { var y = _ref11.y; return y; }); } else if (isAlternateAxisDataPoint(row.at(0))) { yValues = row.map(function (_ref12) { var y2 = _ref12.y2; return y2; }); } else if (isOHLCDataPoint(row.at(0))) { availableStats = ["open", "high", "low", "close"]; } else if (isBoxDataPoint(row.at(0))) { availableStats = ["high", "q3", "median", "q1", "low", "outlier"]; } else if (isHighLowDataPoint(row.at(0))) { availableStats = ["high", "low"]; } var filteredYValues = yValues.filter(function (num) { return !isNaN(num); }); var _ref13 = filteredYValues.length > 0 ? [Math.min.apply(Math, _toConsumableArray(filteredYValues)), Math.max.apply(Math, _toConsumableArray(filteredYValues))] : [-1, -1], _ref14 = _slicedToArray(_ref13, 2), min = _ref14[0], max = _ref14[1]; var tenths = Math.round(row.length / 10); return { index: index, minimumPointIndex: yValues.indexOf(min), maximumPointIndex: yValues.indexOf(max), minimumValue: min, maximumValue: max, tenths: tenths, availableStats: availableStats, statIndex: -1, inputType: detectDataPointType(row.at(0)), size: row.length }; }); }; var initializeAxis = function initializeAxis(_ref15) { var _userAxis$format, _userAxis$minimum, _userAxis$maximum, _userAxis$label, _userAxis$type, _userAxis$continuous; var data = _ref15.data, axisName = _ref15.axisName, userAxis = _ref15.userAxis, filterGroupIndex = _ref15.filterGroupIndex; var format = (_userAxis$format = userAxis === null || userAxis === void 0 ? void 0 : userAxis.format) !== null && _userAxis$format !== void 0 ? _userAxis$format : "valueLabels" in userAxis ? function (index) { return userAxis.valueLabels[index]; } : defaultFormat; return { minimum: (_userAxis$minimum = userAxis === null || userAxis === void 0 ? void 0 : userAxis.minimum) !== null && _userAxis$minimum !== void 0 ? _userAxis$minimum : calculateAxisMinimum({ data: data, prop: axisName, filterGroupIndex: filterGroupIndex }), maximum: (_userAxis$maximum = userAxis === null || userAxis === void 0 ? void 0 : userAxis.maximum) !== null && _userAxis$maximum !== void 0 ? _userAxis$maximum : calculateAxisMaximum({ data: data, prop: axisName, filterGroupIndex: filterGroupIndex }), label: (_userAxis$label = userAxis === null || userAxis === void 0 ? void 0 : userAxis.label) !== null && _userAxis$label !== void 0 ? _userAxis$label : "", type: (_userAxis$type = userAxis === null || userAxis === void 0 ? void 0 : userAxis.type) !== null && _userAxis$type !== void 0 ? _userAxis$type : "linear", format: format, continuous: (_userAxis$continuous = userAxis.continuous) !== null && _userAxis$continuous !== void 0 ? _userAxis$continuous : false }; }; var detectDataPointType = function detectDataPointType(query) { if (typeof query === "number") { return "number"; } if (_typeof(query) !== "object") { return "unknown"; } if (isSimpleDataPoint(query)) { return "SimpleDataPoint"; } if (isAlternateAxisDataPoint(query)) { return "AlternativeAxisDataPoint"; } if (isOHLCDataPoint(query)) { return "OHLCDataPoint"; } if (isBoxDataPoint(query)) { return "BoxDataPoint"; } if (isHighLowDataPoint(query)) { return "HighLowDataPoint"; } return "unknown"; }; var convertDataRow = function convertDataRow(row) { if (row === null) { return null; } return row.map(function (point, index) { if (typeof point === "number") { return { x: index, y: point }; } return point; }); }; var formatWrapper = function formatWrapper(_ref16) { var axis = _ref16.axis, translationCallback = _ref16.translationCallback; var format = function format(num) { if (isNaN(num)) { return translationCallback("missing"); } if (typeof axis.minimum === "number" && num < axis.minimum) { return translationCallback("tooLow"); } if (typeof axis.maximum === "number" && num > axis.maximum) { return translationCallback("tooHigh"); } return axis.format(num); }; return format; }; var generateChartSummary = function generateChartSummary(_ref17) { var title = _ref17.title, groupCount = _ref17.groupCount, _ref17$live = _ref17.live, live = _ref17$live === void 0 ? false : _ref17$live, _ref17$hierarchy = _ref17.hierarchy, hierarchy = _ref17$hierarchy === void 0 ? false : _ref17$hierarchy, translationCallback = _ref17.translationCallback; var text = ["summ", "chart"]; if (live) { text.push("live"); } if (hierarchy) { text.push("hier"); } if (groupCount > 1) { text.push("group"); } if (title.length > 0) { text.push("title"); } return translationCallback(text.join("-"), { groupCount: groupCount, title: title }); }; var axisDescriptions = { x: "X", y: "Y", y2: "Alternate Y" }; var generateAxisSummary = function generateAxisSummary(_ref18) { var _axis$label; var axisLetter = _ref18.axisLetter, axis = _ref18.axis, translationCallback = _ref18.translationCallback; var code = ["axis", "desc"]; if (axis.type === "log10") { code.push("log"); } if (axisLetter === "x" && axis.continuous) { code.push("con"); } return translationCallback(code.join("-"), { letter: axisDescriptions[axisLetter], label: (_axis$label = axis.label) !== null && _axis$label !== void 0 ? _axis$label : "", min: axis.format(axis.minimum), max: axis.format(axis.maximum) }); }; var generateInstructions = function generateInstructions(_ref19) { var hierarchy = _ref19.hierarchy, live = _ref19.live, hasNotes = _ref19.hasNotes, translationCallback = _ref19.translationCallback; var keyboardMessage = filteredJoin([translationCallback("instructionArrows"), hierarchy && translationCallback("instructionHierarchy"), live && translationCallback("instructionLive"), translationCallback("instructionHotkeys")], " "); var info = [keyboardMessage]; if (hasNotes) { info.unshift("Has notes."); } return info.join(" "); }; var isUnplayable = function isUnplayable(yValue, yAxis) { return isNaN(yValue) || yValue < yAxis.minimum || yValue > yAxis.maximum; }; var prepChartElement = function prepChartElement(_ref20) { var elem = _ref20.elem, title = _ref20.title, translationCallback = _ref20.translationCallback, addCleanupTask = _ref20.addCleanupTask; if (!elem.hasAttribute("alt") && !elem.hasAttribute("aria-label")) { var label = title ? translationCallback("description", { title: title }) : translationCallback("description-untitled"); elem.setAttribute("aria-label", label); addCleanupTask(function () { return elem.removeAttribute("aria-label"); }); } if (!elem.hasAttribute("role")) { elem.setAttribute("role", "application"); addCleanupTask(function () { return elem.removeAttribute("role"); }); } }; var checkForNumberInput = function checkForNumberInput(metadataByGroup, data) { if (Array.isArray(data) && typeof data[0] === "number") { metadataByGroup[0].inputType = "number"; } else { var index = 0; for (var group in data) { var row = data[group]; if (row !== null && Array.isArray(row) && detectDataPointType(row.at(0)) === "number") { metadataByGroup[index].inputType = "number"; } index++; } } return metadataByGroup; }; var detectIfMobile = function detectIfMobile() { var toMatch = [/Android/i, /webOS/i, /iPhone/i, /iPad/i, /iPod/i, /BlackBerry/i, /Windows Phone/i]; return toMatch.some(function (toMatchItem) { return navigator.userAgent.match(toMatchItem); }); }; var filteredJoin = function filteredJoin(arr, joiner) { return arr.filter(function (item) { return Boolean(item); }).join(joiner); }; var determineCC = function determineCC(containerElement, cleanUpFnCallback, providedCC) { if (providedCC) { return providedCC; } var generatedCC = document.createElement("div"); containerElement.appendChild(generatedCC); cleanUpFnCallback(function () { generatedCC.remove(); }); return generatedCC; }; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var _extendStatics = function extendStatics(d, b) { _extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; } || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return _extendStatics(d, b); }; function __extends(d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); _extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } var _assign = function __assign() { _assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return _assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; // // Main // function memoize(fn, options) { var cache = options && options.cache ? options.cache : cacheDefault; var serializer = options && options.serializer ? options.serializer : serializerDefault; var strategy = options && options.strategy ? options.strategy : strategyDefault; return strategy(fn, { cache: cache, serializer: serializer }); } // // Strategy // function isPrimitive(value) { return value == null || typeof value === 'number' || typeof value === 'boolean'; // || typeof value === "string" 'unsafe' primitive for our needs } function monadic(fn, cache, serializer, arg) { var cacheKey = isPrimitive(arg) ? arg : serializer(arg); var computedValue = cache.get(cacheKey); if (typeof computedValue === 'undefined') { computedValue = fn.call(this, arg); cache.set(cacheKey, computedValue); } return computedValue; } function variadic(fn, cache, serializer) { var args = Array.prototype.slice.call(arguments, 3); var cacheKey = serializer(args); var computedValue = cache.get(cacheKey); if (typeof computedValue === 'undefined') { computedValue = fn.apply(this, args); cache.set(cacheKey, computedValue); } return computedValue; } function assemble(fn, context, strategy, cache, serialize) { return strategy.bind(context, fn, cache, serialize); } function strategyDefault(fn, options) { var strategy = fn.length === 1 ? monadic : variadic; return assemble(fn, this, strategy, options.cache.create(), options.serializer); } function strategyVariadic(fn, options) { return assemble(fn, this, variadic, options.cache.create(), options.serializer); } // // Serializer // var serializerDefault = function serializerDefault() { return JSON.stringify(arguments); }; // // Cache // var ObjectWithoutPrototypeCache = /** @class */function () { function ObjectWithoutPrototypeCache() { this.cache = Object.create(null); } ObjectWithoutPrototypeCache.prototype.get = function (key) { return this.cache[key]; }; ObjectWithoutPrototypeCache.prototype.set = function (key, value) { this.cache[key] = value; }; return ObjectWithoutPrototypeCache; }(); var cacheDefault = { create: function create() { return new ObjectWithoutPrototypeCache(); } }; var strategies = { variadic: strategyVariadic }; var ErrorKind; (function (ErrorKind) { /** Argument is unclosed (e.g. `{0`) */ ErrorKind[ErrorKind["EXPECT_ARGUMENT_CLOSING_BRACE"] = 1] = "EXPECT_ARGUMENT_CLOSING_BRACE"; /** Argument is empty (e.g. `{}`). */ ErrorKind[ErrorKind["EMPTY_ARGUMENT"] = 2] = "EMPTY_ARGUMENT"; /** Argument is malformed (e.g. `{foo!}``) */ ErrorKind[ErrorKind["MALFORMED_ARGUMENT"] = 3] = "MALFORMED_ARGUMENT"; /** Expect an argument type (e.g. `{foo,}`) */ ErrorKind[ErrorKind["EXPECT_ARGUMENT_TYPE"] = 4] = "EXPECT_ARGUMENT_TYPE"; /** Unsupported argument type (e.g. `{foo,foo}`) */ ErrorKind[ErrorKind["INVALID_ARGUMENT_TYPE"] = 5] = "INVALID_ARGUMENT_TYPE"; /** Expect an argument style (e.g. `{foo, number, }`) */ ErrorKind[ErrorKind["EXPECT_ARGUMENT_STYLE"] = 6] = "EXPECT_ARGUMENT_STYLE"; /** The number skeleton is invalid. */ ErrorKind[ErrorKind["INVALID_NUMBER_SKELETON"] = 7] = "INVALID_NUMBER_SKELETON"; /** The date time skeleton is invalid. */ ErrorKind[ErrorKind["INVALID_DATE_TIME_SKELETON"] = 8] = "INVALID_DATE_TIME_SKELETON"; /** Exepct a number skeleton following the `::` (e.g. `{foo, number, ::}`) */ ErrorKind[ErrorKind["EXPECT_NUMBER_SKELETON"] = 9] = "EXPECT_NUMBER_SKELETON"; /** Exepct a date time skeleton following the `::` (e.g. `{foo, date, ::}`) */ ErrorKind[ErrorKind["EXPECT_DATE_TIME_SKELETON"] = 10] = "EXPECT_DATE_TIME_SKELETON"; /** Unmatched apostrophes in the argument style (e.g. `{foo, number, 'test`) */ ErrorKind[ErrorKind["UNCLOSED_QUOTE_IN_ARGUMENT_STYLE"] = 11] = "UNCLOSED_QUOTE_IN_ARGUMENT_STYLE"; /** Missing select argument options (e.g. `{foo, select}`) */ ErrorKind[ErrorKind["EXPECT_SELECT_ARGUMENT_OPTIONS"] = 12] = "EXPECT_SELECT_ARGUMENT_OPTIONS"; /** Expecting an offset value in `plural` or `selectordinal` argument (e.g `{foo, plural, offset}`) */ ErrorKind[ErrorKind["EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE"] = 13] = "EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE"; /** Offset value in `plural` or `selectordinal` is invalid (e.g. `{foo, plural, offset: x}`) */ ErrorKind[ErrorKind["INVALID_PLURAL_ARGUMENT_OFFSET_VALUE"] = 14] = "INVALID_PLURAL_ARGUMENT_OFFSET_VALUE"; /** Expecting a selector in `select` argument (e.g `{foo, select}`) */ ErrorKind[ErrorKind["EXPECT_SELECT_ARGUMENT_SELECTOR"] = 15] = "EXPECT_SELECT_ARGUMENT_SELECTOR"; /** Expecting a selector in `plural` or `selectordinal` argument (e.g `{foo, plural}`) */ ErrorKind[ErrorKind["EXPECT_PLURAL_ARGUMENT_SELECTOR"] = 16] = "EXPECT_PLURAL_ARGUMENT_SELECTOR"; /** Expecting a message fragment after the `select` selector (e.g. `{foo, select, apple}`) */ ErrorKind[ErrorKind["EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT"] = 17] = "EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT"; /** * Expecting a message fragment after the `plural` or `selectordinal` selector * (e.g. `{foo, plural, one}`) */ ErrorKind[ErrorKind["EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT"] = 18] = "EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT"; /** Selector in `plural` or `selectordinal` is malformed (e.g. `{foo, plural, =x {#}}`) */ ErrorKind[ErrorKind["INVALID_PLURAL_ARGUMENT_SELECTOR"] = 19] = "INVALID_PLURAL_ARGUMENT_SELECTOR"; /** * Duplicate selectors in `plural` or `selectordinal` argument. * (e.g. {foo, plural, one {#} one {#}}) */ ErrorKind[ErrorKind["DUPLICATE_PLURAL_ARGUMENT_SELECTOR"] = 20] = "DUPLICATE_PLURAL_ARGUMENT_SELECTOR"; /** Duplicate selectors in `select` argument. * (e.g. {foo, select, apple {apple} apple {apple}}) */ ErrorKind[ErrorKind["DUPLICATE_SELECT_ARGUMENT_SELECTOR"] = 21] = "DUPLICATE_SELECT_ARGUMENT_SELECTOR"; /** Plural or select argument option must have `other` clause. */ ErrorKind[ErrorKind["MISSING_OTHER_CLAUSE"] = 22] = "MISSING_OTHER_CLAUSE"; /** The tag is malformed. (e.g. `<bold!>foo</bold!>) */ ErrorKind[ErrorKind["INVALID_TAG"] = 23] = "INVALID_TAG"; /** The tag name is invalid. (e.g. `<123>foo</123>`) */ ErrorKind[ErrorKind["INVALID_TAG_NAME"] = 25] = "INVALID_TAG_NAME"; /** The closing tag does not match the opening tag. (e.g. `<bold>foo</italic>`) */ ErrorKind[ErrorKind["UNMATCHED_CLOSING_TAG"] = 26] = "UNMATCHED_CLOSING_TAG"; /** The opening tag has unmatched closing tag. (e.g. `<bold>foo`) */ ErrorKind[ErrorKind["UNCLOSED_TAG"] = 27] = "UNCLOSED_TAG"; })(ErrorKind || (ErrorKind = {})); var TYPE; (function (TYPE) { /** * Raw text */ TYPE[TYPE["literal"] = 0] = "literal"; /** * Variable w/o any format, e.g `var` in `this is a {var}` */ TYPE[TYPE["argument"] = 1] = "argument"; /** * Variable w/ number format */ TYPE[TYPE["number"] = 2] = "number"; /** * Variable w/ date format */ TYPE[TYPE["date"] = 3] = "date"; /** * Variable w/ time format */ TYPE[TYPE["time"] = 4] = "time"; /** * Variable w/ select format */ TYPE[TYPE["select"] = 5] = "select"; /** * Variable w/ plural format */ TYPE[TYPE["plural"] = 6] = "plural"; /** * Only possible within plural argument. * This is the `#` symbol that will be substituted with the count. */ TYPE[TYPE["pound"] = 7] = "pound"; /** * XML-like tag */ TYPE[TYPE["tag"] = 8] = "tag"; })(TYPE || (TYPE = {})); var SKELETON_TYPE; (function (SKELETON_TYPE) { SKELETON_TYPE[SKELETON_TYPE["number"] = 0] = "number"; SKELETON_TYPE[SKELETON_TYPE["dateTime"] = 1] = "dateTime"; })(SKELETON_TYPE || (SKELETON_TYPE = {})); /** * Type Guards */ function isLiteralElement(el) { return el.type === TYPE.literal; } function isArgumentElement(el) { return el.type === TYPE.argument; } function isNumberElement(el) { return el.type === TYPE.number; } function isDateElement(el) { return el.type === TYPE.date; } function isTimeElement(el) { return el.type === TYPE.time; } function isSelectElement(el) { return el.type === TYPE.select; } function isPluralElement(el) { return el.type === TYPE.plural; } function isPoundElement(el) { return el.type === TYPE.pound; } function isTagElement(el) { return el.type === TYPE.tag; } function isNumberSkeleton(el) { return !!(el && _typeof(el) === 'object' && el.type === SKELETON_TYPE.number); } function isDateTimeSkeleton(el) { return !!(el && _typeof(el) === 'object' && el.type === SKELETON_TYPE.dateTime); } // @generated from regex-gen.ts var SPACE_SEPARATOR_REGEX = /[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; /** * 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 ? '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; // 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-digi