cspell-lib
Version:
A library of useful functions used across various cspell tools.
54 lines • 1.96 kB
JavaScript
import assert from 'node:assert';
/**
* Extract a substring from a TextMap.
* @param textMap - A text range with an optional map
* @param extractRange - The range in the original document to extract
* @returns The TextMap covering extractRange
*/
export function extractTextMapRangeOrigin(textMap, extractRange) {
const { text: srcTxt, range: srcRange, map: srcMap } = textMap;
const [r0, r1] = srcRange;
const startOrig = Math.min(Math.max(extractRange[0], r0), r1);
const endOrig = Math.min(Math.max(extractRange[1], r0), r1);
const a = startOrig - r0;
const b = endOrig - r0;
const range = [startOrig, endOrig];
if (!srcMap || !srcMap.length || a === b) {
const text = srcTxt.slice(a, b);
return { text, range };
}
assert((srcMap.length & 1) === 0, 'Map must be pairs of values.');
const mapLen = srcMap.length;
const mapEndSrc = srcMap[mapLen - 2];
const mapEndDst = srcMap[mapLen - 1];
const endDiff = srcTxt.length - mapEndDst;
const head = !srcMap[0] && !srcMap[1] ? [] : [0, 0];
const tail = [mapEndSrc + endDiff, mapEndDst + endDiff];
const sMap = [...head, ...srcMap, ...tail];
let idx = 0;
for (; idx < sMap.length && a >= sMap[idx]; idx += 2) {
// empty
}
const aIdx = idx;
idx -= 2;
const a0 = a - sMap[idx];
const a1 = a0 + sMap[idx + 1];
for (; idx < sMap.length && b > sMap[idx]; idx += 2) {
// empty
}
const bIdx = idx;
const b0 = b - sMap[idx];
const b1 = b0 + sMap[idx + 1];
const text = srcTxt.slice(a1, b1);
if (bIdx === aIdx) {
return { text, range };
}
const ab = [a0, a1];
const map = sMap.slice(aIdx, bIdx + 2).map((v, i) => v - ab[i & 1]);
return { text, range, map };
}
export function doesIntersect(textMap, rangeOrigin) {
const r = textMap.range;
return r[0] < rangeOrigin[1] && r[1] > rangeOrigin[0];
}
//# sourceMappingURL=TextMap.js.map