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