| '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]); |
| }; |