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