84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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]);
 | 
						|
};
 |