Skip to content

Commit a38637f

Browse files
committed
feat: Accept multiple keymap YAMLs to be combined
1 parent c53c895 commit a38637f

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

.github/workflows/draw-zmk.yml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ on:
3030
draw_args:
3131
description: "Map of keyboard names to extra `keymap draw` args, e.g. `corne:'-k corne_rotated -l LAYOUT_split_3x5_3'`"
3232
type: string
33+
extra_keymap_yaml:
34+
description: "Map of keyboard names to extra keymap YAMLs to be passed to `keymap draw` after the parsed one, e.g. `corne:'keymap-drawer/extra_combos.yaml'`"
35+
type: string
3336
commit_message:
3437
description: 'Commit message for updated images. Ignored if `amend_commit` is `true`.'
3538
type: string
@@ -142,10 +145,12 @@ jobs:
142145
keyboard=$(basename -s .keymap "$keymap_file")
143146
echo "INFO: drawing for $keyboard"
144147
145-
IFS=" " read -r -a parse_args <<< "$(get_args "${{ inputs.parse_args }}" "$keyboard")"
146-
echo "INFO: got extra parse args:" "${parse_args[@]}"
147-
IFS=" " read -r -a draw_args <<< "$(get_args "${{ inputs.draw_args }}" "$keyboard")"
148-
echo "INFO: got extra draw args:" "${draw_args[@]}"
148+
IFS=" " read -r -a parse_args <<< "$(get_args "${{ inputs.parse_args }}" "$keyboard")"
149+
echo "INFO: got extra parse args:" "${parse_args[@]}"
150+
IFS=" " read -r -a draw_args <<< "$(get_args "${{ inputs.draw_args }}" "$keyboard")"
151+
echo "INFO: got extra draw args:" "${draw_args[@]}"
152+
IFS=" " read -r -a extra_keymap_yaml <<< "$(get_args "${{ inputs.extra_keymap_yaml }}" "$keyboard")"
153+
echo "INFO: got extra keymap YAML args:" "${extra_keymap_yaml[@]}"
149154
150155
json_path="${{ inputs.json_path }}"
151156
if [ -n "$json_path" ] && [ -f "$json_path/${keyboard}.json" ]; then
@@ -165,7 +170,7 @@ jobs:
165170
continue
166171
fi
167172
168-
if keymap $debug_arg "${config_arg[@]}" draw "${{ inputs.output_folder }}/$keyboard.yaml" "${draw_args[@]}" >"$tmp_svg"; then
173+
if keymap $debug_arg "${config_arg[@]}" draw "${{ inputs.output_folder }}/$keyboard.yaml" "${extra_keymap_yaml[@]}" "${draw_args[@]}" >"$tmp_svg"; then
169174
mv "$tmp_svg" "${{ inputs.output_folder }}/$keyboard.svg"
170175
artifacts+=("${{ inputs.output_folder }}/$keyboard.svg")
171176
else

keymap_drawer/__main__.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,20 @@
1919
from keymap_drawer.parse import KanataKeymapParser, QmkJsonParser, ZmkKeymapParser
2020

2121

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+
2231
def draw(args: Namespace, config: Config) -> None:
2332
"""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))
2636

2737
cli_layout = {
2838
k: v
@@ -189,8 +199,9 @@ def main() -> None:
189199
draw_p.add_argument(
190200
"keymap_yaml",
191201
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",
193203
type=FileType("rt", encoding="utf-8"),
204+
nargs="+",
194205
)
195206
draw_p.add_argument(
196207
"-o",

0 commit comments

Comments
 (0)