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