diff options
| author | Jules Aguillon | 2024-07-21 23:37:07 +0200 |
|---|---|---|
| committer | GitHub | 2024-07-21 23:37:07 +0200 |
| commit | 2696f42144f42b1c4c270555047d40095693d3c4 (patch) | |
| tree | c72d45eaeb3f517c3450ba134b26d08f5022bb3d /srcs/compose | |
| parent | 84e10e047012f55d6c2ba2a2c53da93cc9ac00e4 (diff) | |
| download | unexpected-keyboard-2696f42144f42b1c4c270555047d40095693d3c4.tar.gz unexpected-keyboard-2696f42144f42b1c4c270555047d40095693d3c4.zip | |
Allow extending the compose key (#713)
This allows adding more compose sequences without modifying
en_US_UTF_8_Compose.pre.
This is done by grouping sequences files that should be merged together
into a directory. This also allows moving keysymdef.h into that
directory.
Diffstat (limited to 'srcs/compose')
| -rw-r--r-- | srcs/compose/README.md | 4 | ||||
| -rw-r--r-- | srcs/compose/compile.py | 36 | ||||
| -rw-r--r-- | srcs/compose/compose/en_US_UTF_8_Compose.pre (renamed from srcs/compose/en_US_UTF_8_Compose.pre) | 0 | ||||
| -rw-r--r-- | srcs/compose/compose/extra.json | 5 | ||||
| -rw-r--r-- | srcs/compose/compose/keysymdef.h (renamed from srcs/compose/keysymdef.h) | 0 |
5 files changed, 35 insertions, 10 deletions
diff --git a/srcs/compose/README.md b/srcs/compose/README.md index a3cfdb3..fff4941 100644 --- a/srcs/compose/README.md +++ b/srcs/compose/README.md @@ -3,6 +3,8 @@ The `compose.py` program parses the compose sequences found in this directory and generates `srcs/juloo.keyboard2/ComposeKeyData.java`. -## `en_US_UTF_8_Compose.pre` +## `compose/en_US_UTF_8_Compose.pre` This file is copied from the `xorg` project. Copyright applies. + +## `compose/extra.json` diff --git a/srcs/compose/compile.py b/srcs/compose/compile.py index 74fee79..fe4fe9f 100644 --- a/srcs/compose/compile.py +++ b/srcs/compose/compile.py @@ -12,20 +12,18 @@ from array import array # Parse symbol names from keysymdef.h. Many compose sequences in # en_US_UTF_8_Compose.pre reference theses. For example, all the sequences on # the Greek, Cyrillic and Hebrew scripts need these symbols. -def parse_keysymdef_h(): - with open(os.path.join(os.path.dirname(__file__), "keysymdef.h"), "r") as inp: +def parse_keysymdef_h(fname): + with open(fname, "r") as inp: keysym_re = re.compile(r'^#define XK_(\S+)\s+\S+\s*/\*.U\+([0-9a-fA-F]+)\s') for line in inp: m = re.match(keysym_re, line) if m != None: yield (m.group(1), chr(int(m.group(2), 16))) -xkb_char_extra_names = dict(parse_keysymdef_h()) - dropped_sequences = 0 # Parse XKB's Compose.pre files -def parse_sequences_file_xkb(fname): +def parse_sequences_file_xkb(fname, xkb_char_extra_names): # Parse a line of the form: # <Multi_key> <minus> <space> : "~" asciitilde # TILDE # Sequences not starting with <Multi_key> are ignored. @@ -99,13 +97,30 @@ def parse_sequences_file_json(fname): return list(seqs.items()) # Format of the sequences file is determined by its extension -def parse_sequences_file(fname): +def parse_sequences_file(fname, xkb_char_extra_names={}): if fname.endswith(".pre"): - return parse_sequences_file_xkb(fname) + return parse_sequences_file_xkb(fname, xkb_char_extra_names) if fname.endswith(".json"): return parse_sequences_file_json(fname) raise Exception(fname + ": Unsupported format") +# A sequence directory can contain several sequence files as well as +# 'keysymdef.h'. +def parse_sequences_dir(dname): + compose_files = [] + xkb_char_extra_names = {} + # Parse keysymdef.h first if present + for fbasename in os.listdir(dname): + fname = os.path.join(dname, fbasename) + if fbasename == "keysymdef.h": + xkb_char_extra_names = dict(parse_keysymdef_h(fname)) + else: + compose_files.append(fname) + sequences = [] + for fname in compose_files: + sequences.extend(parse_sequences_file(fname, xkb_char_extra_names)) + return sequences + # Turn a list of sequences into a trie. def add_sequences_to_trie(seqs, trie): def add_seq_to_trie(t_, seq, result): @@ -238,9 +253,12 @@ public final class ComposeKeyData total_sequences = 0 tries = {} # Orderred dict -for fname in sys.argv[1:]: +for fname in sorted(sys.argv[1:]): tname, _ = os.path.splitext(os.path.basename(fname)) - sequences = parse_sequences_file(fname) + if os.path.isdir(fname): + sequences = parse_sequences_dir(fname) + else: + sequences = parse_sequences_file(fname) add_sequences_to_trie(sequences, tries.setdefault(tname, {})) total_sequences += len(sequences) entry_states, automata = make_automata(tries) diff --git a/srcs/compose/en_US_UTF_8_Compose.pre b/srcs/compose/compose/en_US_UTF_8_Compose.pre index 680f4fa..680f4fa 100644 --- a/srcs/compose/en_US_UTF_8_Compose.pre +++ b/srcs/compose/compose/en_US_UTF_8_Compose.pre diff --git a/srcs/compose/compose/extra.json b/srcs/compose/compose/extra.json new file mode 100644 index 0000000..26adcdc --- /dev/null +++ b/srcs/compose/compose/extra.json @@ -0,0 +1,5 @@ +{ + "V": { + "s": "Š" + } +} diff --git a/srcs/compose/keysymdef.h b/srcs/compose/compose/keysymdef.h index 1965381..1965381 100644 --- a/srcs/compose/keysymdef.h +++ b/srcs/compose/compose/keysymdef.h |
