OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 * @constructor | 31 * @unrestricted |
33 * @param {string} mimeType | |
34 * @param {boolean} stripExtraWhitespace | |
35 */ | 32 */ |
36 WebInspector.DOMSyntaxHighlighter = function(mimeType, stripExtraWhitespace) | 33 WebInspector.DOMSyntaxHighlighter = class { |
37 { | 34 /** |
| 35 * @param {string} mimeType |
| 36 * @param {boolean} stripExtraWhitespace |
| 37 */ |
| 38 constructor(mimeType, stripExtraWhitespace) { |
38 this._mimeType = mimeType; | 39 this._mimeType = mimeType; |
39 this._stripExtraWhitespace = stripExtraWhitespace; | 40 this._stripExtraWhitespace = stripExtraWhitespace; |
40 }; | 41 } |
41 | 42 |
42 WebInspector.DOMSyntaxHighlighter.prototype = { | 43 /** |
43 /** | 44 * @param {string} content |
44 * @param {string} content | 45 * @param {string} className |
45 * @param {string} className | 46 * @return {!Element} |
46 * @return {!Element} | 47 */ |
47 */ | 48 createSpan(content, className) { |
48 createSpan: function(content, className) | 49 var span = createElement('span'); |
49 { | 50 span.className = 'cm-' + className; |
50 var span = createElement("span"); | 51 if (this._stripExtraWhitespace && className !== 'whitespace') |
51 span.className = "cm-" + className; | 52 content = content.replace(/^[\n\r]*/, '').replace(/\s*$/, ''); |
52 if (this._stripExtraWhitespace && className !== "whitespace") | 53 span.createTextChild(content); |
53 content = content.replace(/^[\n\r]*/, "").replace(/\s*$/, ""); | 54 return span; |
54 span.createTextChild(content); | 55 } |
55 return span; | 56 |
56 }, | 57 /** |
| 58 * @param {!Element} node |
| 59 * @return {!Promise.<undefined>} |
| 60 */ |
| 61 syntaxHighlightNode(node) { |
| 62 var lines = node.textContent.split('\n'); |
| 63 var plainTextStart; |
| 64 var line; |
| 65 |
| 66 return self.runtime.extension(WebInspector.TokenizerFactory).instance().then
(processTokens.bind(this)); |
57 | 67 |
58 /** | 68 /** |
59 * @param {!Element} node | 69 * @param {!WebInspector.TokenizerFactory} tokenizerFactory |
60 * @return {!Promise.<undefined>} | 70 * @this {WebInspector.DOMSyntaxHighlighter} |
61 */ | 71 */ |
62 syntaxHighlightNode: function(node) | 72 function processTokens(tokenizerFactory) { |
63 { | 73 node.removeChildren(); |
64 var lines = node.textContent.split("\n"); | 74 var tokenize = tokenizerFactory.createTokenizer(this._mimeType); |
65 var plainTextStart; | 75 for (var i = 0; i < lines.length; ++i) { |
66 var line; | 76 line = lines[i]; |
| 77 plainTextStart = 0; |
| 78 tokenize(line, processToken.bind(this)); |
| 79 if (plainTextStart < line.length) { |
| 80 var plainText = line.substring(plainTextStart, line.length); |
| 81 node.createTextChild(plainText); |
| 82 } |
| 83 if (i < lines.length - 1) |
| 84 node.createTextChild('\n'); |
| 85 } |
| 86 } |
67 | 87 |
68 return self.runtime.extension(WebInspector.TokenizerFactory).instance().
then(processTokens.bind(this)); | 88 /** |
| 89 * @param {string} token |
| 90 * @param {?string} tokenType |
| 91 * @param {number} column |
| 92 * @param {number} newColumn |
| 93 * @this {WebInspector.DOMSyntaxHighlighter} |
| 94 */ |
| 95 function processToken(token, tokenType, column, newColumn) { |
| 96 if (!tokenType) |
| 97 return; |
69 | 98 |
70 /** | 99 if (column > plainTextStart) { |
71 * @param {!WebInspector.TokenizerFactory} tokenizerFactory | 100 var plainText = line.substring(plainTextStart, column); |
72 * @this {WebInspector.DOMSyntaxHighlighter} | 101 node.createTextChild(plainText); |
73 */ | 102 } |
74 function processTokens(tokenizerFactory) | 103 node.appendChild(this.createSpan(token, tokenType)); |
75 { | 104 plainTextStart = newColumn; |
76 node.removeChildren(); | |
77 var tokenize = tokenizerFactory.createTokenizer(this._mimeType); | |
78 for (var i = 0; i < lines.length; ++i) { | |
79 line = lines[i]; | |
80 plainTextStart = 0; | |
81 tokenize(line, processToken.bind(this)); | |
82 if (plainTextStart < line.length) { | |
83 var plainText = line.substring(plainTextStart, line.length); | |
84 node.createTextChild(plainText); | |
85 } | |
86 if (i < lines.length - 1) | |
87 node.createTextChild("\n"); | |
88 } | |
89 } | |
90 | |
91 /** | |
92 * @param {string} token | |
93 * @param {?string} tokenType | |
94 * @param {number} column | |
95 * @param {number} newColumn | |
96 * @this {WebInspector.DOMSyntaxHighlighter} | |
97 */ | |
98 function processToken(token, tokenType, column, newColumn) | |
99 { | |
100 if (!tokenType) | |
101 return; | |
102 | |
103 if (column > plainTextStart) { | |
104 var plainText = line.substring(plainTextStart, column); | |
105 node.createTextChild(plainText); | |
106 } | |
107 node.appendChild(this.createSpan(token, tokenType)); | |
108 plainTextStart = newColumn; | |
109 } | |
110 } | 105 } |
| 106 } |
111 }; | 107 }; |
OLD | NEW |