Skip to content

Commit

Permalink
decouple the SVG and JSON outputs
Browse files Browse the repository at this point in the history
  • Loading branch information
fabi1cazenave committed Mar 9, 2024
1 parent ad50f54 commit 256fb47
Showing 1 changed file with 45 additions and 44 deletions.
89 changes: 45 additions & 44 deletions kalamine/generators/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,12 @@
from ..utils import LAYER_KEYS, ODK_ID, SCAN_CODES, Layer, upper_key


def _web_keymap(layout: "KeyboardLayout") -> Dict[str, List[str]]:
"""Web layout, main part.
Returns
-------
dict[str, list[str]]
A dict whose keys are key ids and values are list of characters (length 2-4).
"""
def json(layout: "KeyboardLayout") -> Dict:
"""JSON layout descriptor"""

keymap = {}
# flatten the keymap: each key has an array of 2-4 characters
# correcponding to Base, Shift, AltGr, AltGr+Shift
keymap: Dict[str, List[str]] = {}
for key_name in LAYER_KEYS:
if key_name.startswith("-"):
continue
Expand All @@ -34,17 +30,12 @@ def _web_keymap(layout: "KeyboardLayout") -> Dict[str, List[str]]:
if chars:
keymap[SCAN_CODES["web"][key_name]] = chars

return keymap


def json(layout: "KeyboardLayout") -> Dict:
"""JSON layout descriptor"""
return {
# fmt: off
"name": layout.meta["name"],
"description": layout.meta["description"],
"geometry": layout.meta["geometry"].lower(),
"keymap": _web_keymap(layout),
"keymap": keymap,
"deadkeys": layout.dead_keys,
"altgr": layout.has_altgr,
# fmt: on
Expand All @@ -58,13 +49,6 @@ def svg(layout: "KeyboardLayout") -> ET.ElementTree:
ET.register_namespace("", svg_ns)
ns = {"": svg_ns}

# Parse the SVG template
# res = pkgutil.get_data(__package__, "templates/x-keyboard.svg")
res = pkgutil.get_data("kalamine", "templates/x-keyboard.svg")
if res is None:
return ET.ElementTree()
svg = ET.ElementTree(ET.fromstring(res.decode("utf-8")))

def set_key_label(key: ET.Element, lvl: int, char: str) -> None:
for label in key.findall(f'g/text[@class="level{lvl}"]', ns):
if char not in layout.dead_keys:
Expand All @@ -78,27 +62,44 @@ def set_key_label(key: ET.Element, lvl: int, char: str) -> None:
label.text = char[-1]
label.set("class", f"{label.get('class')} deadKey")

# Fill-in with layout
for name, chars in _web_keymap(layout).items():
for key in svg.findall(f'.//g[@id="{name}"]', ns):

# Print 1-4 level chars
for level_num, char in enumerate(chars, start=1):
if level_num == 1:
if chars[1] == upper_key(chars[0], blank_if_obvious=False):
continue
if level_num == 4:
if chars[3] == upper_key(chars[2], blank_if_obvious=False):
continue
set_key_label(key, level_num, char)

# Print 5-6 levels (1dk deadkeys)
if layout.dead_keys and (odk := layout.dead_keys.get(ODK_ID)):
level5 = odk.get(chars[0])
level6 = odk.get(chars[1])
if level5:
set_key_label(key, 5, level5)
if level6 and level6 != upper_key(level5, blank_if_obvious=False):
set_key_label(key, 6, level6)
def same_symbol(key_name: str, lower: Layer, upper: Layer):
up = layout.layers[upper]
low = layout.layers[lower]
if key_name not in up or key_name not in low:
return False
return up[key_name] == upper_key(low[key_name], blank_if_obvious=False)

# Parse the SVG template
# res = pkgutil.get_data(__package__, "templates/x-keyboard.svg")
res = pkgutil.get_data("kalamine", "templates/x-keyboard.svg")
if res is None:
return ET.ElementTree()
svg = ET.ElementTree(ET.fromstring(res.decode("utf-8")))

for key_name in LAYER_KEYS:
if key_name.startswith("-"):
continue

level = 0
for i in [
Layer.BASE,
Layer.SHIFT,
Layer.ALTGR,
Layer.ALTGR_SHIFT,
Layer.ODK,
Layer.ODK_SHIFT,
]:
level += 1
if key_name not in layout.layers[i]:
continue
if level == 1 and same_symbol(key_name, Layer.BASE, Layer.SHIFT):
continue
if level == 4 and same_symbol(key_name, Layer.ALTGR, Layer.ALTGR_SHIFT):
continue
if level == 6 and same_symbol(key_name, Layer.ODK, Layer.ODK_SHIFT):
continue

key = svg.find(f".//g[@id=\"{SCAN_CODES['web'][key_name]}\"]", ns)
set_key_label(key, level, layout.layers[i][key_name])

return svg

0 comments on commit 256fb47

Please sign in to comment.