63 lines
1.5 KiB
TypeScript
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,
|
|
};
|
|
}
|