OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 /** | |
6 * @constructor | |
7 */ | |
8 WebInspector.ShadowEditor = function() {} | |
9 | |
10 /** | |
11 * @constructor | |
12 * @param {boolean=} inset | |
lushnikov
2016/08/19 16:24:35
let's make non-optional
flandy
2016/08/19 21:50:39
Done.
| |
13 * @param {!WebInspector.CSSLength=} x | |
14 * @param {!WebInspector.CSSLength=} y | |
15 * @param {!WebInspector.CSSLength=} blurRadius | |
16 * @param {!WebInspector.CSSLength=} spreadRadius | |
17 * @param {!WebInspector.Color=} color | |
18 */ | |
19 WebInspector.CSSShadowModel = function(inset, x, y, blurRadius, spreadRadius, co lor) | |
lushnikov
2016/08/19 16:24:35
This model is a good patch by itself.
Let's extra
flandy
2016/08/19 21:50:40
Done.
| |
20 { | |
21 this._inset = !!inset; | |
22 this._x = x || new WebInspector.CSSLength(0, WebInspector.CSSLengthUnit.None ); | |
lushnikov
2016/08/19 16:24:35
let's introduce a convenience method: WebInspector
flandy
2016/08/19 21:50:39
Done.
| |
23 this._y = y || new WebInspector.CSSLength(0, WebInspector.CSSLengthUnit.None ); | |
lushnikov
2016/08/19 16:24:35
let's name these and all related local variables a
flandy
2016/08/19 21:50:39
Done.
| |
24 this._blurRadius = blurRadius || new WebInspector.CSSLength(0, WebInspector. CSSLengthUnit.None); | |
25 this._spreadRadius = spreadRadius || new WebInspector.CSSLength(0, WebInspec tor.CSSLengthUnit.None); | |
26 this._color = color; | |
27 this._format = ""; | |
lushnikov
2016/08/19 16:24:35
there should be some default format - otherwise, t
flandy
2016/08/19 21:50:39
Done.
| |
28 } | |
29 | |
30 /** | |
31 * @enum {string} | |
32 */ | |
33 WebInspector.CSSShadowModel.FormatParts = { | |
34 Inset: "I", | |
35 X: "X", | |
36 Y: "Y", | |
37 BlurRadius: "B", | |
38 SpreadRadius: "S", | |
39 Color: "C" | |
40 } | |
41 | |
42 /** | |
43 * @param {string} text | |
44 * @return {?Array<!WebInspector.CSSShadowModel>} | |
lushnikov
2016/08/19 16:24:35
let's return !Array<..>, which would be empty in c
flandy
2016/08/19 21:50:39
Done.
| |
45 */ | |
46 WebInspector.CSSShadowModel.parseTextShadow = function(text) | |
47 { | |
48 return WebInspector.CSSShadowModel._parseShadow(text, false); | |
49 } | |
50 | |
51 /** | |
52 * @param {string} text | |
53 * @return {?Array<!WebInspector.CSSShadowModel>} | |
54 */ | |
55 WebInspector.CSSShadowModel.parseBoxShadow = function(text) | |
56 { | |
57 return WebInspector.CSSShadowModel._parseShadow(text, true); | |
58 } | |
59 | |
60 WebInspector.CSSShadowModel.prototype = { | |
61 /** | |
62 * @param {boolean} inset | |
63 */ | |
64 setInset: function(inset) | |
65 { | |
66 this._inset = inset; | |
67 }, | |
68 | |
69 /** | |
70 * @param {!WebInspector.CSSLength} x | |
71 * @param {!WebInspector.CSSLength} y | |
72 */ | |
73 setOffset: function(x, y) | |
74 { | |
75 this._x = x; | |
76 this._y = y; | |
77 }, | |
78 | |
79 /** | |
80 * @param {!WebInspector.CSSLength} blurRadius | |
81 */ | |
82 setBlurRadius: function(blurRadius) | |
83 { | |
84 this._blurRadius = blurRadius; | |
85 }, | |
86 | |
87 /** | |
88 * @param {!WebInspector.CSSLength} spreadRadius | |
89 */ | |
90 setSpreadRadius: function(spreadRadius) | |
91 { | |
92 this._spreadRadius = spreadRadius; | |
93 }, | |
94 | |
95 /** | |
96 * @param {!WebInspector.Color} color | |
97 */ | |
98 setColor: function(color) | |
99 { | |
100 this._color = color; | |
101 }, | |
102 | |
103 /** | |
104 * @param {string} format | |
105 */ | |
106 setFormat: function(format) | |
107 { | |
108 this._format = format; | |
109 }, | |
110 | |
111 /** | |
112 * @return {!WebInspector.CSSLength} | |
113 */ | |
114 xOffset: function() | |
115 { | |
116 return this._x; | |
117 }, | |
118 | |
119 /** | |
120 * @return {!WebInspector.CSSLength} | |
121 */ | |
122 yOffset: function() | |
123 { | |
124 return this._y; | |
125 }, | |
126 | |
127 /** | |
128 * @return {string} | |
129 */ | |
130 asCSSText: function() | |
131 { | |
132 var parts = []; | |
133 for (var i = 0; i < this._format.length; i++) { | |
134 var part = this._format.charAt(i); | |
135 if (part === WebInspector.CSSShadowModel.FormatParts.Inset && this._ inset) | |
136 parts.push("inset"); | |
137 else if (part === WebInspector.CSSShadowModel.FormatParts.X) | |
138 parts.push(this._x.asCSSText()); | |
139 else if (part === WebInspector.CSSShadowModel.FormatParts.Y) | |
140 parts.push(this._y.asCSSText()); | |
141 else if (part === WebInspector.CSSShadowModel.FormatParts.BlurRadius ) | |
142 parts.push(this._blurRadius.asCSSText()); | |
143 else if (part === WebInspector.CSSShadowModel.FormatParts.SpreadRadi us) | |
144 parts.push(this._spreadRadius.asCSSText()); | |
145 else if (part === WebInspector.CSSShadowModel.FormatParts.Color && t his._color) | |
146 parts.push(this._color.asString(this._color.format())); | |
147 } | |
148 return parts.join(" "); | |
149 } | |
150 } | |
151 | |
152 /** | |
153 * @param {string} text | |
154 * @param {boolean} isBoxShadow | |
155 * @return {?Array<!WebInspector.CSSShadowModel>} | |
156 */ | |
157 WebInspector.CSSShadowModel._parseShadow = function(text, isBoxShadow) | |
158 { | |
159 var shadowTexts = []; | |
160 // Split by commas that aren't inside of color values to get the individual shadow values. | |
161 var splits = WebInspector.TextUtils.splitStringByRegexes(text, [WebInspector .Color.Regex, /,/g]); | |
162 var currentIndex = 0; | |
163 for (var i = 0; i < splits.length; i++) { | |
164 if (splits[i].regexIndex === 1) { | |
165 var comma = splits[i]; | |
166 shadowTexts.push(text.substring(currentIndex, comma.position)); | |
167 currentIndex = comma.position + 1; | |
168 } | |
169 } | |
170 shadowTexts.push(text.substring(currentIndex, text.length)); | |
171 | |
172 var shadows = []; | |
173 for (var i = 0; i < shadowTexts.length; i++) { | |
174 var shadow = new WebInspector.CSSShadowModel(); | |
175 var format = ""; | |
176 var nextPartAllowed = true; | |
177 var regexes = [/inset/gi, WebInspector.Color.Regex, WebInspector.CSSLeng th.Regex]; | |
178 var results = WebInspector.TextUtils.splitStringByRegexes(shadowTexts[i] , regexes); | |
179 for (var j = 0; j < results.length; j++) { | |
180 var result = results[j]; | |
181 if (result.regexIndex === -1) { | |
182 // Don't allow anything other than inset, color, length values, and whitespace. | |
183 if (/\S/.test(result.value)) | |
184 return null; | |
185 // All parts must be separated by whitespace. | |
186 nextPartAllowed = true; | |
187 } else { | |
188 if (!nextPartAllowed) | |
189 return null; | |
190 nextPartAllowed = false; | |
191 | |
192 if (result.regexIndex === 0) { | |
193 shadow.setInset(true); | |
194 format += WebInspector.CSSShadowModel.FormatParts.Inset; | |
195 } else if (result.regexIndex === 1) { | |
196 var color = WebInspector.Color.parse(result.value); | |
197 if (!color) | |
198 return null; | |
199 shadow.setColor(color); | |
200 format += WebInspector.CSSShadowModel.FormatParts.Color; | |
201 } else if (result.regexIndex === 2) { | |
202 var length = WebInspector.CSSLength.parse(result.value); | |
203 if (!length) | |
204 return null; | |
205 var previousPart = format.length > 0 ? format.charAt(format. length - 1) : ""; | |
206 if (previousPart === WebInspector.CSSShadowModel.FormatParts .X) { | |
207 shadow.setOffset(shadow.xOffset(), length); | |
208 format += WebInspector.CSSShadowModel.FormatParts.Y; | |
209 } else if (previousPart === WebInspector.CSSShadowModel.Form atParts.Y) { | |
210 shadow.setBlurRadius(length); | |
211 format += WebInspector.CSSShadowModel.FormatParts.BlurRa dius; | |
212 } else if (previousPart === WebInspector.CSSShadowModel.Form atParts.BlurRadius) { | |
213 shadow.setSpreadRadius(length); | |
214 format += WebInspector.CSSShadowModel.FormatParts.Spread Radius; | |
215 } else { | |
216 shadow.setOffset(length, shadow.yOffset()); | |
217 format += WebInspector.CSSShadowModel.FormatParts.X; | |
218 } | |
219 } | |
220 } | |
221 } | |
222 if (invalidCount(WebInspector.CSSShadowModel.FormatParts.X, 1, 1) | |
223 || invalidCount(WebInspector.CSSShadowModel.FormatParts.Y, 1, 1) | |
224 || invalidCount(WebInspector.CSSShadowModel.FormatParts.Color, 0 , 1) | |
225 || invalidCount(WebInspector.CSSShadowModel.FormatParts.BlurRadi us, 0, 1) | |
226 || invalidCount(WebInspector.CSSShadowModel.FormatParts.Inset, 0 , isBoxShadow ? 1 : 0) | |
227 || invalidCount(WebInspector.CSSShadowModel.FormatParts.SpreadRa dius, 0, isBoxShadow ? 1 : 0)) | |
228 return null; | |
229 shadow.setFormat(format); | |
230 shadows.push(shadow); | |
231 } | |
232 return shadows; | |
233 | |
234 /** | |
235 * @param {string} character | |
236 * @param {number} min | |
237 * @param {number} max | |
238 * @return {boolean} | |
239 */ | |
240 function invalidCount(character, min, max) | |
241 { | |
242 var count = 0; | |
243 for (var i = 0; i < format.length; i++) { | |
244 if (format.charAt(i) === character) | |
245 count++; | |
246 } | |
247 return count < min || count > max; | |
248 } | |
249 } | |
250 | |
251 /** | |
252 * @constructor | |
253 * @param {number} amount | |
254 * @param {string} unit | |
lushnikov
2016/08/19 16:24:35
WebInspector.CSSLengthUnit
flandy
2016/08/19 21:50:39
Done.
| |
255 */ | |
256 WebInspector.CSSLength = function(amount, unit) | |
257 { | |
258 this.amount = amount; | |
259 this.unit = unit; | |
260 } | |
261 | |
262 /** @type {!RegExp} */ | |
263 WebInspector.CSSLength.Regex = /([+-]?(?:[0-9]*[.])?[0-9]+(?:[eE][+-]?[0-9]+)?)( [a-zA-Z]{2,4})|[+-]?(?:0*[.])?0+(?:[eE][+-]?[0-9]+)?/g; | |
lushnikov
2016/08/19 16:24:35
can we build this complex regex out of composing p
flandy
2016/08/19 21:50:39
Done.
| |
264 | |
265 /** | |
266 * @enum {string} | |
267 */ | |
268 WebInspector.CSSLengthUnit = { | |
269 Ch: "ch", | |
270 Cm: "cm", | |
271 Em: "em", | |
272 Ex: "ex", | |
273 In: "in", | |
274 Mm: "mm", | |
275 Pc: "pc", | |
276 Pt: "pt", | |
277 Px: "px", | |
278 Rem: "rem", | |
279 Vh: "vh", | |
280 Vmax: "vmax", | |
281 Vmin: "vmin", | |
282 Vw: "vw", | |
283 None: "" | |
284 } | |
285 | |
286 /** | |
287 * @param {string} text | |
288 * @return {?WebInspector.CSSLength} | |
289 */ | |
290 WebInspector.CSSLength.parse = function(text) | |
291 { | |
292 var lengthRegex = new RegExp("^(" + WebInspector.CSSLength.Regex.source + ") $"); | |
293 var match = text.match(lengthRegex) || []; | |
294 if (match.length > 3 && match[3]) { | |
295 if (validUnit(match[3])) | |
296 return new WebInspector.CSSLength(parseFloat(match[2]), match[3]); | |
297 } else if (match.length > 1) { | |
298 return new WebInspector.CSSLength(0, WebInspector.CSSLengthUnit.None); | |
299 } | |
300 return null; | |
301 | |
302 /** | |
303 * @param {string} unit | |
304 * @return {boolean} | |
305 */ | |
306 function validUnit(unit) | |
lushnikov
2016/08/19 16:24:35
this can go away if the CSSLengthUnit regex would
flandy
2016/08/19 21:50:40
Done.
| |
307 { | |
308 unit = unit.toLowerCase(); | |
309 var keys = Object.keys(WebInspector.CSSLengthUnit); | |
310 for (var i = 0; i < keys.length; i++) { | |
311 if (WebInspector.CSSLengthUnit[keys[i]] === unit) | |
312 return true; | |
313 } | |
314 return false; | |
315 } | |
316 } | |
317 | |
318 WebInspector.CSSLength.prototype = { | |
319 /** | |
320 * @return {string} | |
321 */ | |
322 asCSSText: function() | |
323 { | |
324 return this.amount + this.unit; | |
325 } | |
326 } | |
OLD | NEW |