Skip to content

Commit

Permalink
cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
fabi1cazenave committed Jan 31, 2024
1 parent cf9424c commit d81ef0a
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 167 deletions.
75 changes: 4 additions & 71 deletions kalamine/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,11 +144,8 @@ def __init__(self, filepath):

# initialize a blank layout
self.layers = [{}, {}, {}, {}, {}, {}]
self.new_dead_keys = {} # dictionary subset of DEAD_KEYS
self.dk_set = set()
self.new_dk_index = [] # ordered keys of the above dictionary
self.dead_keys = {} # dictionary subset of DEAD_KEYS
self.dk_index = [] # ordered keys of the above dictionary
self.meta = CONFIG.copy() # default parameters, hardcoded
self.has_altgr = False
self.has_1dk = False
Expand Down Expand Up @@ -196,9 +193,6 @@ def __init__(self, filepath):
self.has_altgr = True
self._parse_template(text_to_lines(cfg["altgr"]), rows, Layer.ALTGR)

# self.has_1dk = ODK_ID in self.new_dead_keys
# print(self.dk_set)

# space bar
spc = SPACEBAR.copy()
if "spacebar" in cfg:
Expand All @@ -215,67 +209,11 @@ def __init__(self, filepath):
self.layers[Layer.ALTGR]["spce"] = spc["altgr"]
self.layers[Layer.ALTGR_SHIFT]["spce"] = spc["altgr_shift"]

self._old_parse_dead_keys(spc)
self._parse_dead_keys(spc)
# print(self.new_dead_keys)

def _old_parse_dead_keys(self, spc):
"""Build a deadkey dict."""

# active dead keys: self.dk_index
for dk in DEAD_KEYS:
if dk["char"] in self.dead_keys:
self.dk_index.append(dk["char"])

# remove unused characters in self.dead_keys[].{base,alt}
def layer_has_char(char, layer_index):
for id in self.layers[layer_index]:
if self.layers[layer_index][id] == char:
return True
return False

for dk_id in self.dead_keys:
base = self.dead_keys[dk_id]["base"]
alt = self.dead_keys[dk_id]["alt"]
used_base = ""
used_alt = ""
for i in range(len(base)):
if layer_has_char(base[i], Layer.BASE) or layer_has_char(
base[i], Layer.SHIFT
):
used_base += base[i]
used_alt += alt[i]
self.dead_keys[dk_id]["base"] = used_base
self.dead_keys[dk_id]["alt"] = used_alt

# 1dk behavior
if ODK_ID in self.dead_keys:
self.has_1dk = True
odk = self.dead_keys[ODK_ID]

# alt_self (double-press), alt_space (1dk+space)
odk["alt_space"] = spc["1dk"] # spc["1dk"]
for key in self.layers[Layer.BASE]:
if self.layers[Layer.BASE][key] == ODK_ID:
odk["alt_self"] = self.layers[Layer.ODK][key]
break

# copy the 2nd and 3rd layers to the dead key
for i in [Layer.BASE, Layer.SHIFT]:
for name, alt_char in self.layers[i + Layer.ODK].items():
base_char = self.layers[i][name]
if name != "spce" and base_char != ODK_ID:
odk["base"] += base_char
odk["alt"] += alt_char

def _parse_dead_keys(self, spc):
"""Build a deadkey dict."""

# # active dead keys: self.dk_index
# for dk in DEAD_KEYS:
# if dk["char"] in self.dk_set:
# self.dk_index.append(dk["char"])

def layout_has_char(char):
all_layers = [Layer.BASE, Layer.SHIFT]
if self.has_altgr:
Expand All @@ -292,14 +230,14 @@ def layout_has_char(char):
if layout_has_char(space):
all_spaces.append(space)

self.new_dead_keys = {}
self.dead_keys = {}
for dk in DEAD_KEYS:
id = dk["char"]
if id not in self.dk_set:
continue

self.new_dead_keys[id] = {}
deadkey = self.new_dead_keys[id]
self.dead_keys[id] = {}
deadkey = self.dead_keys[id]
deadkey[id] = dk["alt_self"]

if id == ODK_ID:
Expand Down Expand Up @@ -358,13 +296,8 @@ def _parse_template(self, template, rows, layer_number):
if shift_key != " ":
self.layers[layer_number + 1][key] = shift_key

# XXX building a deadkey_index would be enough
for dk in DEAD_KEYS:
if base_key == dk["char"]:
self.dead_keys[base_key] = dk.copy()
self.dk_set.add(dk["char"])
if shift_key == dk["char"]:
self.dead_keys[shift_key] = dk.copy()
if base_key == dk["char"] or shift_key == dk["char"]:
self.dk_set.add(dk["char"])

i += 6
Expand Down
89 changes: 31 additions & 58 deletions kalamine/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def xkb_keymap(layout, xkbcomp=False):
# dead key?
if keysym in DK_INDEX:
name = DK_INDEX[keysym]["name"]
desc = layout.new_dead_keys[keysym][keysym]
desc = layout.dead_keys[keysym][keysym]
symbol = odk_symbol if keysym == ODK_ID else f"dead_{name}"
# regular key: use a keysym if possible, utf-8 otherwise
elif keysym in XKB_KEY_SYM and len(XKB_KEY_SYM[keysym]) <= max_length:
Expand Down Expand Up @@ -126,7 +126,7 @@ def ahk_escape(key):

def ahk_actions(symbol):
actions = {}
for key, dk in layout.new_dead_keys.items():
for key, dk in layout.dead_keys.items():
dk_id = ahk_escape(key)
if symbol == "spce":
actions[dk_id] = ahk_escape(dk[" "])
Expand Down Expand Up @@ -155,8 +155,8 @@ def ahk_actions(symbol):
symbol = layer[key_name]
sym = ahk_escape(symbol)

if symbol in layout.new_dead_keys:
actions = {sym: layout.new_dead_keys[symbol][symbol]}
if symbol in layout.dead_keys:
actions = {sym: layout.dead_keys[symbol][symbol]}
elif key_name == "spce":
actions = ahk_actions(key_name)
else:
Expand Down Expand Up @@ -238,8 +238,8 @@ def klc_keymap(layout):
if key_name in layer:
symbol = layer[key_name]
desc = symbol
if symbol in layout.new_dead_keys:
desc = layout.new_dead_keys[symbol][" "]
if symbol in layout.dead_keys:
desc = layout.dead_keys[symbol][" "]
symbol = hex_ord(desc) + "@"
else:
if i == Layer.BASE:
Expand Down Expand Up @@ -292,9 +292,9 @@ def klc_deadkeys(layout):
output = []

for k in DK_INDEX:
if k not in layout.new_dead_keys:
if k not in layout.dead_keys:
continue
dk = layout.new_dead_keys[k]
dk = layout.dead_keys[k]

output.append(f"// DEADKEY: {DK_INDEX[k]['name'].upper()} //" + "{{{")
output.append(f"DEADKEY\t{hex_ord(dk[' '])}")
Expand All @@ -303,11 +303,11 @@ def klc_deadkeys(layout):
if base == k:
continue

if base in layout.new_dead_keys:
base = layout.new_dead_keys[base][" "]
if base in layout.dead_keys:
base = layout.dead_keys[base][" "]

if alt in layout.new_dead_keys:
alt = layout.new_dead_keys[alt][" "]
if alt in layout.dead_keys:
alt = layout.dead_keys[alt][" "]
ext = hex_ord(alt) + "@"
else:
ext = hex_ord(alt)
Expand All @@ -325,9 +325,9 @@ def klc_dk_index(layout):

output = []
for k in DK_INDEX:
if k not in layout.new_dead_keys:
if k not in layout.dead_keys:
continue
dk = layout.new_dead_keys[k]
dk = layout.dead_keys[k]
output.append(f"{hex_ord(dk[' '])}\t\"{DK_INDEX[k]['name'].upper()}\"")
return output

Expand All @@ -351,8 +351,8 @@ def osx_keymap(layout):
def has_dead_keys(letter):
if letter in "\u0020\u00a0\u202f": # space
return True
for k in layout.new_dead_keys:
if letter in layout.new_dead_keys[k]:
for k in layout.dead_keys:
if letter in layout.dead_keys[k]:
return True
return False

Expand All @@ -372,7 +372,7 @@ def has_dead_keys(letter):

if key_name in layer:
key = layer[key_name]
if key in layout.new_dead_keys:
if key in layout.dead_keys:
symbol = f"dead_{DK_INDEX[key]['name']}"
final_key = False
else:
Expand All @@ -397,7 +397,7 @@ def osx_actions(layout):

def when(state, action):
state_attr = f'state="{state}"'.ljust(18)
if action in layout.new_dead_keys:
if action in layout.dead_keys:
action_attr = f"next=\"{DK_INDEX[action]['name']}\""
elif action.startswith("dead_"):
action_attr = f'next="{action[5:]}"'
Expand All @@ -413,12 +413,12 @@ def append_actions(symbol, actions):
ret_actions.append("</action>")

# dead key definitions
for key in layout.new_dead_keys:
for key in layout.dead_keys:
name = DK_INDEX[key]["name"]
term = layout.new_dead_keys[key][key]
term = layout.dead_keys[key][key]
ret_actions.append(f'<action id="dead_{name}">')
ret_actions.append(f' <when state="none" next="{name}" />')
if name == "1dk" and term in layout.new_dead_keys:
if name == "1dk" and term in layout.dead_keys:
nested_dk = DK_INDEX[term]["name"]
ret_actions.append(f' <when state="1dk" next="{nested_dk}" />')
ret_actions.append("</action>")
Expand All @@ -438,24 +438,24 @@ def append_actions(symbol, actions):
key = layout.layers[i][key_name]
if i and key == layout.layers[0][key_name]:
continue
if key in layout.new_dead_keys:
if key in layout.dead_keys:
continue

actions = []
for k in DK_INDEX:
if k in layout.new_dead_keys:
if key in layout.new_dead_keys[k]:
if k in layout.dead_keys:
if key in layout.dead_keys[k]:
actions.append(
(DK_INDEX[k]["name"], layout.new_dead_keys[k][key])
(DK_INDEX[k]["name"], layout.dead_keys[k][key])
)
if actions:
append_actions(xml_proof(key), actions)

# spacebar actions
actions = []
for k in DK_INDEX:
if k in layout.new_dead_keys:
actions.append((DK_INDEX[k]["name"], layout.new_dead_keys[k][" "]))
if k in layout.dead_keys:
actions.append((DK_INDEX[k]["name"], layout.dead_keys[k][" "]))
append_actions("&#x0020;", actions) # space
append_actions("&#x00a0;", actions) # no-break space
append_actions("&#x202f;", actions) # fine no-break space
Expand All @@ -468,12 +468,12 @@ def osx_terminators(layout):

ret_terminators = []
for key in DK_INDEX:
if key not in layout.new_dead_keys:
if key not in layout.dead_keys:
continue
dk = layout.new_dead_keys[key]
dk = layout.dead_keys[key]
name = DK_INDEX[key]["name"]
term = dk[key]
if name == "1dk" and term in layout.new_dead_keys:
if name == "1dk" and term in layout.dead_keys:
term = dk[" "]
state = f'state="{name}"'.ljust(18)
output = f'output="{xml_proof(term)}"'
Expand Down Expand Up @@ -520,31 +520,4 @@ def web_deadkeys(layout: "KeyboardLayout") -> Dict[str, Dict[str, str]]:
A dict whose keys are deadkeys and values are key mapping.
"""

deadkeys = {}
if layout.has_1dk: # ensure 1dk is first in the dead key dictionary
deadkeys[ODK_ID] = {}

for id, dk in layout.dead_keys.items():
deadkeys[id] = {}
deadkeys[id][id] = dk["alt_self"]
deadkeys[id]["\u0020"] = dk["alt_space"]
deadkeys[id]["\u00a0"] = dk["alt_space"]
deadkeys[id]["\u202f"] = dk["alt_space"]

if id == ODK_ID:
for key_name in LAYER_KEYS:
if key_name.startswith("-"):
continue
for i in [Layer.ODK_SHIFT, Layer.ODK]:
if key_name in layout.layers[i]:
deadkeys[id][
layout.layers[i - Layer.ODK][key_name]
] = layout.layers[i][key_name]

else:
base = dk["base"]
alt = dk["alt"]
for i in range(len(base)):
deadkeys[id][base[i]] = alt[i]

return deadkeys
return layout.dead_keys
Loading

0 comments on commit d81ef0a

Please sign in to comment.