summaryrefslogtreecommitdiff
path: root/node_modules/postcss-merge-longhand/src/lib/parseWsc.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/postcss-merge-longhand/src/lib/parseWsc.js')
-rw-r--r--node_modules/postcss-merge-longhand/src/lib/parseWsc.js83
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]);
+};