Chromium Code Reviews| 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 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 WebInspector = {}; | 36 WebInspector = {}; |
| 37 importScripts("CodeMirrorUtils.js"); | 37 importScripts("CodeMirrorUtils.js"); |
| 38 | 38 |
| 39 onmessage = function(event) { | 39 onmessage = function(event) { |
| 40 if (!event.data.method) | 40 if (!event.data.method) |
| 41 return; | 41 return; |
| 42 | 42 |
| 43 self[event.data.method](event.data.params); | 43 self[event.data.method](event.data.params); |
| 44 }; | 44 }; |
| 45 | 45 |
| 46 /** | |
| 47 * @param {Object} params | |
| 48 */ | |
| 46 function format(params) | 49 function format(params) |
| 47 { | 50 { |
| 48 // Default to a 4-space indent. | 51 // Default to a 4-space indent. |
| 49 var indentString = params.indentString || " "; | 52 var indentString = params.indentString || " "; |
| 50 var result = {}; | 53 var result = {}; |
| 51 | 54 |
| 52 if (params.mimeType === "text/html") { | 55 if (params.mimeType === "text/html") { |
| 53 var formatter = new HTMLScriptFormatter(indentString); | 56 var formatter = new HTMLScriptFormatter(indentString); |
| 54 result = formatter.format(params.content); | 57 result = formatter.format(params.content); |
| 58 } else if (params.mimeType === "text/css") { | |
| 59 result.mapping = { original: [0], formatted: [0] }; | |
| 60 result.content = formatCSS(params.content, result.mapping, 0, 0, indentS tring); | |
| 55 } else { | 61 } else { |
| 56 result.mapping = { original: [0], formatted: [0] }; | 62 result.mapping = { original: [0], formatted: [0] }; |
| 57 result.content = formatScript(params.content, result.mapping, 0, 0, inde ntString); | 63 result.content = formatScript(params.content, result.mapping, 0, 0, inde ntString); |
| 58 } | 64 } |
| 59 postMessage(result); | 65 postMessage(result); |
| 60 } | 66 } |
| 61 | 67 |
| 68 /** | |
| 69 * @param {number} totalLength | |
| 70 * @param {number} chunkSize | |
| 71 */ | |
| 62 function getChunkCount(totalLength, chunkSize) | 72 function getChunkCount(totalLength, chunkSize) |
| 63 { | 73 { |
| 64 if (totalLength <= chunkSize) | 74 if (totalLength <= chunkSize) |
| 65 return 1; | 75 return 1; |
| 66 | 76 |
| 67 var remainder = totalLength % chunkSize; | 77 var remainder = totalLength % chunkSize; |
| 68 var partialLength = totalLength - remainder; | 78 var partialLength = totalLength - remainder; |
| 69 return (partialLength / chunkSize) + (remainder ? 1 : 0); | 79 return (partialLength / chunkSize) + (remainder ? 1 : 0); |
| 70 } | 80 } |
| 71 | 81 |
| 82 /** | |
| 83 * @param {Object} params | |
| 84 */ | |
| 72 function outline(params) | 85 function outline(params) |
| 73 { | 86 { |
| 74 const chunkSize = 100000; // characters per data chunk | 87 const chunkSize = 100000; // characters per data chunk |
| 75 const totalLength = params.content.length; | 88 const totalLength = params.content.length; |
| 76 const lines = params.content.split("\n"); | 89 const lines = params.content.split("\n"); |
| 77 const chunkCount = getChunkCount(totalLength, chunkSize); | 90 const chunkCount = getChunkCount(totalLength, chunkSize); |
| 78 var outlineChunk = []; | 91 var outlineChunk = []; |
| 79 var previousIdentifier = null; | 92 var previousIdentifier = null; |
| 80 var previousToken = null; | 93 var previousToken = null; |
| 81 var previousTokenType = null; | 94 var previousTokenType = null; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 postMessage({ chunk: outlineChunk, total: chunkCount, index: cur rentChunk++ }); | 148 postMessage({ chunk: outlineChunk, total: chunkCount, index: cur rentChunk++ }); |
| 136 outlineChunk = []; | 149 outlineChunk = []; |
| 137 processedChunkCharacters = 0; | 150 processedChunkCharacters = 0; |
| 138 } | 151 } |
| 139 } | 152 } |
| 140 tokenizer(line, processToken); | 153 tokenizer(line, processToken); |
| 141 } | 154 } |
| 142 postMessage({ chunk: outlineChunk, total: chunkCount, index: chunkCount }); | 155 postMessage({ chunk: outlineChunk, total: chunkCount, index: chunkCount }); |
| 143 } | 156 } |
| 144 | 157 |
| 158 /** | |
| 159 * @param {string} content | |
| 160 * @param {{original: Array.<number>, formatted: Array.<number>}} mapping | |
| 161 * @param {number} offset | |
| 162 * @param {number} formattedOffset | |
| 163 * @param {string} indentString | |
| 164 * @return {string} | |
| 165 */ | |
| 145 function formatScript(content, mapping, offset, formattedOffset, indentString) | 166 function formatScript(content, mapping, offset, formattedOffset, indentString) |
| 146 { | 167 { |
| 147 var formattedContent; | 168 var formattedContent; |
| 148 try { | 169 try { |
| 149 var tokenizer = new Tokenizer(content); | 170 var tokenizer = new Tokenizer(content); |
| 150 var builder = new FormattedContentBuilder(tokenizer.content(), mapping, offset, formattedOffset, indentString); | 171 var builder = new JavaScriptFormattedContentBuilder(tokenizer.content(), mapping, offset, formattedOffset, indentString); |
| 151 var formatter = new JavaScriptFormatter(tokenizer, builder); | 172 var formatter = new JavaScriptFormatter(tokenizer, builder); |
| 152 formatter.format(); | 173 formatter.format(); |
| 153 formattedContent = builder.content(); | 174 formattedContent = builder.content(); |
| 154 } catch (e) { | 175 } catch (e) { |
| 155 formattedContent = content; | 176 formattedContent = content; |
| 156 } | 177 } |
| 157 return formattedContent; | 178 return formattedContent; |
| 158 } | 179 } |
| 159 | 180 |
| 181 /** | |
| 182 * @param {string} content | |
| 183 * @param {{original: Array.<number>, formatted: Array.<number>}} mapping | |
| 184 * @param {number} offset | |
| 185 * @param {number} formattedOffset | |
| 186 * @param {string} indentString | |
| 187 * @return {string} | |
| 188 */ | |
| 189 function formatCSS(content, mapping, offset, formattedOffset, indentString) | |
|
pfeldman
2013/09/30 15:46:06
Should not be global
| |
| 190 { | |
| 191 var formattedContent; | |
| 192 try { | |
| 193 var builder = new CSSFormattedContentBuilder(content, mapping, offset, f ormattedOffset, indentString); | |
| 194 var formatter = new CSSFormatter(content, builder); | |
| 195 formatter.format(); | |
| 196 formattedContent = builder.content(); | |
| 197 } catch (e) { | |
| 198 formattedContent = content; | |
| 199 } | |
| 200 return formattedContent; | |
| 201 } | |
| 202 | |
| 160 Array.prototype.keySet = function() | 203 Array.prototype.keySet = function() |
| 161 { | 204 { |
| 162 var keys = {}; | 205 var keys = {}; |
| 163 for (var i = 0; i < this.length; ++i) | 206 for (var i = 0; i < this.length; ++i) |
| 164 keys[this[i]] = true; | 207 keys[this[i]] = true; |
| 165 return keys; | 208 return keys; |
| 166 }; | 209 }; |
| 167 | 210 |
| 211 /** | |
| 212 * @param {string} indentString | |
| 213 */ | |
| 168 HTMLScriptFormatter = function(indentString) | 214 HTMLScriptFormatter = function(indentString) |
|
vsevik
2013/09/30 16:12:13
HTMLFormatter?
| |
| 169 { | 215 { |
| 170 this._indentString = indentString; | 216 this._indentString = indentString; |
| 171 } | 217 } |
| 172 | 218 |
| 173 HTMLScriptFormatter.prototype = { | 219 HTMLScriptFormatter.prototype = { |
| 220 /** | |
| 221 * @param {string} content | |
| 222 */ | |
| 174 format: function(content) | 223 format: function(content) |
| 175 { | 224 { |
| 176 this.line = content; | 225 this.line = content; |
| 177 this._content = content; | 226 this._content = content; |
| 178 this._formattedContent = ""; | 227 this._formattedContent = ""; |
| 179 this._mapping = { original: [0], formatted: [0] }; | 228 this._mapping = { original: [0], formatted: [0] }; |
| 180 this._position = 0; | 229 this._position = 0; |
| 181 | 230 |
| 182 var scriptOpened = false; | 231 var scriptOpened = false; |
| 232 var styleOpened = false; | |
| 183 var tokenizer = WebInspector.CodeMirrorUtils.createTokenizer("text/html" ); | 233 var tokenizer = WebInspector.CodeMirrorUtils.createTokenizer("text/html" ); |
| 184 function processToken(tokenValue, tokenType, tokenStart, tokenEnd) { | 234 function processToken(tokenValue, tokenType, tokenStart, tokenEnd) { |
| 185 if (tokenValue.toLowerCase() === "<script" && tokenType === "xml-tag ") { | 235 if (tokenType !== "xml-tag") |
| 236 return; | |
| 237 if (tokenValue.toLowerCase() === "<script") { | |
| 186 scriptOpened = true; | 238 scriptOpened = true; |
| 187 } else if (scriptOpened && tokenValue === ">" && tokenType === "xml- tag") { | 239 } else if (scriptOpened && tokenValue === ">") { |
| 188 scriptOpened = false; | 240 scriptOpened = false; |
| 189 this._scriptStarted(tokenEnd); | 241 this._scriptStarted(tokenEnd); |
| 190 } else if (tokenValue.toLowerCase() === "</script" && tokenType === "xml-tag") { | 242 } else if (tokenValue.toLowerCase() === "</script") { |
| 191 this._scriptEnded(tokenStart); | 243 this._scriptEnded(tokenStart); |
| 244 } else if (tokenValue.toLowerCase() === "<style") { | |
| 245 styleOpened = true; | |
| 246 } else if (styleOpened && tokenValue === ">") { | |
| 247 styleOpened = false; | |
| 248 this._styleStarted(tokenEnd); | |
| 249 } else if (tokenValue.toLowerCase() === "</style") { | |
| 250 this._styleEnded(tokenStart); | |
| 192 } | 251 } |
| 193 } | 252 } |
| 194 tokenizer(content, processToken.bind(this)); | 253 tokenizer(content, processToken.bind(this)); |
| 195 | 254 |
| 196 this._formattedContent += this._content.substring(this._position); | 255 this._formattedContent += this._content.substring(this._position); |
| 197 return { content: this._formattedContent, mapping: this._mapping }; | 256 return { content: this._formattedContent, mapping: this._mapping }; |
| 198 }, | 257 }, |
| 199 | 258 |
| 259 /** | |
| 260 * @param {number} cursor | |
| 261 */ | |
| 200 _scriptStarted: function(cursor) | 262 _scriptStarted: function(cursor) |
| 201 { | 263 { |
| 264 this._handleSubFormatterStart(cursor); | |
| 265 }, | |
| 266 | |
| 267 /** | |
| 268 * @param {number} cursor | |
| 269 */ | |
| 270 _scriptEnded: function(cursor) | |
| 271 { | |
| 272 this._handleSubFormatterEnd(formatScript, cursor); | |
| 273 }, | |
| 274 | |
| 275 /** | |
| 276 * @param {number} cursor | |
| 277 */ | |
| 278 _styleStarted: function(cursor) | |
| 279 { | |
| 280 this._handleSubFormatterStart(cursor); | |
| 281 }, | |
| 282 | |
| 283 /** | |
| 284 * @param {number} cursor | |
| 285 */ | |
| 286 _styleEnded: function(cursor) | |
| 287 { | |
| 288 this._handleSubFormatterEnd(formatCSS, cursor); | |
| 289 }, | |
| 290 | |
| 291 /** | |
| 292 * @param {number} cursor | |
| 293 */ | |
| 294 _handleSubFormatterStart: function(cursor) | |
| 295 { | |
| 202 this._formattedContent += this._content.substring(this._position, cursor ); | 296 this._formattedContent += this._content.substring(this._position, cursor ); |
| 203 this._formattedContent += "\n"; | 297 this._formattedContent += "\n"; |
| 204 this._position = cursor; | 298 this._position = cursor; |
| 205 }, | 299 }, |
| 206 | 300 |
| 207 _scriptEnded: function(cursor) | 301 /** |
| 302 * @param {function(string, Array.<number>, number, number, string)} formatF unction | |
| 303 * @param {number} cursor | |
| 304 */ | |
| 305 _handleSubFormatterEnd: function(formatFunction, cursor) | |
| 208 { | 306 { |
| 209 if (cursor === this._position) | 307 if (cursor === this._position) |
| 210 return; | 308 return; |
| 211 | 309 |
| 212 var scriptContent = this._content.substring(this._position, cursor); | 310 var scriptContent = this._content.substring(this._position, cursor); |
| 213 this._mapping.original.push(this._position); | 311 this._mapping.original.push(this._position); |
| 214 this._mapping.formatted.push(this._formattedContent.length); | 312 this._mapping.formatted.push(this._formattedContent.length); |
| 215 var formattedScriptContent = formatScript(scriptContent, this._mapping, this._position, this._formattedContent.length, this._indentString); | 313 var formattedScriptContent = formatFunction(scriptContent, this._mapping , this._position, this._formattedContent.length, this._indentString); |
| 216 | 314 |
| 217 this._formattedContent += formattedScriptContent; | 315 this._formattedContent += formattedScriptContent; |
| 218 this._position = cursor; | 316 this._position = cursor; |
| 219 }, | 317 } |
| 220 } | 318 } |
| 221 | 319 |
| 222 function require() | 320 function require() |
| 223 { | 321 { |
| 224 return parse; | 322 return parse; |
| 225 } | 323 } |
| 226 | 324 |
| 227 var exports = {}; | 325 var exports = {}; |
| 228 importScripts("UglifyJS/parse-js.js"); | 326 importScripts("UglifyJS/parse-js.js"); |
| 229 var parse = exports; | 327 var parse = exports; |
| 230 | 328 |
| 231 importScripts("JavaScriptFormatter.js"); | 329 importScripts("JavaScriptFormatter.js"); |
| 330 importScripts("CSSFormatter.js"); | |
| OLD | NEW |