| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports["default"] = parseNestedPropRoot; |
| |
| /** |
| * Attempts to parse a selector as if it"s a root for a group of nested props |
| * E.g.: `margin: {`, `font: 10px/1.1 Arial {` ("{" excluded) |
| */ |
| function parseNestedPropRoot(propString) { |
| var modesEntered = [{ |
| mode: "normal", |
| character: null, |
| isCalculationEnabled: true |
| }]; |
| var result = {}; |
| var lastModeIndex = 0; |
| var propName = ""; |
| |
| for (var i = 0; i < propString.length; i++) { |
| var character = propString[i]; |
| var prevCharacter = propString[i - 1]; // If entering/exiting a string |
| |
| if (character === '"' || character === "'") { |
| if (modesEntered[lastModeIndex].isCalculationEnabled === true) { |
| modesEntered.push({ |
| mode: "string", |
| isCalculationEnabled: false, |
| character: character |
| }); |
| lastModeIndex++; |
| } else if (modesEntered[lastModeIndex].mode === "string" && modesEntered[lastModeIndex].character === character && prevCharacter !== "\\") { |
| modesEntered.pop(); |
| lastModeIndex--; |
| } |
| } // If entering/exiting interpolation |
| |
| |
| if (character === "{") { |
| modesEntered.push({ |
| mode: "interpolation", |
| isCalculationEnabled: true |
| }); |
| lastModeIndex++; |
| } else if (character === "}") { |
| modesEntered.pop(); |
| lastModeIndex--; |
| } // Check for : outside fn call, string or interpolation. It must be at the |
| // end of a string or have a whitespace between it and following value |
| |
| |
| if (modesEntered[lastModeIndex].mode === "normal" && character === ":" && prevCharacter !== "\\") { |
| var propValueStr = propString.substring(i + 1); |
| |
| if (propValueStr.length) { |
| var propValue = { |
| before: /^(\s*)/.exec(propValueStr)[1], |
| value: propValueStr.trim() |
| }; // It's a declaration if 1) there is a whitespace after :, or |
| // 2) the value is a number with/without a unit (starts with a number |
| // or a dot), or |
| // 3) the value is a variable (starts with $), or |
| // 4) the value a string, surprisingly |
| |
| if (propValue.before === "" && !/^[\d.$'"]/.test(propValue.value)) { |
| return null; |
| } // +1 for the colon |
| |
| |
| propValue.sourceIndex = propValue.before.length + i + 1; |
| result.propValue = propValue; |
| } |
| |
| result.propName = { |
| after: /(\s*)$/.exec(propName)[1], |
| value: propName.trim() |
| }; |
| return result; |
| } |
| |
| propName += character; |
| } |
| |
| return null; |
| } |