logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

json2crab.py (2423B)


  1. #!/usr/bin/env python3
  2. import argparse
  3. import sys
  4. import json
  5. indent_level=4
  6. def parse_cli():
  7. parser = argparse.ArgumentParser(description='Ferris keymap formatter')
  8. parser.add_argument("--input", type=argparse.FileType('r'),
  9. default=sys.stdin, help="Input keymap (json file produced by qmk configurator)")
  10. return parser.parse_args()
  11. def col_index(key_index):
  12. if key_index < 30:
  13. col = key_index % 5
  14. else:
  15. col = key_index % 2
  16. return col
  17. def format_layers(layers):
  18. formatted = indent_level * " " + "\"layers\": [\n"
  19. max_key_length = {}
  20. for layer in layers:
  21. for (index, keycode) in enumerate(layer):
  22. col = col_index(index)
  23. max_length = max_key_length.get(col)
  24. if (not max_length) or len(keycode) > max_length:
  25. max_key_length.update({col: len(keycode)})
  26. for (layer_index, layer) in enumerate(layers):
  27. formatted += 2 * indent_level * " "
  28. formatted += "["
  29. for (index, keycode) in enumerate(layer):
  30. if index > 30 and index % 2 == 0 or index % 5 == 0 and index != 0:
  31. formatted += (1 + 2 * indent_level) * " "
  32. formatted += json.dumps(keycode)
  33. if index == 33:
  34. formatted += "\n"
  35. elif index > 30 and index % 2 == 1 or index % 5 == 4:
  36. formatted += ",\n"
  37. else:
  38. n_spaces = max_key_length[col_index(index)] - len(keycode)
  39. formatted += n_spaces * " "
  40. formatted += ", "
  41. if index % 10 == 9:
  42. formatted += "\n"
  43. formatted += 2 * indent_level * " "
  44. if layer_index < len(layers) - 1:
  45. formatted += "],\n"
  46. else:
  47. formatted += "]\n"
  48. formatted += indent_level * " "
  49. formatted += "]"
  50. return formatted
  51. def format_keymap(keymap_json):
  52. formatted = "{"
  53. for (index, k) in enumerate(keymap_json):
  54. if k == "layers":
  55. formatted += format_layers(keymap_json[k])
  56. else:
  57. formatted += f"{indent_level * ' '}{json.dumps(k)}: {json.dumps(keymap_json[k])}"
  58. if index < len(keymap_json) - 1:
  59. formatted += ","
  60. formatted += "\n"
  61. formatted += "}"
  62. return formatted
  63. def main():
  64. args=parse_cli()
  65. keymap_json = json.loads(args.input.read())
  66. print(format_keymap(keymap_json))
  67. main()