|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // @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,
- };
- };
|