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