UNPKG

3.62 kBJavaScriptView Raw
1//.CommonJS
2var 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 */
14CSSOM.CSSStyleRule = function CSSStyleRule() {
15 CSSOM.CSSRule.call(this);
16 this.selectorText = "";
17 this.style = new CSSOM.CSSStyleDeclaration();
18 this.style.parentRule = this;
19};
20
21CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule();
22CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule;
23CSSOM.CSSStyleRule.prototype.type = 1;
24
25Object.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 */
49CSSOM.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 // 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
189exports.CSSStyleRule = CSSOM.CSSStyleRule;
190///CommonJS