| 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 |