CasperSecurity
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseBoxShadowValue = parseBoxShadowValue;
exports.formatBoxShadowValue = formatBoxShadowValue;
let KEYWORDS = new Set([
'inset',
'inherit',
'initial',
'revert',
'unset'
]);
let COMMA = /\,(?![^(]*\))/g // Comma separator that is not located between brackets. E.g.: `cubiz-bezier(a, b, c)` these don't count.
;
let SPACE = /\ +(?![^(]*\))/g // Similar to the one above, but with spaces instead.
;
let LENGTH = /^-?(\d+)(.*?)$/g;
function parseBoxShadowValue(input) {
let shadows = input.split(COMMA);
return shadows.map((shadow)=>{
let value = shadow.trim();
let result = {
raw: value
};
let parts = value.split(SPACE);
let seen = new Set();
for (let part of parts){
// Reset index, since the regex is stateful.
LENGTH.lastIndex = 0;
// Keyword
if (!seen.has('KEYWORD') && KEYWORDS.has(part)) {
result.keyword = part;
seen.add('KEYWORD');
} else if (LENGTH.test(part)) {
if (!seen.has('X')) {
result.x = part;
seen.add('X');
} else if (!seen.has('Y')) {
result.y = part;
seen.add('Y');
} else if (!seen.has('BLUR')) {
result.blur = part;
seen.add('BLUR');
} else if (!seen.has('SPREAD')) {
result.spread = part;
seen.add('SPREAD');
}
} else {
if (!result.color) {
result.color = part;
} else {
if (!result.unknown) result.unknown = [];
result.unknown.push(part);
}
}
}
// Check if valid
result.valid = result.x !== undefined && result.y !== undefined;
return result;
});
}
function formatBoxShadowValue(shadows) {
return shadows.map((shadow)=>{
if (!shadow.valid) {
return shadow.raw;
}
return [
shadow.keyword,
shadow.x,
shadow.y,
shadow.blur,
shadow.spread,
shadow.color
].filter(Boolean).join(' ');
}).join(', ');
}