getLocator.js
749 Bytes
export default function getLocator ( source ) {
let originalLines = source.split( '\n' );
let start = 0;
let lineRanges = originalLines.map( ( line, i ) => {
const end = start + line.length + 1;
const range = { start, end, line: i };
start = end;
return range;
});
let i = 0;
function rangeContains ( range, index ) {
return range.start <= index && index < range.end;
}
function getLocation ( range, index ) {
return { line: range.line, column: index - range.start };
}
return function locate ( index ) {
let range = lineRanges[i];
const d = index >= range.end ? 1 : -1;
while ( range ) {
if ( rangeContains( range, index ) ) return getLocation( range, index );
i += d;
range = lineRanges[i];
}
};
}