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; } else 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; } else 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('(')); return function1Name === function2Name; } function backgroundPosition(validator, value1, value2) { if ( !understandable(validator, value1, value2, 0, true) && !( validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2) ) ) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if ( !validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1)) ) { return false; } else if ( !validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2)) ) { return false; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isImage(value2)) { return true; } else 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; } else 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; } else 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; } else 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; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isTime(value1) && !validator.isTime(value2)) { return false; } else if (validator.isTime(value2)) { return true; } else if (validator.isTime(value1)) { return false; } else 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; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isUnit(value1) && !validator.isUnit(value2)) { return false; } else if (validator.isUnit(value2)) { return true; } else if (validator.isUnit(value1)) { return false; } else 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; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if ( (validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2)) ) { return false; } else if (validator.isUnit(value2) || validator.isNumber(value2)) { return true; } else if (validator.isUnit(value1) || validator.isNumber(value1)) { return false; } else 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; } else 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, }, };