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];
		}
	};
}