1 |
|
2 | var CSSOM = {
|
3 | CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
|
4 | CSSRule: require("./CSSRule").CSSRule
|
5 | };
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
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 | Object.defineProperty(CSSOM.CSSStyleRule.prototype, "cssText", {
|
26 | get: function() {
|
27 | var text;
|
28 | if (this.selectorText) {
|
29 | text = this.selectorText + " {" + this.style.cssText + "}";
|
30 | } else {
|
31 | text = "";
|
32 | }
|
33 | return text;
|
34 | },
|
35 | set: function(cssText) {
|
36 | var rule = CSSOM.CSSStyleRule.parse(cssText);
|
37 | this.style = rule.style;
|
38 | this.selectorText = rule.selectorText;
|
39 | }
|
40 | });
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | CSSOM.CSSStyleRule.parse = function(ruleText) {
|
50 | var i = 0;
|
51 | var state = "selector";
|
52 | var index;
|
53 | var j = i;
|
54 | var buffer = "";
|
55 |
|
56 | var SIGNIFICANT_WHITESPACE = {
|
57 | "selector": true,
|
58 | "value": true
|
59 | };
|
60 |
|
61 | var styleRule = new CSSOM.CSSStyleRule();
|
62 | var name, priority="";
|
63 |
|
64 | for (var character; (character = ruleText.charAt(i)); i++) {
|
65 |
|
66 | switch (character) {
|
67 |
|
68 | case " ":
|
69 | case "\t":
|
70 | case "\r":
|
71 | case "\n":
|
72 | case "\f":
|
73 | if (SIGNIFICANT_WHITESPACE[state]) {
|
74 |
|
75 | switch (ruleText.charAt(i - 1)) {
|
76 | case " ":
|
77 | case "\t":
|
78 | case "\r":
|
79 | case "\n":
|
80 | case "\f":
|
81 | break;
|
82 | default:
|
83 | buffer += " ";
|
84 | break;
|
85 | }
|
86 | }
|
87 | break;
|
88 |
|
89 |
|
90 | case '"':
|
91 | j = i + 1;
|
92 | index = ruleText.indexOf('"', j) + 1;
|
93 | if (!index) {
|
94 | throw '" is missing';
|
95 | }
|
96 | buffer += ruleText.slice(i, index);
|
97 | i = index - 1;
|
98 | break;
|
99 |
|
100 | case "'":
|
101 | j = i + 1;
|
102 | index = ruleText.indexOf("'", j) + 1;
|
103 | if (!index) {
|
104 | throw "' is missing";
|
105 | }
|
106 | buffer += ruleText.slice(i, index);
|
107 | i = index - 1;
|
108 | break;
|
109 |
|
110 |
|
111 | case "/":
|
112 | if (ruleText.charAt(i + 1) === "*") {
|
113 | i += 2;
|
114 | index = ruleText.indexOf("*/", i);
|
115 | if (index === -1) {
|
116 | throw new SyntaxError("Missing */");
|
117 | } else {
|
118 | i = index + 1;
|
119 | }
|
120 | } else {
|
121 | buffer += character;
|
122 | }
|
123 | break;
|
124 |
|
125 | case "{":
|
126 | if (state === "selector") {
|
127 | styleRule.selectorText = buffer.trim();
|
128 | buffer = "";
|
129 | state = "name";
|
130 | }
|
131 | break;
|
132 |
|
133 | case ":":
|
134 | if (state === "name") {
|
135 | name = buffer.trim();
|
136 | buffer = "";
|
137 | state = "value";
|
138 | } else {
|
139 | buffer += character;
|
140 | }
|
141 | break;
|
142 |
|
143 | case "!":
|
144 | if (state === "value" && ruleText.indexOf("!important", i) === i) {
|
145 | priority = "important";
|
146 | i += "important".length;
|
147 | } else {
|
148 | buffer += character;
|
149 | }
|
150 | break;
|
151 |
|
152 | case ";":
|
153 | if (state === "value") {
|
154 | styleRule.style.setProperty(name, buffer.trim(), priority);
|
155 | priority = "";
|
156 | buffer = "";
|
157 | state = "name";
|
158 | } else {
|
159 | buffer += character;
|
160 | }
|
161 | break;
|
162 |
|
163 | case "}":
|
164 | if (state === "value") {
|
165 | styleRule.style.setProperty(name, buffer.trim(), priority);
|
166 | priority = "";
|
167 | buffer = "";
|
168 | } else if (state === "name") {
|
169 | break;
|
170 | } else {
|
171 | buffer += character;
|
172 | }
|
173 | state = "selector";
|
174 | break;
|
175 |
|
176 | default:
|
177 | buffer += character;
|
178 | break;
|
179 |
|
180 | }
|
181 | }
|
182 |
|
183 | return styleRule;
|
184 |
|
185 | };
|
186 |
|
187 |
|
188 |
|
189 | exports.CSSStyleRule = CSSOM.CSSStyleRule;
|
190 |
|