| 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 | 4 |
| 5 self['Common'] = self['Common'] || {}; | |
| 6 | |
| 7 /** | 5 /** |
| 8 * @unrestricted | 6 * @unrestricted |
| 9 */ | 7 */ |
| 10 Common.Text = class { | 8 TextUtils.Text = class { |
| 11 /** | 9 /** |
| 12 * @param {string} value | 10 * @param {string} value |
| 13 */ | 11 */ |
| 14 constructor(value) { | 12 constructor(value) { |
| 15 this._value = value; | 13 this._value = value; |
| 16 } | 14 } |
| 17 | 15 |
| 18 /** | 16 /** |
| 19 * @return {!Array<number>} | 17 * @return {!Array<number>} |
| 20 */ | 18 */ |
| (...skipping 22 matching lines...) Expand all Loading... |
| 43 * @param {number} lineNumber | 41 * @param {number} lineNumber |
| 44 * @param {number} columnNumber | 42 * @param {number} columnNumber |
| 45 * @return {number} | 43 * @return {number} |
| 46 */ | 44 */ |
| 47 offsetFromPosition(lineNumber, columnNumber) { | 45 offsetFromPosition(lineNumber, columnNumber) { |
| 48 return (lineNumber ? this.lineEndings()[lineNumber - 1] + 1 : 0) + columnNum
ber; | 46 return (lineNumber ? this.lineEndings()[lineNumber - 1] + 1 : 0) + columnNum
ber; |
| 49 } | 47 } |
| 50 | 48 |
| 51 /** | 49 /** |
| 52 * @param {number} offset | 50 * @param {number} offset |
| 53 * @return {!Common.Text.Position} | 51 * @return {!TextUtils.Text.Position} |
| 54 */ | 52 */ |
| 55 positionFromOffset(offset) { | 53 positionFromOffset(offset) { |
| 56 var lineEndings = this.lineEndings(); | 54 var lineEndings = this.lineEndings(); |
| 57 var lineNumber = lineEndings.lowerBound(offset); | 55 var lineNumber = lineEndings.lowerBound(offset); |
| 58 return {lineNumber: lineNumber, columnNumber: offset - (lineNumber && (lineE
ndings[lineNumber - 1] + 1))}; | 56 return {lineNumber: lineNumber, columnNumber: offset - (lineNumber && (lineE
ndings[lineNumber - 1] + 1))}; |
| 59 } | 57 } |
| 60 | 58 |
| 61 /** | 59 /** |
| 62 * @return {string} | 60 * @return {string} |
| 63 */ | 61 */ |
| 64 lineAt(lineNumber) { | 62 lineAt(lineNumber) { |
| 65 var lineEndings = this.lineEndings(); | 63 var lineEndings = this.lineEndings(); |
| 66 var lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0; | 64 var lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0; |
| 67 var lineEnd = lineEndings[lineNumber]; | 65 var lineEnd = lineEndings[lineNumber]; |
| 68 var lineContent = this._value.substring(lineStart, lineEnd); | 66 var lineContent = this._value.substring(lineStart, lineEnd); |
| 69 if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) ===
'\r') | 67 if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) ===
'\r') |
| 70 lineContent = lineContent.substring(0, lineContent.length - 1); | 68 lineContent = lineContent.substring(0, lineContent.length - 1); |
| 71 return lineContent; | 69 return lineContent; |
| 72 } | 70 } |
| 73 | 71 |
| 74 /** | 72 /** |
| 75 * @param {!Common.TextRange} range | 73 * @param {!TextUtils.TextRange} range |
| 76 * @return {!Common.SourceRange} | 74 * @return {!TextUtils.SourceRange} |
| 77 */ | 75 */ |
| 78 toSourceRange(range) { | 76 toSourceRange(range) { |
| 79 var start = this.offsetFromPosition(range.startLine, range.startColumn); | 77 var start = this.offsetFromPosition(range.startLine, range.startColumn); |
| 80 var end = this.offsetFromPosition(range.endLine, range.endColumn); | 78 var end = this.offsetFromPosition(range.endLine, range.endColumn); |
| 81 return new Common.SourceRange(start, end - start); | 79 return new TextUtils.SourceRange(start, end - start); |
| 82 } | 80 } |
| 83 | 81 |
| 84 /** | 82 /** |
| 85 * @param {!Common.SourceRange} sourceRange | 83 * @param {!TextUtils.SourceRange} sourceRange |
| 86 * @return {!Common.TextRange} | 84 * @return {!TextUtils.TextRange} |
| 87 */ | 85 */ |
| 88 toTextRange(sourceRange) { | 86 toTextRange(sourceRange) { |
| 89 var cursor = new Common.TextCursor(this.lineEndings()); | 87 var cursor = new TextUtils.TextCursor(this.lineEndings()); |
| 90 var result = Common.TextRange.createFromLocation(0, 0); | 88 var result = TextUtils.TextRange.createFromLocation(0, 0); |
| 91 | 89 |
| 92 cursor.resetTo(sourceRange.offset); | 90 cursor.resetTo(sourceRange.offset); |
| 93 result.startLine = cursor.lineNumber(); | 91 result.startLine = cursor.lineNumber(); |
| 94 result.startColumn = cursor.columnNumber(); | 92 result.startColumn = cursor.columnNumber(); |
| 95 | 93 |
| 96 cursor.advance(sourceRange.offset + sourceRange.length); | 94 cursor.advance(sourceRange.offset + sourceRange.length); |
| 97 result.endLine = cursor.lineNumber(); | 95 result.endLine = cursor.lineNumber(); |
| 98 result.endColumn = cursor.columnNumber(); | 96 result.endColumn = cursor.columnNumber(); |
| 99 return result; | 97 return result; |
| 100 } | 98 } |
| 101 | 99 |
| 102 /** | 100 /** |
| 103 * @param {!Common.TextRange} range | 101 * @param {!TextUtils.TextRange} range |
| 104 * @param {string} replacement | 102 * @param {string} replacement |
| 105 * @return {string} | 103 * @return {string} |
| 106 */ | 104 */ |
| 107 replaceRange(range, replacement) { | 105 replaceRange(range, replacement) { |
| 108 var sourceRange = this.toSourceRange(range); | 106 var sourceRange = this.toSourceRange(range); |
| 109 return this._value.substring(0, sourceRange.offset) + replacement + | 107 return this._value.substring(0, sourceRange.offset) + replacement + |
| 110 this._value.substring(sourceRange.offset + sourceRange.length); | 108 this._value.substring(sourceRange.offset + sourceRange.length); |
| 111 } | 109 } |
| 112 | 110 |
| 113 /** | 111 /** |
| 114 * @param {!Common.TextRange} range | 112 * @param {!TextUtils.TextRange} range |
| 115 * @return {string} | 113 * @return {string} |
| 116 */ | 114 */ |
| 117 extract(range) { | 115 extract(range) { |
| 118 var sourceRange = this.toSourceRange(range); | 116 var sourceRange = this.toSourceRange(range); |
| 119 return this._value.substr(sourceRange.offset, sourceRange.length); | 117 return this._value.substr(sourceRange.offset, sourceRange.length); |
| 120 } | 118 } |
| 121 }; | 119 }; |
| 122 | 120 |
| 123 /** @typedef {{lineNumber: number, columnNumber: number}} */ | 121 /** @typedef {{lineNumber: number, columnNumber: number}} */ |
| 124 Common.Text.Position; | 122 TextUtils.Text.Position; |
| 125 | 123 |
| 126 /** | 124 /** |
| 127 * @unrestricted | 125 * @unrestricted |
| 128 */ | 126 */ |
| 129 Common.TextCursor = class { | 127 TextUtils.TextCursor = class { |
| 130 /** | 128 /** |
| 131 * @param {!Array<number>} lineEndings | 129 * @param {!Array<number>} lineEndings |
| 132 */ | 130 */ |
| 133 constructor(lineEndings) { | 131 constructor(lineEndings) { |
| 134 this._lineEndings = lineEndings; | 132 this._lineEndings = lineEndings; |
| 135 this._offset = 0; | 133 this._offset = 0; |
| 136 this._lineNumber = 0; | 134 this._lineNumber = 0; |
| 137 this._columnNumber = 0; | 135 this._columnNumber = 0; |
| 138 } | 136 } |
| 139 | 137 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 170 return this._lineNumber; | 168 return this._lineNumber; |
| 171 } | 169 } |
| 172 | 170 |
| 173 /** | 171 /** |
| 174 * @return {number} | 172 * @return {number} |
| 175 */ | 173 */ |
| 176 columnNumber() { | 174 columnNumber() { |
| 177 return this._columnNumber; | 175 return this._columnNumber; |
| 178 } | 176 } |
| 179 }; | 177 }; |
| OLD | NEW |