summaryrefslogtreecommitdiff
path: root/lib/python/qmk/keyboard.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/keyboard.py')
-rw-r--r--lib/python/qmk/keyboard.py55
1 files changed, 47 insertions, 8 deletions
diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py
index d1f2a301df..33f182e8f9 100644
--- a/lib/python/qmk/keyboard.py
+++ b/lib/python/qmk/keyboard.py
@@ -7,6 +7,43 @@ from pathlib import Path
from qmk.c_parse import parse_config_h_file
from qmk.makefile import parse_rules_mk_file
+BOX_DRAWING_CHARACTERS = {
+ "unicode": {
+ "tl": "┌",
+ "tr": "┐",
+ "bl": "└",
+ "br": "┘",
+ "v": "│",
+ "h": "─",
+ },
+ "ascii": {
+ "tl": " ",
+ "tr": " ",
+ "bl": "|",
+ "br": "|",
+ "v": "|",
+ "h": "_",
+ },
+}
+
+base_path = os.path.join(os.getcwd(), "keyboards") + os.path.sep
+
+
+def _find_name(path):
+ """Determine the keyboard name by stripping off the base_path and rules.mk.
+ """
+ return path.replace(base_path, "").replace(os.path.sep + "rules.mk", "")
+
+
+def list_keyboards():
+ """Returns a list of all keyboards.
+ """
+ # We avoid pathlib here because this is performance critical code.
+ kb_wildcard = os.path.join(base_path, "**", "rules.mk")
+ paths = [path for path in glob(kb_wildcard, recursive=True) if 'keymaps' not in path]
+
+ return sorted(map(_find_name, paths))
+
def config_h(keyboard):
"""Parses all the config.h files for a keyboard.
@@ -52,10 +89,12 @@ def rules_mk(keyboard):
return rules
-def render_layout(layout_data, key_labels=None):
+def render_layout(layout_data, render_ascii, key_labels=None):
"""Renders a single layout.
"""
textpad = [array('u', ' ' * 200) for x in range(50)]
+ style = 'ascii' if render_ascii else 'unicode'
+ box_chars = BOX_DRAWING_CHARACTERS[style]
for key in layout_data:
x = ceil(key.get('x', 0) * 4)
@@ -77,13 +116,13 @@ def render_layout(layout_data, key_labels=None):
label = label[:label_len]
label_blank = ' ' * label_len
- label_border = '─' * label_len
+ label_border = box_chars['h'] * label_len
label_middle = label + ' '*label_leftover # noqa: yapf insists there be no whitespace around *
- top_line = array('u', '┌' + label_border + '┐')
- lab_line = array('u', '│' + label_middle + '│')
- mid_line = array('u', '│' + label_blank + '│')
- bot_line = array('u', '└' + label_border + "┘")
+ top_line = array('u', box_chars['tl'] + label_border + box_chars['tr'])
+ lab_line = array('u', box_chars['v'] + label_middle + box_chars['v'])
+ mid_line = array('u', box_chars['v'] + label_blank + box_chars['v'])
+ bot_line = array('u', box_chars['bl'] + label_border + box_chars['br'])
textpad[y][x:x + w] = top_line
textpad[y + 1][x:x + w] = lab_line
@@ -99,13 +138,13 @@ def render_layout(layout_data, key_labels=None):
return '\n'.join(lines)
-def render_layouts(info_json):
+def render_layouts(info_json, render_ascii):
"""Renders all the layouts from an `info_json` structure.
"""
layouts = {}
for layout in info_json['layouts']:
layout_data = info_json['layouts'][layout]['layout']
- layouts[layout] = render_layout(layout_data)
+ layouts[layout] = render_layout(layout_data, render_ascii)
return layouts