OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 /** |
| 5 * @unrestricted |
| 6 */ |
| 7 WebInspector.Text = class { |
| 8 /** |
| 9 * @param {string} value |
| 10 */ |
| 11 constructor(value) { |
| 12 this._value = value; |
| 13 } |
4 | 14 |
5 /** | 15 /** |
6 * @constructor | 16 * @return {!Array<number>} |
7 * @param {string} value | 17 */ |
8 */ | 18 lineEndings() { |
9 WebInspector.Text = function(value) | 19 if (!this._lineEndings) |
10 { | 20 this._lineEndings = this._value.computeLineEndings(); |
11 this._value = value; | 21 return this._lineEndings; |
12 }; | 22 } |
13 | 23 |
14 WebInspector.Text.prototype = { | 24 /** |
15 /** | 25 * @return {string} |
16 * @return {!Array<number>} | 26 */ |
17 */ | 27 value() { |
18 lineEndings: function() | 28 return this._value; |
19 { | 29 } |
20 if (!this._lineEndings) | |
21 this._lineEndings = this._value.computeLineEndings(); | |
22 return this._lineEndings; | |
23 }, | |
24 | 30 |
25 /** | 31 /** |
26 * @return {string} | 32 * @return {number} |
27 */ | 33 */ |
28 value: function() | 34 lineCount() { |
29 { | 35 var lineEndings = this.lineEndings(); |
30 return this._value; | 36 return lineEndings.length; |
31 }, | 37 } |
32 | 38 |
33 /** | 39 /** |
34 * @return {number} | 40 * @param {number} lineNumber |
35 */ | 41 * @param {number} columNumber |
36 lineCount: function() | 42 * @return {number} |
37 { | 43 */ |
38 var lineEndings = this.lineEndings(); | 44 offsetFromPosition(lineNumber, columNumber) { |
39 return lineEndings.length; | 45 return (lineNumber ? this.lineEndings()[lineNumber - 1] + 1 : 0) + columNumb
er; |
40 }, | 46 } |
41 | 47 |
42 /** | 48 /** |
43 * @param {number} lineNumber | 49 * @return {string} |
44 * @param {number} columNumber | 50 */ |
45 * @return {number} | 51 lineAt(lineNumber) { |
46 */ | 52 var lineEndings = this.lineEndings(); |
47 offsetFromPosition: function(lineNumber, columNumber) | 53 var lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0; |
48 { | 54 var lineEnd = lineEndings[lineNumber]; |
49 return (lineNumber ? this.lineEndings()[lineNumber - 1] + 1 : 0) + colum
Number; | 55 var lineContent = this._value.substring(lineStart, lineEnd); |
50 }, | 56 if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) ===
'\r') |
| 57 lineContent = lineContent.substring(0, lineContent.length - 1); |
| 58 return lineContent; |
| 59 } |
51 | 60 |
52 /** | 61 /** |
53 * @return {string} | 62 * @param {!WebInspector.TextRange} range |
54 */ | 63 * @return {!WebInspector.SourceRange} |
55 lineAt: function(lineNumber) | 64 */ |
56 { | 65 toSourceRange(range) { |
57 var lineEndings = this.lineEndings(); | 66 var start = this.offsetFromPosition(range.startLine, range.startColumn); |
58 var lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0; | 67 var end = this.offsetFromPosition(range.endLine, range.endColumn); |
59 var lineEnd = lineEndings[lineNumber]; | 68 return new WebInspector.SourceRange(start, end - start); |
60 var lineContent = this._value.substring(lineStart, lineEnd); | 69 } |
61 if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1)
=== "\r") | |
62 lineContent = lineContent.substring(0, lineContent.length - 1); | |
63 return lineContent; | |
64 }, | |
65 | 70 |
66 /** | 71 /** |
67 * @param {!WebInspector.TextRange} range | 72 * @param {!WebInspector.SourceRange} sourceRange |
68 * @return {!WebInspector.SourceRange} | 73 * @return {!WebInspector.TextRange} |
69 */ | 74 */ |
70 toSourceRange: function(range) | 75 toTextRange(sourceRange) { |
71 { | 76 var cursor = new WebInspector.TextCursor(this.lineEndings()); |
72 var start = this.offsetFromPosition(range.startLine, range.startColumn); | 77 var result = WebInspector.TextRange.createFromLocation(0, 0); |
73 var end = this.offsetFromPosition(range.endLine, range.endColumn); | |
74 return new WebInspector.SourceRange(start, end - start); | |
75 }, | |
76 | 78 |
77 /** | 79 cursor.resetTo(sourceRange.offset); |
78 * @param {!WebInspector.SourceRange} sourceRange | 80 result.startLine = cursor.lineNumber(); |
79 * @return {!WebInspector.TextRange} | 81 result.startColumn = cursor.columnNumber(); |
80 */ | |
81 toTextRange: function(sourceRange) | |
82 { | |
83 var cursor = new WebInspector.TextCursor(this.lineEndings()); | |
84 var result = WebInspector.TextRange.createFromLocation(0, 0); | |
85 | 82 |
86 cursor.resetTo(sourceRange.offset); | 83 cursor.advance(sourceRange.offset + sourceRange.length); |
87 result.startLine = cursor.lineNumber(); | 84 result.endLine = cursor.lineNumber(); |
88 result.startColumn = cursor.columnNumber(); | 85 result.endColumn = cursor.columnNumber(); |
| 86 return result; |
| 87 } |
89 | 88 |
90 cursor.advance(sourceRange.offset + sourceRange.length); | 89 /** |
91 result.endLine = cursor.lineNumber(); | 90 * @param {!WebInspector.TextRange} range |
92 result.endColumn = cursor.columnNumber(); | 91 * @param {string} replacement |
93 return result; | 92 * @return {string} |
94 }, | 93 */ |
| 94 replaceRange(range, replacement) { |
| 95 var sourceRange = this.toSourceRange(range); |
| 96 return this._value.substring(0, sourceRange.offset) + replacement + |
| 97 this._value.substring(sourceRange.offset + sourceRange.length); |
| 98 } |
95 | 99 |
96 /** | 100 /** |
97 * @param {!WebInspector.TextRange} range | 101 * @param {!WebInspector.TextRange} range |
98 * @param {string} replacement | 102 * @return {string} |
99 * @return {string} | 103 */ |
100 */ | 104 extract(range) { |
101 replaceRange: function(range, replacement) | 105 var sourceRange = this.toSourceRange(range); |
102 { | 106 return this._value.substr(sourceRange.offset, sourceRange.length); |
103 var sourceRange = this.toSourceRange(range); | 107 } |
104 return this._value.substring(0, sourceRange.offset) + replacement + this
._value.substring(sourceRange.offset + sourceRange.length); | |
105 }, | |
106 | |
107 /** | |
108 * @param {!WebInspector.TextRange} range | |
109 * @return {string} | |
110 */ | |
111 extract: function(range) | |
112 { | |
113 var sourceRange = this.toSourceRange(range); | |
114 return this._value.substr(sourceRange.offset, sourceRange.length); | |
115 } | |
116 }; | 108 }; |
117 | 109 |
118 /** | 110 /** |
119 * @constructor | 111 * @unrestricted |
120 * @param {!Array<number>} lineEndings | |
121 */ | 112 */ |
122 WebInspector.TextCursor = function(lineEndings) | 113 WebInspector.TextCursor = class { |
123 { | 114 /** |
| 115 * @param {!Array<number>} lineEndings |
| 116 */ |
| 117 constructor(lineEndings) { |
124 this._lineEndings = lineEndings; | 118 this._lineEndings = lineEndings; |
125 this._offset = 0; | 119 this._offset = 0; |
126 this._lineNumber = 0; | 120 this._lineNumber = 0; |
127 this._columnNumber = 0; | 121 this._columnNumber = 0; |
| 122 } |
| 123 |
| 124 /** |
| 125 * @param {number} offset |
| 126 */ |
| 127 advance(offset) { |
| 128 this._offset = offset; |
| 129 while (this._lineNumber < this._lineEndings.length && this._lineEndings[this
._lineNumber] < this._offset) |
| 130 ++this._lineNumber; |
| 131 this._columnNumber = this._lineNumber ? this._offset - this._lineEndings[thi
s._lineNumber - 1] - 1 : this._offset; |
| 132 } |
| 133 |
| 134 /** |
| 135 * @return {number} |
| 136 */ |
| 137 offset() { |
| 138 return this._offset; |
| 139 } |
| 140 |
| 141 /** |
| 142 * @param {number} offset |
| 143 */ |
| 144 resetTo(offset) { |
| 145 this._offset = offset; |
| 146 this._lineNumber = this._lineEndings.lowerBound(offset); |
| 147 this._columnNumber = this._lineNumber ? this._offset - this._lineEndings[thi
s._lineNumber - 1] - 1 : this._offset; |
| 148 } |
| 149 |
| 150 /** |
| 151 * @return {number} |
| 152 */ |
| 153 lineNumber() { |
| 154 return this._lineNumber; |
| 155 } |
| 156 |
| 157 /** |
| 158 * @return {number} |
| 159 */ |
| 160 columnNumber() { |
| 161 return this._columnNumber; |
| 162 } |
128 }; | 163 }; |
129 | |
130 WebInspector.TextCursor.prototype = { | |
131 /** | |
132 * @param {number} offset | |
133 */ | |
134 advance: function(offset) | |
135 { | |
136 this._offset = offset; | |
137 while (this._lineNumber < this._lineEndings.length && this._lineEndings[
this._lineNumber] < this._offset) | |
138 ++this._lineNumber; | |
139 this._columnNumber = this._lineNumber ? this._offset - this._lineEndings
[this._lineNumber - 1] - 1 : this._offset; | |
140 }, | |
141 | |
142 /** | |
143 * @return {number} | |
144 */ | |
145 offset: function() | |
146 { | |
147 return this._offset; | |
148 }, | |
149 | |
150 /** | |
151 * @param {number} offset | |
152 */ | |
153 resetTo: function(offset) | |
154 { | |
155 this._offset = offset; | |
156 this._lineNumber = this._lineEndings.lowerBound(offset); | |
157 this._columnNumber = this._lineNumber ? this._offset - this._lineEndings
[this._lineNumber - 1] - 1 : this._offset; | |
158 }, | |
159 | |
160 /** | |
161 * @return {number} | |
162 */ | |
163 lineNumber: function() | |
164 { | |
165 return this._lineNumber; | |
166 }, | |
167 | |
168 /** | |
169 * @return {number} | |
170 */ | |
171 columnNumber: function() | |
172 { | |
173 return this._columnNumber; | |
174 } | |
175 }; | |
OLD | NEW |