You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
3.5 KiB
190 lines
3.5 KiB
//.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
|
|
|