OLD | NEW |
| (Empty) |
1 //.CommonJS | |
2 var CSSOM = { | |
3 CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaratio
n, | |
4 CSSRule: require("./CSSRule").CSSRule | |
5 }; | |
6 ///CommonJS | |
7 | |
8 | |
9 /** | |
10 * @constructor | |
11 * @see http://dev.w3.org/csswg/cssom/#cssstylerule | |
12 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule | |
13 */ | |
14 CSSOM.CSSStyleRule = function CSSStyleRule() { | |
15 CSSOM.CSSRule.call(this); | |
16 this.selectorText = ""; | |
17 this.style = new CSSOM.CSSStyleDeclaration; | |
18 this.style.parentRule = this; | |
19 }; | |
20 | |
21 CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule; | |
22 CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule; | |
23 CSSOM.CSSStyleRule.prototype.type = 1; | |
24 | |
25 CSSOM.CSSStyleRule.prototype.__defineGetter__("cssText", function() { | |
26 var text; | |
27 if (this.selectorText) { | |
28 text = this.selectorText + " {" + this.style.cssText + "}"; | |
29 } else { | |
30 text = ""; | |
31 } | |
32 return text; | |
33 }); | |
34 | |
35 CSSOM.CSSStyleRule.prototype.__defineSetter__("cssText", function(cssText) { | |
36 var rule = CSSOM.CSSStyleRule.parse(cssText); | |
37 this.style = rule.style; | |
38 this.selectorText = rule.selectorText; | |
39 }); | |
40 | |
41 | |
42 /** | |
43 * NON-STANDARD | |
44 * lightweight version of parse.js. | |
45 * @param {string} ruleText | |
46 * @return CSSStyleRule | |
47 */ | |
48 CSSOM.CSSStyleRule.parse = function(ruleText) { | |
49 var i = 0; | |
50 var state = "selector"; | |
51 var index; | |
52 var j = i; | |
53 var buffer = ""; | |
54 | |
55 var SIGNIFICANT_WHITESPACE = { | |
56 "selector": true, | |
57 "value": true | |
58 }; | |
59 | |
60 var styleRule = new CSSOM.CSSStyleRule; | |
61 var selector, name, value, priority=""; | |
62 | |
63 for (var character; character = ruleText.charAt(i); i++) { | |
64 | |
65 switch (character) { | |
66 | |
67 case " ": | |
68 case "\t": | |
69 case "\r": | |
70 case "\n": | |
71 case "\f": | |
72 if (SIGNIFICANT_WHITESPACE[state]) { | |
73 // Squash 2 or more white-spaces in the row into
1 | |
74 switch (ruleText.charAt(i - 1)) { | |
75 case " ": | |
76 case "\t": | |
77 case "\r": | |
78 case "\n": | |
79 case "\f": | |
80 break; | |
81 default: | |
82 buffer += " "; | |
83 break; | |
84 } | |
85 } | |
86 break; | |
87 | |
88 // String | |
89 case '"': | |
90 j = i + 1; | |
91 index = ruleText.indexOf('"', j) + 1; | |
92 if (!index) { | |
93 throw '" is missing'; | |
94 } | |
95 buffer += ruleText.slice(i, index); | |
96 i = index - 1; | |
97 break; | |
98 | |
99 case "'": | |
100 j = i + 1; | |
101 index = ruleText.indexOf("'", j) + 1; | |
102 if (!index) { | |
103 throw "' is missing"; | |
104 } | |
105 buffer += ruleText.slice(i, index); | |
106 i = index - 1; | |
107 break; | |
108 | |
109 // Comment | |
110 case "/": | |
111 if (ruleText.charAt(i + 1) === "*") { | |
112 i += 2; | |
113 index = ruleText.indexOf("*/", i); | |
114 if (index === -1) { | |
115 throw new SyntaxError("Missing */"); | |
116 } else { | |
117 i = index + 1; | |
118 } | |
119 } else { | |
120 buffer += character; | |
121 } | |
122 break; | |
123 | |
124 case "{": | |
125 if (state === "selector") { | |
126 styleRule.selectorText = buffer.trim(); | |
127 buffer = ""; | |
128 state = "name"; | |
129 } | |
130 break; | |
131 | |
132 case ":": | |
133 if (state === "name") { | |
134 name = buffer.trim(); | |
135 buffer = ""; | |
136 state = "value"; | |
137 } else { | |
138 buffer += character; | |
139 } | |
140 break; | |
141 | |
142 case "!": | |
143 if (state === "value" && ruleText.indexOf("!important",
i) === i) { | |
144 priority = "important"; | |
145 i += "important".length; | |
146 } else { | |
147 buffer += character; | |
148 } | |
149 break; | |
150 | |
151 case ";": | |
152 if (state === "value") { | |
153 styleRule.style.setProperty(name, buffer.trim(),
priority); | |
154 priority = ""; | |
155 buffer = ""; | |
156 state = "name"; | |
157 } else { | |
158 buffer += character; | |
159 } | |
160 break; | |
161 | |
162 case "}": | |
163 if (state === "value") { | |
164 styleRule.style.setProperty(name, buffer.trim(),
priority); | |
165 priority = ""; | |
166 buffer = ""; | |
167 } else if (state === "name") { | |
168 break; | |
169 } else { | |
170 buffer += character; | |
171 } | |
172 state = "selector"; | |
173 break; | |
174 | |
175 default: | |
176 buffer += character; | |
177 break; | |
178 | |
179 } | |
180 } | |
181 | |
182 return styleRule; | |
183 | |
184 }; | |
185 | |
186 | |
187 //.CommonJS | |
188 exports.CSSStyleRule = CSSOM.CSSStyleRule; | |
189 ///CommonJS | |
OLD | NEW |