zmk/docs/src/keymap-upgrade/index.ts
Joel Spadin 08d9391a8a feat(keymap-upgrader): Upgrade renamed nodes
Added an upgrade function to fix renamed behavior nodes in the unlikely
event that someone was changing behavior settings this way instead of
using references.
2024-01-25 18:03:37 -06:00

61 lines
1.5 KiB
TypeScript

import { createParser } from "./parser";
import { applyEdits, Range } from "./textedit";
import { upgradeBehaviors } from "./behaviors";
import { upgradeHeaders } from "./headers";
import { upgradeKeycodes } from "./keycodes";
import { upgradeNodeNames } from "./nodes";
import { upgradeProperties } from "./properties";
export { initParser } from "./parser";
const upgradeFunctions = [
upgradeBehaviors,
upgradeHeaders,
upgradeKeycodes,
upgradeNodeNames,
upgradeProperties,
];
export function upgradeKeymap(text: string) {
const parser = createParser();
const tree = parser.parse(text);
const edits = upgradeFunctions.map((f) => f(tree)).flat();
return applyEdits(text, edits);
}
export function rangesToLineNumbers(
text: string,
changedRanges: Range[]
): string {
const lineBreaks = getLineBreakPositions(text);
const changedLines = changedRanges.map((range) => {
const startLine = positionToLineNumber(range.startIndex, lineBreaks);
const endLine = positionToLineNumber(range.endIndex, lineBreaks);
return startLine === endLine ? `${startLine}` : `${startLine}-${endLine}`;
});
return `{${changedLines.join(",")}}`;
}
function getLineBreakPositions(text: string) {
const positions: number[] = [];
let index = 0;
while ((index = text.indexOf("\n", index)) >= 0) {
positions.push(index);
index++;
}
return positions;
}
function positionToLineNumber(position: number, lineBreaks: number[]) {
const line = lineBreaks.findIndex((lineBreak) => position <= lineBreak);
return line < 0 ? 0 : line + 1;
}