| //.CommonJS |
| var CSSOM = { |
| CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration, |
| CSSRule: require("./CSSRule").CSSRule |
| }; |
| ///CommonJS |
| |
| |
| /** |
| * @constructor |
| * @see http://dev.w3.org/csswg/cssom/#cssstylerule |
| * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule |
| */ |
| CSSOM.CSSStyleRule = function CSSStyleRule() { |
| CSSOM.CSSRule.call(this); |
| this.selectorText = ""; |
| this.style = new CSSOM.CSSStyleDeclaration(); |
| this.style.parentRule = this; |
| }; |
| |
| CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule(); |
| CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule; |
| CSSOM.CSSStyleRule.prototype.type = 1; |
| |
| Object.defineProperty(CSSOM.CSSStyleRule.prototype, "cssText", { |
| get: function() { |
| var text; |
| if (this.selectorText) { |
| text = this.selectorText + " {" + this.style.cssText + "}"; |
| } else { |
| text = ""; |
| } |
| return text; |
| }, |
| set: function(cssText) { |
| var rule = CSSOM.CSSStyleRule.parse(cssText); |
| this.style = rule.style; |
| this.selectorText = rule.selectorText; |
| } |
| }); |
| |
| |
| /** |
| * NON-STANDARD |
| * lightweight version of parse.js. |
| * @param {string} ruleText |
| * @return CSSStyleRule |
| */ |
| CSSOM.CSSStyleRule.parse = function(ruleText) { |
| var i = 0; |
| var state = "selector"; |
| var index; |
| var j = i; |
| var buffer = ""; |
| |
| var SIGNIFICANT_WHITESPACE = { |
| "selector": true, |
| "value": true |
| }; |
| |
| var styleRule = new CSSOM.CSSStyleRule(); |
| var name, priority=""; |
| |
| for (var character; (character = ruleText.charAt(i)); i++) { |
| |
| switch (character) { |
| |
| case " ": |
| case "\t": |
| case "\r": |
| case "\n": |
| case "\f": |
| if (SIGNIFICANT_WHITESPACE[state]) { |
| // Squash 2 or more white-spaces in the row into 1 |
| switch (ruleText.charAt(i - 1)) { |
| case " ": |
| case "\t": |
| case "\r": |
| case "\n": |
| case "\f": |
| break; |
| default: |
| buffer += " "; |
| break; |
| } |
| } |
| break; |
| |
| // String |
| case '"': |
| j = i + 1; |
| index = ruleText.indexOf('"', j) + 1; |
| if (!index) { |
| throw '" is missing'; |
| } |
| buffer += ruleText.slice(i, index); |
| i = index - 1; |
| break; |
| |
| case "'": |
| j = i + 1; |
| index = ruleText.indexOf("'", j) + 1; |
| if (!index) { |
| throw "' is missing"; |
| } |
| buffer += ruleText.slice(i, index); |
| i = index - 1; |
| break; |
| |
| // Comment |
| case "/": |
| if (ruleText.charAt(i + 1) === "*") { |
| i += 2; |
| index = ruleText.indexOf("*/", i); |
| if (index === -1) { |
| throw new SyntaxError("Missing */"); |
| } else { |
| i = index + 1; |
| } |
| } else { |
| buffer += character; |
| } |
| break; |
| |
| case "{": |
| if (state === "selector") { |
| styleRule.selectorText = buffer.trim(); |
| buffer = ""; |
| state = "name"; |
| } |
| break; |
| |
| case ":": |
| if (state === "name") { |
| name = buffer.trim(); |
| buffer = ""; |
| state = "value"; |
| } else { |
| buffer += character; |
| } |
| break; |
| |
| case "!": |
| if (state === "value" && ruleText.indexOf("!important", i) === i) { |
| priority = "important"; |
| i += "important".length; |
| } else { |
| buffer += character; |
| } |
| break; |
| |
| case ";": |
| if (state === "value") { |
| styleRule.style.setProperty(name, buffer.trim(), priority); |
| priority = ""; |
| buffer = ""; |
| state = "name"; |
| } else { |
| buffer += character; |
| } |
| break; |
| |
| case "}": |
| if (state === "value") { |
| styleRule.style.setProperty(name, buffer.trim(), priority); |
| priority = ""; |
| buffer = ""; |
| } else if (state === "name") { |
| break; |
| } else { |
| buffer += character; |
| } |
| state = "selector"; |
| break; |
| |
| default: |
| buffer += character; |
| break; |
| |
| } |
| } |
| |
| return styleRule; |
| |
| }; |
| |
| |
| //.CommonJS |
| exports.CSSStyleRule = CSSOM.CSSStyleRule; |
| ///CommonJS |