From 39b3f50aa31df9786e4a10a27633137a4369f6ae Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Wed, 29 May 2024 15:02:08 +0200 Subject: [PATCH] Allow compose sequence ending with more symbols Change the compose state machine definition to allow final states that are wider than 16-bits. This increases the number of sequences that can be used from en_US_UTF_8_Compose.pre from 2013 to 2043 (of 3201). --- srcs/compose/compile.py | 16 +++++--- srcs/juloo.keyboard2/ComposeKey.java | 49 +++++++++++++++-------- srcs/juloo.keyboard2/ComposeKeyData.java | Bin 52399 -> 55996 bytes 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/srcs/compose/compile.py b/srcs/compose/compile.py index 1e60ae8..2cb060e 100644 --- a/srcs/compose/compile.py +++ b/srcs/compose/compile.py @@ -64,11 +64,6 @@ def parse_sequences_file_xkb(fname): def parse_seq_result(r): if len(r) == 2 and r[0] == '\\': return r[1] - # The state machine can't represent characters that do not fit in a - # 16-bit char. This breaks some sequences that output letters with - # combined diacritics or emojis. - if len(r) > 1 or ord(r[0]) > 65535: - raise Exception("Char out of range: " + r) return r # Populate [char_names] with the information present in the file. with open(fname, "r") as inp: @@ -146,7 +141,15 @@ def make_automata(tree_root): states[i] = (c, node_i) i += 1 def add_leaf(c): - states.append((c, 1)) + # There are two encoding for leafs: character final state for 15-bit + # characters and string final state for the rest. + if len(c) > 1 or ord(c[0]) > 32767: # String final state + cb = c.encode("UTF-16") + states.append((-1, len(cb) + 1)) + for c in cb: + states.append((c, 0)) + else: # Character final state + states.append((c, 1)) def add_node(n): if type(n) == str: add_leaf(n) @@ -169,6 +172,7 @@ def gen_java(machine): chars_map = { # These characters cannot be used in unicode form as Java's parser # unescape unicode sequences before parsing. + -1: "\\uFFFF", "\"": "\\\"", "\\": "\\\\", "\n": "\\n", diff --git a/srcs/juloo.keyboard2/ComposeKey.java b/srcs/juloo.keyboard2/ComposeKey.java index ef5a7f2..328bb83 100644 --- a/srcs/juloo.keyboard2/ComposeKey.java +++ b/srcs/juloo.keyboard2/ComposeKey.java @@ -27,31 +27,48 @@ public final class ComposeKey } /** Apply the pending compose sequence to char [c]. */ - static KeyValue apply(int state, char c) + static KeyValue apply(int prev, char c) { char[] states = ComposeKeyData.states; char[] edges = ComposeKeyData.edges; - int length = edges[state]; - int next = Arrays.binarySearch(states, state + 1, state + length, c); + int prev_length = edges[prev]; + int next = Arrays.binarySearch(states, prev + 1, prev + prev_length, c); if (next < 0) return null; next = edges[next]; - // The next state is the end of a sequence, show the result. - if (edges[next] == 1) - return KeyValue.makeCharKey(states[next]); - return KeyValue.makeComposePending(String.valueOf(c), next, 0); + char next_header = states[next]; + if (next_header == 0) // Enter a new intermediate state. + return KeyValue.makeComposePending(String.valueOf(c), next, 0); + else if (next_header > 0) // Character final state. + return KeyValue.makeCharKey(next_header); + else // next_header is < 0, string final state. + { + int next_length = edges[next]; + return KeyValue.makeStringKey( + new String(states, next + 1, next + next_length)); + } } - /** The [states] array represents the different states and their transition. - A state occupies one or several cells of the array: - - The first cell is the result of the compose sequence if the state is of - size 1, unspecified otherwise. - - The remaining cells are the transitions, sorted alphabetically. + /** The state machine is comprised of two arrays. + + The [states] array represents the different states and the associated + transitions: + - The first cell is the header cell, [states[s]]. + - If the header is equal to [0], + The remaining cells are the transitions characters, sorted + alphabetically. + - If the header is positive, + This is a final state, [states[s]] is the result of the sequence. + In this case, [edges[s]] must be equal to [1]. + - If the header is equal to [-1], + This is a final state, the remaining cells represent the result string + which starts at index [s + 1] and has a length of [edges[s] - 1]. The [edges] array represents the transition state corresponding to each accepted inputs. - Id [states[i]] is the first cell of a state, [edges[i]] is the number of - cells occupied by the state [i]. - If [states[i]] is a transition, [edges[i]] is the index of the state to - jump into. */ + - If [states[s]] is a header cell, [edges[s]] is the number of cells + occupied by the state [s], including the header cell. + - If [states[s]] is a transition, [edges[s]] is the index of the state to + jump into. + - If [states[s]] is a part of a final state, [edges[s]] is not used. */ } diff --git a/srcs/juloo.keyboard2/ComposeKeyData.java b/srcs/juloo.keyboard2/ComposeKeyData.java index 999b397d16d5437b8a958cbeedd6e975ab477b37..2fbe4d02b8bc21dfb8ca2c09da469d1c1ee1b719 100644 GIT binary patch literal 55996 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 literal 52399 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