1
Fork 0
keyswirl/layout-lens/src/config.ts
2023-10-22 16:10:53 +02:00

63 lines
1.5 KiB
TypeScript

import {
Arguments,
Config,
KeyboardKey,
KeySymbol,
Layout,
PredefinedLayout,
PredefinedLayoutName,
SpecialSymbols,
} from "./types";
import split_3x5_2 from "./layouts/split_3x5_2";
export function parseConfig(input: string): Config {
const parsed = JSON.parse(input);
const layout = PredefinedLayoutName[
parsed.layout as string
] as PredefinedLayoutName;
if (layout === undefined) {
throw `Cannot find layout ${parsed.layout}`;
}
return {
keys: (parsed.keys as string[][]).map((k) =>
k.map((s) => {
const special = SpecialSymbols[s];
if (special === undefined) return s;
return special as SpecialSymbols;
}),
),
colorscheme: parsed.colorscheme,
imagePadding: parsed.imagePadding,
keySize: parsed.keySize,
layout,
};
}
function key(
main: KeySymbol,
tlLayer: KeySymbol = "",
trLayer: KeySymbol = "",
blLayer: KeySymbol = "",
): KeyboardKey {
return { main, tlLayer, trLayer, blLayer };
}
const layouts: Record<PredefinedLayoutName, PredefinedLayout> = {
[PredefinedLayoutName.split_3x5_2]: split_3x5_2,
};
export function makeLayout(config: Config): Layout {
const predefined = layouts[config.layout](config.keySize);
return {
keys: config.keys.map((k) => key(...(k as Arguments<typeof key>))),
colorscheme: config.colorscheme,
imagePadding: config.imagePadding,
keySize: config.keySize,
visual: predefined.visual,
size: predefined.size,
};
}