diff options
Diffstat (limited to 'keyboards/ferris/keymaps/json2crab.py')
| -rwxr-xr-x | keyboards/ferris/keymaps/json2crab.py | 76 |
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 | |||
| 3 | import argparse | ||
| 4 | import sys | ||
| 5 | import json | ||
| 6 | |||
| 7 | indent_level=4 | ||
| 8 | |||
| 9 | def 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 | |||
| 15 | def 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 | |||
| 22 | def 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 | |||
| 58 | def 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 | |||
| 71 | def main(): | ||
| 72 | args=parse_cli() | ||
| 73 | keymap_json = json.loads(args.input.read()) | ||
| 74 | print(format_keymap(keymap_json)) | ||
| 75 | |||
| 76 | main() | ||
