@@ -191,30 +191,8 @@ def print_board( # pylint: disable=too-many-locals
191191 ghost_keys : Sequence [int ] | None = None ,
192192 ) -> None :
193193 """Print SVG code representing the keymap."""
194- layers = deepcopy (self .keymap .layers )
195- if draw_layers :
196- assert all (l in layers for l in draw_layers ), "Some layer names selected for drawing are not in the keymap"
197- layers = {name : layer for name , layer in layers .items () if name in draw_layers }
198-
199- if keys_only :
200- combos_per_layer : dict [str , list [ComboSpec ]] = {}
201- else :
202- combos_per_layer = self .keymap .get_combos_per_layer (layers )
203-
204- if combos_only :
205- layers = {
206- name : [LayoutKey () for _ in range (len (self .layout ))]
207- for name , combos in combos_per_layer .items ()
208- if combos
209- }
210-
211- if ghost_keys :
212- for key_position in ghost_keys :
213- assert (
214- 0 <= key_position < len (self .layout )
215- ), "Some key positions for `ghost_keys` are negative or too large for the layout"
216- for layer in layers .values ():
217- layer [key_position ].type = "ghost"
194+ # get final set of layers and combos per layer given the drawing options
195+ layers , combos_per_layer = _resolve_layers_combos (self .keymap , draw_layers , keys_only , combos_only , ghost_keys )
218196
219197 self .layer_names = set (layers )
220198
@@ -257,3 +235,42 @@ def print_board( # pylint: disable=too-many-locals
257235 self .print_footer (Point (board_w , board_h ))
258236
259237 self .output_stream .write ("</svg>\n " )
238+
239+
240+ def _resolve_layers_combos (
241+ keymap : KeymapData ,
242+ draw_layers : Sequence [str ] | None = None ,
243+ keys_only : bool = False ,
244+ combos_only : bool = False ,
245+ ghost_keys : Sequence [int ] | None = None ,
246+ ) -> tuple [dict [str , list [LayoutKey ]], dict [str , list [ComboSpec ]]]:
247+ layers = deepcopy (keymap .layers )
248+ if draw_layers :
249+ assert all (l in layers for l in draw_layers ), "Some layer names selected for drawing are not in the keymap"
250+ layers = {name : layer for name , layer in layers .items () if name in draw_layers }
251+
252+ if keys_only :
253+ combos_per_layer : dict [str , list [ComboSpec ]] = {}
254+ elif not layers :
255+ combos_per_layer = {"Combos" : keymap .combos }
256+ else :
257+ combos_per_layer = keymap .get_combos_per_layer (layers )
258+
259+ assert keymap .layout is not None
260+
261+ if combos_only or not layers :
262+ layers = {
263+ name : [LayoutKey () for _ in range (len (keymap .layout ))]
264+ for name , combos in combos_per_layer .items ()
265+ if combos
266+ }
267+
268+ if ghost_keys :
269+ for key_position in ghost_keys :
270+ assert (
271+ 0 <= key_position < len (keymap .layout )
272+ ), "Some key positions for `ghost_keys` are negative or too large for the layout"
273+ for layer in layers .values ():
274+ layer [key_position ].type = "ghost"
275+
276+ return layers , combos_per_layer
0 commit comments