diff options
| author | Jules Aguillon | 2024-03-02 19:12:37 +0100 |
|---|---|---|
| committer | Jules Aguillon | 2024-03-02 19:12:37 +0100 |
| commit | 940cf0deb8e71121bcebdba2a063c3c4e2602197 (patch) | |
| tree | b5ab58491ed19e96837dd841e16ae4c7b2830813 /srcs/compose | |
| parent | c2d5b14261be61323277c24bdb90828e7c3a997a (diff) | |
| download | unexpected-keyboard-940cf0deb8e71121bcebdba2a063c3c4e2602197.tar.gz unexpected-keyboard-940cf0deb8e71121bcebdba2a063c3c4e2602197.zip | |
compose: Parse json files and fix edge cases
There's no json file yet, this was part of an experiment.
Add a missing escape rule and detect colliding sequences.
Diffstat (limited to 'srcs/compose')
| -rw-r--r-- | srcs/compose/compile.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/srcs/compose/compile.py b/srcs/compose/compile.py index 82c600e..1e60ae8 100644 --- a/srcs/compose/compile.py +++ b/srcs/compose/compile.py @@ -1,4 +1,4 @@ -import textwrap, sys, re, string +import textwrap, sys, re, string, json # Names not defined in Compose.pre xkb_char_extra_names = { @@ -89,25 +89,42 @@ def parse_sequences_file_xkb(fname): seqs.append(s) return seqs +# Parse from a json file containing a dictionary sequence → result string. +def parse_sequences_file_json(fname): + with open(fname, "r") as inp: + seqs = json.load(inp) + return list(seqs.items()) + # Format of the sequences file is determined by its extension def parse_sequences_file(fname): if fname.endswith(".pre"): return parse_sequences_file_xkb(fname) + if fname.endswith(".json"): + return parse_sequences_file_json(fname) raise Exception(fname + ": Unsupported format") # Turn a list of sequences into a trie. def add_sequences_to_trie(seqs, trie): - for seq, result in seqs: + def add_seq_to_trie(t_, seq, result): t_ = trie i = 0 while i < len(seq) - 1: c = seq[i] if c not in t_: t_[c] = {} + if isinstance(t_[c], str): + global dropped_sequences + dropped_sequences += 1 + print("Sequence collide: '%s = %s' '%s = %s'" % ( + seq[:i+1], t_[c], seq, result), + file=sys.stderr) + return t_ = t_[c] i += 1 c = seq[i] t_[c] = result + for seq, result in seqs: + add_seq_to_trie(trie, seq, result) # Compile the trie into a state machine. def make_automata(tree_root): @@ -155,9 +172,11 @@ def gen_java(machine): "\"": "\\\"", "\\": "\\\\", "\n": "\\n", + "\r": "\\r", ord("\""): "\\\"", ord("\\"): "\\\\", ord("\n"): "\\n", + ord("\r"): "\\r", } def char_repr(c): if c in chars_map: |
