vendor/node_modules/cssom/lib/parse.js in stylus-source-0.23.0 vs vendor/node_modules/cssom/lib/parse.js in stylus-source-0.24.0
- old
+ new
@@ -11,16 +11,14 @@
///CommonJS
/**
* @param {string} token
- * @param {Object} [options]
*/
-CSSOM.parse = function parse(token, options) {
+CSSOM.parse = function parse(token) {
- options = options || {};
- var i = options.startIndex || 0;
+ var i = 0;
/**
"before-selector" or
"selector" or
"atRule" or
@@ -28,14 +26,13 @@
"before-name" or
"name" or
"before-value" or
"value"
*/
- var state = options.state || "before-selector";
+ var state = "before-selector";
var index;
- var j = i;
var buffer = "";
var SIGNIFICANT_WHITESPACE = {
"selector": true,
"value": true,
@@ -45,13 +42,16 @@
"atBlock": true
};
var styleSheet = new CSSOM.CSSStyleSheet;
- // @type CSSStyleSheet|CSSMediaRule
+ // @type CSSStyleSheet|CSSMediaRule|CSSKeyframesRule
var currentScope = styleSheet;
-
+
+ // @type CSSMediaRule|CSSKeyframesRule
+ var parentRule;
+
var selector, name, value, priority="", styleRule, mediaRule, importRule, keyframesRule, keyframeRule;
for (var character; character = token.charAt(i); i++) {
switch (character) {
@@ -66,12 +66,11 @@
}
break;
// String
case '"':
- j = i + 1;
- index = token.indexOf('"', j) + 1;
+ index = token.indexOf('"', i + 1) + 1;
if (!index) {
throw '" is missing';
}
buffer += token.slice(i, index);
i = index - 1;
@@ -84,12 +83,11 @@
break;
}
break;
case "'":
- j = i + 1;
- index = token.indexOf("'", j) + 1;
+ index = token.indexOf("'", i + 1) + 1;
if (!index) {
throw "' is missing";
}
buffer += token.slice(i, index);
i = index - 1;
@@ -103,106 +101,109 @@
}
break;
// Comment
case "/":
- if (token.charAt(i + 1) == "*") {
+ if (token.charAt(i + 1) === "*") {
i += 2;
index = token.indexOf("*/", i);
- if (index == -1) {
- throw SyntaxError("Missing */");
+ if (index === -1) {
+ throw new SyntaxError("Missing */");
} else {
i = index + 1;
}
} else {
buffer += character;
}
- if (state == "importRule-begin") {
+ if (state === "importRule-begin") {
buffer += " ";
state = "importRule";
}
break;
// At-rule
case "@":
- if (token.indexOf("@media", i) == i) {
+ if (token.indexOf("@media", i) === i) {
state = "atBlock";
mediaRule = new CSSOM.CSSMediaRule;
mediaRule.__starts = i;
i += "media".length;
buffer = "";
break;
- } else if (token.indexOf("@import", i) == i) {
+ } else if (token.indexOf("@import", i) === i) {
state = "importRule-begin";
i += "import".length;
buffer += "@import";
break;
- } else if (token.indexOf("@-webkit-keyframes", i) == i) {
+ } else if (token.indexOf("@-webkit-keyframes", i) === i) {
state = "keyframesRule-begin";
keyframesRule = new CSSOM.CSSKeyframesRule;
keyframesRule.__starts = i;
i += "-webkit-keyframes".length;
buffer = "";
break;
- } else if (state == "selector") {
+ } else if (state === "selector") {
state = "atRule";
}
buffer += character;
break;
case "{":
- if (state == "selector" || state == "atRule") {
- styleRule.selectorText = buffer.trimRight();
+ if (state === "selector" || state === "atRule") {
+ styleRule.selectorText = buffer.trim();
styleRule.style.__starts = i;
buffer = "";
state = "before-name";
- } else if (state == "atBlock") {
+ } else if (state === "atBlock") {
mediaRule.media.mediaText = buffer.trim();
- mediaRule.parentRule = currentScope;
- currentScope = mediaRule;
+ currentScope = parentRule = mediaRule;
+ mediaRule.parentStyleSheet = styleSheet;
buffer = "";
state = "before-selector";
- } else if (state == "keyframesRule-begin") {
- keyframesRule.name = buffer.trimRight();
- keyframesRule.parentRule = currentScope;
- currentScope = keyframesRule;
+ } else if (state === "keyframesRule-begin") {
+ keyframesRule.name = buffer.trim();
+ if (parentRule) {
+ keyframesRule.parentRule = parentRule;
+ }
+ keyframesRule.parentStyleSheet = styleSheet;
+ currentScope = parentRule = keyframesRule;
buffer = "";
state = "keyframeRule-begin";
- } else if (state == "keyframeRule-begin") {
+ } else if (state === "keyframeRule-begin") {
styleRule = new CSSOM.CSSKeyframeRule;
- styleRule.keyText = buffer.trimRight();
+ styleRule.keyText = buffer.trim();
styleRule.__starts = i;
buffer = "";
state = "before-name";
}
break;
case ":":
- if (state == "name") {
+ if (state === "name") {
name = buffer.trim();
buffer = "";
state = "before-value";
} else {
buffer += character;
}
break;
case '(':
- if (state == 'value') {
+ if (state === 'value') {
index = token.indexOf(')', i + 1);
- if (index == -1) {
+ if (index === -1) {
throw i + ': unclosed "("';
}
buffer += token.slice(i, index + 1);
i = index;
} else {
buffer += character;
}
break;
case "!":
- if (state == "value" && token.indexOf("!important", i) === i) {
+ if (state === "value" && token.indexOf("!important", i) === i) {
priority = "important";
i += "important".length;
} else {
buffer += character;
}
@@ -220,13 +221,13 @@
buffer = "";
state = "before-selector";
break;
case "importRule":
importRule = new CSSOM.CSSImportRule;
- importRule.parentRule = currentScope;
+ importRule.parentStyleSheet = importRule.styleSheet.parentStyleSheet = styleSheet;
importRule.cssText = buffer + character;
- currentScope.cssRules.push(importRule);
+ styleSheet.cssRules.push(importRule);
buffer = "";
state = "before-selector";
break;
default:
buffer += character;
@@ -240,29 +241,33 @@
styleRule.style.setProperty(name, buffer.trim(), priority);
priority = "";
case "before-name":
case "name":
styleRule.__ends = i + 1;
- styleRule.parentRule = currentScope;
+ if (parentRule) {
+ styleRule.parentRule = parentRule;
+ }
+ styleRule.parentStyleSheet = styleSheet;
currentScope.cssRules.push(styleRule);
buffer = "";
- if (currentScope.constructor == CSSOM.CSSKeyframesRule) {
+ if (currentScope.constructor === CSSOM.CSSKeyframesRule) {
state = "keyframeRule-begin";
} else {
state = "before-selector";
}
break;
case "keyframeRule-begin":
case "before-selector":
case "selector":
// End of media rule.
- // Nesting rules aren't supported yet
- if (!currentScope.parentRule) {
+ if (!parentRule) {
throw "unexpected }";
}
currentScope.__ends = i + 1;
- currentScope.parentRule.cssRules.push(currentScope);
- currentScope = currentScope.parentRule;
+ // Nesting rules aren’t supported yet
+ styleSheet.cssRules.push(currentScope);
+ currentScope = styleSheet;
+ parentRule = null;
buffer = "";
state = "before-selector";
break;
}
break;