You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.7 KiB
65 lines
1.7 KiB
// @ts-nocheck |
|
|
|
'use strict'; |
|
|
|
const rangeOperators = ['>=', '<=', '>', '<', '=']; |
|
const styleSearch = require('style-search'); |
|
|
|
function getRangeContextOperators(node) { |
|
const operators = []; |
|
|
|
styleSearch({ source: node.value, target: rangeOperators }, (match) => { |
|
const before = node[match.startIndex - 1]; |
|
|
|
if (before === '>' || before === '<') { |
|
return; |
|
} |
|
|
|
operators.push(match.target); |
|
}); |
|
|
|
// Sorting helps when using the operators to split |
|
// E.g. for "(10em < width <= 50em)" this returns ["<=", "<"] |
|
return operators.sort((a, b) => b.length - a.length); |
|
} |
|
|
|
function getRangeContextName(parsedNode) { |
|
// When the node is like "(10em < width < 50em)" |
|
// The parsedNode is ["10em", "width", "50em"] - the name is always in the second position |
|
if (parsedNode.length === 3) { |
|
return parsedNode[1]; |
|
} |
|
|
|
// When the node is like "(width > 10em)" or "(10em < width)" |
|
// Regex is needed because the name can either be in the first or second position |
|
return parsedNode.find((value) => value.match(/^(?!--)\D+/) || value.match(/^(--).+/)); |
|
} |
|
|
|
module.exports = function (node) { |
|
const nodeValue = node.value; |
|
|
|
const operators = getRangeContextOperators(node); |
|
|
|
// Remove spaces and parentheses and split by the operators |
|
const parsedMedia = nodeValue.replace(/[()\s]/g, '').split(new RegExp(operators.join('|'))); |
|
|
|
const name = getRangeContextName(parsedMedia); |
|
const nameObj = { |
|
value: name, |
|
sourceIndex: node.sourceIndex + nodeValue.indexOf(name), |
|
}; |
|
|
|
const values = parsedMedia |
|
.filter((parsedValue) => parsedValue !== name) |
|
.map((value) => { |
|
return { |
|
value, |
|
sourceIndex: node.sourceIndex + nodeValue.indexOf(value), |
|
}; |
|
}); |
|
|
|
return { |
|
name: nameObj, |
|
values, |
|
}; |
|
};
|
|
|