|
19 | 19 | from keymap_drawer.parse import KanataKeymapParser, QmkJsonParser, ZmkKeymapParser |
20 | 20 |
|
21 | 21 |
|
| 22 | +def _merge_keymaps(base: dict, new: dict) -> dict: |
| 23 | + return { |
| 24 | + "layout": base.get("layout", {}) or new.get("layout", {}), # override layout |
| 25 | + "layers": base.get("layers", {}) | new.get("layers", {}), # merge layers |
| 26 | + "combos": base.get("combos", []) + new.get("combos", []), # append combos |
| 27 | + "draw_config": base.get("draw_config", {}) | new.get("draw_config", {}), # merge config |
| 28 | + } |
| 29 | + |
| 30 | + |
22 | 31 | def draw(args: Namespace, config: Config) -> None: |
23 | 32 | """Draw the keymap in SVG format to stdout.""" |
24 | | - yaml_data = yaml.safe_load(args.keymap_yaml) |
25 | | - assert "layers" in yaml_data, 'Keymap needs to be specified via the "layers" field in keymap_yaml' |
| 33 | + yaml_data: dict[str, dict] = {} |
| 34 | + for yaml_arg in args.keymap_yaml: |
| 35 | + yaml_data = _merge_keymaps(yaml_data, yaml.safe_load(yaml_arg)) |
26 | 36 |
|
27 | 37 | cli_layout = { |
28 | 38 | k: v |
@@ -189,8 +199,9 @@ def main() -> None: |
189 | 199 | draw_p.add_argument( |
190 | 200 | "keymap_yaml", |
191 | 201 | help='YAML file (or stdin for "-") containing keymap definition with layers and (optionally) combos, ' |
192 | | - "see README for schema", |
| 202 | + "see README for schema. Can specify multiple files, which are merged together before drawing", |
193 | 203 | type=FileType("rt", encoding="utf-8"), |
| 204 | + nargs="+", |
194 | 205 | ) |
195 | 206 | draw_p.add_argument( |
196 | 207 | "-o", |
|
0 commit comments