|
|
- //.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
|