astro-ghostcms/.pnpm-store/v3/files/c4/972dfe867fc3ebd3cdd030e0103...

63 lines
1.9 KiB
Plaintext

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LinesAndColumns = void 0;
class LinesAndColumns {
constructor(code) {
const len = code.length;
const lineStartIndices = [0];
for (let index = 0; index < len; index++) {
const c = code[index];
if (c === "\r") {
const next = code[index + 1] || "";
if (next === "\n") {
index++;
}
lineStartIndices.push(index + 1);
}
else if (c === "\n") {
lineStartIndices.push(index + 1);
}
}
this.code = code;
this.lineStartIndices = lineStartIndices;
}
getLocFromIndex(index) {
const lineNumber = sortedLastIndex(this.lineStartIndices, index);
return {
line: lineNumber,
column: index - this.lineStartIndices[lineNumber - 1],
};
}
getIndexFromLoc(loc) {
const lineIndex = loc.line - 1;
if (this.lineStartIndices.length > lineIndex) {
const lineStartIndex = this.lineStartIndices[lineIndex];
const positionIndex = lineStartIndex + loc.column;
return positionIndex;
}
else if (this.lineStartIndices.length === lineIndex) {
return this.code.length + loc.column;
}
return this.code.length + loc.column;
}
}
exports.LinesAndColumns = LinesAndColumns;
function sortedLastIndex(array, value) {
let lower = 0;
let upper = array.length;
while (lower < upper) {
const mid = Math.floor(lower + (upper - lower) / 2);
const target = array[mid];
if (target < value) {
lower = mid + 1;
}
else if (target > value) {
upper = mid;
}
else {
return mid + 1;
}
}
return upper;
}