json2keymap 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env python3
  2. """Script to generate a keymap.c from a configurator export.
  3. """
  4. import json
  5. import os
  6. import sys
  7. # Add the QMK python libs to our path and import the modules we use
  8. script_dir = os.path.dirname(os.path.realpath(__file__))
  9. qmk_dir = os.path.abspath(os.path.join(script_dir, '..'))
  10. python_lib_dir = os.path.abspath(os.path.join(qmk_dir, 'lib', 'python'))
  11. sys.path.append(python_lib_dir)
  12. import qmk.keymap
  13. from milc import cli
  14. # Change to the root of our checkout
  15. running_cwd = os.getcwd()
  16. os.chdir(qmk_dir)
  17. @cli.argument('-f', '--filename', help='Configurator JSON export') # FIXME: This should be positional
  18. @cli.argument('-o', '--output', help='File to write to')
  19. @cli.entrypoint('Generate a keymap.c from a QMK Configurator export.')
  20. def main(cli):
  21. # Error checking
  22. if cli.config.general.filename == ('-'):
  23. cli.log.error('Reading from STDIN is not (yet) supported.')
  24. cli.print_usage()
  25. if not os.path.exists(cli.config.general.filename):
  26. cli.log.error('JSON file does not exist!')
  27. cli.print_usage()
  28. # Environment processing
  29. if cli.config.general.output == ('-'):
  30. cli.config.general.output = None
  31. # Parse the configurator json
  32. with open(cli.config.general.filename, 'r') as fd:
  33. user_keymap = json.load(fd)
  34. # Generate the keymap
  35. keymap_c = qmk.keymap.generate(user_keymap['keyboard'], user_keymap['layout'], user_keymap['layers'])
  36. if cli.config.general.output:
  37. with open(cli.config.general.output, 'w') as keymap_fd:
  38. keymap_fd.write(keymap_c)
  39. if sys.stdout.isatty():
  40. print('Wrote keymap to', cli.config.general.output)
  41. else:
  42. print(keymap_c)
  43. if __name__ == '__main__':
  44. cli()