|
@@ -45,7 +45,12 @@ def info_json(keyboard):
|
|
info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
|
|
info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
|
|
|
|
|
|
# Populate layout data
|
|
# Populate layout data
|
|
- for layout_name, layout_json in _find_all_layouts(info_data, keyboard).items():
|
|
|
|
|
|
+ layouts, aliases = _find_all_layouts(info_data, keyboard)
|
|
|
|
+
|
|
|
|
+ if aliases:
|
|
|
|
+ info_data['layout_aliases'] = aliases
|
|
|
|
+
|
|
|
|
+ for layout_name, layout_json in layouts.items():
|
|
if not layout_name.startswith('LAYOUT_kc'):
|
|
if not layout_name.startswith('LAYOUT_kc'):
|
|
layout_json['c_macro'] = True
|
|
layout_json['c_macro'] = True
|
|
info_data['layouts'][layout_name] = layout_json
|
|
info_data['layouts'][layout_name] = layout_json
|
|
@@ -92,7 +97,7 @@ def _json_load(json_file):
|
|
Note: file must be a Path object.
|
|
Note: file must be a Path object.
|
|
"""
|
|
"""
|
|
try:
|
|
try:
|
|
- return hjson.load(json_file.open())
|
|
|
|
|
|
+ return hjson.load(json_file.open(encoding='utf-8'))
|
|
|
|
|
|
except json.decoder.JSONDecodeError as e:
|
|
except json.decoder.JSONDecodeError as e:
|
|
cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e)
|
|
cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e)
|
|
@@ -415,21 +420,28 @@ def _merge_layouts(info_data, new_info_data):
|
|
|
|
|
|
def _search_keyboard_h(path):
|
|
def _search_keyboard_h(path):
|
|
current_path = Path('keyboards/')
|
|
current_path = Path('keyboards/')
|
|
|
|
+ aliases = {}
|
|
layouts = {}
|
|
layouts = {}
|
|
|
|
+
|
|
for directory in path.parts:
|
|
for directory in path.parts:
|
|
current_path = current_path / directory
|
|
current_path = current_path / directory
|
|
keyboard_h = '%s.h' % (directory,)
|
|
keyboard_h = '%s.h' % (directory,)
|
|
keyboard_h_path = current_path / keyboard_h
|
|
keyboard_h_path = current_path / keyboard_h
|
|
if keyboard_h_path.exists():
|
|
if keyboard_h_path.exists():
|
|
- layouts.update(find_layouts(keyboard_h_path))
|
|
|
|
|
|
+ new_layouts, new_aliases = find_layouts(keyboard_h_path)
|
|
|
|
+ layouts.update(new_layouts)
|
|
|
|
+
|
|
|
|
+ for alias, alias_text in new_aliases.items():
|
|
|
|
+ if alias_text in layouts:
|
|
|
|
+ aliases[alias] = alias_text
|
|
|
|
|
|
- return layouts
|
|
|
|
|
|
+ return layouts, aliases
|
|
|
|
|
|
|
|
|
|
def _find_all_layouts(info_data, keyboard):
|
|
def _find_all_layouts(info_data, keyboard):
|
|
"""Looks for layout macros associated with this keyboard.
|
|
"""Looks for layout macros associated with this keyboard.
|
|
"""
|
|
"""
|
|
- layouts = _search_keyboard_h(Path(keyboard))
|
|
|
|
|
|
+ layouts, aliases = _search_keyboard_h(Path(keyboard))
|
|
|
|
|
|
if not layouts:
|
|
if not layouts:
|
|
# If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
|
|
# If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
|
|
@@ -437,11 +449,15 @@ def _find_all_layouts(info_data, keyboard):
|
|
|
|
|
|
for file in glob('keyboards/%s/*.h' % keyboard):
|
|
for file in glob('keyboards/%s/*.h' % keyboard):
|
|
if file.endswith('.h'):
|
|
if file.endswith('.h'):
|
|
- these_layouts = find_layouts(file)
|
|
|
|
|
|
+ these_layouts, these_aliases = find_layouts(file)
|
|
|
|
+
|
|
if these_layouts:
|
|
if these_layouts:
|
|
layouts.update(these_layouts)
|
|
layouts.update(these_layouts)
|
|
|
|
|
|
- return layouts
|
|
|
|
|
|
+ if these_aliases:
|
|
|
|
+ aliases.update(these_aliases)
|
|
|
|
+
|
|
|
|
+ return layouts, aliases
|
|
|
|
|
|
|
|
|
|
def _log_error(info_data, message):
|
|
def _log_error(info_data, message):
|
|
@@ -540,11 +556,19 @@ def merge_info_jsons(keyboard, info_data):
|
|
cli.log.error('\t%s: %s', json_path, e.message)
|
|
cli.log.error('\t%s: %s', json_path, e.message)
|
|
continue
|
|
continue
|
|
|
|
|
|
- # Mark the layouts as coming from json
|
|
|
|
- for layout in new_info_data.get('layouts', {}).values():
|
|
|
|
- layout['c_macro'] = False
|
|
|
|
|
|
+ # Merge layout data in
|
|
|
|
+ for layout_name, layout in new_info_data.get('layouts', {}).items():
|
|
|
|
+ if layout_name in info_data['layouts']:
|
|
|
|
+ for new_key, existing_key in zip(layout['layout'], info_data['layouts'][layout_name]['layout']):
|
|
|
|
+ existing_key.update(new_key)
|
|
|
|
+ else:
|
|
|
|
+ layout['c_macro'] = False
|
|
|
|
+ info_data['layouts'][layout_name] = layout
|
|
|
|
|
|
# Update info_data with the new data
|
|
# Update info_data with the new data
|
|
|
|
+ if 'layouts' in new_info_data:
|
|
|
|
+ del (new_info_data['layouts'])
|
|
|
|
+
|
|
deep_update(info_data, new_info_data)
|
|
deep_update(info_data, new_info_data)
|
|
|
|
|
|
return info_data
|
|
return info_data
|