315 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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
 | |
|   }
 | |
| };
 |