| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| 11 * copyright notice, this list of conditions and the following disclaimer | 11 * copyright notice, this list of conditions and the following disclaimer |
| 12 * in the documentation and/or other materials provided with the | 12 * in the documentation and/or other materials provided with the |
| 13 * distribution. | 13 * distribution. |
| 14 * * Neither the name of Google Inc. nor the names of its | 14 * * Neither the name of Google Inc. nor the names of its |
| 15 * contributors may be used to endorse or promote products derived from | 15 * contributors may be used to endorse or promote products derived from |
| 16 * this software without specific prior written permission. | 16 * this software without specific prior written permission. |
| 17 * | 17 * |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | |
| 31 /** | 30 /** |
| 32 * @interface | 31 * @interface |
| 33 */ | 32 */ |
| 34 WebInspector.Formatter = function() | 33 WebInspector.Formatter = function() {}; |
| 35 { | |
| 36 }; | |
| 37 | 34 |
| 38 /** | 35 /** |
| 39 * @param {!WebInspector.ResourceType} contentType | 36 * @param {!WebInspector.ResourceType} contentType |
| 40 * @param {string} mimeType | 37 * @param {string} mimeType |
| 41 * @param {string} content | 38 * @param {string} content |
| 42 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback | 39 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback |
| 43 */ | 40 */ |
| 44 WebInspector.Formatter.format = function(contentType, mimeType, content, callbac
k) | 41 WebInspector.Formatter.format = function(contentType, mimeType, content, callbac
k) { |
| 45 { | 42 if (contentType.isDocumentOrScriptOrStyleSheet()) |
| 46 if (contentType.isDocumentOrScriptOrStyleSheet()) | 43 new WebInspector.ScriptFormatter(mimeType, content, callback); |
| 47 new WebInspector.ScriptFormatter(mimeType, content, callback); | 44 else |
| 48 else | 45 new WebInspector.IdentityFormatter(mimeType, content, callback); |
| 49 new WebInspector.IdentityFormatter(mimeType, content, callback); | |
| 50 }; | 46 }; |
| 51 | 47 |
| 52 /** | 48 /** |
| 53 * @param {!Array.<number>} lineEndings | 49 * @param {!Array.<number>} lineEndings |
| 54 * @param {number} lineNumber | 50 * @param {number} lineNumber |
| 55 * @param {number} columnNumber | 51 * @param {number} columnNumber |
| 56 * @return {number} | 52 * @return {number} |
| 57 */ | 53 */ |
| 58 WebInspector.Formatter.locationToPosition = function(lineEndings, lineNumber, co
lumnNumber) | 54 WebInspector.Formatter.locationToPosition = function(lineEndings, lineNumber, co
lumnNumber) { |
| 59 { | 55 var position = lineNumber ? lineEndings[lineNumber - 1] + 1 : 0; |
| 60 var position = lineNumber ? lineEndings[lineNumber - 1] + 1 : 0; | 56 return position + columnNumber; |
| 61 return position + columnNumber; | |
| 62 }; | 57 }; |
| 63 | 58 |
| 64 /** | 59 /** |
| 65 * @param {!Array.<number>} lineEndings | 60 * @param {!Array.<number>} lineEndings |
| 66 * @param {number} position | 61 * @param {number} position |
| 67 * @return {!Array.<number>} | 62 * @return {!Array.<number>} |
| 68 */ | 63 */ |
| 69 WebInspector.Formatter.positionToLocation = function(lineEndings, position) | 64 WebInspector.Formatter.positionToLocation = function(lineEndings, position) { |
| 70 { | 65 var lineNumber = lineEndings.upperBound(position - 1); |
| 71 var lineNumber = lineEndings.upperBound(position - 1); | 66 if (!lineNumber) |
| 72 if (!lineNumber) | 67 var columnNumber = position; |
| 73 var columnNumber = position; | 68 else |
| 74 else | 69 var columnNumber = position - lineEndings[lineNumber - 1] - 1; |
| 75 var columnNumber = position - lineEndings[lineNumber - 1] - 1; | 70 return [lineNumber, columnNumber]; |
| 76 return [lineNumber, columnNumber]; | |
| 77 }; | 71 }; |
| 78 | 72 |
| 79 /** | 73 /** |
| 80 * @constructor | |
| 81 * @implements {WebInspector.Formatter} | 74 * @implements {WebInspector.Formatter} |
| 82 * @param {string} mimeType | 75 * @unrestricted |
| 83 * @param {string} content | |
| 84 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback | |
| 85 */ | 76 */ |
| 86 WebInspector.ScriptFormatter = function(mimeType, content, callback) | 77 WebInspector.ScriptFormatter = class { |
| 87 { | 78 /** |
| 88 content = content.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/
, ""); | 79 * @param {string} mimeType |
| 80 * @param {string} content |
| 81 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback |
| 82 */ |
| 83 constructor(mimeType, content, callback) { |
| 84 content = content.replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/
, ''); |
| 89 this._callback = callback; | 85 this._callback = callback; |
| 90 this._originalContent = content; | 86 this._originalContent = content; |
| 91 | 87 |
| 92 var parameters = { | 88 var parameters = { |
| 93 mimeType: mimeType, | 89 mimeType: mimeType, |
| 94 content: content, | 90 content: content, |
| 95 indentString: WebInspector.moduleSetting("textEditorIndent").get() | 91 indentString: WebInspector.moduleSetting('textEditorIndent').get() |
| 96 }; | 92 }; |
| 97 WebInspector.formatterWorkerPool.runTask("format", parameters) | 93 WebInspector.formatterWorkerPool.runTask('format', parameters).then(this._di
dFormatContent.bind(this)); |
| 98 .then(this._didFormatContent.bind(this)); | 94 } |
| 99 }; | |
| 100 | 95 |
| 101 WebInspector.ScriptFormatter.prototype = { | 96 /** |
| 102 /** | 97 * @param {?MessageEvent} event |
| 103 * @param {?MessageEvent} event | 98 */ |
| 104 */ | 99 _didFormatContent(event) { |
| 105 _didFormatContent: function(event) | 100 var formattedContent = ''; |
| 106 { | 101 var mapping = []; |
| 107 var formattedContent = ""; | 102 if (event) { |
| 108 var mapping = []; | 103 formattedContent = event.data.content; |
| 109 if (event) { | 104 mapping = event.data['mapping']; |
| 110 formattedContent = event.data.content; | |
| 111 mapping = event.data["mapping"]; | |
| 112 } | |
| 113 var sourceMapping = new WebInspector.FormatterSourceMappingImpl(this._or
iginalContent.computeLineEndings(), formattedContent.computeLineEndings(), mappi
ng); | |
| 114 this._callback(formattedContent, sourceMapping); | |
| 115 } | 105 } |
| 106 var sourceMapping = new WebInspector.FormatterSourceMappingImpl( |
| 107 this._originalContent.computeLineEndings(), formattedContent.computeLine
Endings(), mapping); |
| 108 this._callback(formattedContent, sourceMapping); |
| 109 } |
| 116 }; | 110 }; |
| 117 | 111 |
| 118 /** | 112 /** |
| 119 * @constructor | |
| 120 * @implements {WebInspector.Formatter} | 113 * @implements {WebInspector.Formatter} |
| 121 * @param {string} mimeType | 114 * @unrestricted |
| 122 * @param {string} content | |
| 123 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback | |
| 124 */ | 115 */ |
| 125 WebInspector.IdentityFormatter = function(mimeType, content, callback) | 116 WebInspector.IdentityFormatter = class { |
| 126 { | 117 /** |
| 118 * @param {string} mimeType |
| 119 * @param {string} content |
| 120 * @param {function(string, !WebInspector.FormatterSourceMapping)} callback |
| 121 */ |
| 122 constructor(mimeType, content, callback) { |
| 127 callback(content, new WebInspector.IdentityFormatterSourceMapping()); | 123 callback(content, new WebInspector.IdentityFormatterSourceMapping()); |
| 124 } |
| 128 }; | 125 }; |
| 129 | 126 |
| 130 /** | 127 /** |
| 131 * @typedef {{original: !Array.<number>, formatted: !Array.<number>}} | 128 * @typedef {{original: !Array.<number>, formatted: !Array.<number>}} |
| 132 */ | 129 */ |
| 133 WebInspector.FormatterMappingPayload; | 130 WebInspector.FormatterMappingPayload; |
| 134 | 131 |
| 135 /** | 132 /** |
| 136 * @interface | 133 * @interface |
| 137 */ | 134 */ |
| 138 WebInspector.FormatterSourceMapping = function() | 135 WebInspector.FormatterSourceMapping = function() {}; |
| 139 { | |
| 140 }; | |
| 141 | 136 |
| 142 WebInspector.FormatterSourceMapping.prototype = { | 137 WebInspector.FormatterSourceMapping.prototype = { |
| 143 /** | 138 /** |
| 144 * @param {number} lineNumber | 139 * @param {number} lineNumber |
| 145 * @param {number=} columnNumber | 140 * @param {number=} columnNumber |
| 146 * @return {!Array.<number>} | 141 * @return {!Array.<number>} |
| 147 */ | 142 */ |
| 148 originalToFormatted: function(lineNumber, columnNumber) { }, | 143 originalToFormatted: function(lineNumber, columnNumber) {}, |
| 149 | 144 |
| 150 /** | 145 /** |
| 151 * @param {number} lineNumber | 146 * @param {number} lineNumber |
| 152 * @param {number=} columnNumber | 147 * @param {number=} columnNumber |
| 153 * @return {!Array.<number>} | 148 * @return {!Array.<number>} |
| 154 */ | 149 */ |
| 155 formattedToOriginal: function(lineNumber, columnNumber) { } | 150 formattedToOriginal: function(lineNumber, columnNumber) {} |
| 156 }; | 151 }; |
| 157 | 152 |
| 158 /** | 153 /** |
| 159 * @constructor | |
| 160 * @implements {WebInspector.FormatterSourceMapping} | 154 * @implements {WebInspector.FormatterSourceMapping} |
| 155 * @unrestricted |
| 161 */ | 156 */ |
| 162 WebInspector.IdentityFormatterSourceMapping = function() | 157 WebInspector.IdentityFormatterSourceMapping = class { |
| 163 { | 158 /** |
| 164 }; | 159 * @override |
| 160 * @param {number} lineNumber |
| 161 * @param {number=} columnNumber |
| 162 * @return {!Array.<number>} |
| 163 */ |
| 164 originalToFormatted(lineNumber, columnNumber) { |
| 165 return [lineNumber, columnNumber || 0]; |
| 166 } |
| 165 | 167 |
| 166 WebInspector.IdentityFormatterSourceMapping.prototype = { | 168 /** |
| 167 /** | 169 * @override |
| 168 * @override | 170 * @param {number} lineNumber |
| 169 * @param {number} lineNumber | 171 * @param {number=} columnNumber |
| 170 * @param {number=} columnNumber | 172 * @return {!Array.<number>} |
| 171 * @return {!Array.<number>} | 173 */ |
| 172 */ | 174 formattedToOriginal(lineNumber, columnNumber) { |
| 173 originalToFormatted: function(lineNumber, columnNumber) | 175 return [lineNumber, columnNumber || 0]; |
| 174 { | 176 } |
| 175 return [lineNumber, columnNumber || 0]; | |
| 176 }, | |
| 177 | |
| 178 /** | |
| 179 * @override | |
| 180 * @param {number} lineNumber | |
| 181 * @param {number=} columnNumber | |
| 182 * @return {!Array.<number>} | |
| 183 */ | |
| 184 formattedToOriginal: function(lineNumber, columnNumber) | |
| 185 { | |
| 186 return [lineNumber, columnNumber || 0]; | |
| 187 } | |
| 188 }; | 177 }; |
| 189 | 178 |
| 190 /** | 179 /** |
| 191 * @constructor | |
| 192 * @implements {WebInspector.FormatterSourceMapping} | 180 * @implements {WebInspector.FormatterSourceMapping} |
| 193 * @param {!Array.<number>} originalLineEndings | 181 * @unrestricted |
| 194 * @param {!Array.<number>} formattedLineEndings | |
| 195 * @param {!WebInspector.FormatterMappingPayload} mapping | |
| 196 */ | 182 */ |
| 197 WebInspector.FormatterSourceMappingImpl = function(originalLineEndings, formatte
dLineEndings, mapping) | 183 WebInspector.FormatterSourceMappingImpl = class { |
| 198 { | 184 /** |
| 185 * @param {!Array.<number>} originalLineEndings |
| 186 * @param {!Array.<number>} formattedLineEndings |
| 187 * @param {!WebInspector.FormatterMappingPayload} mapping |
| 188 */ |
| 189 constructor(originalLineEndings, formattedLineEndings, mapping) { |
| 199 this._originalLineEndings = originalLineEndings; | 190 this._originalLineEndings = originalLineEndings; |
| 200 this._formattedLineEndings = formattedLineEndings; | 191 this._formattedLineEndings = formattedLineEndings; |
| 201 this._mapping = mapping; | 192 this._mapping = mapping; |
| 193 } |
| 194 |
| 195 /** |
| 196 * @override |
| 197 * @param {number} lineNumber |
| 198 * @param {number=} columnNumber |
| 199 * @return {!Array.<number>} |
| 200 */ |
| 201 originalToFormatted(lineNumber, columnNumber) { |
| 202 var originalPosition = |
| 203 WebInspector.Formatter.locationToPosition(this._originalLineEndings, lin
eNumber, columnNumber || 0); |
| 204 var formattedPosition = |
| 205 this._convertPosition(this._mapping.original, this._mapping.formatted, o
riginalPosition || 0); |
| 206 return WebInspector.Formatter.positionToLocation(this._formattedLineEndings,
formattedPosition); |
| 207 } |
| 208 |
| 209 /** |
| 210 * @override |
| 211 * @param {number} lineNumber |
| 212 * @param {number=} columnNumber |
| 213 * @return {!Array.<number>} |
| 214 */ |
| 215 formattedToOriginal(lineNumber, columnNumber) { |
| 216 var formattedPosition = |
| 217 WebInspector.Formatter.locationToPosition(this._formattedLineEndings, li
neNumber, columnNumber || 0); |
| 218 var originalPosition = this._convertPosition(this._mapping.formatted, this._
mapping.original, formattedPosition); |
| 219 return WebInspector.Formatter.positionToLocation(this._originalLineEndings,
originalPosition || 0); |
| 220 } |
| 221 |
| 222 /** |
| 223 * @param {!Array.<number>} positions1 |
| 224 * @param {!Array.<number>} positions2 |
| 225 * @param {number} position |
| 226 * @return {number} |
| 227 */ |
| 228 _convertPosition(positions1, positions2, position) { |
| 229 var index = positions1.upperBound(position) - 1; |
| 230 var convertedPosition = positions2[index] + position - positions1[index]; |
| 231 if (index < positions2.length - 1 && convertedPosition > positions2[index +
1]) |
| 232 convertedPosition = positions2[index + 1]; |
| 233 return convertedPosition; |
| 234 } |
| 202 }; | 235 }; |
| 203 | |
| 204 WebInspector.FormatterSourceMappingImpl.prototype = { | |
| 205 /** | |
| 206 * @override | |
| 207 * @param {number} lineNumber | |
| 208 * @param {number=} columnNumber | |
| 209 * @return {!Array.<number>} | |
| 210 */ | |
| 211 originalToFormatted: function(lineNumber, columnNumber) | |
| 212 { | |
| 213 var originalPosition = WebInspector.Formatter.locationToPosition(this._o
riginalLineEndings, lineNumber, columnNumber || 0); | |
| 214 var formattedPosition = this._convertPosition(this._mapping.original, th
is._mapping.formatted, originalPosition || 0); | |
| 215 return WebInspector.Formatter.positionToLocation(this._formattedLineEndi
ngs, formattedPosition); | |
| 216 }, | |
| 217 | |
| 218 /** | |
| 219 * @override | |
| 220 * @param {number} lineNumber | |
| 221 * @param {number=} columnNumber | |
| 222 * @return {!Array.<number>} | |
| 223 */ | |
| 224 formattedToOriginal: function(lineNumber, columnNumber) | |
| 225 { | |
| 226 var formattedPosition = WebInspector.Formatter.locationToPosition(this._
formattedLineEndings, lineNumber, columnNumber || 0); | |
| 227 var originalPosition = this._convertPosition(this._mapping.formatted, th
is._mapping.original, formattedPosition); | |
| 228 return WebInspector.Formatter.positionToLocation(this._originalLineEndin
gs, originalPosition || 0); | |
| 229 }, | |
| 230 | |
| 231 /** | |
| 232 * @param {!Array.<number>} positions1 | |
| 233 * @param {!Array.<number>} positions2 | |
| 234 * @param {number} position | |
| 235 * @return {number} | |
| 236 */ | |
| 237 _convertPosition: function(positions1, positions2, position) | |
| 238 { | |
| 239 var index = positions1.upperBound(position) - 1; | |
| 240 var convertedPosition = positions2[index] + position - positions1[index]
; | |
| 241 if (index < positions2.length - 1 && convertedPosition > positions2[inde
x + 1]) | |
| 242 convertedPosition = positions2[index + 1]; | |
| 243 return convertedPosition; | |
| 244 } | |
| 245 }; | |
| OLD | NEW |