aboutsummaryrefslogtreecommitdiff
path: root/keyboards/ferris/keymaps/json2crab.py
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/ferris/keymaps/json2crab.py')
-rwxr-xr-xkeyboards/ferris/keymaps/json2crab.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/keyboards/ferris/keymaps/json2crab.py b/keyboards/ferris/keymaps/json2crab.py
new file mode 100755
index 000000000..a32429fae
--- /dev/null
+++ b/keyboards/ferris/keymaps/json2crab.py
@@ -0,0 +1,76 @@
1#!/usr/bin/env python3
2
3import argparse
4import sys
5import json
6
7indent_level=4
8
9def parse_cli():
10 parser = argparse.ArgumentParser(description='Ferris keymap formatter')
11 parser.add_argument("--input", type=argparse.FileType('r'),
12 default=sys.stdin, help="Input keymap (json file produced by qmk configurator)")
13 return parser.parse_args()
14
15def col_index(key_index):
16 if key_index < 30:
17 col = key_index % 5
18 else:
19 col = key_index % 2
20 return col
21
22def format_layers(layers):
23 formatted = indent_level * " " + "\"layers\": [\n"
24 max_key_length = {}
25 for layer in layers:
26 for (index, keycode) in enumerate(layer):
27 col = col_index(index)
28 max_length = max_key_length.get(col)
29 if (not max_length) or len(keycode) > max_length:
30 max_key_length.update({col: len(keycode)})
31 for (layer_index, layer) in enumerate(layers):
32 formatted += 2 * indent_level * " "
33 formatted += "["
34 for (index, keycode) in enumerate(layer):
35 if index > 30 and index % 2 == 0 or index % 5 == 0 and index != 0:
36 formatted += (1 + 2 * indent_level) * " "
37 formatted += json.dumps(keycode)
38 if index == 33:
39 formatted += "\n"
40 elif index > 30 and index % 2 == 1 or index % 5 == 4:
41 formatted += ",\n"
42 else:
43 n_spaces = max_key_length[col_index(index)] - len(keycode)
44 formatted += n_spaces * " "
45 formatted += ", "
46 if index % 10 == 9:
47 formatted += "\n"
48 formatted += 2 * indent_level * " "
49 if layer_index < len(layers) - 1:
50 formatted += "],\n"
51 else:
52 formatted += "]\n"
53 formatted += indent_level * " "
54 formatted += "]"
55
56 return formatted
57
58def format_keymap(keymap_json):
59 formatted = "{"
60 for (index, k) in enumerate(keymap_json):
61 if k == "layers":
62 formatted += format_layers(keymap_json[k])
63 else:
64 formatted += f"{indent_level * ' '}{json.dumps(k)}: {json.dumps(keymap_json[k])}"
65 if index < len(keymap_json) - 1:
66 formatted += ","
67 formatted += "\n"
68 formatted += "}"
69 return formatted
70
71def main():
72 args=parse_cli()
73 keymap_json = json.loads(args.input.read())
74 print(format_keymap(keymap_json))
75
76main()