Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/ui/ShadowEditor.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui/ShadowEditor.js b/third_party/WebKit/Source/devtools/front_end/ui/ShadowEditor.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d95a9a8eb007e58cfe40c5f947e94758ef6d3897 |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/devtools/front_end/ui/ShadowEditor.js |
| @@ -0,0 +1,199 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +/** |
| + * @constructor |
| + */ |
| +WebInspector.ShadowEditor = function() {} |
| + |
| +/** |
| + * @constructor |
| + */ |
| +WebInspector.ShadowEditor.Shadow = function(type) |
|
lushnikov
2016/08/16 22:53:20
Let's make this a real css shadow model:
WebInspe
flandy
2016/08/18 22:00:41
Done. I've opted to use more options for the forma
|
| +{ |
| + this.type = type; |
| + this.order = []; |
| +} |
| + |
| +/** |
| + * @enum {string} |
| + */ |
| +WebInspector.ShadowEditor.Shadow.Parts = { |
| + Inset: "inset", |
| + Length: "length", |
| + Color: "color" |
| +}; |
| + |
| +/** |
| + * @param {string} text |
| + * @param {string} type |
| + * @return {?Array<!WebInspector.ShadowEditor.Shadow>} |
| + */ |
| +WebInspector.ShadowEditor.Shadow.parse = function(text, type) |
|
lushnikov
2016/08/16 22:53:20
WI.CSSShadowModel.parseBoxShadow = function(text)
flandy
2016/08/18 22:00:41
Done.
|
| +{ |
| + var shadowTexts = []; |
| + // Split by commas that aren't inside of color values to get the individual shadow values. |
| + var splits = WebInspector.TextUtils.splitStringByRegexes(text, [WebInspector.Color.Regex, /,/g]); |
| + var currentIndex = 0; |
| + for (var i = 0; i < splits.length; i++) { |
| + if (splits[i].regexIndex === 1) { |
| + var comma = splits[i]; |
| + shadowTexts.push(text.substring(currentIndex, comma.position)); |
| + currentIndex = comma.position + 1; |
| + } |
| + } |
| + shadowTexts.push(text.substring(currentIndex, text.length)); |
| + |
| + var shadows = []; |
| + for (var i = 0; i < shadowTexts.length; i++) { |
| + var shadow = new WebInspector.ShadowEditor.Shadow(type); |
| + var regexes = [/inset/g, WebInspector.Color.Regex, WebInspector.ShadowEditor.Length.Regex]; |
| + var results = WebInspector.TextUtils.splitStringByRegexes(shadowTexts[i], regexes); |
| + for (var j = 0; j < results.length; j++) { |
| + var result = results[j]; |
| + if (result.regexIndex === 0) { |
| + shadow.setInset(result.value); |
| + } else if (result.regexIndex === 1) { |
| + var color = WebInspector.Color.parse(result.value); |
| + if (!color) |
| + return null; |
| + shadow.setColor(color); |
| + } else if (result.regexIndex === 2) { |
| + var length = WebInspector.ShadowEditor.Length.parse(result.value); |
| + if (!length) |
| + return null; |
| + shadow.addLength(length); |
| + } |
| + } |
| + shadows.push(shadow); |
| + } |
| + return shadows; |
| +} |
| + |
| +WebInspector.ShadowEditor.Shadow.prototype = { |
| + /** |
| + * @param {string} inset |
| + */ |
| + setInset: function(inset) |
| + { |
| + if (!this.inset) |
| + this.order.push(WebInspector.ShadowEditor.Shadow.Parts.Inset); |
| + this.inset = inset; |
| + }, |
| + |
| + /** |
| + * @param {!WebInspector.Color} color |
| + */ |
| + setColor: function(color) |
| + { |
| + if (!this.color) |
| + this.order.push(WebInspector.ShadowEditor.Shadow.Parts.Color); |
| + this.color = color; |
| + }, |
| + |
| + /** |
| + * @param {!WebInspector.ShadowEditor.Length} length |
| + */ |
| + addLength: function(length) |
|
lushnikov
2016/08/16 22:53:20
this method should not belong to model; it's a par
flandy
2016/08/18 22:00:41
Done.
|
| + { |
| + if (!this.xOffset) { |
| + this.order.push(WebInspector.ShadowEditor.Shadow.Parts.Length); |
| + this.xOffset = length; |
| + } else if (!this.yOffset) { |
| + this.yOffset = length; |
| + } else if (!this.blur) { |
| + this.blur = length; |
| + } else if (!this.spread) { |
| + this.spread = length; |
| + } |
| + }, |
| + |
| + /** |
| + * @return {!Array<!WebInspector.ShadowEditor.Length>} |
| + */ |
| + lengths: function() |
| + { |
| + var lengthValues = []; |
| + if (this.xOffset) |
| + lengthValues.push(this.xOffset); |
| + if (this.yOffset) |
| + lengthValues.push(this.yOffset); |
| + if (this.blur) |
| + lengthValues.push(this.blur); |
| + if (this.spread) |
| + lengthValues.push(this.spread); |
| + return lengthValues; |
| + }, |
| + |
| + /** |
| + * @return {!Array<{type: string, text: string}>} |
| + */ |
| + textParts: function() |
| + { |
| + var parts = []; |
| + for (var i = 0; i < this.order.length; i++) { |
| + var currentPart = this.order[i]; |
| + var textValue; |
| + if (currentPart === WebInspector.ShadowEditor.Shadow.Parts.Inset) |
| + textValue = this.inset; |
| + else if (currentPart === WebInspector.ShadowEditor.Shadow.Parts.Length) |
| + textValue = this.lengths().join(" "); |
| + else if (currentPart === WebInspector.ShadowEditor.Shadow.Parts.Color) |
| + textValue = this.color.asString(this.color.format()); |
| + parts.push({ |
| + type: currentPart, |
| + text: textValue |
| + }); |
| + } |
| + return parts; |
| + } |
| +} |
| + |
| + |
| +/** |
| + * @constructor |
| + * @param {number} amount |
| + * @param {string} unit |
| + */ |
| +WebInspector.ShadowEditor.Length = function(amount, unit) |
|
lushnikov
2016/08/16 22:53:20
WI.CSSLength = function(...)
flandy
2016/08/18 22:00:41
Done.
|
| +{ |
| + this.amount = amount; |
| + this.unit = unit; |
| +} |
| + |
| +/** @type {!RegExp} */ |
| +WebInspector.ShadowEditor.Length.Regex = /([0-9]+)([a-zA-Z]{2,4})|0/g; |
|
lushnikov
2016/08/16 22:53:20
could it be negative/fractional?
flandy
2016/08/18 22:00:41
Yes, and also scientific notation. Fixed.
|
| + |
| +/** @type {!Set<string>} */ |
| +WebInspector.ShadowEditor.Length._units = new Set([ |
|
lushnikov
2016/08/16 22:53:20
WI.CSSLengthUnit = {
Ch: "ch",
Ex: "ex",
flandy
2016/08/18 22:00:41
Done.
|
| + "ch", "cm", "em", "ex", "in", "mm", "pc", "pt", "px", "rem", "vh", "vmax", "vmin", "vw" |
| +]); |
| + |
| +/** |
| + * @param {string} text |
| + * @return {?WebInspector.ShadowEditor.Length} |
| + */ |
| +WebInspector.ShadowEditor.Length.parse = function(text) |
| +{ |
| + var lengthRegex = new RegExp("^(" + WebInspector.ShadowEditor.Length.Regex.source + ")$"); |
| + var match = text.match(lengthRegex) || []; |
| + if (match.length > 3 && match[3]) { |
| + if (WebInspector.ShadowEditor.Length._units.has(match[3].toLowerCase())) |
| + return new WebInspector.ShadowEditor.Length(parseFloat(match[2]), match[3]); |
| + } else if (match.length > 1) { |
| + return new WebInspector.ShadowEditor.Length(0, ""); |
| + } |
| + return null; |
| +} |
| + |
| +WebInspector.ShadowEditor.Length.prototype = { |
| + /** |
| + * @override |
| + * @return {string} |
| + */ |
| + toString: function() |
|
lushnikov
2016/08/16 22:53:20
let's do toCSSText()
flandy
2016/08/18 22:00:41
Renamed to asCSSText() to keep consistent with WI.
|
| + { |
| + return this.amount + this.unit; |
| + } |
| +} |