$
This commit is contained in:
656
node_modules/clean-css/lib/optimizer/configuration/break-up.js
generated
vendored
Normal file
656
node_modules/clean-css/lib/optimizer/configuration/break-up.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
314
node_modules/clean-css/lib/optimizer/configuration/can-override.js
generated
vendored
Normal file
314
node_modules/clean-css/lib/optimizer/configuration/can-override.js
generated
vendored
Normal file
@@ -0,0 +1,314 @@
|
||||
var understandable = require('./properties/understandable');
|
||||
|
||||
function animationIterationCount(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2);
|
||||
}
|
||||
|
||||
function animationName(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2);
|
||||
}
|
||||
|
||||
function areSameFunction(validator, value1, value2) {
|
||||
if (!validator.isFunction(value1) || !validator.isFunction(value2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var function1Name = value1.substring(0, value1.indexOf('('));
|
||||
var function2Name = value2.substring(0, value2.indexOf('('));
|
||||
|
||||
var function1Value = value1.substring(function1Name.length + 1, value1.length - 1);
|
||||
var function2Value = value2.substring(function2Name.length + 1, value2.length - 1);
|
||||
|
||||
if (validator.isFunction(function1Value) || validator.isFunction(function2Value)) {
|
||||
return function1Name === function2Name && areSameFunction(validator, function1Value, function2Value);
|
||||
}
|
||||
return function1Name === function2Name;
|
||||
}
|
||||
|
||||
function backgroundPosition(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return unit(validator, value1, value2);
|
||||
}
|
||||
|
||||
function backgroundSize(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return unit(validator, value1, value2);
|
||||
}
|
||||
|
||||
function color(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) {
|
||||
return false;
|
||||
} if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) {
|
||||
return false;
|
||||
} if (!validator.colorHexAlpha && (validator.isHexAlphaColor(value1) || validator.isHexAlphaColor(value2))) {
|
||||
return false;
|
||||
} if (validator.isColor(value1) && validator.isColor(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sameFunctionOrValue(validator, value1, value2);
|
||||
}
|
||||
|
||||
function components(overrideCheckers) {
|
||||
return function(validator, value1, value2, position) {
|
||||
return overrideCheckers[position](validator, value1, value2);
|
||||
};
|
||||
}
|
||||
|
||||
function fontFamily(validator, value1, value2) {
|
||||
return understandable(validator, value1, value2, 0, true);
|
||||
}
|
||||
|
||||
function image(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (validator.isImage(value2)) {
|
||||
return true;
|
||||
} if (validator.isImage(value1)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return sameFunctionOrValue(validator, value1, value2);
|
||||
}
|
||||
|
||||
function keyword(propertyName) {
|
||||
return function(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isKeyword(propertyName)(value2);
|
||||
};
|
||||
}
|
||||
|
||||
function keywordWithGlobal(propertyName) {
|
||||
return function(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2);
|
||||
};
|
||||
}
|
||||
|
||||
function propertyName(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isIdentifier(value2);
|
||||
}
|
||||
|
||||
function sameFunctionOrValue(validator, value1, value2) {
|
||||
return areSameFunction(validator, value1, value2)
|
||||
? true
|
||||
: value1 === value2;
|
||||
}
|
||||
|
||||
function textShadow(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isUnit(value2)
|
||||
|| validator.isColor(value2)
|
||||
|| validator.isGlobal(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2);
|
||||
}
|
||||
|
||||
function time(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (validator.isTime(value1) && !validator.isTime(value2)) {
|
||||
return false;
|
||||
} if (validator.isTime(value2)) {
|
||||
return true;
|
||||
} if (validator.isTime(value1)) {
|
||||
return false;
|
||||
} if (validator.isFunction(value1)
|
||||
&& !validator.isPrefixed(value1)
|
||||
&& validator.isFunction(value2)
|
||||
&& !validator.isPrefixed(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sameFunctionOrValue(validator, value1, value2);
|
||||
}
|
||||
|
||||
function timingFunction(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isTimingFunction(value2) || validator.isGlobal(value2);
|
||||
}
|
||||
|
||||
function unit(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if (validator.isUnit(value1) && !validator.isUnit(value2)) {
|
||||
return false;
|
||||
} if (validator.isUnit(value2)) {
|
||||
return true;
|
||||
} if (validator.isUnit(value1)) {
|
||||
return false;
|
||||
} if (validator.isFunction(value1)
|
||||
&& !validator.isPrefixed(value1)
|
||||
&& validator.isFunction(value2)
|
||||
&& !validator.isPrefixed(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sameFunctionOrValue(validator, value1, value2);
|
||||
}
|
||||
|
||||
function unitOrKeywordWithGlobal(propertyName) {
|
||||
var byKeyword = keywordWithGlobal(propertyName);
|
||||
|
||||
return function(validator, value1, value2) {
|
||||
return unit(validator, value1, value2) || byKeyword(validator, value1, value2);
|
||||
};
|
||||
}
|
||||
|
||||
function unitOrNumber(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true)
|
||||
&& !(validator.isUnit(value2)
|
||||
|| validator.isNumber(value2))) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
} if ((validator.isUnit(value1)
|
||||
|| validator.isNumber(value1))
|
||||
&& !(validator.isUnit(value2)
|
||||
|| validator.isNumber(value2))) {
|
||||
return false;
|
||||
} if (validator.isUnit(value2) || validator.isNumber(value2)) {
|
||||
return true;
|
||||
} if (validator.isUnit(value1) || validator.isNumber(value1)) {
|
||||
return false;
|
||||
} if (validator.isFunction(value1)
|
||||
&& !validator.isPrefixed(value1)
|
||||
&& validator.isFunction(value2)
|
||||
&& !validator.isPrefixed(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return sameFunctionOrValue(validator, value1, value2);
|
||||
}
|
||||
|
||||
function zIndex(validator, value1, value2) {
|
||||
if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) {
|
||||
return false;
|
||||
} if (validator.isVariable(value1) && validator.isVariable(value2)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return validator.isZIndex(value2);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
generic: {
|
||||
color: color,
|
||||
components: components,
|
||||
image: image,
|
||||
propertyName: propertyName,
|
||||
time: time,
|
||||
timingFunction: timingFunction,
|
||||
unit: unit,
|
||||
unitOrNumber: unitOrNumber
|
||||
},
|
||||
property: {
|
||||
animationDirection: keywordWithGlobal('animation-direction'),
|
||||
animationFillMode: keyword('animation-fill-mode'),
|
||||
animationIterationCount: animationIterationCount,
|
||||
animationName: animationName,
|
||||
animationPlayState: keywordWithGlobal('animation-play-state'),
|
||||
backgroundAttachment: keyword('background-attachment'),
|
||||
backgroundClip: keywordWithGlobal('background-clip'),
|
||||
backgroundOrigin: keyword('background-origin'),
|
||||
backgroundPosition: backgroundPosition,
|
||||
backgroundRepeat: keyword('background-repeat'),
|
||||
backgroundSize: backgroundSize,
|
||||
bottom: unitOrKeywordWithGlobal('bottom'),
|
||||
borderCollapse: keyword('border-collapse'),
|
||||
borderStyle: keywordWithGlobal('*-style'),
|
||||
clear: keywordWithGlobal('clear'),
|
||||
cursor: keywordWithGlobal('cursor'),
|
||||
display: keywordWithGlobal('display'),
|
||||
float: keywordWithGlobal('float'),
|
||||
left: unitOrKeywordWithGlobal('left'),
|
||||
fontFamily: fontFamily,
|
||||
fontStretch: keywordWithGlobal('font-stretch'),
|
||||
fontStyle: keywordWithGlobal('font-style'),
|
||||
fontVariant: keywordWithGlobal('font-variant'),
|
||||
fontWeight: keywordWithGlobal('font-weight'),
|
||||
listStyleType: keywordWithGlobal('list-style-type'),
|
||||
listStylePosition: keywordWithGlobal('list-style-position'),
|
||||
outlineStyle: keywordWithGlobal('*-style'),
|
||||
overflow: keywordWithGlobal('overflow'),
|
||||
position: keywordWithGlobal('position'),
|
||||
right: unitOrKeywordWithGlobal('right'),
|
||||
textAlign: keywordWithGlobal('text-align'),
|
||||
textDecoration: keywordWithGlobal('text-decoration'),
|
||||
textOverflow: keywordWithGlobal('text-overflow'),
|
||||
textShadow: textShadow,
|
||||
top: unitOrKeywordWithGlobal('top'),
|
||||
transform: sameFunctionOrValue,
|
||||
verticalAlign: unitOrKeywordWithGlobal('vertical-align'),
|
||||
visibility: keywordWithGlobal('visibility'),
|
||||
whiteSpace: keywordWithGlobal('white-space'),
|
||||
zIndex: zIndex
|
||||
}
|
||||
};
|
15
node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js
generated
vendored
Normal file
15
node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
var sameVendorPrefixes = require('../../vendor-prefixes').same;
|
||||
|
||||
function understandable(validator, value1, value2, _position, isPaired) {
|
||||
if (!sameVendorPrefixes(value1, value2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
module.exports = understandable;
|
294
node_modules/clean-css/lib/optimizer/configuration/restore.js
generated
vendored
Normal file
294
node_modules/clean-css/lib/optimizer/configuration/restore.js
generated
vendored
Normal file
@@ -0,0 +1,294 @@
|
||||
var shallowClone = require('../clone').shallow;
|
||||
|
||||
var Token = require('../../tokenizer/token');
|
||||
var Marker = require('../../tokenizer/marker');
|
||||
|
||||
function isInheritOnly(values) {
|
||||
for (var i = 0, l = values.length; i < l; i++) {
|
||||
var value = values[i][1];
|
||||
|
||||
if (value != 'inherit' && value != Marker.COMMA && value != Marker.FORWARD_SLASH) { return false; }
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function background(property, configuration, lastInMultiplex) {
|
||||
var components = property.components;
|
||||
var restored = [];
|
||||
var needsOne, needsBoth;
|
||||
|
||||
function restoreValue(component) {
|
||||
Array.prototype.unshift.apply(restored, component.value);
|
||||
}
|
||||
|
||||
function isDefaultValue(component) {
|
||||
var descriptor = configuration[component.name];
|
||||
|
||||
if (descriptor.doubleValues && descriptor.defaultValue.length == 1) {
|
||||
return component.value[0][1] == descriptor.defaultValue[0]
|
||||
&& (component.value[1]
|
||||
? component.value[1][1] == descriptor.defaultValue[0]
|
||||
: true);
|
||||
} if (descriptor.doubleValues && descriptor.defaultValue.length != 1) {
|
||||
return component.value[0][1] == descriptor.defaultValue[0]
|
||||
&& ((component.value[1] ? component.value[1][1] : component.value[0][1])
|
||||
== descriptor.defaultValue[1]);
|
||||
}
|
||||
return component.value[0][1] == descriptor.defaultValue;
|
||||
}
|
||||
|
||||
for (var i = components.length - 1; i >= 0; i--) {
|
||||
var component = components[i];
|
||||
var isDefault = isDefaultValue(component);
|
||||
|
||||
if (component.name == 'background-clip') {
|
||||
var originComponent = components[i - 1];
|
||||
var isOriginDefault = isDefaultValue(originComponent);
|
||||
|
||||
needsOne = component.value[0][1] == originComponent.value[0][1];
|
||||
|
||||
needsBoth = !needsOne && (
|
||||
(isOriginDefault && !isDefault)
|
||||
|| (!isOriginDefault && !isDefault)
|
||||
|| (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1]));
|
||||
|
||||
if (needsOne) {
|
||||
restoreValue(originComponent);
|
||||
} else if (needsBoth) {
|
||||
restoreValue(component);
|
||||
restoreValue(originComponent);
|
||||
}
|
||||
|
||||
i--;
|
||||
} else if (component.name == 'background-size') {
|
||||
var positionComponent = components[i - 1];
|
||||
var isPositionDefault = isDefaultValue(positionComponent);
|
||||
|
||||
needsOne = !isPositionDefault && isDefault;
|
||||
|
||||
needsBoth = !needsOne
|
||||
&& (isPositionDefault && !isDefault || !isPositionDefault && !isDefault);
|
||||
|
||||
if (needsOne) {
|
||||
restoreValue(positionComponent);
|
||||
} else if (needsBoth) {
|
||||
restoreValue(component);
|
||||
restored.unshift([Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]);
|
||||
restoreValue(positionComponent);
|
||||
} else if (positionComponent.value.length == 1) {
|
||||
restoreValue(positionComponent);
|
||||
}
|
||||
|
||||
i--;
|
||||
} else {
|
||||
if (isDefault || configuration[component.name].multiplexLastOnly && !lastInMultiplex) { continue; }
|
||||
|
||||
restoreValue(component);
|
||||
}
|
||||
}
|
||||
|
||||
if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0') { restored.push(property.value[0]); }
|
||||
|
||||
if (restored.length === 0) { restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]); }
|
||||
|
||||
if (isInheritOnly(restored)) { return [restored[0]]; }
|
||||
|
||||
return restored;
|
||||
}
|
||||
|
||||
function borderRadius(property) {
|
||||
if (property.multiplex) {
|
||||
var horizontal = shallowClone(property);
|
||||
var vertical = shallowClone(property);
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
var component = property.components[i];
|
||||
|
||||
var horizontalComponent = shallowClone(property);
|
||||
horizontalComponent.value = [component.value[0]];
|
||||
horizontal.components.push(horizontalComponent);
|
||||
|
||||
var verticalComponent = shallowClone(property);
|
||||
// FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius
|
||||
// longhands have two values, whereas tokenizer does not care about populating 2nd value
|
||||
// if it's missing, hence this fallback
|
||||
verticalComponent.value = [component.value[1] || component.value[0]];
|
||||
vertical.components.push(verticalComponent);
|
||||
}
|
||||
|
||||
var horizontalValues = fourValues(horizontal);
|
||||
var verticalValues = fourValues(vertical);
|
||||
|
||||
if (horizontalValues.length == verticalValues.length
|
||||
&& horizontalValues[0][1] == verticalValues[0][1]
|
||||
&& (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true)
|
||||
&& (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true)
|
||||
&& (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) {
|
||||
return horizontalValues;
|
||||
}
|
||||
return horizontalValues.concat([[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]).concat(verticalValues);
|
||||
}
|
||||
return fourValues(property);
|
||||
}
|
||||
|
||||
function font(property, configuration) {
|
||||
var components = property.components;
|
||||
var restored = [];
|
||||
var component;
|
||||
var componentIndex = 0;
|
||||
var fontFamilyIndex = 0;
|
||||
|
||||
if (property.value[0][1].indexOf(Marker.INTERNAL) === 0) {
|
||||
property.value[0][1] = property.value[0][1].substring(Marker.INTERNAL.length);
|
||||
return property.value;
|
||||
}
|
||||
|
||||
// first four components are optional
|
||||
while (componentIndex < 4) {
|
||||
component = components[componentIndex];
|
||||
|
||||
if (component.value[0][1] != configuration[component.name].defaultValue) {
|
||||
Array.prototype.push.apply(restored, component.value);
|
||||
}
|
||||
|
||||
componentIndex++;
|
||||
}
|
||||
|
||||
// then comes font-size
|
||||
Array.prototype.push.apply(restored, components[componentIndex].value);
|
||||
componentIndex++;
|
||||
|
||||
// then may come line-height
|
||||
if (components[componentIndex].value[0][1] != configuration[components[componentIndex].name].defaultValue) {
|
||||
Array.prototype.push.apply(restored, [[Token.PROPERTY_VALUE, Marker.FORWARD_SLASH]]);
|
||||
Array.prototype.push.apply(restored, components[componentIndex].value);
|
||||
}
|
||||
|
||||
componentIndex++;
|
||||
|
||||
// then comes font-family
|
||||
while (components[componentIndex].value[fontFamilyIndex]) {
|
||||
restored.push(components[componentIndex].value[fontFamilyIndex]);
|
||||
|
||||
if (components[componentIndex].value[fontFamilyIndex + 1]) {
|
||||
restored.push([Token.PROPERTY_VALUE, Marker.COMMA]);
|
||||
}
|
||||
|
||||
fontFamilyIndex++;
|
||||
}
|
||||
|
||||
if (isInheritOnly(restored)) {
|
||||
return [restored[0]];
|
||||
}
|
||||
|
||||
return restored;
|
||||
}
|
||||
|
||||
function fourValues(property) {
|
||||
var components = property.components;
|
||||
var value1 = components[0].value[0];
|
||||
var value2 = components[1].value[0];
|
||||
var value3 = components[2].value[0];
|
||||
var value4 = components[3].value[0];
|
||||
|
||||
if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) {
|
||||
return [value1];
|
||||
} if (value1[1] == value3[1] && value2[1] == value4[1]) {
|
||||
return [value1, value2];
|
||||
} if (value2[1] == value4[1]) {
|
||||
return [value1, value2, value3];
|
||||
}
|
||||
return [value1, value2, value3, value4];
|
||||
}
|
||||
|
||||
function multiplex(restoreWith) {
|
||||
return function(property, configuration) {
|
||||
if (!property.multiplex) { return restoreWith(property, configuration, true); }
|
||||
|
||||
var multiplexSize = 0;
|
||||
var restored = [];
|
||||
var componentMultiplexSoFar = {};
|
||||
var i, l;
|
||||
|
||||
// At this point we don't know what's the multiplex size, e.g. how many background layers are there
|
||||
for (i = 0, l = property.components[0].value.length; i < l; i++) {
|
||||
if (property.components[0].value[i][1] == Marker.COMMA) { multiplexSize++; }
|
||||
}
|
||||
|
||||
for (i = 0; i <= multiplexSize; i++) {
|
||||
var _property = shallowClone(property);
|
||||
|
||||
// We split multiplex into parts and restore them one by one
|
||||
for (var j = 0, m = property.components.length; j < m; j++) {
|
||||
var componentToClone = property.components[j];
|
||||
var _component = shallowClone(componentToClone);
|
||||
_property.components.push(_component);
|
||||
|
||||
// The trick is some properties has more than one value, so we iterate over values looking for
|
||||
// a multiplex separator - a comma
|
||||
for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) {
|
||||
if (componentToClone.value[k][1] == Marker.COMMA) {
|
||||
componentMultiplexSoFar[_component.name] = k + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
_component.value.push(componentToClone.value[k]);
|
||||
}
|
||||
}
|
||||
|
||||
// No we can restore shorthand value
|
||||
var lastInMultiplex = i == multiplexSize;
|
||||
var _restored = restoreWith(_property, configuration, lastInMultiplex);
|
||||
Array.prototype.push.apply(restored, _restored);
|
||||
|
||||
if (i < multiplexSize) { restored.push([Token.PROPERTY_VALUE, Marker.COMMA]); }
|
||||
}
|
||||
|
||||
return restored;
|
||||
};
|
||||
}
|
||||
|
||||
function withoutDefaults(property, configuration) {
|
||||
var components = property.components;
|
||||
var restored = [];
|
||||
|
||||
for (var i = components.length - 1; i >= 0; i--) {
|
||||
var component = components[i];
|
||||
var descriptor = configuration[component.name];
|
||||
|
||||
if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, configuration, descriptor.keepUnlessDefault)) {
|
||||
restored.unshift(component.value[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (restored.length === 0) { restored.push([Token.PROPERTY_VALUE, configuration[property.name].defaultValue]); }
|
||||
|
||||
if (isInheritOnly(restored)) { return [restored[0]]; }
|
||||
|
||||
return restored;
|
||||
}
|
||||
|
||||
function isDefault(components, configuration, propertyName) {
|
||||
var component;
|
||||
var i, l;
|
||||
|
||||
for (i = 0, l = components.length; i < l; i++) {
|
||||
component = components[i];
|
||||
|
||||
if (component.name == propertyName && component.value[0][1] == configuration[propertyName].defaultValue) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
background: background,
|
||||
borderRadius: borderRadius,
|
||||
font: font,
|
||||
fourValues: fourValues,
|
||||
multiplex: multiplex,
|
||||
withoutDefaults: withoutDefaults
|
||||
};
|
Reference in New Issue
Block a user