mirror of https://gitlab.com/octtspacc/sitoctt
107 lines
3.3 KiB
JavaScript
107 lines
3.3 KiB
JavaScript
"use strict";
|
|
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
// The below is a compiled copy of https://github.com/angular/angular/blob/92e41e9cb417223d9888a4c23b4c0e73188f87d0/packages/compiler/src/render3/view/style_parser.ts
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.hyphenate = exports.parse = void 0;
|
|
/**
|
|
* Parses string representation of a style and converts it into object literal.
|
|
*
|
|
* @param value string representation of style as used in the `style` attribute in HTML.
|
|
* Example: `color: red; height: auto`.
|
|
* @returns An array of style property name and value pairs, e.g. `['color', 'red', 'height',
|
|
* 'auto']`
|
|
*/
|
|
function parse(value) {
|
|
// we use a string array here instead of a string map
|
|
// because a string-map is not guaranteed to retain the
|
|
// order of the entries whereas a string array can be
|
|
// constructed in a [key, value, key, value] format.
|
|
const styles = [];
|
|
let i = 0;
|
|
let parenDepth = 0;
|
|
let quote = 0; /* Char.QuoteNone */
|
|
let valueStart = 0;
|
|
let propStart = 0;
|
|
let currentProp = null;
|
|
while (i < value.length) {
|
|
const token = value.charCodeAt(i++);
|
|
switch (token) {
|
|
case 40 /* Char.OpenParen */:
|
|
parenDepth++;
|
|
break;
|
|
case 41 /* Char.CloseParen */:
|
|
parenDepth--;
|
|
break;
|
|
case 39 /* Char.QuoteSingle */:
|
|
// valueStart needs to be there since prop values don't
|
|
// have quotes in CSS
|
|
if (quote === 0 /* Char.QuoteNone */) {
|
|
quote = 39 /* Char.QuoteSingle */;
|
|
} else if (
|
|
quote === 39 /* Char.QuoteSingle */ &&
|
|
value.charCodeAt(i - 1) !== 92 /* Char.BackSlash */
|
|
) {
|
|
quote = 0 /* Char.QuoteNone */;
|
|
}
|
|
break;
|
|
case 34 /* Char.QuoteDouble */:
|
|
// same logic as above
|
|
if (quote === 0 /* Char.QuoteNone */) {
|
|
quote = 34 /* Char.QuoteDouble */;
|
|
} else if (
|
|
quote === 34 /* Char.QuoteDouble */ &&
|
|
value.charCodeAt(i - 1) !== 92 /* Char.BackSlash */
|
|
) {
|
|
quote = 0 /* Char.QuoteNone */;
|
|
}
|
|
break;
|
|
case 58 /* Char.Colon */:
|
|
if (
|
|
!currentProp &&
|
|
parenDepth === 0 &&
|
|
quote === 0 /* Char.QuoteNone */
|
|
) {
|
|
currentProp = hyphenate(value.substring(propStart, i - 1).trim());
|
|
valueStart = i;
|
|
}
|
|
break;
|
|
case 59 /* Char.Semicolon */:
|
|
if (
|
|
currentProp &&
|
|
valueStart > 0 &&
|
|
parenDepth === 0 &&
|
|
quote === 0 /* Char.QuoteNone */
|
|
) {
|
|
const styleVal = value.substring(valueStart, i - 1).trim();
|
|
styles.push(currentProp, styleVal);
|
|
propStart = i;
|
|
valueStart = 0;
|
|
currentProp = null;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (currentProp && valueStart) {
|
|
const styleVal = value.slice(valueStart).trim();
|
|
styles.push(currentProp, styleVal);
|
|
}
|
|
return styles;
|
|
}
|
|
exports.parse = parse;
|
|
function hyphenate(value) {
|
|
return value
|
|
.replace(/[a-z][A-Z]/g, (v) => {
|
|
return v.charAt(0) + "-" + v.charAt(1);
|
|
})
|
|
.toLowerCase();
|
|
}
|
|
exports.hyphenate = hyphenate;
|