generate_c.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import itertools
  2. import json
  3. import os.path
  4. import re
  5. KEYMAP_C = """/* {0}
  6. {1}
  7. */
  8. [{2}] = {3}(
  9. {4})
  10. """
  11. README_MD = """## {0}
  12. ```
  13. {1}
  14. ```
  15. """
  16. base = os.path.dirname(__file__)
  17. layer_names = dict(enumerate(['_QWERTY', '_LOWER', '_RAISE', '_MOVEMENT', '_NUMPAD', '_FUNCTION']))
  18. layer_name = {('MO(%d)' % i): layer_names.get(i).strip('_') for i in layer_names.keys()}
  19. keys = json.load(open(os.path.join(base, 'keys.json')))
  20. d = json.load(open(os.path.join(base, 'guidoism.json')))
  21. def surround(s, a, b, c):
  22. return a + b.join(s) + c
  23. def pattern(cell, table):
  24. return ['─'*cell for i in range(table)]
  25. top = surround(pattern(5, 12), '┌', '┬', '┐')
  26. mid = surround(pattern(5, 12), '├', '┼', '┤')
  27. bottom = surround(pattern(5, 12), '└', '┴', '┘')
  28. from more_itertools import chunked, intersperse, interleave_longest
  29. def uni(k):
  30. return keys.get(k, k).lower().center(5)
  31. def c_layout(i, definition, template):
  32. c_name = layer_names[i]
  33. pretty_name = c_name.strip('_').capitalize()
  34. layout = d['layout']
  35. surround = lambda s: ''.join(interleave_longest(['│']*(len(s)+1), s))
  36. layer = list(map(uni, definition))
  37. layer[41] = layer[41].center(11)
  38. layer = chunked(layer, 12)
  39. rows = intersperse(mid, map(surround, layer))
  40. pretty = '\n'.join(itertools.chain([top], rows, [bottom]))
  41. surround = lambda s: ', '.join(s)
  42. layer = list(map(lambda k: layer_name.get(k, k), definition))
  43. layer = chunked(layer, 12)
  44. rows = map(surround, layer)
  45. c_layer = ',\n '.join(itertools.chain([], rows, []))
  46. return template.format(pretty_name, pretty, c_name, layout, c_layer)
  47. start = '// START_REPLACEMENT\n'
  48. end = '// END_REPLACEMENT\n'
  49. replacement = start + ',\n\n'.join(c_layout(i, l, KEYMAP_C) for i, l in enumerate(d['layers'])) + end
  50. keymap = os.path.join(base, 'keymap.c')
  51. existing = open(keymap).read()
  52. r = re.compile(r'// START_REPLACEMENT.*// END_REPLACEMENT', re.DOTALL)
  53. open(keymap, 'w').write(r.sub(replacement, existing))
  54. replacement = '## Current Configuration\n\n' + '\n\n'.join(c_layout(i, l, README_MD) for i, l in enumerate(d['layers']))
  55. keymap = os.path.join(base, 'readme.md')
  56. existing = open(keymap).read()
  57. r = re.compile(r'## Current Configuration.*', re.DOTALL)
  58. open(keymap, 'w').write(r.sub(replacement, existing))