Spaces:
Running
Running
var functionNoVendorRegexStr = '[A-Z]+(\\-|[A-Z]|[0-9])+\\(.*?\\)'; | |
var functionVendorRegexStr = '\\-(\\-|[A-Z]|[0-9])+\\(.*?\\)'; | |
var variableRegexStr = 'var\\(\\-\\-[^\\)]+\\)'; | |
var functionAnyRegexStr = '(' + variableRegexStr + '|' + functionNoVendorRegexStr + '|' + functionVendorRegexStr + ')'; | |
var calcRegex = new RegExp('^(\\-moz\\-|\\-webkit\\-)?calc\\([^\\)]+\\)$', 'i'); | |
var decimalRegex = /[0-9]/; | |
var functionAnyRegex = new RegExp('^' + functionAnyRegexStr + '$', 'i'); | |
var hexAlphaColorRegex = /^#(?:[0-9a-f]{4}|[0-9a-f]{8})$/i; | |
// eslint-disable-next-line max-len | |
var hslColorRegex = /^hsl\(\s{0,31}[-.]?\d+\s{0,31},\s{0,31}\d*\.?\d+%\s{0,31},\s{0,31}\d*\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[-.]?\d+\s{0,31},\s{0,31}\d*\.?\d+%\s{0,31},\s{0,31}\d*\.?\d+%\s{0,31},\s{0,31}\.?\d+\s{0,31}\)$/; | |
// eslint-disable-next-line max-len | |
var hslColorWithSpacesRegex = /^hsl\(\s{0,31}[-.]?\d+(deg)?\s{1,31}\d*\.?\d+%\s{1,31}\d*\.?\d+%\s{0,31}\)|hsla\(\s{0,31}[-.]?\d+(deg)?\s{1,31}\d*\.?\d+%\s{1,31}\d*\.?\d+%\s{1,31}\/\s{1,31}\d*\.?\d+%?\s{0,31}\)$/; | |
var identifierRegex = /^(-[a-z0-9_][a-z0-9\-_]*|[a-z_][a-z0-9\-_]*)$/i; | |
var namedEntityRegex = /^[a-z]+$/i; | |
var prefixRegex = /^-([a-z0-9]|-)*$/i; | |
var quotedTextRegex = /^("[^"]*"|'[^']*')$/i; | |
// eslint-disable-next-line max-len | |
var rgbColorRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[\d]{1,3}\s{0,31},\s{0,31}[.\d]+\s{0,31}\)$/i; | |
// eslint-disable-next-line max-len | |
var rgbColorWithSpacesRegex = /^rgb\(\s{0,31}[\d]{1,3}\s{1,31}[\d]{1,3}\s{1,31}[\d]{1,3}\s{0,31}\)|rgba\(\s{0,31}[\d]{1,3}\s{1,31}[\d]{1,3}\s{1,31}[\d]{1,3}\s{1,31}\/\s{1,31}[\d]*\.?[.\d]+%?\s{0,31}\)$/i; | |
var timeUnitPattern = /\d+(s|ms)/; | |
var timingFunctionRegex = /^(cubic-bezier|steps)\([^)]+\)$/; | |
var validTimeUnits = ['ms', 's']; | |
var urlRegex = /^url\([\s\S]+\)$/i; | |
var variableRegex = new RegExp('^' + variableRegexStr + '$', 'i'); | |
var eightValueColorRegex = /^#[0-9a-f]{8}$/i; | |
var fourValueColorRegex = /^#[0-9a-f]{4}$/i; | |
var sixValueColorRegex = /^#[0-9a-f]{6}$/i; | |
var threeValueColorRegex = /^#[0-9a-f]{3}$/i; | |
var DECIMAL_DOT = '.'; | |
var MINUS_SIGN = '-'; | |
var PLUS_SIGN = '+'; | |
var Keywords = { | |
'^': [ | |
'inherit', | |
'initial', | |
'unset' | |
], | |
'*-style': [ | |
'auto', | |
'dashed', | |
'dotted', | |
'double', | |
'groove', | |
'hidden', | |
'inset', | |
'none', | |
'outset', | |
'ridge', | |
'solid' | |
], | |
'*-timing-function': [ | |
'ease', | |
'ease-in', | |
'ease-in-out', | |
'ease-out', | |
'linear', | |
'step-end', | |
'step-start' | |
], | |
'animation-direction': [ | |
'alternate', | |
'alternate-reverse', | |
'normal', | |
'reverse' | |
], | |
'animation-fill-mode': [ | |
'backwards', | |
'both', | |
'forwards', | |
'none' | |
], | |
'animation-iteration-count': [ | |
'infinite' | |
], | |
'animation-name': [ | |
'none' | |
], | |
'animation-play-state': [ | |
'paused', | |
'running' | |
], | |
'background-attachment': [ | |
'fixed', | |
'inherit', | |
'local', | |
'scroll' | |
], | |
'background-clip': [ | |
'border-box', | |
'content-box', | |
'inherit', | |
'padding-box', | |
'text' | |
], | |
'background-origin': [ | |
'border-box', | |
'content-box', | |
'inherit', | |
'padding-box' | |
], | |
'background-position': [ | |
'bottom', | |
'center', | |
'left', | |
'right', | |
'top' | |
], | |
'background-repeat': [ | |
'no-repeat', | |
'inherit', | |
'repeat', | |
'repeat-x', | |
'repeat-y', | |
'round', | |
'space' | |
], | |
'background-size': [ | |
'auto', | |
'cover', | |
'contain' | |
], | |
'border-collapse': [ | |
'collapse', | |
'inherit', | |
'separate' | |
], | |
bottom: [ | |
'auto' | |
], | |
clear: [ | |
'both', | |
'left', | |
'none', | |
'right' | |
], | |
color: [ | |
'transparent' | |
], | |
cursor: [ | |
'all-scroll', | |
'auto', | |
'col-resize', | |
'crosshair', | |
'default', | |
'e-resize', | |
'help', | |
'move', | |
'n-resize', | |
'ne-resize', | |
'no-drop', | |
'not-allowed', | |
'nw-resize', | |
'pointer', | |
'progress', | |
'row-resize', | |
's-resize', | |
'se-resize', | |
'sw-resize', | |
'text', | |
'vertical-text', | |
'w-resize', | |
'wait' | |
], | |
display: [ | |
'block', | |
'inline', | |
'inline-block', | |
'inline-table', | |
'list-item', | |
'none', | |
'table', | |
'table-caption', | |
'table-cell', | |
'table-column', | |
'table-column-group', | |
'table-footer-group', | |
'table-header-group', | |
'table-row', | |
'table-row-group' | |
], | |
float: [ | |
'left', | |
'none', | |
'right' | |
], | |
left: [ | |
'auto' | |
], | |
font: [ | |
'caption', | |
'icon', | |
'menu', | |
'message-box', | |
'small-caption', | |
'status-bar', | |
'unset' | |
], | |
'font-size': [ | |
'large', | |
'larger', | |
'medium', | |
'small', | |
'smaller', | |
'x-large', | |
'x-small', | |
'xx-large', | |
'xx-small' | |
], | |
'font-stretch': [ | |
'condensed', | |
'expanded', | |
'extra-condensed', | |
'extra-expanded', | |
'normal', | |
'semi-condensed', | |
'semi-expanded', | |
'ultra-condensed', | |
'ultra-expanded' | |
], | |
'font-style': [ | |
'italic', | |
'normal', | |
'oblique' | |
], | |
'font-variant': [ | |
'normal', | |
'small-caps' | |
], | |
'font-weight': [ | |
'100', | |
'200', | |
'300', | |
'400', | |
'500', | |
'600', | |
'700', | |
'800', | |
'900', | |
'bold', | |
'bolder', | |
'lighter', | |
'normal' | |
], | |
'line-height': [ | |
'normal' | |
], | |
'list-style-position': [ | |
'inside', | |
'outside' | |
], | |
'list-style-type': [ | |
'armenian', | |
'circle', | |
'decimal', | |
'decimal-leading-zero', | |
'disc', | |
'decimal|disc', // this is the default value of list-style-type, see comment in configuration.js | |
'georgian', | |
'lower-alpha', | |
'lower-greek', | |
'lower-latin', | |
'lower-roman', | |
'none', | |
'square', | |
'upper-alpha', | |
'upper-latin', | |
'upper-roman' | |
], | |
overflow: [ | |
'auto', | |
'hidden', | |
'scroll', | |
'visible' | |
], | |
position: [ | |
'absolute', | |
'fixed', | |
'relative', | |
'static' | |
], | |
right: [ | |
'auto' | |
], | |
'text-align': [ | |
'center', | |
'justify', | |
'left', | |
'left|right', // this is the default value of list-style-type, see comment in configuration.js | |
'right' | |
], | |
'text-decoration': [ | |
'line-through', | |
'none', | |
'overline', | |
'underline' | |
], | |
'text-overflow': [ | |
'clip', | |
'ellipsis' | |
], | |
top: [ | |
'auto' | |
], | |
'vertical-align': [ | |
'baseline', | |
'bottom', | |
'middle', | |
'sub', | |
'super', | |
'text-bottom', | |
'text-top', | |
'top' | |
], | |
visibility: [ | |
'collapse', | |
'hidden', | |
'visible' | |
], | |
'white-space': [ | |
'normal', | |
'nowrap', | |
'pre' | |
], | |
width: [ | |
'inherit', | |
'initial', | |
'medium', | |
'thick', | |
'thin' | |
] | |
}; | |
var Units = [ | |
'%', | |
'ch', | |
'cm', | |
'em', | |
'ex', | |
'in', | |
'mm', | |
'pc', | |
'pt', | |
'px', | |
'rem', | |
'vh', | |
'vm', | |
'vmax', | |
'vmin', | |
'vw' | |
]; | |
function isColor(value) { | |
return value != 'auto' | |
&& ( | |
isKeyword('color')(value) | |
|| isHexColor(value) | |
|| isColorFunction(value) | |
|| isNamedEntity(value) | |
); | |
} | |
function isColorFunction(value) { | |
return isRgbColor(value) || isHslColor(value); | |
} | |
function isDynamicUnit(value) { | |
return calcRegex.test(value); | |
} | |
function isFunction(value) { | |
return functionAnyRegex.test(value); | |
} | |
function isHexColor(value) { | |
return threeValueColorRegex.test(value) | |
|| fourValueColorRegex.test(value) | |
|| sixValueColorRegex.test(value) | |
|| eightValueColorRegex.test(value); | |
} | |
function isHslColor(value) { | |
return hslColorRegex.test(value) || hslColorWithSpacesRegex.test(value); | |
} | |
function isHexAlphaColor(value) { | |
return hexAlphaColorRegex.test(value); | |
} | |
function isIdentifier(value) { | |
return identifierRegex.test(value); | |
} | |
function isQuotedText(value) { | |
return quotedTextRegex.test(value); | |
} | |
function isImage(value) { | |
return value == 'none' || value == 'inherit' || isUrl(value); | |
} | |
function isKeyword(propertyName) { | |
return function(value) { | |
return Keywords[propertyName].indexOf(value) > -1; | |
}; | |
} | |
function isNamedEntity(value) { | |
return namedEntityRegex.test(value); | |
} | |
function isNumber(value) { | |
return scanForNumber(value) == value.length; | |
} | |
function isRgbColor(value) { | |
return rgbColorRegex.test(value) || rgbColorWithSpacesRegex.test(value); | |
} | |
function isPrefixed(value) { | |
return prefixRegex.test(value); | |
} | |
function isPositiveNumber(value) { | |
return isNumber(value) | |
&& parseFloat(value) >= 0; | |
} | |
function isVariable(value) { | |
return variableRegex.test(value); | |
} | |
function isTime(value) { | |
var numberUpTo = scanForNumber(value); | |
return numberUpTo == value.length && parseInt(value) === 0 | |
|| numberUpTo > -1 && validTimeUnits.indexOf(value.slice(numberUpTo + 1)) > -1 | |
|| isCalculatedTime(value); | |
} | |
function isCalculatedTime(value) { | |
return isFunction(value) && timeUnitPattern.test(value); | |
} | |
function isTimingFunction() { | |
var isTimingFunctionKeyword = isKeyword('*-timing-function'); | |
return function(value) { | |
return isTimingFunctionKeyword(value) || timingFunctionRegex.test(value); | |
}; | |
} | |
function isUnit(validUnits, value) { | |
var numberUpTo = scanForNumber(value); | |
return numberUpTo == value.length && parseInt(value) === 0 | |
|| numberUpTo > -1 && validUnits.indexOf(value.slice(numberUpTo + 1).toLowerCase()) > -1 | |
|| value == 'auto' | |
|| value == 'inherit'; | |
} | |
function isUrl(value) { | |
return urlRegex.test(value); | |
} | |
function isZIndex(value) { | |
return value == 'auto' | |
|| isNumber(value) | |
|| isKeyword('^')(value); | |
} | |
function scanForNumber(value) { | |
var hasDot = false; | |
var hasSign = false; | |
var character; | |
var i, l; | |
for (i = 0, l = value.length; i < l; i++) { | |
character = value[i]; | |
if (i === 0 && (character == PLUS_SIGN || character == MINUS_SIGN)) { | |
hasSign = true; | |
} else if (i > 0 && hasSign && (character == PLUS_SIGN || character == MINUS_SIGN)) { | |
return i - 1; | |
} else if (character == DECIMAL_DOT && !hasDot) { | |
hasDot = true; | |
} else if (character == DECIMAL_DOT && hasDot) { | |
return i - 1; | |
} else if (decimalRegex.test(character)) { | |
continue; | |
} else { | |
return i - 1; | |
} | |
} | |
return i; | |
} | |
function validator(compatibility) { | |
var validUnits = Units.slice(0).filter(function(value) { | |
return !(value in compatibility.units) || compatibility.units[value] === true; | |
}); | |
if (compatibility.customUnits.rpx) { | |
validUnits.push('rpx'); | |
} | |
return { | |
colorOpacity: compatibility.colors.opacity, | |
colorHexAlpha: compatibility.colors.hexAlpha, | |
isAnimationDirectionKeyword: isKeyword('animation-direction'), | |
isAnimationFillModeKeyword: isKeyword('animation-fill-mode'), | |
isAnimationIterationCountKeyword: isKeyword('animation-iteration-count'), | |
isAnimationNameKeyword: isKeyword('animation-name'), | |
isAnimationPlayStateKeyword: isKeyword('animation-play-state'), | |
isTimingFunction: isTimingFunction(), | |
isBackgroundAttachmentKeyword: isKeyword('background-attachment'), | |
isBackgroundClipKeyword: isKeyword('background-clip'), | |
isBackgroundOriginKeyword: isKeyword('background-origin'), | |
isBackgroundPositionKeyword: isKeyword('background-position'), | |
isBackgroundRepeatKeyword: isKeyword('background-repeat'), | |
isBackgroundSizeKeyword: isKeyword('background-size'), | |
isColor: isColor, | |
isColorFunction: isColorFunction, | |
isDynamicUnit: isDynamicUnit, | |
isFontKeyword: isKeyword('font'), | |
isFontSizeKeyword: isKeyword('font-size'), | |
isFontStretchKeyword: isKeyword('font-stretch'), | |
isFontStyleKeyword: isKeyword('font-style'), | |
isFontVariantKeyword: isKeyword('font-variant'), | |
isFontWeightKeyword: isKeyword('font-weight'), | |
isFunction: isFunction, | |
isGlobal: isKeyword('^'), | |
isHexAlphaColor: isHexAlphaColor, | |
isHslColor: isHslColor, | |
isIdentifier: isIdentifier, | |
isImage: isImage, | |
isKeyword: isKeyword, | |
isLineHeightKeyword: isKeyword('line-height'), | |
isListStylePositionKeyword: isKeyword('list-style-position'), | |
isListStyleTypeKeyword: isKeyword('list-style-type'), | |
isNumber: isNumber, | |
isPrefixed: isPrefixed, | |
isPositiveNumber: isPositiveNumber, | |
isQuotedText: isQuotedText, | |
isRgbColor: isRgbColor, | |
isStyleKeyword: isKeyword('*-style'), | |
isTime: isTime, | |
isUnit: isUnit.bind(null, validUnits), | |
isUrl: isUrl, | |
isVariable: isVariable, | |
isWidth: isKeyword('width'), | |
isZIndex: isZIndex | |
}; | |
} | |
module.exports = validator; | |