]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - keyboards/signum/3_0/elitec/keymaps/default/generate_km.py
[Keyboard] Signum3.0 generate json keymap (#5688)
[qmk_firmware.git] / keyboards / signum / 3_0 / elitec / keymaps / default / generate_km.py
index 05996d06cab8c7dd1be8c75a652becd0bfc530d9..9517a2f1f0719f263127fdb212cb62777e492761 100755 (executable)
@@ -1,12 +1,11 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
+import json
 import layout
+import os
 import re
 
-# TODO: auto-generate mutex layers
-# TODO: auto-generate update_tri_layer (_state)
-
 
 def gen_uc_iter():
     length = len(layout.uc_dict)
@@ -18,7 +17,7 @@ def gen_uc_iter():
             yield (key, value, True)
 
 
-def translate(s):
+def _translate(s):
     if re.match("^[0-9]$", s):
         return ("KC_{0}".format(s), "   {0}   ".format(s))
     elif re.match("^[a-z]$", s):
@@ -50,80 +49,115 @@ def translate(s):
 
 
 def toKC(s):
-    (kc, lgd) = translate(s)
-    return kc
+    return _translate(s)[0]
 
 
 def toLgd(s):
-    (kc, lgd) = translate(s)
-    return lgd
-
-
-if __name__ == "__main__":
+    return _translate(s)[1]
 
-    template = open("km_template.txt", mode="r")
-    output = open("keymap.c", mode="w", encoding='utf-8')
 
+def writeKeymap(f_template, f_keymap, columns, rows):
     doCopy = False
 
-    for line in template:
+    for line in f_template:
         doCopy = True
         if line.startswith("//<enum/>"):
             doCopy = False
-#            output.write(str(layout.uc_dict))
+            # f_keymap.write(str(layout.uc_dict))
             for k, v, isLast in gen_uc_iter():
                 if isLast:
-                    output.write(k + "\n")
+                    f_keymap.write(k + "\n")
                 else:
-                    output.write(k + ",\n")
-        if line.startswith("//<uc_map/>"):
+                    f_keymap.write(k + ",\n")
+        elif line.startswith("//<uc_map/>"):
             doCopy = False
             for k, v, isLast in gen_uc_iter():
                 if isLast:
-                    output.write(u"\t[{0}] = {1}  // {2}\n".format(k, v, chr(int(v, 0))))
+                    f_keymap.write(u"\t[{0}] = {1}  // {2}\n".format(k, v, chr(int(v, 0))))
                 else:
-                    output.write(u"\t[{0}] = {1},  // {2}\n".format(k, v, chr(int(v, 0))))
-        if line.startswith("//<keymaps/>"):
+                    f_keymap.write(u"\t[{0}] = {1},  // {2}\n".format(k, v, chr(int(v, 0))))
+        elif line.startswith("//<keymaps/>"):
             doCopy = False
-            counter = len(layout.layers)
-            layer = 0
-            S = layout.static
-            for L in layout.layers:
-                counter -= 1
-                r_counter = 4
-                output.write("/* Layer %d\n" % layer)
-                output.write(" * -------------------------------------------------               -------------------------------------------------\n")
-                output.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(toLgd(L[0][0]), toLgd(L[0][1]), toLgd(L[0][2]), toLgd(L[0][3]), toLgd(L[0][4]), toLgd(L[0][5]), toLgd(L[0][6]), toLgd(L[0][7]), toLgd(L[0][8]), toLgd(L[0][9]), toLgd(L[0][10]), toLgd(L[0][11])))
-                output.write(" * -------------------------------------------------               -------------------------------------------------\n")
-                output.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(toLgd(L[1][0]), toLgd(L[1][1]), toLgd(L[1][2]), toLgd(L[1][3]), toLgd(L[1][4]), toLgd(L[1][5]), toLgd(L[1][6]), toLgd(L[1][7]), toLgd(L[1][8]), toLgd(L[1][9]), toLgd(L[1][10]), toLgd(L[1][11])))
-                output.write(" * -------------------------------------------------               -------------------------------------------------\n")
-                output.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(toLgd(L[2][0]), toLgd(L[2][1]), toLgd(L[2][2]), toLgd(L[2][3]), toLgd(L[2][4]), toLgd(L[2][5]), toLgd(L[2][6]), toLgd(L[2][7]), toLgd(L[2][8]), toLgd(L[2][9]), toLgd(L[2][10]), toLgd(L[2][11])))
-                output.write(" * -----------------------------------------------------------------------------------------------------------------\n")
-                output.write(" *  {0} {1} {2}        |{3}|{4}|{5}|{6}|{7}|{8}|        {9} {10} {11}".format(toLgd(L[3][0]), toLgd(L[3][1]), toLgd(L[3][2]), toLgd(L[3][3]), toLgd(L[3][4]), toLgd(L[3][5]), toLgd(L[3][6]), toLgd(L[3][7]), toLgd(L[3][8]), toLgd(L[3][9]), toLgd(L[3][10]), toLgd(L[3][11])).rstrip()+"\n")
-                output.write(" *                                 -------------------------------------------------\n")
-                output.write(" */\n")
+            for layer, L in enumerate(layout.layers):
+                r_counter = rows
+                f_keymap.write("/* Layer %d\n" % layer)
+                f_keymap.write(" * -------------------------------------------------               -------------------------------------------------\n")
+                f_keymap.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(*map(toLgd, L[:12])))
+                f_keymap.write(" * -------------------------------------------------               -------------------------------------------------\n")
+                f_keymap.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(*map(toLgd, L[12:24])))
+                f_keymap.write(" * -------------------------------------------------               -------------------------------------------------\n")
+                f_keymap.write(" * |{0}|{1}|{2}|{3}|{4}|{5}|               |{6}|{7}|{8}|{9}|{10}|{11}|\n".format(*map(toLgd, L[24:36])))
+                f_keymap.write(" * -----------------------------------------------------------------------------------------------------------------\n")
+                f_keymap.write(" *  {0} {1} {2}        |{3}|{4}|{5}|{6}|{7}|{8}|        {9} {10} {11}".format(*map(toLgd, L[36:48])).rstrip()+"\n")
+                f_keymap.write(" *                                 -------------------------------------------------\n")
+                f_keymap.write(" */\n")
 
                 l_code = '\tLAYOUT_ortho_4x12(\n'
                 for r in range(r_counter):
                     r_counter -= 1
-                    c_counter = 12
+                    c_counter = columns
                     l_code += '\t\t'
                     for c in range(c_counter):
                         c_counter -= 1
                         if c != 0:
                             l_code += " "
-                        l_code += "%s" % toKC(L[r][c])
+                        l_code += "%s" % toKC(L[r*columns + columns-c_counter-1])
                         if r_counter or c_counter:
                             l_code += ","
                     l_code += '\n'
-                if counter:
+                if layer + 1 != len(layout.layers):
                     l_code += "\t),\n\n"
                 else:
                     l_code += "\t)\n"
-                output.write(l_code)
-                layer += 1
+                f_keymap.write(l_code)
         if doCopy:
-            output.write(line)
+            f_keymap.write(line)
+
+
+def getKeymapJSON(keyboard, keymap, layout, layers):
+    return json.dumps({
+        'keyboard': keyboard,
+        'keymap': keymap,
+        'layout': layout,
+        'layers': layers
+        }, sort_keys=True, indent=4)
+
 
-    template.close()
-    output.close()
+def layersToKC(layers):
+    return [list(map(toKC, layer)) for layer in layers]
+
+
+def pathToKeymap(path):
+    head, keymap = os.path.split(path)
+    _, keymapsdir = os.path.split(head)
+    if keymapsdir == 'keymaps':
+        return keymap
+
+
+def pathToKeyboard(path):
+    head, keymap = os.path.split(path)
+    head, keymapsdir = os.path.split(head)
+    if keymapsdir == 'keymaps':
+        head, dir = os.path.split(head)
+        while dir not in ('/', 'keyboards'):
+            yield dir
+            head, dir = os.path.split(head)
+
+
+if __name__ == "__main__":
+    with open("km_template.txt", mode="r") as f_template:
+        with open("keymap.c", mode="w", encoding='utf-8') as f_keymap:
+            writeKeymap(f_template, f_keymap, columns=12, rows=4)
+
+    abspath = os.path.dirname(os.path.abspath(__file__))
+    keyboard = list(reversed(list(pathToKeyboard(abspath))))
+    keymap = pathToKeymap(abspath)
+    keyboard_layout = 'LAYOUT_ortho_4x12'
+    with open("%s_%s.json" % ('_'.join(keyboard), keymap), mode="w") as f_keymapjson:
+        f_keymapjson.write(
+                getKeymapJSON(
+                    '/'.join(keyboard),
+                    keymap,
+                    keyboard_layout,
+                    layersToKC(layout.layers))
+                )