12448].indexOf(codePoint) !== -1) { indices.push(index); return types.push(CB); } } if (classType === CM || classType === ZWJ$1) { if (index === 0) { indices.push(index); return types.push(AL); } var prev = types[index - 1]; if (LINE_BREAKS.indexOf(prev) === -1) { indices.push(indices[index - 1]); return types.push(prev); } indices.push(index); return types.push(AL); } indices.push(index); if (classType === CJ) { return types.push(lineBreak2 === "strict" ? NS : ID); } if (classType === SA) { return types.push(AL); } if (classType === AI) { return types.push(AL); } if (classType === XX) { if (codePoint >= 131072 && codePoint <= 196605 || codePoint >= 196608 && codePoint <= 262141) { return types.push(ID); } else { return types.push(AL); } } types.push(classType); }); return [indices, types, categories]; }; var isAdjacentWithSpaceIgnored = function(a2, b, currentIndex, classTypes) { var current = classTypes[currentIndex]; if (Array.isArray(a2) ? a2.indexOf(current) !== -1 : a2 === current) { var i = currentIndex; while (i <= classTypes.length) { i++; var next = classTypes[i]; if (next === b) { return true; } if (next !== SP) { break; } } } if (current === SP) { var i = currentIndex; while (i > 0) { i--; var prev = classTypes[i]; if (Array.isArray(a2) ? a2.indexOf(prev) !== -1 : a2 === prev) { var n = currentIndex; while (n <= classTypes.length) { n++; var next = classTypes[n]; if (next === b) { return true; } if (next !== SP) { break; } } } if (prev !== SP) { break; } } } return false; }; var previousNonSpaceClassType = function(currentIndex, classTypes) { var i = currentIndex; while (i >= 0) { var type = classTypes[i]; if (type === SP) { i--; } else { return type; } } return 0; }; var _lineBreakAtIndex = function(codePoints, classTypes, indicies, index, forbiddenBreaks) { if (indicies[index] === 0) { return BREAK_NOT_ALLOWED$1; } var currentIndex = index - 1; if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) { return BREAK_NOT_ALLOWED$1; } var beforeIndex = currentIndex - 1; var afterIndex = currentIndex + 1; var current = classTypes[currentIndex]; var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0; var next = classTypes[afterIndex]; if (current === CR$1 && next === LF$1) { return BREAK_NOT_ALLOWED$1; } if (HARD_LINE_BREAKS.indexOf(current) !== -1) { return BREAK_MANDATORY; } if (HARD_LINE_BREAKS.indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if (SPACE$1.indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) { return BREAK_ALLOWED$1; } if (UnicodeTrie$1.get(codePoints[currentIndex]) === ZWJ$1) { return BREAK_NOT_ALLOWED$1; } if ((current === EB || current === EM) && UnicodeTrie$1.get(codePoints[afterIndex]) === ZWJ$1) { return BREAK_NOT_ALLOWED$1; } if (current === WJ || next === WJ) { return BREAK_NOT_ALLOWED$1; } if (current === GL) { return BREAK_NOT_ALLOWED$1; } if ([SP, BA, HY].indexOf(current) === -1 && next === GL) { return BREAK_NOT_ALLOWED$1; } if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { return BREAK_NOT_ALLOWED$1; } if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { return BREAK_NOT_ALLOWED$1; } if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) { return BREAK_NOT_ALLOWED$1; } if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { return BREAK_NOT_ALLOWED$1; } if (current === SP) { return BREAK_ALLOWED$1; } if (current === QU || next === QU) { return BREAK_NOT_ALLOWED$1; } if (next === CB || current === CB) { return BREAK_ALLOWED$1; } if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) { return BREAK_NOT_ALLOWED$1; } if (before === HL && HYPHEN.indexOf(current) !== -1) { return BREAK_NOT_ALLOWED$1; } if (current === SY && next === HL) { return BREAK_NOT_ALLOWED$1; } if (next === IN) { return BREAK_NOT_ALLOWED$1; } if (ALPHABETICS.indexOf(next) !== -1 && current === NU || ALPHABETICS.indexOf(current) !== -1 && next === NU) { return BREAK_NOT_ALLOWED$1; } if (current === PR && [ID, EB, EM].indexOf(next) !== -1 || [ID, EB, EM].indexOf(current) !== -1 && next === PO) { return BREAK_NOT_ALLOWED$1; } if (ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1 || PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if ( // (PR | PO) × ( OP | HY )? NU [PR, PO].indexOf(current) !== -1 && (next === NU || [OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU) || // ( OP | HY ) × NU [OP, HY].indexOf(current) !== -1 && next === NU || // NU × (NU | SY | IS) current === NU && [NU, SY, IS].indexOf(next) !== -1 ) { return BREAK_NOT_ALLOWED$1; } if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) { var prevIndex = currentIndex; while (prevIndex >= 0) { var type = classTypes[prevIndex]; if (type === NU) { return BREAK_NOT_ALLOWED$1; } else if ([SY, IS].indexOf(type) !== -1) { prevIndex--; } else { break; } } } if ([PR, PO].indexOf(next) !== -1) { var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex; while (prevIndex >= 0) { var type = classTypes[prevIndex]; if (type === NU) { return BREAK_NOT_ALLOWED$1; } else if ([SY, IS].indexOf(type) !== -1) { prevIndex--; } else { break; } } } if (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1 || [JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1 || [JT, H3].indexOf(current) !== -1 && next === JT) { return BREAK_NOT_ALLOWED$1; } if (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1 || KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR) { return BREAK_NOT_ALLOWED$1; } if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if (current === IS && ALPHABETICS.indexOf(next) !== -1) { return BREAK_NOT_ALLOWED$1; } if (ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP && ea_OP.indexOf(codePoints[afterIndex]) === -1 || ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) { return BREAK_NOT_ALLOWED$1; } if (current === RI$1 && next === RI$1) { var i = indicies[currentIndex]; var count = 1; while (i > 0) { i--; if (classTypes[i] === RI$1) { count++; } else { break; } } if (count % 2 !== 0) { return BREAK_NOT_ALLOWED$1; } } if (current === EB && next === EM) { return BREAK_NOT_ALLOWED$1; } return BREAK_ALLOWED$1; }; var cssFormattedClasses = function(codePoints, options) { if (!options) { options = { lineBreak: "normal", wordBreak: "normal" }; } var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2]; if (options.wordBreak === "break-all" || options.wordBreak === "break-word") { classTypes = classTypes.map(function(type) { return [NU, AL, SA].indexOf(type) !== -1 ? ID : type; }); } var forbiddenBreakpoints = options.wordBreak === "keep-all" ? isLetterNumber.map(function(letterNumber, i) { return letterNumber && codePoints[i] >= 19968 && codePoints[i] <= 40959; }) : void 0; return [indicies, classTypes, forbiddenBreakpoints]; }; var Break = ( /** @class */ function() { function Break2(codePoints, lineBreak2, start, end) { this.codePoints = codePoints; this.required = lineBreak2 === BREAK_MANDATORY; this.start = start; this.end = end; } Break2.prototype.slice = function() { return fromCodePoint$1.apply(void 0, this.codePoints.slice(this.start, this.end)); }; return Break2; }() ); var LineBreaker = function(str, options) { var codePoints = toCodePoints$1(str); var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2]; var length = codePoints.length; var lastEnd = 0; var nextIndex = 0; return { next: function() { if (nextIndex >= length) { return { done: true, value: null }; } var lineBreak2 = BREAK_NOT_ALLOWED$1; while (nextIndex < length && (lineBreak2 = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) === BREAK_NOT_ALLOWED$1) { } if (lineBreak2 !== BREAK_NOT_ALLOWED$1 || nextIndex === length) { var value = new Break(codePoints, lineBreak2, lastEnd, nextIndex); lastEnd = nextIndex; return { value, done: false }; } return { done: true, value: null }; } }; }; var FLAG_UNRESTRICTED = 1 << 0; var FLAG_ID = 1 << 1; var FLAG_INTEGER = 1 << 2; var FLAG_NUMBER = 1 << 3; var LINE_FEED = 10; var SOLIDUS = 47; var REVERSE_SOLIDUS = 92; var CHARACTER_TABULATION = 9; var SPACE = 32; var QUOTATION_MARK = 34; var EQUALS_SIGN = 61; var NUMBER_SIGN = 35; var DOLLAR_SIGN = 36; var PERCENTAGE_SIGN = 37; var APOSTROPHE = 39; var LEFT_PARENTHESIS = 40; var RIGHT_PARENTHESIS = 41; var LOW_LINE = 95; var HYPHEN_MINUS = 45; var EXCLAMATION_MARK = 33; var LESS_THAN_SIGN = 60; var GREATER_THAN_SIGN = 62; var COMMERCIAL_AT = 64; var LEFT_SQUARE_BRACKET = 91; var RIGHT_SQUARE_BRACKET = 93; var CIRCUMFLEX_ACCENT = 61; var LEFT_CURLY_BRACKET = 123; var QUESTION_MARK = 63; var RIGHT_CURLY_BRACKET = 125; var VERTICAL_LINE = 124; var TILDE = 126; var CONTROL = 128; var REPLACEMENT_CHARACTER = 65533; var ASTERISK = 42; var PLUS_SIGN = 43; var COMMA = 44; var COLON = 58; var SEMICOLON = 59; var FULL_STOP = 46; var NULL = 0; var BACKSPACE = 8; var LINE_TABULATION = 11; var SHIFT_OUT = 14; var INFORMATION_SEPARATOR_ONE = 31; var DELETE = 127; var EOF = -1; var ZERO = 48; var a = 97; var e = 101; var f = 102; var u = 117; var z = 122; var A = 65; var E = 69; var F = 70; var U = 85; var Z = 90; var isDigit = function(codePoint) { return codePoint >= ZERO && codePoint <= 57; }; var isSurrogateCodePoint = function(codePoint) { return codePoint >= 55296 && codePoint <= 57343; }; var isHex = function(codePoint) { return isDigit(codePoint) || codePoint >= A && codePoint <= F || codePoint >= a && codePoint <= f; }; var isLowerCaseLetter = function(codePoint) { return codePoint >= a && codePoint <= z; }; var isUpperCaseLetter = function(codePoint) { return codePoint >= A && codePoint <= Z; }; var isLetter = function(codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); }; var isNonASCIICodePoint = function(codePoint) { return codePoint >= CONTROL; }; var isWhiteSpace = function(codePoint) { return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE; }; var isNameStartCodePoint = function(codePoint) { return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE; }; var isNameCodePoint = function(codePoint) { return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS; }; var isNonPrintableCodePoint = function(codePoint) { return codePoint >= NULL && codePoint <= BACKSPACE || codePoint === LINE_TABULATION || codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE || codePoint === DELETE; }; var isValidEscape = function(c1, c2) { if (c1 !== REVERSE_SOLIDUS) { return false; } return c2 !== LINE_FEED; }; var isIdentifierStart = function(c1, c2, c3) { if (c1 === HYPHEN_MINUS) { return isNameStartCodePoint(c2) || isValidEscape(c2, c3); } else if (isNameStartCodePoint(c1)) { return true; } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) { return true; } return false; }; var isNumberStart = function(c1, c2, c3) { if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { if (isDigit(c2)) { return true; } return c2 === FULL_STOP && isDigit(c3); } if (c1 === FULL_STOP) { return isDigit(c2); } return isDigit(c1); }; var stringToNumber = function(codePoints) { var c = 0; var sign = 1; if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { if (codePoints[c] === HYPHEN_MINUS) { sign = -1; } c++; } var integers = []; while (isDigit(codePoints[c])) { integers.push(codePoints[c++]); } var int = integers.length ? parseInt(fromCodePoint$1.apply(void 0, integers), 10) : 0; if (codePoints[c] === FULL_STOP) { c++; } var fraction = []; while (isDigit(codePoints[c])) { fraction.push(codePoints[c++]); } var fracd = fraction.length; var frac = fracd ? parseInt(fromCodePoint$1.apply(void 0, fraction), 10) : 0; if (codePoints[c] === E || codePoints[c] === e) { c++; } var expsign = 1; if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { if (codePoints[c] === HYPHEN_MINUS) { expsign = -1; } c++; } var exponent = []; while (isDigit(codePoints[c])) { exponent.push(codePoints[c++]); } var exp = exponent.length ? parseInt(fromCodePoint$1.apply(void 0, exponent), 10) : 0; return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp); }; var LEFT_PARENTHESIS_TOKEN = { type: 2 /* LEFT_PARENTHESIS_TOKEN */ }; var RIGHT_PARENTHESIS_TOKEN = { type: 3 /* RIGHT_PARENTHESIS_TOKEN */ }; var COMMA_TOKEN = { type: 4 /* COMMA_TOKEN */ }; var SUFFIX_MATCH_TOKEN = { type: 13 /* SUFFIX_MATCH_TOKEN */ }; var PREFIX_MATCH_TOKEN = { type: 8 /* PREFIX_MATCH_TOKEN */ }; var COLUMN_TOKEN = { type: 21 /* COLUMN_TOKEN */ }; var DASH_MATCH_TOKEN = { type: 9 /* DASH_MATCH_TOKEN */ }; var INCLUDE_MATCH_TOKEN = { type: 10 /* INCLUDE_MATCH_TOKEN */ }; var LEFT_CURLY_BRACKET_TOKEN = { type: 11 /* LEFT_CURLY_BRACKET_TOKEN */ }; var RIGHT_CURLY_BRACKET_TOKEN = { type: 12 /* RIGHT_CURLY_BRACKET_TOKEN */ }; var SUBSTRING_MATCH_TOKEN = { type: 14 /* SUBSTRING_MATCH_TOKEN */ }; var BAD_URL_TOKEN = { type: 23 /* BAD_URL_TOKEN */ }; var BAD_STRING_TOKEN = { type: 1 /* BAD_STRING_TOKEN */ }; var CDO_TOKEN = { type: 25 /* CDO_TOKEN */ }; var CDC_TOKEN = { type: 24 /* CDC_TOKEN */ }; var COLON_TOKEN = { type: 26 /* COLON_TOKEN */ }; var SEMICOLON_TOKEN = { type: 27 /* SEMICOLON_TOKEN */ }; var LEFT_SQUARE_BRACKET_TOKEN = { type: 28 /* LEFT_SQUARE_BRACKET_TOKEN */ }; var RIGHT_SQUARE_BRACKET_TOKEN = { type: 29 /* RIGHT_SQUARE_BRACKET_TOKEN */ }; var WHITESPACE_TOKEN = { type: 31 /* WHITESPACE_TOKEN */ }; var EOF_TOKEN = { type: 32 /* EOF_TOKEN */ }; var Tokenizer = ( /** @class */ function() { function Tokenizer2() { this._value = []; } Tokenizer2.prototype.write = function(chunk) { this._value = this._value.concat(toCodePoints$1(chunk)); }; Tokenizer2.prototype.read = function() { var tokens = []; var token = this.consumeToken(); while (token !== EOF_TOKEN) { tokens.push(token); token = this.consumeToken(); } return tokens; }; Tokenizer2.prototype.consumeToken = function() { var codePoint = this.consumeCodePoint(); switch (codePoint) { case QUOTATION_MARK: return this.consumeStringToken(QUOTATION_MARK); case NUMBER_SIGN: var c1 = this.peekCodePoint(0); var c2 = this.peekCodePoint(1); var c3 = this.peekCodePoint(2); if (isNameCodePoint(c1) || isValidEscape(c2, c3)) { var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED; var value = this.consumeName(); return { type: 5, value, flags }; } break; case DOLLAR_SIGN: if (this.peekCodePoint(0) === EQUALS_SIGN) { this.consumeCodePoint(); return SUFFIX_MATCH_TOKEN; } break; case APOSTROPHE: return this.consumeStringToken(APOSTROPHE); case LEFT_PARENTHESIS: return LEFT_PARENTHESIS_TOKEN; case RIGHT_PARENTHESIS: return RIGHT_PARENTHESIS_TOKEN; case ASTERISK: if (this.peekCodePoint(0) === EQUALS_SIGN) { this.consumeCodePoint(); return SUBSTRING_MATCH_TOKEN; } break; case PLUS_SIGN: if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) { this.reconsumeCodePoint(codePoint); return this.consumeNumericToken(); } break; case COMMA: return COMMA_TOKEN; case HYPHEN_MINUS: var e1 = codePoint; var e2 = this.peekCodePoint(0); var e3 = this.peekCodePoint(1); if (isNumberStart(e1, e2, e3)) { this.reconsumeCodePoint(codePoint); return this.consumeNumericToken(); } if (isIdentifierStart(e1, e2, e3)) { this.reconsumeCodePoint(codePoint); return this.consumeIdentLikeToken(); } if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) { this.consumeCodePoint(); this.consumeCodePoint(); return CDC_TOKEN; } break; case FULL_STOP: if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) { this.reconsumeCodePoint(codePoint); return this.consumeNumericToken(); } break; case SOLIDUS: if (this.peekCodePoint(0) === ASTERISK) { this.consumeCodePoint(); while (true) { var c = this.consumeCodePoint(); if (c === ASTERISK) { c = this.consumeCodePoint(); if (c === SOLIDUS) { return this.consumeToken(); } } if (c === EOF) { return this.consumeToken(); } } } break; case COLON: return COLON_TOKEN; case SEMICOLON: return SEMICOLON_TOKEN; case LESS_THAN_SIGN: if (this.peekCodePoint(0) === EXCLAMATION_MARK && this.peekCodePoint(1) === HYPHEN_MINUS && this.peekCodePoint(2) === HYPHEN_MINUS) { this.consumeCodePoint(); this.consumeCodePoint(); return CDO_TOKEN; } break; case COMMERCIAL_AT: var a1 = this.peekCodePoint(0); var a2 = this.peekCodePoint(1); var a3 = this.peekCodePoint(2); if (isIdentifierStart(a1, a2, a3)) { var value = this.consumeName(); return { type: 7, value }; } break; case LEFT_SQUARE_BRACKET: return LEFT_SQUARE_BRACKET_TOKEN; case REVERSE_SOLIDUS: if (isValidEscape(codePoint, this.peekCodePoint(0))) { this.reconsumeCodePoint(codePoint); return this.consumeIdentLikeToken(); } break; case RIGHT_SQUARE_BRACKET: return RIGHT_SQUARE_BRACKET_TOKEN; case CIRCUMFLEX_ACCENT: if (this.peekCodePoint(0) === EQUALS_SIGN) { this.consumeCodePoint(); return PREFIX_MATCH_TOKEN; } break; case LEFT_CURLY_BRACKET: return LEFT_CURLY_BRACKET_TOKEN; case RIGHT_CURLY_BRACKET: return RIGHT_CURLY_BRACKET_TOKEN; case u: case U: var u1 = this.peekCodePoint(0); var u2 = this.peekCodePoint(1); if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) { this.consumeCodePoint(); this.consumeUnicodeRangeToken(); } this.reconsumeCodePoint(codePoint); return this.consumeIdentLikeToken(); case VERTICAL_LINE: if (this.peekCodePoint(0) === EQUALS_SIGN) { this.consumeCodePoint(); return DASH_MATCH_TOKEN; } if (this.peekCodePoint(0) === VERTICAL_LINE) { this.consumeCodePoint(); return COLUMN_TOKEN; } break; case TILDE: if (this.peekCodePoint(0) === EQUALS_SIGN) { this.consumeCodePoint(); return INCLUDE_MATCH_TOKEN; } break; case EOF: return EOF_TOKEN; } if (isWhiteSpace(codePoint)) { this.consumeWhiteSpace(); return WHITESPACE_TOKEN; } if (isDigit(codePoint)) { this.reconsumeCodePoint(codePoint); return this.consumeNumericToken(); } if (isNameStartCodePoint(codePoint)) { this.reconsumeCodePoint(codePoint); return this.consumeIdentLikeToken(); } return { type: 6, value: fromCodePoint$1(codePoint) }; }; Tokenizer2.prototype.consumeCodePoint = function() { var value = this._value.shift(); return typeof value === "undefined" ? -1 : value; }; Tokenizer2.prototype.reconsumeCodePoint = function(codePoint) { this._value.unshift(codePoint); }; Tokenizer2.prototype.peekCodePoint = function(delta) { if (delta >= this._value.length) { return -1; } return this._value[delta]; }; Tokenizer2.prototype.consumeUnicodeRangeToken = function() { var digits = []; var codePoint = this.consumeCodePoint(); while (isHex(codePoint) && digits.length < 6) { digits.push(codePoint); codePoint = this.consumeCodePoint(); } var questionMarks = false; while (codePoint === QUESTION_MARK && digits.length < 6) { digits.push(codePoint); codePoint = this.consumeCodePoint(); questionMarks = true; } if (questionMarks) { var start_1 = parseInt(fromCodePoint$1.apply(void 0, digits.map(function(digit) { return digit === QUESTION_MARK ? ZERO : digit; })), 16); var end = parseInt(fromCodePoint$1.apply(void 0, digits.map(function(digit) { return digit === QUESTION_MARK ? F : digit; })), 16); return { type: 30, start: start_1, end }; } var start = parseInt(fromCodePoint$1.apply(void 0, digits), 16); if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) { this.consumeCodePoint(); codePoint = this.consumeCodePoint(); var endDigits = []; while (isHex(codePoint) && endDigits.length < 6) { endDigits.push(codePoint); codePoint = this.consumeCodePoint(); } var end = parseInt(fromCodePoint$1.apply(void 0, endDigits), 16); return { type: 30, start, end }; } else { return { type: 30, start, end: start }; } }; Tokenizer2.prototype.consumeIdentLikeToken = function() { var value = this.consumeName(); if (value.toLowerCase() === "url" && this.peekCodePoint(0) === LEFT_PARENTHESIS) { this.consumeCodePoint(); return this.consumeUrlToken(); } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) { this.consumeCodePoint(); return { type: 19, value }; } return { type: 20, value }; }; Tokenizer2.prototype.consumeUrlToken = function() { var value = []; this.consumeWhiteSpace(); if (this.peekCodePoint(0) === EOF) { return { type: 22, value: "" }; } var next = this.peekCodePoint(0); if (next === APOSTROPHE || next === QUOTATION_MARK) { var stringToken = this.consumeStringToken(this.consumeCodePoint()); if (stringToken.type === 0) { this.consumeWhiteSpace(); if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) { this.consumeCodePoint(); return { type: 22, value: stringToken.value }; } } this.consumeBadUrlRemnants(); return BAD_URL_TOKEN; } while (true) { var codePoint = this.consumeCodePoint(); if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) { return { type: 22, value: fromCodePoint$1.apply(void 0, value) }; } else if (isWhiteSpace(codePoint)) { this.consumeWhiteSpace(); if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) { this.consumeCodePoint(); return { type: 22, value: fromCodePoint$1.apply(void 0, value) }; } this.consumeBadUrlRemnants(); return BAD_URL_TOKEN; } else if (codePoint === QUOTATION_MARK || codePoint === APOSTROPHE || codePoint === LEFT_PARENTHESIS || isNonPrintableCodePoint(codePoint)) { this.consumeBadUrlRemnants(); return BAD_URL_TOKEN; } else if (codePoint === REVERSE_SOLIDUS) { if (isValidEscape(codePoint, this.peekCodePoint(0))) { value.push(this.consumeEscapedCodePoint()); } else { this.consumeBadUrlRemnants(); return BAD_URL_TOKEN; } } else { value.push(codePoint); } } }; Tokenizer2.prototype.consumeWhiteSpace = function() { while (isWhiteSpace(this.peekCodePoint(0))) { this.consumeCodePoint(); } }; Tokenizer2.prototype.consumeBadUrlRemnants = function() { while (true) { var codePoint = this.consumeCodePoint(); if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) { return; } if (isValidEscape(codePoint, this.peekCodePoint(0))) { this.consumeEscapedCodePoint(); } } }; Tokenizer2.prototype.consumeStringSlice = function(count) { var SLICE_STACK_SIZE = 5e4; var value = ""; while (count > 0) { var amount = Math.min(SLICE_STACK_SIZE, count); value += fromCodePoint$1.apply(void 0, this._value.splice(0, amount)); count -= amount; } this._value.shift(); return value; }; Tokenizer2.prototype.consumeStringToken = function(endingCodePoint) { var value = ""; var i = 0; do { var codePoint = this._value[i]; if (codePoint === EOF || codePoint === void 0 || codePoint === endingCodePoint) { value += this.consumeStringSlice(i); return { type: 0, value }; } if (codePoint === LINE_FEED) { this._value.splice(0, i); return BAD_STRING_TOKEN; } if (codePoint === REVERSE_SOLIDUS) { var next = this._value[i + 1]; if (next !== EOF && next !== void 0) { if (next === LINE_FEED) { value += this.consumeStringSlice(i); i = -1; this._value.shift(); } else if (isValidEscape(codePoint, next)) { value += this.consumeStringSlice(i); value += fromCodePoint$1(this.consumeEscapedCodePoint()); i = -1; } } } i++; } while (true); }; Tokenizer2.prototype.consumeNumber = function() { var repr = []; var type = FLAG_INTEGER; var c1 = this.peekCodePoint(0); if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { repr.push(this.consumeCodePoint()); } while (isDigit(this.peekCodePoint(0))) { repr.push(this.consumeCodePoint()); } c1 = this.peekCodePoint(0); var c2 = this.peekCodePoint(1); if (c1 === FULL_STOP && isDigit(c2)) { repr.push(this.consumeCodePoint(), this.consumeCodePoint()); type = FLAG_NUMBER; while (isDigit(this.peekCodePoint(0))) { repr.push(this.consumeCodePoint()); } } c1 = this.peekCodePoint(0); c2 = this.peekCodePoint(1); var c3 = this.peekCodePoint(2); if ((c1 === E || c1 === e) && ((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3) || isDigit(c2))) { repr.push(this.consumeCodePoint(), this.consumeCodePoint()); type = FLAG_NUMBER; while (isDigit(this.peekCodePoint(0))) { repr.push(this.consumeCodePoint()); } } return [stringToNumber(repr), type]; }; Tokenizer2.prototype.consumeNumericToken = function() { var _a = this.consumeNumber(), number = _a[0], flags = _a[1]; var c1 = this.peekCodePoint(0); var c2 = this.peekCodePoint(1); var c3 = this.peekCodePoint(2); if (isIdentifierStart(c1, c2, c3)) { var unit = this.consumeName(); return { type: 15, number, flags, unit }; } if (c1 === PERCENTAGE_SIGN) { this.consumeCodePoint(); return { type: 16, number, flags }; } return { type: 17, number, flags }; }; Tokenizer2.prototype.consumeEscapedCodePoint = function() { var codePoint = this.consumeCodePoint(); if (isHex(codePoint)) { var hex = fromCodePoint$1(codePoint); while (isHex(this.peekCodePoint(0)) && hex.length < 6) { hex += fromCodePoint$1(this.consumeCodePoint()); } if (isWhiteSpace(this.peekCodePoint(0))) { this.consumeCodePoint(); } var hexCodePoint = parseInt(hex, 16); if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 1114111) { return REPLACEMENT_CHARACTER; } return hexCodePoint; } if (codePoint === EOF) { return REPLACEMENT_CHARACTER; } return codePoint; }; Tokenizer2.prototype.consumeName = function() { var result = ""; while (true) { var codePoint = this.consumeCodePoint(); if (isNameCodePoint(codePoint)) { result += fromCodePoint$1(codePoint); } else if (isValidEscape(codePoint, this.peekCodePoint(0))) { result += fromCodePoint$1(this.consumeEscapedCodePoint()); } else { this.reconsumeCodePoint(codePoint); return result; } } }; return Tokenizer2; }() ); var Parser = ( /** @class */ function() { function Parser2(tokens) { this._tokens = tokens; } Parser2.create = function(value) { var tokenizer = new Tokenizer(); tokenizer.write(value); return new Parser2(tokenizer.read()); }; Parser2.parseValue = function(value) { return Parser2.create(value).parseComponentValue(); }; Parser2.parseValues = function(value) { return Parser2.create(value).parseComponentValues(); }; Parser2.prototype.parseComponentValue = function() { var token = this.consumeToken(); while (token.type === 31) { token = this.consumeToken(); } if (token.type === 32) { throw new SyntaxError("Error parsing CSS component value, unexpected EOF"); } this.reconsumeToken(token); var value = this.consumeComponentValue(); do { token = this.consumeToken(); } while (token.type === 31); if (token.type === 32) { return value; } throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one"); }; Parser2.prototype.parseComponentValues = function() { var values = []; while (true) { var value = this.consumeComponentValue(); if (value.type === 32) { return values; } values.push(value); values.push(); } }; Parser2.prototype.consumeComponentValue = function() { var token = this.consumeToken(); switch (token.type) { case 11: case 28: case 2: return this.consumeSimpleBlock(token.type); case 19: return this.consumeFunction(token); } return token; }; Parser2.prototype.consumeSimpleBlock = function(type) { var block = { type, values: [] }; var token = this.consumeToken(); while (true) { if (token.type === 32 || isEndingTokenFor(token, type)) { return block; } this.reconsumeToken(token); block.values.push(this.consumeComponentValue()); token = this.consumeToken(); } }; Parser2.prototype.consumeFunction = function(functionToken) { var cssFunction = { name: functionToken.value, values: [], type: 18 /* FUNCTION */ }; while (true) { var token = this.consumeToken(); if (token.type === 32 || token.type === 3) { return cssFunction; } this.reconsumeToken(token); cssFunction.values.push(this.consumeComponentValue()); } }; Parser2.prototype.consumeToken = function() { var token = this._tokens.shift(); return typeof token === "undefined" ? EOF_TOKEN : token; }; Parser2.prototype.reconsumeToken = function(token) { this._tokens.unshift(token); }; return Parser2; }() ); var isDimensionToken = function(token) { return token.type === 15; }; var isNumberToken = function(token) { return token.type === 17; }; var isIdentToken = function(token) { return token.type === 20; }; var isStringToken = function(token) { return token.type === 0; }; var isIdentWithValue = function(token, value) { return isIdentToken(token) && token.value === value; }; var nonWhiteSpace = function(token) { return token.type !== 31; }; var nonFunctionArgSeparator = function(token) { return token.type !== 31 && token.type !== 4; }; var parseFunctionArgs = function(tokens) { var args = []; var arg = []; tokens.forEach(function(token) { if (token.type === 4) { if (arg.length === 0) { throw new Error("Error parsing function args, zero tokens for arg"); } args.push(arg); arg = []; return; } if (token.type !== 31) { arg.push(token); } }); if (arg.length) { args.push(arg); } return args; }; var isEndingTokenFor = function(token, type) { if (type === 11 && token.type === 12) { return true; } if (type === 28 && token.type === 29) { return true; } return type === 2 && token.type === 3; }; var isLength = function(token) { return token.type === 17 || token.type === 15; }; var isLengthPercentage = function(token) { return token.type === 16 || isLength(token); }; var parseLengthPercentageTuple = function(tokens) { return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]]; }; var ZERO_LENGTH = { type: 17, number: 0, flags: FLAG_INTEGER }; var FIFTY_PERCENT = { type: 16, number: 50, flags: FLAG_INTEGER }; var HUNDRED_PERCENT = { type: 16, number: 100, flags: FLAG_INTEGER }; var getAbsoluteValueForTuple = function(tuple, width, height) { var x = tuple[0], y = tuple[1]; return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== "undefined" ? y : x, height)]; }; var getAbsoluteValue = function(token, parent) { if (token.type === 16) { return token.number / 100 * parent; } if (isDimensionToken(token)) { switch (token.unit) { case "rem": case "em": return 16 * token.number; // TODO use correct font-size case "px": default: return token.number; } } return token.number; }; var DEG = "deg"; var GRAD = "grad"; var RAD = "rad"; var TURN = "turn"; var angle = { name: "angle", parse: function(_context, value) { if (value.type === 15) { switch (value.unit) { case DEG: return Math.PI * value.number / 180; case GRAD: return Math.PI / 200 * value.number; case RAD: return value.number; case TURN: return Math.PI * 2 * value.number; } } throw new Error("Unsupported angle type"); } }; var isAngle = function(value) { if (value.type === 15) { if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) { return true; } } return false; }; var parseNamedSide = function(tokens) { var sideOrCorner = tokens.filter(isIdentToken).map(function(ident) { return ident.value; }).join(" "); switch (sideOrCorner) { case "to bottom right": case "to right bottom": case "left top": case "top left": return [ZERO_LENGTH, ZERO_LENGTH]; case "to top": case "bottom": return deg(0); case "to bottom left": case "to left bottom": case "right top": case "top right": return [ZERO_LENGTH, HUNDRED_PERCENT]; case "to right": case "left": return deg(90); case "to top left": case "to left top": case "right bottom": case "bottom right": return [HUNDRED_PERCENT, HUNDRED_PERCENT]; case "to bottom": case "top": return deg(180); case "to top right": case "to right top": case "left bottom": case "bottom left": return [HUNDRED_PERCENT, ZERO_LENGTH]; case "to left": case "right": return deg(270); } return 0; }; var deg = function(deg2) { return Math.PI * deg2 / 180; }; var color$1 = { name: "color", parse: function(context, value) { if (value.type === 18) { var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name]; if (typeof colorFunction === "undefined") { throw new Error('Attempting to parse an unsupported color function "' + value.name + '"'); } return colorFunction(context, value.values); } if (value.type === 5) { if (value.value.length === 3) { var r = value.value.substring(0, 1); var g = value.value.substring(1, 2); var b = value.value.substring(2, 3); return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1); } if (value.value.length === 4) { var r = value.value.substring(0, 1); var g = value.value.substring(1, 2); var b = value.value.substring(2, 3); var a2 = value.value.substring(3, 4); return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a2 + a2, 16) / 255); } if (value.value.length === 6) { var r = value.value.substring(0, 2); var g = value.value.substring(2, 4); var b = value.value.substring(4, 6); return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1); } if (value.value.length === 8) { var r = value.value.substring(0, 2); var g = value.value.substring(2, 4); var b = value.value.substring(4, 6); var a2 = value.value.substring(6, 8); return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a2, 16) / 255); } } if (value.type === 20) { var namedColor = COLORS[value.value.toUpperCase()]; if (typeof namedColor !== "undefined") { return namedColor; } } return COLORS.TRANSPARENT; } }; var isTransparent = function(color2) { return (255 & color2) === 0; }; var asString = function(color2) { var alpha = 255 & color2; var blue = 255 & color2 >> 8; var green = 255 & color2 >> 16; var red = 255 & color2 >> 24; return alpha < 255 ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" : "rgb(" + red + "," + green + "," + blue + ")"; }; var pack = function(r, g, b, a2) { return (r << 24 | g << 16 | b << 8 | Math.round(a2 * 255) << 0) >>> 0; }; var getTokenColorValue = function(token, i) { if (token.type === 17) { return token.number; } if (token.type === 16) { var max = i === 3 ? 1 : 255; return i === 3 ? token.number / 100 * max : Math.round(token.number / 100 * max); } return 0; }; var rgb = function(_context, args) { var tokens = args.filter(nonFunctionArgSeparator); if (tokens.length === 3) { var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2]; return pack(r, g, b, 1); } if (tokens.length === 4) { var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a2 = _b[3]; return pack(r, g, b, a2); } return 0; }; function hue2rgb(t1, t2, hue) { if (hue < 0) { hue += 1; } if (hue >= 1) { hue -= 1; } if (hue < 1 / 6) { return (t2 - t1) * hue * 6 + t1; } else if (hue < 1 / 2) { return t2; } else if (hue < 2 / 3) { return (t2 - t1) * 6 * (2 / 3 - hue) + t1; } else { return t1; } } var hsl = function(context, args) { var tokens = args.filter(nonFunctionArgSeparator); var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3]; var h = (hue.type === 17 ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2); var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0; var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0; var a2 = typeof alpha !== "undefined" && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1; if (s === 0) { return pack(l * 255, l * 255, l * 255, 1); } var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; var t1 = l * 2 - t2; var r = hue2rgb(t1, t2, h + 1 / 3); var g = hue2rgb(t1, t2, h); var b = hue2rgb(t1, t2, h - 1 / 3); return pack(r * 255, g * 255, b * 255, a2); }; var SUPPORTED_COLOR_FUNCTIONS = { hsl, hsla: hsl, rgb, rgba: rgb }; var parseColor = function(context, value) { return color$1.parse(context, Parser.create(value).parseComponentValue()); }; var COLORS = { ALICEBLUE: 4042850303, ANTIQUEWHITE: 4209760255, AQUA: 16777215, AQUAMARINE: 2147472639, AZURE: 4043309055, BEIGE: 4126530815, BISQUE: 4293182719, BLACK: 255, BLANCHEDALMOND: 4293643775, BLUE: 65535, BLUEVIOLET: 2318131967, BROWN: 2771004159, BURLYWOOD: 3736635391, CADETBLUE: 1604231423, CHARTREUSE: 2147418367, CHOCOLATE: 3530104575, CORAL: 4286533887, CORNFLOWERBLUE: 1687547391, CORNSILK: 4294499583, CRIMSON: 3692313855, CYAN: 16777215, DARKBLUE: 35839, DARKCYAN: 9145343, DARKGOLDENROD: 3095837695, DARKGRAY: 2846468607, DARKGREEN: 6553855, DARKGREY: 2846468607, DARKKHAKI: 3182914559, DARKMAGENTA: 2332068863, DARKOLIVEGREEN: 1433087999, DARKORANGE: 4287365375, DARKORCHID: 2570243327, DARKRED: 2332033279, DARKSALMON: 3918953215, DARKSEAGREEN: 2411499519, DARKSLATEBLUE: 1211993087, DARKSLATEGRAY: 793726975, DARKSLATEGREY: 793726975, DARKTURQUOISE: 13554175, DARKVIOLET: 2483082239, DEEPPINK: 4279538687, DEEPSKYBLUE: 12582911, DIMGRAY: 1768516095, DIMGREY: 1768516095, DODGERBLUE: 512819199, FIREBRICK: 2988581631, FLORALWHITE: 4294635775, FORESTGREEN: 579543807, FUCHSIA: 4278255615, GAINSBORO: 3705462015, GHOSTWHITE: 4177068031, GOLD: 4292280575, GOLDENROD: 3668254975, GRAY: 2155905279, GREEN: 8388863, GREENYELLOW: 2919182335, GREY: 2155905279, HONEYDEW: 4043305215, HOTPINK: 4285117695, INDIANRED: 3445382399, INDIGO: 1258324735, IVORY: 4294963455, KHAKI: 4041641215, LAVENDER: 3873897215, LAVENDERBLUSH: 4293981695, LAWNGREEN: 2096890111, LEMONCHIFFON: 4294626815, LIGHTBLUE: 2916673279, LIGHTCORAL: 4034953471, LIGHTCYAN: 3774873599, LIGHTGOLDENRODYELLOW: 4210742015, LIGHTGRAY: 3553874943, LIGHTGREEN: 2431553791, LIGHTGREY: 3553874943, LIGHTPINK: 4290167295, LIGHTSALMON: 4288707327, LIGHTSEAGREEN: 548580095, LIGHTSKYBLUE: 2278488831, LIGHTSLATEGRAY: 2005441023, LIGHTSLATEGREY: 2005441023, LIGHTSTEELBLUE: 2965692159, LIGHTYELLOW: 4294959359, LIME: 16711935, LIMEGREEN: 852308735, LINEN: 4210091775, MAGENTA: 4278255615, MAROON: 2147483903, MEDIUMAQUAMARINE: 1724754687, MEDIUMBLUE: 52735, MEDIUMORCHID: 3126187007, MEDIUMPURPLE: 2473647103, MEDIUMSEAGREEN: 1018393087, MEDIUMSLATEBLUE: 2070474495, MEDIUMSPRINGGREEN: 16423679, MEDIUMTURQUOISE: 1221709055, MEDIUMVIOLETRED: 3340076543, MIDNIGHTBLUE: 421097727, MINTCREAM: 4127193855, MISTYROSE: 4293190143, MOCCASIN: 4293178879, NAVAJOWHITE: 4292783615, NAVY: 33023, OLDLACE: 4260751103, OLIVE: 2155872511, OLIVEDRAB: 1804477439, ORANGE: 4289003775, ORANGERED: 4282712319, ORCHID: 3664828159, PALEGOLDENROD: 4008225535, PALEGREEN: 2566625535, PALETURQUOISE: 2951671551, PALEVIOLETRED: 3681588223, PAPAYAWHIP: 4293907967, PEACHPUFF: 4292524543, PERU: 3448061951, PINK: 4290825215, PLUM: 3718307327, POWDERBLUE: 2967529215, PURPLE: 2147516671, REBECCAPURPLE: 1714657791, RED: 4278190335, ROSYBROWN: 3163525119, ROYALBLUE: 1097458175, SADDLEBROWN: 2336560127, SALMON: 4202722047, SANDYBROWN: 4104413439, SEAGREEN: 780883967, SEASHELL: 4294307583, SIENNA: 2689740287, SILVER: 3233857791, SKYBLUE: 2278484991, SLATEBLUE: 1784335871, SLATEGRAY: 1887473919, SLATEGREY: 1887473919, SNOW: 4294638335, SPRINGGREEN: 16744447, STEELBLUE: 1182971135, TAN: 3535047935, TEAL: 8421631, THISTLE: 3636451583, TOMATO: 4284696575, TRANSPARENT: 0, TURQUOISE: 1088475391, VIOLET: 4001558271, WHEAT: 4125012991, WHITE: 4294967295, WHITESMOKE: 4126537215, YELLOW: 4294902015, YELLOWGREEN: 2597139199 }; var backgroundClip = { name: "background-clip", initialValue: "border-box", prefix: false, type: 1, parse: function(_context, tokens) { return tokens.map(function(token) { if (isIdentToken(token)) { switch (token.value) { case "padding-box": return 1; case "content-box": return 2; } } return 0; }); } }; var backgroundColor = { name: "background-color", initialValue: "transparent", prefix: false, type: 3, format: "color" }; var parseColorStop = function(context, args) { var color2 = color$1.parse(context, args[0]); var stop = args[1]; return stop && isLengthPercentage(stop) ? { color: color2, stop } : { color: color2, stop: null }; }; var processColorStops = function(stops, lineLength) { var first = stops[0]; var last = stops[stops.length - 1]; if (first.stop === null) { first.stop = ZERO_LENGTH; } if (last.stop === null) { last.stop = HUNDRED_PERCENT; } var processStops = []; var previous = 0; for (var i = 0; i < stops.length; i++) { var stop_1 = stops[i].stop; if (stop_1 !== null) { var absoluteValue = getAbsoluteValue(stop_1, lineLength); if (absoluteValue > previous) { processStops.push(absoluteValue); } else { processStops.push(previous); } previous = absoluteValue; } else { processStops.push(null); } } var gapBegin = null; for (var i = 0; i < processStops.length; i++) { var stop_2 = processStops[i]; if (stop_2 === null) { if (gapBegin === null) { gapBegin = i; } } else if (gapBegin !== null) { var gapLength = i - gapBegin; var beforeGap = processStops[gapBegin - 1]; var gapValue = (stop_2 - beforeGap) / (gapLength + 1); for (var g = 1; g <= gapLength; g++) { processStops[gapBegin + g - 1] = gapValue * g; } gapBegin = null; } } return stops.map(function(_a, i2) { var color2 = _a.color; return { color: color2, stop: Math.max(Math.min(1, processStops[i2] / lineLength), 0) }; }); }; var getAngleFromCorner = function(corner, width, height) { var centerX = width / 2; var centerY = height / 2; var x = getAbsoluteValue(corner[0], width) - centerX; var y = centerY - getAbsoluteValue(corner[1], height); return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2); }; var calculateGradientDirection = function(angle2, width, height) { var radian = typeof angle2 === "number" ? angle2 : getAngleFromCorner(angle2, width, height); var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian)); var halfWidth = width / 2; var halfHeight = height / 2; var halfLineLength = lineLength / 2; var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength; var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength; return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff]; }; var distance = function(a2, b) { return Math.sqrt(a2 * a2 + b * b); }; var findCorner = function(width, height, x, y, closest) { var corners = [ [0, 0], [0, height], [width, 0], [width, height] ]; return corners.reduce(function(stat, corner) { var cx = corner[0], cy = corner[1]; var d = distance(x - cx, y - cy); if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) { return { optimumCorner: corner, optimumDistance: d }; } return stat; }, { optimumDistance: closest ? Infinity : -Infinity, optimumCorner: null }).optimumCorner; }; var calculateRadius = function(gradient, x, y, width, height) { var rx = 0; var ry = 0; switch (gradient.size) { case 0: if (gradient.shape === 0) { rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height)); } else if (gradient.shape === 1) { rx = Math.min(Math.abs(x), Math.abs(x - width)); ry = Math.min(Math.abs(y), Math.abs(y - height)); } break; case 2: if (gradient.shape === 0) { rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height)); } else if (gradient.shape === 1) { var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width)); var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1]; rx = distance(cx - x, (cy - y) / c); ry = c * rx; } break; case 1: if (gradient.shape === 0) { rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height)); } else if (gradient.shape === 1) { rx = Math.max(Math.abs(x), Math.abs(x - width)); ry = Math.max(Math.abs(y), Math.abs(y - height)); } break; case 3: if (gradient.shape === 0) { rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height)); } else if (gradient.shape === 1) { var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width)); var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1]; rx = distance(cx - x, (cy - y) / c); ry = c * rx; } break; } if (Array.isArray(gradient.size)) { rx = getAbsoluteValue(gradient.size[0], width); ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx; } return [rx, ry]; }; var linearGradient = function(context, tokens) { var angle$1 = deg(180); var stops = []; parseFunctionArgs(tokens).forEach(function(arg, i) { if (i === 0) { var firstToken = arg[0]; if (firstToken.type === 20 && firstToken.value === "to") { angle$1 = parseNamedSide(arg); return; } else if (isAngle(firstToken)) { angle$1 = angle.parse(context, firstToken); return; } } var colorStop = parseColorStop(context, arg); stops.push(colorStop); }); return { angle: angle$1, stops, type: 1 /* LINEAR_GRADIENT */ }; }; var prefixLinearGradient = function(context, tokens) { var angle$1 = deg(180); var stops = []; parseFunctionArgs(tokens).forEach(function(arg, i) { if (i === 0) { var firstToken = arg[0]; if (firstToken.type === 20 && ["top", "left", "right", "bottom"].indexOf(firstToken.value) !== -1) { angle$1 = parseNamedSide(arg); return; } else if (isAngle(firstToken)) { angle$1 = (angle.parse(context, firstToken) + deg(270)) % deg(360); return; } } var colorStop = parseColorStop(context, arg); stops.push(colorStop); }); return { angle: angle$1, stops, type: 1 /* LINEAR_GRADIENT */ }; }; var webkitGradient = function(context, tokens) { var angle2 = deg(180); var stops = []; var type = 1; var shape = 0; var size = 3; var position2 = []; parseFunctionArgs(tokens).forEach(function(arg, i) { var firstToken = arg[0]; if (i === 0) { if (isIdentToken(firstToken) && firstToken.value === "linear") { type = 1; return; } else if (isIdentToken(firstToken) && firstToken.value === "radial") { type = 2; return; } } if (firstToken.type === 18) { if (firstToken.name === "from") { var color2 = color$1.parse(context, firstToken.values[0]); stops.push({ stop: ZERO_LENGTH, color: color2 }); } else if (firstToken.name === "to") { var color2 = color$1.parse(context, firstToken.values[0]); stops.push({ stop: HUNDRED_PERCENT, color: color2 }); } else if (firstToken.name === "color-stop") { var values = firstToken.values.filter(nonFunctionArgSeparator); if (values.length === 2) { var color2 = color$1.parse(context, values[1]); var stop_1 = values[0]; if (isNumberToken(stop_1)) { stops.push({ stop: { type: 16, number: stop_1.number * 100, flags: stop_1.flags }, color: color2 }); } } } } }); return type === 1 ? { angle: (angle2 + deg(180)) % deg(360), stops, type } : { size, shape, stops, position: position2, type }; }; var CLOSEST_SIDE = "closest-side"; var FARTHEST_SIDE = "farthest-side"; var CLOSEST_CORNER = "closest-corner"; var FARTHEST_CORNER = "farthest-corner"; var CIRCLE = "circle"; var ELLIPSE = "ellipse"; var COVER = "cover"; var CONTAIN = "contain"; var radialGradient = function(context, tokens) { var shape = 0; var size = 3; var stops = []; var position2 = []; parseFunctionArgs(tokens).forEach(function(arg, i) { var isColorStop = true; if (i === 0) { var isAtPosition_1 = false; isColorStop = arg.reduce(function(acc, token) { if (isAtPosition_1) { if (isIdentToken(token)) { switch (token.value) { case "center": position2.push(FIFTY_PERCENT); return acc; case "top": case "left": position2.push(ZERO_LENGTH); return acc; case "right": case "bottom": position2.push(HUNDRED_PERCENT); return acc; } } else if (isLengthPercentage(token) || isLength(token)) { position2.push(token); } } else if (isIdentToken(token)) { switch (token.value) { case CIRCLE: shape = 0; return false; case ELLIPSE: shape = 1; return false; case "at": isAtPosition_1 = true; return false; case CLOSEST_SIDE: size = 0; return false; case COVER: case FARTHEST_SIDE: size = 1; return false; case CONTAIN: case CLOSEST_CORNER: size = 2; return false; case FARTHEST_CORNER: size = 3; return false; } } else if (isLength(token) || isLengthPercentage(token)) { if (!Array.isArray(size)) { size = []; } size.push(token); return false; } return acc; }, isColorStop); } if (isColorStop) { var colorStop = parseColorStop(context, arg); stops.push(colorStop); } }); return { size, shape, stops, position: position2, type: 2 /* RADIAL_GRADIENT */ }; }; var prefixRadialGradient = function(context, tokens) { var shape = 0; var size = 3; var stops = []; var position2 = []; parseFunctionArgs(tokens).forEach(function(arg, i) { var isColorStop = true; if (i === 0) { isColorStop = arg.reduce(function(acc, token) { if (isIdentToken(token)) { switch (token.value) { case "center": position2.push(FIFTY_PERCENT); return false; case "top": case "left": position2.push(ZERO_LENGTH); return false; case "right": case "bottom": position2.push(HUNDRED_PERCENT); return false; } } else if (isLengthPercentage(token) || isLength(token)) { position2.push(token); return false; } return acc; }, isColorStop); } else if (i === 1) { isColorStop = arg.reduce(function(acc, token) { if (isIdentToken(token)) { switch (token.value) { case CIRCLE: shape = 0; return false; case ELLIPSE: shape = 1; return false; case CONTAIN: case CLOSEST_SIDE: size = 0; return false; case FARTHEST_SIDE: size = 1; return false; case CLOSEST_CORNER: size = 2; return false; case COVER: case FARTHEST_CORNER: size = 3; return false; } } else if (isLength(token) || isLengthPercentage(token)) { if (!Array.isArray(size)) { size = []; } size.push(token); return false; } return acc; }, isColorStop); } if (isColorStop) { var colorStop = parseColorStop(context, arg); stops.push(colorStop); } }); return { size, shape, stops, position: position2, type: 2 /* RADIAL_GRADIENT */ }; }; var isLinearGradient = function(background) { return background.type === 1; }; var isRadialGradient = function(background) { return background.type === 2; }; var image = { name: "image", parse: function(context, value) { if (value.type === 22) { var image_1 = { url: value.value, type: 0 /* URL */ }; context.cache.addImage(value.value); return image_1; } if (value.type === 18) { var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name]; if (typeof imageFunction === "undefined") { throw new Error('Attempting to parse an unsupported image function "' + value.name + '"'); } return imageFunction(context, value.values); } throw new Error("Unsupported image type " + value.type); } }; function isSupportedImage(value) { return !(value.type === 20 && value.value === "none") && (value.type !== 18 || !!SUPPORTED_IMAGE_FUNCTIONS[value.name]); } var SUPPORTED_IMAGE_FUNCTIONS = { "linear-gradient": linearGradient, "-moz-linear-gradient": prefixLinearGradient, "-ms-linear-gradient": prefixLinearGradient, "-o-linear-gradient": prefixLinearGradient, "-webkit-linear-gradient": prefixLinearGradient, "radial-gradient": radialGradient, "-moz-radial-gradient": prefixRadialGradient, "-ms-radial-gradient": prefixRadialGradient, "-o-radial-gradient": prefixRadialGradient, "-webkit-radial-gradient": prefixRadialGradient, "-webkit-gradient": webkitGradient }; var backgroundImage = { name: "background-image", initialValue: "none", type: 1, prefix: false, parse: function(context, tokens) { if (tokens.length === 0) { return []; } var first = tokens[0]; if (first.type === 20 && first.value === "none") { return []; } return tokens.filter(function(value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); }).map(function(value) { return image.parse(context, value); }); } }; var backgroundOrigin = { name: "background-origin", initialValue: "border-box", prefix: false, type: 1, parse: function(_context, tokens) { return tokens.map(function(token) { if (isIdentToken(token)) { switch (token.value) { case "padding-box": return 1; case "content-box": return 2; } } return 0; }); } }; var backgroundPosition = { name: "background-position", initialValue: "0% 0%", type: 1, prefix: false, parse: function(_context, tokens) { return parseFunctionArgs(tokens).map(function(values) { return values.filter(isLengthPercentage); }).map(parseLengthPercentageTuple); } }; var backgroundRepeat = { name: "background-repeat", initialValue: "repeat", prefix: false, type: 1, parse: function(_context, tokens) { return parseFunctionArgs(tokens).map(function(values) { return values.filter(isIdentToken).map(function(token) { return token.value; }).join(" "); }).map(parseBackgroundRepeat); } }; var parseBackgroundRepeat = function(value) { switch (value) { case "no-repeat": return 1; case "repeat-x": case "repeat no-repeat": return 2; case "repeat-y": case "no-repeat repeat": return 3; case "repeat": default: return 0; } }; var BACKGROUND_SIZE; (function(BACKGROUND_SIZE2) { BACKGROUND_SIZE2["AUTO"] = "auto"; BACKGROUND_SIZE2["CONTAIN"] = "contain"; BACKGROUND_SIZE2["COVER"] = "cover"; })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {})); var backgroundSize = { name: "background-size", initialValue: "0", prefix: false, type: 1, parse: function(_context, tokens) { return parseFunctionArgs(tokens).map(function(values) { return values.filter(isBackgroundSizeInfoToken); }); } }; var isBackgroundSizeInfoToken = function(value) { return isIdentToken(value) || isLengthPercentage(value); }; var borderColorForSide = function(side) { return { name: "border-" + side + "-color", initialValue: "transparent", prefix: false, type: 3, format: "color" }; }; var borderTopColor = borderColorForSide("top"); var borderRightColor = borderColorForSide("right"); var borderBottomColor = borderColorForSide("bottom"); var borderLeftColor = borderColorForSide("left"); var borderRadiusForSide = function(side) { return { name: "border-radius-" + side, initialValue: "0 0", prefix: false, type: 1, parse: function(_context, tokens) { return parseLengthPercentageTuple(tokens.filter(isLengthPercentage)); } }; }; var borderTopLeftRadius = borderRadiusForSide("top-left"); var borderTopRightRadius = borderRadiusForSide("top-right"); var borderBottomRightRadius = borderRadiusForSide("bottom-right"); var borderBottomLeftRadius = borderRadiusForSide("bottom-left"); var borderStyleForSide = function(side) { return { name: "border-" + side + "-style", initialValue: "solid", prefix: false, type: 2, parse: function(_context, style) { switch (style) { case "none": return 0; case "dashed": return 2; case "dotted": return 3; case "double": return 4; } return 1; } }; }; var borderTopStyle = borderStyleForSide("top