diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2024-08-30 17:21:18 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2024-08-30 17:21:18 +0800 |
| commit | efbc2ffe6a1ee5ec38a4396305561d6515d0943e (patch) | |
| tree | 2b4c94f18f2c792dfda813050755d5c0273fae22 /node_modules/clean-css/lib/optimizer/validator.js | |
| parent | 43acceb75957c880a5ba5a31aae221394a36d5f6 (diff) | |
node fixes, updates
Diffstat (limited to 'node_modules/clean-css/lib/optimizer/validator.js')
| -rw-r--r-- | node_modules/clean-css/lib/optimizer/validator.js | 561 |
1 files changed, 561 insertions, 0 deletions
diff --git a/node_modules/clean-css/lib/optimizer/validator.js b/node_modules/clean-css/lib/optimizer/validator.js new file mode 100644 index 00000000..3e2a5c88 --- /dev/null +++ b/node_modules/clean-css/lib/optimizer/validator.js @@ -0,0 +1,561 @@ +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; |
