Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81143 views
1
//.CommonJS
2
var CSSOM = {
3
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
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
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
* NON-STANDARD
45
* lightweight version of parse.js.
46
* @param {string} ruleText
47
* @return CSSStyleRule
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 selector, name, value, 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
// Squash 2 or more white-spaces in the row into 1
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
// String
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
// Comment
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
//.CommonJS
189
exports.CSSStyleRule = CSSOM.CSSStyleRule;
190
///CommonJS
191
192