diff options
Diffstat (limited to 'node_modules/postcss-merge-longhand/src/lib/parseWsc.js')
| -rw-r--r-- | node_modules/postcss-merge-longhand/src/lib/parseWsc.js | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/postcss-merge-longhand/src/lib/parseWsc.js b/node_modules/postcss-merge-longhand/src/lib/parseWsc.js new file mode 100644 index 00000000..a0bc16c1 --- /dev/null +++ b/node_modules/postcss-merge-longhand/src/lib/parseWsc.js @@ -0,0 +1,83 @@ +'use strict'; +const { list } = require('postcss'); +const { isWidth, isStyle, isColor } = require('./validateWsc.js'); + +const none = /^\s*(none|medium)(\s+none(\s+(none|currentcolor))?)?\s*$/i; + +/* Approximate https://drafts.csswg.org/css-values-4/#typedef-dashed-ident */ +// eslint-disable-next-line no-control-regex +const varRE = /--(\w|-|[^\x00-\x7F])+/g; +/** @type {(v: string) => string} */ +const toLower = (v) => { + let match; + let lastIndex = 0; + let result = ''; + varRE.lastIndex = 0; + while ((match = varRE.exec(v)) !== null) { + if (match.index > lastIndex) { + result += v.substring(lastIndex, match.index).toLowerCase(); + } + result += match[0]; + lastIndex = match.index + match[0].length; + } + if (lastIndex < v.length) { + result += v.substring(lastIndex).toLowerCase(); + } + if (result === '') { + return v; + } + return result; +}; + +/** + * @param {string} value + * @return {[string, string, string]} + */ +module.exports = function parseWsc(value) { + if (none.test(value)) { + return ['medium', 'none', 'currentcolor']; + } + + let width, style, color; + + const values = list.space(value); + if ( + values.length > 1 && + isStyle(values[1]) && + values[0].toLowerCase() === 'none' + ) { + values.unshift(); + width = '0'; + } + + /** @type {string[]} */ + const unknown = []; + + values.forEach((v) => { + if (isStyle(v)) { + style = toLower(v); + } else if (isWidth(v)) { + width = toLower(v); + } else if (isColor(v)) { + color = toLower(v); + } else { + unknown.push(v); + } + }); + + if (unknown.length) { + if (!width && style && color) { + width = unknown.pop(); + } + + if (width && !style && color) { + style = unknown.pop(); + } + + if (width && style && !color) { + color = unknown.pop(); + } + } + + return /** @type {[string, string, string]} */ ([width, style, color]); +}; |
