77 lines
2.4 KiB
Python
77 lines
2.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import argparse
|
||
|
import sys
|
||
|
import json
|
||
|
|
||
|
indent_level=4
|
||
|
|
||
|
def parse_cli():
|
||
|
parser = argparse.ArgumentParser(description='Ferris keymap formatter')
|
||
|
parser.add_argument("--input", type=argparse.FileType('r'),
|
||
|
default=sys.stdin, help="Input keymap (json file produced by qmk configurator)")
|
||
|
return parser.parse_args()
|
||
|
|
||
|
def col_index(key_index):
|
||
|
if key_index < 30:
|
||
|
col = key_index % 5
|
||
|
else:
|
||
|
col = key_index % 2
|
||
|
return col
|
||
|
|
||
|
def format_layers(layers):
|
||
|
formatted = indent_level * " " + "\"layers\": [\n"
|
||
|
max_key_length = {}
|
||
|
for layer in layers:
|
||
|
for (index, keycode) in enumerate(layer):
|
||
|
col = col_index(index)
|
||
|
max_length = max_key_length.get(col)
|
||
|
if (not max_length) or len(keycode) > max_length:
|
||
|
max_key_length.update({col: len(keycode)})
|
||
|
for (layer_index, layer) in enumerate(layers):
|
||
|
formatted += 2 * indent_level * " "
|
||
|
formatted += "["
|
||
|
for (index, keycode) in enumerate(layer):
|
||
|
if index > 30 and index % 2 == 0 or index % 5 == 0 and index != 0:
|
||
|
formatted += (1 + 2 * indent_level) * " "
|
||
|
formatted += json.dumps(keycode)
|
||
|
if index == 33:
|
||
|
formatted += "\n"
|
||
|
elif index > 30 and index % 2 == 1 or index % 5 == 4:
|
||
|
formatted += ",\n"
|
||
|
else:
|
||
|
n_spaces = max_key_length[col_index(index)] - len(keycode)
|
||
|
formatted += n_spaces * " "
|
||
|
formatted += ", "
|
||
|
if index % 10 == 9:
|
||
|
formatted += "\n"
|
||
|
formatted += 2 * indent_level * " "
|
||
|
if layer_index < len(layers) - 1:
|
||
|
formatted += "],\n"
|
||
|
else:
|
||
|
formatted += "]\n"
|
||
|
formatted += indent_level * " "
|
||
|
formatted += "]"
|
||
|
|
||
|
return formatted
|
||
|
|
||
|
def format_keymap(keymap_json):
|
||
|
formatted = "{"
|
||
|
for (index, k) in enumerate(keymap_json):
|
||
|
if k == "layers":
|
||
|
formatted += format_layers(keymap_json[k])
|
||
|
else:
|
||
|
formatted += f"{indent_level * ' '}{json.dumps(k)}: {json.dumps(keymap_json[k])}"
|
||
|
if index < len(keymap_json) - 1:
|
||
|
formatted += ","
|
||
|
formatted += "\n"
|
||
|
formatted += "}"
|
||
|
return formatted
|
||
|
|
||
|
def main():
|
||
|
args=parse_cli()
|
||
|
keymap_json = json.loads(args.input.read())
|
||
|
print(format_keymap(keymap_json))
|
||
|
|
||
|
main()
|