diff --git a/data-scripts/build_keyboard_adjacency_graphs.py b/data-scripts/build_keyboard_adjacency_graphs.py index ea3fa35..4a8465d 100755 --- a/data-scripts/build_keyboard_adjacency_graphs.py +++ b/data-scripts/build_keyboard_adjacency_graphs.py @@ -1,4 +1,5 @@ #!/usr/bin/python +# coding: utf-8 import sys import json as simplejson @@ -10,21 +11,28 @@ def usage(): %s src/Matchers/adjacency_graphs.json ''' % sys.argv[0] -qwerty = r''' +qwerty = u''' `~ 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ qQ wW eE rR tT yY uU iI oO pP [{ ]} \| aA sS dD fF gG hH jJ kK lL ;: '" zZ xX cC vV bB nN mM ,< .> /? ''' -dvorak = r''' +azerty = u''' +œŒ“ &1´ é2~ "3# '4{ (5[ -6| è7` _8\\ ç9^ à0@ )°] =+} + aAâ zZå eE€ rRç tTþ yYý uUû iIî oOô pP¶ ^"~ $£ê + qQ sSø dDÊ fF± gGæ hHð jJÛ kKÎ lLÔ mM¹ ù%² *µ³ + <>| wW« xX» cC© vV® bBß nN¬ ,?¿ ;.× :/÷ !§¡ +''' + +dvorak = u''' `~ 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) [{ ]} '" ,< .> pP yY fF gG cC rR lL /? =+ \| aA oO eE uU iI dD hH tT nN sS -_ ;: qQ jJ kK xX bB mM wW vV zZ ''' -keypad = r''' +keypad = u''' / * - 7 8 9 + 4 5 6 @@ -32,7 +40,7 @@ def usage(): 0 . ''' -mac_keypad = r''' +mac_keypad = u''' = / * 7 8 9 - 4 5 6 + @@ -68,13 +76,21 @@ def build_graph(layout_str, slanted): token_size = len(tokens[0]) x_unit = token_size + 1 # x position unit len is token len plus 1 for the following whitespace. adjacency_func = get_slanted_adjacent_coords if slanted else get_aligned_adjacent_coords - assert all(len(token) == token_size for token in tokens), 'token len mismatch:\n ' + layout_str - for y, line in enumerate(layout_str.split('\n')): + for token in tokens: + assert len(token) == token_size, ( + u'token "%s" len mismatch (%d != %d):\n%s ' % ( + token, len(token), token_size, layout_str + ).encode('utf-8') + ) + for y, line in enumerate(layout_str.split(u'\n')): # the way I illustrated keys above, each qwerty row is indented one space in from the last slant = y - 1 if slanted else 0 for token in line.split(): x, remainder = divmod(line.index(token) - slant, x_unit) - assert remainder == 0, 'unexpected x offset for %s in:\n%s' % (token, layout_str) + assert remainder == 0, ( + u'unexpected x offset for %s (%d != 0) in:\n%s' % ( + token, remainder, layout_str) + ).encode('utf8') position_table[(x,y)] = token adjacency_graph = {} @@ -96,10 +112,11 @@ def build_graph(layout_str, slanted): with open(sys.argv[1], 'w') as f: data = { 'qwerty': build_graph(qwerty, True), + 'azerty': build_graph(azerty, True), 'dvorak': build_graph(dvorak, True), 'keypad': build_graph(keypad, False), 'mac_keypad': build_graph(mac_keypad, False), } - simplejson.dump(data, f) + f.write(simplejson.dumps(data, ensure_ascii=False).encode('utf8')) sys.exit(0) diff --git a/src/Matchers/SpatialMatch.php b/src/Matchers/SpatialMatch.php index 6de328b..ca9fc4b 100644 --- a/src/Matchers/SpatialMatch.php +++ b/src/Matchers/SpatialMatch.php @@ -209,6 +209,7 @@ public static function getAdjacencyGraphs(): array // can be found in multiple graphs (such as 789), the one that's listed first is that one that will be picked. $data = [ 'qwerty' => $data['qwerty'], + 'azerty' => $data['azerty'], 'dvorak' => $data['dvorak'], 'keypad' => $data['keypad'], 'mac_keypad' => $data['mac_keypad'], diff --git a/src/Matchers/adjacency_graphs.json b/src/Matchers/adjacency_graphs.json index ac651e6..e8c055b 100644 --- a/src/Matchers/adjacency_graphs.json +++ b/src/Matchers/adjacency_graphs.json @@ -1 +1 @@ -{"qwerty": {"$": ["3#", null, null, "5%", "rR", "eE"], "(": ["8*", null, null, "0)", "oO", "iI"], ",": ["mM", "kK", "lL", ".>", null, null], "0": ["9(", null, null, "-_", "pP", "oO"], "4": ["3#", null, null, "5%", "rR", "eE"], "8": ["7&", null, null, "9(", "iI", "uU"], "<": ["mM", "kK", "lL", ".>", null, null], "@": ["1!", null, null, "3#", "wW", "qQ"], "D": ["sS", "eE", "rR", "fF", "cC", "xX"], "H": ["gG", "yY", "uU", "jJ", "nN", "bB"], "L": ["kK", "oO", "pP", ";:", ".>", ",<"], "P": ["oO", "0)", "-_", "[{", ";:", "lL"], "T": ["rR", "5%", "6^", "yY", "gG", "fF"], "X": ["zZ", "sS", "dD", "cC", null, null], "\\": ["]}", null, null, null, null, null], "`": [null, null, null, "1!", null, null], "d": ["sS", "eE", "rR", "fF", "cC", "xX"], "h": ["gG", "yY", "uU", "jJ", "nN", "bB"], "l": ["kK", "oO", "pP", ";:", ".>", ",<"], "p": ["oO", "0)", "-_", "[{", ";:", "lL"], "t": ["rR", "5%", "6^", "yY", "gG", "fF"], "x": ["zZ", "sS", "dD", "cC", null, null], "|": ["]}", null, null, null, null, null], "#": ["2@", null, null, "4$", "eE", "wW"], "'": [";:", "[{", "]}", null, null, "/?"], "+": ["-_", null, null, null, "]}", "[{"], "/": [".>", ";:", "'\"", null, null, null], "3": ["2@", null, null, "4$", "eE", "wW"], "7": ["6^", null, null, "8*", "uU", "yY"], ";": ["lL", "pP", "[{", "'\"", "/?", ".>"], "?": [".>", ";:", "'\"", null, null, null], "C": ["xX", "dD", "fF", "vV", null, null], "G": ["fF", "tT", "yY", "hH", "bB", "vV"], "K": ["jJ", "iI", "oO", "lL", ",<", "mM"], "O": ["iI", "9(", "0)", "pP", "lL", "kK"], "S": ["aA", "wW", "eE", "dD", "xX", "zZ"], "W": ["qQ", "2@", "3#", "eE", "sS", "aA"], "[": ["pP", "-_", "=+", "]}", "'\"", ";:"], "_": ["0)", null, null, "=+", "[{", "pP"], "c": ["xX", "dD", "fF", "vV", null, null], "g": ["fF", "tT", "yY", "hH", "bB", "vV"], "k": ["jJ", "iI", "oO", "lL", ",<", "mM"], "o": ["iI", "9(", "0)", "pP", "lL", "kK"], "s": ["aA", "wW", "eE", "dD", "xX", "zZ"], "w": ["qQ", "2@", "3#", "eE", "sS", "aA"], "{": ["pP", "-_", "=+", "]}", "'\"", ";:"], "\"": [";:", "[{", "]}", null, null, "/?"], "&": ["6^", null, null, "8*", "uU", "yY"], "*": ["7&", null, null, "9(", "iI", "uU"], ".": [",<", "lL", ";:", "/?", null, null], "2": ["1!", null, null, "3#", "wW", "qQ"], "6": ["5%", null, null, "7&", "yY", "tT"], ":": ["lL", "pP", "[{", "'\"", "/?", ".>"], ">": [",<", "lL", ";:", "/?", null, null], "B": ["vV", "gG", "hH", "nN", null, null], "F": ["dD", "rR", "tT", "gG", "vV", "cC"], "J": ["hH", "uU", "iI", "kK", "mM", "nN"], "N": ["bB", "hH", "jJ", "mM", null, null], "R": ["eE", "4$", "5%", "tT", "fF", "dD"], "V": ["cC", "fF", "gG", "bB", null, null], "Z": [null, "aA", "sS", "xX", null, null], "^": ["5%", null, null, "7&", "yY", "tT"], "b": ["vV", "gG", "hH", "nN", null, null], "f": ["dD", "rR", "tT", "gG", "vV", "cC"], "j": ["hH", "uU", "iI", "kK", "mM", "nN"], "n": ["bB", "hH", "jJ", "mM", null, null], "r": ["eE", "4$", "5%", "tT", "fF", "dD"], "v": ["cC", "fF", "gG", "bB", null, null], "z": [null, "aA", "sS", "xX", null, null], "~": [null, null, null, "1!", null, null], "!": ["`~", null, null, "2@", "qQ", null], "%": ["4$", null, null, "6^", "tT", "rR"], ")": ["9(", null, null, "-_", "pP", "oO"], "-": ["0)", null, null, "=+", "[{", "pP"], "1": ["`~", null, null, "2@", "qQ", null], "5": ["4$", null, null, "6^", "tT", "rR"], "9": ["8*", null, null, "0)", "oO", "iI"], "=": ["-_", null, null, null, "]}", "[{"], "A": [null, "qQ", "wW", "sS", "zZ", null], "E": ["wW", "3#", "4$", "rR", "dD", "sS"], "I": ["uU", "8*", "9(", "oO", "kK", "jJ"], "M": ["nN", "jJ", "kK", ",<", null, null], "Q": [null, "1!", "2@", "wW", "aA", null], "U": ["yY", "7&", "8*", "iI", "jJ", "hH"], "Y": ["tT", "6^", "7&", "uU", "hH", "gG"], "]": ["[{", "=+", null, "\\|", null, "'\""], "a": [null, "qQ", "wW", "sS", "zZ", null], "e": ["wW", "3#", "4$", "rR", "dD", "sS"], "i": ["uU", "8*", "9(", "oO", "kK", "jJ"], "m": ["nN", "jJ", "kK", ",<", null, null], "q": [null, "1!", "2@", "wW", "aA", null], "u": ["yY", "7&", "8*", "iI", "jJ", "hH"], "y": ["tT", "6^", "7&", "uU", "hH", "gG"], "}": ["[{", "=+", null, "\\|", null, "'\""]}, "dvorak": {"$": ["3#", null, null, "5%", "pP", ".>"], "(": ["8*", null, null, "0)", "rR", "cC"], ",": ["'\"", "2@", "3#", ".>", "oO", "aA"], "0": ["9(", null, null, "[{", "lL", "rR"], "4": ["3#", null, null, "5%", "pP", ".>"], "8": ["7&", null, null, "9(", "cC", "gG"], "<": ["'\"", "2@", "3#", ".>", "oO", "aA"], "@": ["1!", null, null, "3#", ",<", "'\""], "D": ["iI", "fF", "gG", "hH", "bB", "xX"], "H": ["dD", "gG", "cC", "tT", "mM", "bB"], "L": ["rR", "0)", "[{", "/?", "sS", "nN"], "P": [".>", "4$", "5%", "yY", "uU", "eE"], "T": ["hH", "cC", "rR", "nN", "wW", "mM"], "X": ["kK", "iI", "dD", "bB", null, null], "\\": ["=+", null, null, null, null, null], "`": [null, null, null, "1!", null, null], "d": ["iI", "fF", "gG", "hH", "bB", "xX"], "h": ["dD", "gG", "cC", "tT", "mM", "bB"], "l": ["rR", "0)", "[{", "/?", "sS", "nN"], "p": [".>", "4$", "5%", "yY", "uU", "eE"], "t": ["hH", "cC", "rR", "nN", "wW", "mM"], "x": ["kK", "iI", "dD", "bB", null, null], "|": ["=+", null, null, null, null, null], "#": ["2@", null, null, "4$", ".>", ",<"], "'": [null, "1!", "2@", ",<", "aA", null], "+": ["/?", "]}", null, "\\|", null, "-_"], "/": ["lL", "[{", "]}", "=+", "-_", "sS"], "3": ["2@", null, null, "4$", ".>", ",<"], "7": ["6^", null, null, "8*", "gG", "fF"], ";": [null, "aA", "oO", "qQ", null, null], "?": ["lL", "[{", "]}", "=+", "-_", "sS"], "C": ["gG", "8*", "9(", "rR", "tT", "hH"], "G": ["fF", "7&", "8*", "cC", "hH", "dD"], "K": ["jJ", "uU", "iI", "xX", null, null], "O": ["aA", ",<", ".>", "eE", "qQ", ";:"], "S": ["nN", "lL", "/?", "-_", "zZ", "vV"], "W": ["mM", "tT", "nN", "vV", null, null], "[": ["0)", null, null, "]}", "/?", "lL"], "_": ["sS", "/?", "=+", null, null, "zZ"], "c": ["gG", "8*", "9(", "rR", "tT", "hH"], "g": ["fF", "7&", "8*", "cC", "hH", "dD"], "k": ["jJ", "uU", "iI", "xX", null, null], "o": ["aA", ",<", ".>", "eE", "qQ", ";:"], "s": ["nN", "lL", "/?", "-_", "zZ", "vV"], "w": ["mM", "tT", "nN", "vV", null, null], "{": ["0)", null, null, "]}", "/?", "lL"], "\"": [null, "1!", "2@", ",<", "aA", null], "&": ["6^", null, null, "8*", "gG", "fF"], "*": ["7&", null, null, "9(", "cC", "gG"], ".": [",<", "3#", "4$", "pP", "eE", "oO"], "2": ["1!", null, null, "3#", ",<", "'\""], "6": ["5%", null, null, "7&", "fF", "yY"], ":": [null, "aA", "oO", "qQ", null, null], ">": [",<", "3#", "4$", "pP", "eE", "oO"], "B": ["xX", "dD", "hH", "mM", null, null], "F": ["yY", "6^", "7&", "gG", "dD", "iI"], "J": ["qQ", "eE", "uU", "kK", null, null], "N": ["tT", "rR", "lL", "sS", "vV", "wW"], "R": ["cC", "9(", "0)", "lL", "nN", "tT"], "V": ["wW", "nN", "sS", "zZ", null, null], "Z": ["vV", "sS", "-_", null, null, null], "^": ["5%", null, null, "7&", "fF", "yY"], "b": ["xX", "dD", "hH", "mM", null, null], "f": ["yY", "6^", "7&", "gG", "dD", "iI"], "j": ["qQ", "eE", "uU", "kK", null, null], "n": ["tT", "rR", "lL", "sS", "vV", "wW"], "r": ["cC", "9(", "0)", "lL", "nN", "tT"], "v": ["wW", "nN", "sS", "zZ", null, null], "z": ["vV", "sS", "-_", null, null, null], "~": [null, null, null, "1!", null, null], "!": ["`~", null, null, "2@", "'\"", null], "%": ["4$", null, null, "6^", "yY", "pP"], ")": ["9(", null, null, "[{", "lL", "rR"], "-": ["sS", "/?", "=+", null, null, "zZ"], "1": ["`~", null, null, "2@", "'\"", null], "5": ["4$", null, null, "6^", "yY", "pP"], "9": ["8*", null, null, "0)", "rR", "cC"], "=": ["/?", "]}", null, "\\|", null, "-_"], "A": [null, "'\"", ",<", "oO", ";:", null], "E": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "I": ["uU", "yY", "fF", "dD", "xX", "kK"], "M": ["bB", "hH", "tT", "wW", null, null], "Q": [";:", "oO", "eE", "jJ", null, null], "U": ["eE", "pP", "yY", "iI", "kK", "jJ"], "Y": ["pP", "5%", "6^", "fF", "iI", "uU"], "]": ["[{", null, null, null, "=+", "/?"], "a": [null, "'\"", ",<", "oO", ";:", null], "e": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "i": ["uU", "yY", "fF", "dD", "xX", "kK"], "m": ["bB", "hH", "tT", "wW", null, null], "q": [";:", "oO", "eE", "jJ", null, null], "u": ["eE", "pP", "yY", "iI", "kK", "jJ"], "y": ["pP", "5%", "6^", "fF", "iI", "uU"], "}": ["[{", null, null, null, "=+", "/?"]}, "mac_keypad": {"+": ["6", "9", "-", null, null, null, null, "3"], "*": ["/", null, null, null, null, null, "-", "9"], "-": ["9", "/", "*", null, null, null, "+", "6"], "/": ["=", null, null, null, "*", "-", "9", "8"], ".": ["0", "2", "3", null, null, null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "0": [null, "1", "2", "3", ".", null, null, null], "3": ["2", "5", "6", "+", null, null, ".", "0"], "2": ["1", "4", "5", "6", "3", ".", "0", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "4": [null, null, "7", "8", "5", "2", "1", null], "7": [null, null, null, "=", "8", "5", "4", null], "6": ["5", "8", "9", "-", "+", null, "3", "2"], "9": ["8", "=", "/", "*", "-", "+", "6", "5"], "8": ["7", null, "=", "/", "9", "6", "5", "4"], "=": [null, null, null, null, "/", "9", "8", "7"]}, "keypad": {"+": ["9", "*", "-", null, null, null, null, "6"], "*": ["/", null, null, null, "-", "+", "9", "8"], "-": ["*", null, null, null, null, null, "+", "9"], "/": [null, null, null, null, "*", "9", "8", "7"], ".": ["0", "2", "3", null, null, null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "0": [null, "1", "2", "3", ".", null, null, null], "3": ["2", "5", "6", null, null, null, ".", "0"], "2": ["1", "4", "5", "6", "3", ".", "0", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "4": [null, null, "7", "8", "5", "2", "1", null], "7": [null, null, null, "/", "8", "5", "4", null], "6": ["5", "8", "9", "+", null, null, "3", "2"], "9": ["8", "/", "*", "-", "+", null, "6", "5"], "8": ["7", null, "/", "*", "9", "6", "5", "4"]}} \ No newline at end of file +{"qwerty": {"$": ["3#", null, null, "5%", "rR", "eE"], "(": ["8*", null, null, "0)", "oO", "iI"], ",": ["mM", "kK", "lL", ".>", null, null], "0": ["9(", null, null, "-_", "pP", "oO"], "4": ["3#", null, null, "5%", "rR", "eE"], "8": ["7&", null, null, "9(", "iI", "uU"], "<": ["mM", "kK", "lL", ".>", null, null], "@": ["1!", null, null, "3#", "wW", "qQ"], "D": ["sS", "eE", "rR", "fF", "cC", "xX"], "H": ["gG", "yY", "uU", "jJ", "nN", "bB"], "L": ["kK", "oO", "pP", ";:", ".>", ",<"], "P": ["oO", "0)", "-_", "[{", ";:", "lL"], "T": ["rR", "5%", "6^", "yY", "gG", "fF"], "X": ["zZ", "sS", "dD", "cC", null, null], "\\": ["]}", null, null, null, null, null], "`": [null, null, null, "1!", null, null], "d": ["sS", "eE", "rR", "fF", "cC", "xX"], "h": ["gG", "yY", "uU", "jJ", "nN", "bB"], "l": ["kK", "oO", "pP", ";:", ".>", ",<"], "p": ["oO", "0)", "-_", "[{", ";:", "lL"], "t": ["rR", "5%", "6^", "yY", "gG", "fF"], "x": ["zZ", "sS", "dD", "cC", null, null], "|": ["]}", null, null, null, null, null], "#": ["2@", null, null, "4$", "eE", "wW"], "'": [";:", "[{", "]}", null, null, "/?"], "+": ["-_", null, null, null, "]}", "[{"], "/": [".>", ";:", "'\"", null, null, null], "3": ["2@", null, null, "4$", "eE", "wW"], "7": ["6^", null, null, "8*", "uU", "yY"], ";": ["lL", "pP", "[{", "'\"", "/?", ".>"], "?": [".>", ";:", "'\"", null, null, null], "C": ["xX", "dD", "fF", "vV", null, null], "G": ["fF", "tT", "yY", "hH", "bB", "vV"], "K": ["jJ", "iI", "oO", "lL", ",<", "mM"], "O": ["iI", "9(", "0)", "pP", "lL", "kK"], "S": ["aA", "wW", "eE", "dD", "xX", "zZ"], "W": ["qQ", "2@", "3#", "eE", "sS", "aA"], "[": ["pP", "-_", "=+", "]}", "'\"", ";:"], "_": ["0)", null, null, "=+", "[{", "pP"], "c": ["xX", "dD", "fF", "vV", null, null], "g": ["fF", "tT", "yY", "hH", "bB", "vV"], "k": ["jJ", "iI", "oO", "lL", ",<", "mM"], "o": ["iI", "9(", "0)", "pP", "lL", "kK"], "s": ["aA", "wW", "eE", "dD", "xX", "zZ"], "w": ["qQ", "2@", "3#", "eE", "sS", "aA"], "{": ["pP", "-_", "=+", "]}", "'\"", ";:"], "\"": [";:", "[{", "]}", null, null, "/?"], "&": ["6^", null, null, "8*", "uU", "yY"], "*": ["7&", null, null, "9(", "iI", "uU"], ".": [",<", "lL", ";:", "/?", null, null], "2": ["1!", null, null, "3#", "wW", "qQ"], "6": ["5%", null, null, "7&", "yY", "tT"], ":": ["lL", "pP", "[{", "'\"", "/?", ".>"], ">": [",<", "lL", ";:", "/?", null, null], "B": ["vV", "gG", "hH", "nN", null, null], "F": ["dD", "rR", "tT", "gG", "vV", "cC"], "J": ["hH", "uU", "iI", "kK", "mM", "nN"], "N": ["bB", "hH", "jJ", "mM", null, null], "R": ["eE", "4$", "5%", "tT", "fF", "dD"], "V": ["cC", "fF", "gG", "bB", null, null], "Z": [null, "aA", "sS", "xX", null, null], "^": ["5%", null, null, "7&", "yY", "tT"], "b": ["vV", "gG", "hH", "nN", null, null], "f": ["dD", "rR", "tT", "gG", "vV", "cC"], "j": ["hH", "uU", "iI", "kK", "mM", "nN"], "n": ["bB", "hH", "jJ", "mM", null, null], "r": ["eE", "4$", "5%", "tT", "fF", "dD"], "v": ["cC", "fF", "gG", "bB", null, null], "z": [null, "aA", "sS", "xX", null, null], "~": [null, null, null, "1!", null, null], "!": ["`~", null, null, "2@", "qQ", null], "%": ["4$", null, null, "6^", "tT", "rR"], ")": ["9(", null, null, "-_", "pP", "oO"], "-": ["0)", null, null, "=+", "[{", "pP"], "1": ["`~", null, null, "2@", "qQ", null], "5": ["4$", null, null, "6^", "tT", "rR"], "9": ["8*", null, null, "0)", "oO", "iI"], "=": ["-_", null, null, null, "]}", "[{"], "A": [null, "qQ", "wW", "sS", "zZ", null], "E": ["wW", "3#", "4$", "rR", "dD", "sS"], "I": ["uU", "8*", "9(", "oO", "kK", "jJ"], "M": ["nN", "jJ", "kK", ",<", null, null], "Q": [null, "1!", "2@", "wW", "aA", null], "U": ["yY", "7&", "8*", "iI", "jJ", "hH"], "Y": ["tT", "6^", "7&", "uU", "hH", "gG"], "]": ["[{", "=+", null, "\\|", null, "'\""], "a": [null, "qQ", "wW", "sS", "zZ", null], "e": ["wW", "3#", "4$", "rR", "dD", "sS"], "i": ["uU", "8*", "9(", "oO", "kK", "jJ"], "m": ["nN", "jJ", "kK", ",<", null, null], "q": [null, "1!", "2@", "wW", "aA", null], "u": ["yY", "7&", "8*", "iI", "jJ", "hH"], "y": ["tT", "6^", "7&", "uU", "hH", "gG"], "}": ["[{", "=+", null, "\\|", null, "'\""]}, "azerty": {"€": ["zZå", "\"3#", "'4{", "rRç", "dDÊ", "sSø"], "“": [null, null, null, "&1´", null, null], "£": ["^\"~", "=+}", null, null, "*µ³", "ù%²"], "$": ["^\"~", "=+}", null, null, "*µ³", "ù%²"], "§": [":/÷", "mM¹", "ù%²", null, null, null], "(": ["'4{", null, null, "-6|", "tTþ", "rRç"], "«": ["<>|", "qQÂ", "sSø", "xX»", null, null], ",": ["nN¬", "jJÛ", "kKÎ", ";.×", null, null], "0": ["ç9^", null, null, ")°]", "pP¶", "oOô"], "³": ["ù%²", "$£ê", null, null, null, null], "4": ["\"3#", null, null, "(5[", "rRç", "eE€"], "8": ["è7`", null, null, "ç9^", "iIî", "uUû"], "»": ["wW«", "sSø", "dDÊ", "cC©", null, null], "<": [null, null, "qQÂ", "wW«", null, null], "¿": ["nN¬", "jJÛ", "kKÎ", ";.×", null, null], "@": ["ç9^", null, null, ")°]", "pP¶", "oOô"], "D": ["sSø", "eE€", "rRç", "fF±", "cC©", "xX»"], "H": ["gGæ", "yYý", "uUû", "jJÛ", "nN¬", "bBß"], "L": ["kKÎ", "oOô", "pP¶", "mM¹", ":/÷", ";.×"], "P": ["oOô", "à0@", ")°]", "^\"~", "mM¹", "lLÔ"], "Œ": [null, null, null, "&1´", null, null], "T": ["rRç", "(5[", "-6|", "yYý", "gGæ", "fF±"], "×": [",?¿", "kKÎ", "lLÔ", ":/÷", null, null], "X": ["wW«", "sSø", "dDÊ", "cC©", null, null], "Û": ["hHð", "uUû", "iIî", "kKÎ", ",?¿", "nN¬"], "\\": ["è7`", null, null, "ç9^", "iIî", "uUû"], "ß": ["vV®", "gGæ", "hHð", "nN¬", null, null], "`": ["-6|", null, null, "_8\\", "uUû", "yYý"], "d": ["sSø", "eE€", "rRç", "fF±", "cC©", "xX»"], "ç": ["eE€", "'4{", "(5[", "tTþ", "fF±", "dDÊ"], "h": ["gGæ", "yYý", "uUû", "jJÛ", "nN¬", "bBß"], "l": ["kKÎ", "oOô", "pP¶", "mM¹", ":/÷", ";.×"], "p": ["oOô", "à0@", ")°]", "^\"~", "mM¹", "lLÔ"], "t": ["rRç", "(5[", "-6|", "yYý", "gGæ", "fF±"], "÷": [";.×", "lLÔ", "mM¹", "!§¡", null, null], "x": ["wW«", "sSø", "dDÊ", "cC©", null, null], "û": ["yYý", "è7`", "_8\\", "iIî", "jJÛ", "hHð"], "|": ["(5[", null, null, "è7`", "yYý", "tTþ"], "#": ["é2~", null, null, "'4{", "eE€", "zZå"], "'": ["\"3#", null, null, "(5[", "rRç", "eE€"], "+": [")°]", null, null, null, "$£ê", "^\"~"], "¬": ["bBß", "hHð", "jJÛ", ",?¿", null, null], "/": [";.×", "lLÔ", "mM¹", "!§¡", null, null], "°": ["à0@", null, null, "=+}", "^\"~", "pP¶"], "3": ["é2~", null, null, "'4{", "eE€", "zZå"], "´": ["œŒ“", null, null, "é2~", "aAâ", null], "7": ["-6|", null, null, "_8\\", "uUû", "yYý"], ";": [",?¿", "kKÎ", "lLÔ", ":/÷", null, null], "?": ["nN¬", "jJÛ", "kKÎ", ";.×", null, null], "C": ["xX»", "dDÊ", "fF±", "vV®", null, null], "G": ["fF±", "tTþ", "yYý", "hHð", "bBß", "vV®"], "K": ["jJÛ", "iIî", "oOô", "lLÔ", ";.×", ",?¿"], "O": ["iIî", "ç9^", "à0@", "pP¶", "lLÔ", "kKÎ"], "S": ["qQÂ", "zZå", "eE€", "dDÊ", "xX»", "wW«"], "Ô": ["kKÎ", "oOô", "pP¶", "mM¹", ":/÷", ";.×"], "W": ["<>|", "qQÂ", "sSø", "xX»", null, null], "[": ["'4{", null, null, "-6|", "tTþ", "rRç"], "_": ["è7`", null, null, "ç9^", "iIî", "uUû"], "à": ["ç9^", null, null, ")°]", "pP¶", "oOô"], "c": ["xX»", "dDÊ", "fF±", "vV®", null, null], "g": ["fF±", "tTþ", "yYý", "hHð", "bBß", "vV®"], "è": ["-6|", null, null, "_8\\", "uUû", "yYý"], "k": ["jJÛ", "iIî", "oOô", "lLÔ", ";.×", ",?¿"], "o": ["iIî", "ç9^", "à0@", "pP¶", "lLÔ", "kKÎ"], "ð": ["gGæ", "yYý", "uUû", "jJÛ", "nN¬", "bBß"], "s": ["qQÂ", "zZå", "eE€", "dDÊ", "xX»", "wW«"], "ô": ["iIî", "ç9^", "à0@", "pP¶", "lLÔ", "kKÎ"], "w": ["<>|", "qQÂ", "sSø", "xX»", null, null], "ø": ["qQÂ", "zZå", "eE€", "dDÊ", "xX»", "wW«"], "{": ["\"3#", null, null, "(5[", "rRç", "eE€"], "¡": [":/÷", "mM¹", "ù%²", null, null, null], "\"": ["é2~", null, null, "'4{", "eE€", "zZå"], "&": ["œŒ“", null, null, "é2~", "aAâ", null], "©": ["xX»", "dDÊ", "fF±", "vV®", null, null], "*": ["ù%²", "$£ê", null, null, null, null], ".": [",?¿", "kKÎ", "lLÔ", ":/÷", null, null], "±": ["dDÊ", "rRç", "tTþ", "gGæ", "vV®", "cC©"], "2": ["&1´", null, null, "\"3#", "zZå", "aAâ"], "µ": ["ù%²", "$£ê", null, null, null, null], "6": ["(5[", null, null, "è7`", "yYý", "tTþ"], "¹": ["lLÔ", "pP¶", "^\"~", "ù%²", "!§¡", ":/÷"], ":": [";.×", "lLÔ", "mM¹", "!§¡", null, null], ">": [null, null, "qQÂ", "wW«", null, null], "B": ["vV®", "gGæ", "hHð", "nN¬", null, null], "F": ["dDÊ", "rRç", "tTþ", "gGæ", "vV®", "cC©"], "J": ["hHð", "uUû", "iIî", "kKÎ", ",?¿", "nN¬"], "N": ["bBß", "hHð", "jJÛ", ",?¿", null, null], "R": ["eE€", "'4{", "(5[", "tTþ", "fF±", "dDÊ"], "V": ["cC©", "fF±", "gGæ", "bBß", null, null], "Z": ["aAâ", "é2~", "\"3#", "eE€", "sSø", "qQÂ"], "^": ["pP¶", ")°]", "=+}", "$£ê", "ù%²", "mM¹"], "b": ["vV®", "gGæ", "hHð", "nN¬", null, null], "å": ["aAâ", "é2~", "\"3#", "eE€", "sSø", "qQÂ"], "f": ["dDÊ", "rRç", "tTþ", "gGæ", "vV®", "cC©"], "é": ["&1´", null, null, "\"3#", "zZå", "aAâ"], "j": ["hHð", "uUû", "iIî", "kKÎ", ",?¿", "nN¬"], "n": ["bBß", "hHð", "jJÛ", ",?¿", null, null], "r": ["eE€", "'4{", "(5[", "tTþ", "fF±", "dDÊ"], "v": ["cC©", "fF±", "gGæ", "bBß", null, null], "ù": ["mM¹", "^\"~", "$£ê", "*µ³", null, "!§¡"], "z": ["aAâ", "é2~", "\"3#", "eE€", "sSø", "qQÂ"], "ý": ["tTþ", "-6|", "è7`", "uUû", "hHð", "gGæ"], "~": ["&1´", null, null, "\"3#", "zZå", "aAâ"], "!": [":/÷", "mM¹", "ù%²", null, null, null], "%": ["mM¹", "^\"~", "$£ê", "*µ³", null, "!§¡"], ")": ["à0@", null, null, "=+}", "^\"~", "pP¶"], "-": ["(5[", null, null, "è7`", "yYý", "tTþ"], "®": ["cC©", "fF±", "gGæ", "bBß", null, null], "1": ["œŒ“", null, null, "é2~", "aAâ", null], "²": ["mM¹", "^\"~", "$£ê", "*µ³", null, "!§¡"], "5": ["'4{", null, null, "-6|", "tTþ", "rRç"], "¶": ["oOô", "à0@", ")°]", "^\"~", "mM¹", "lLÔ"], "9": ["_8\\", null, null, "à0@", "oOô", "iIî"], "=": [")°]", null, null, null, "$£ê", "^\"~"], "A": [null, "&1´", "é2~", "zZå", "qQÂ", null], "Â": [null, "aAâ", "zZå", "sSø", "wW«", "<>|"], "E": ["zZå", "\"3#", "'4{", "rRç", "dDÊ", "sSø"], "I": ["uUû", "_8\\", "ç9^", "oOô", "kKÎ", "jJÛ"], "Ê": ["sSø", "eE€", "rRç", "fF±", "cC©", "xX»"], "M": ["lLÔ", "pP¶", "^\"~", "ù%²", "!§¡", ":/÷"], "Î": ["jJÛ", "iIî", "oOô", "lLÔ", ";.×", ",?¿"], "Q": [null, "aAâ", "zZå", "sSø", "wW«", "<>|"], "œ": [null, null, null, "&1´", null, null], "U": ["yYý", "è7`", "_8\\", "iIî", "jJÛ", "hHð"], "Y": ["tTþ", "-6|", "è7`", "uUû", "hHð", "gGæ"], "]": ["à0@", null, null, "=+}", "^\"~", "pP¶"], "a": [null, "&1´", "é2~", "zZå", "qQÂ", null], "â": [null, "&1´", "é2~", "zZå", "qQÂ", null], "e": ["zZå", "\"3#", "'4{", "rRç", "dDÊ", "sSø"], "æ": ["fF±", "tTþ", "yYý", "hHð", "bBß", "vV®"], "i": ["uUû", "_8\\", "ç9^", "oOô", "kKÎ", "jJÛ"], "ê": ["^\"~", "=+}", null, null, "*µ³", "ù%²"], "m": ["lLÔ", "pP¶", "^\"~", "ù%²", "!§¡", ":/÷"], "î": ["uUû", "_8\\", "ç9^", "oOô", "kKÎ", "jJÛ"], "q": [null, "aAâ", "zZå", "sSø", "wW«", "<>|"], "u": ["yYý", "è7`", "_8\\", "iIî", "jJÛ", "hHð"], "y": ["tTþ", "-6|", "è7`", "uUû", "hHð", "gGæ"], "}": [")°]", null, null, null, "$£ê", "^\"~"], "þ": ["rRç", "(5[", "-6|", "yYý", "gGæ", "fF±"]}, "mac_keypad": {"+": ["6", "9", "-", null, null, null, null, "3"], "*": ["/", null, null, null, null, null, "-", "9"], "-": ["9", "/", "*", null, null, null, "+", "6"], "/": ["=", null, null, null, "*", "-", "9", "8"], ".": ["0", "2", "3", null, null, null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "0": [null, "1", "2", "3", ".", null, null, null], "3": ["2", "5", "6", "+", null, null, ".", "0"], "2": ["1", "4", "5", "6", "3", ".", "0", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "4": [null, null, "7", "8", "5", "2", "1", null], "7": [null, null, null, "=", "8", "5", "4", null], "6": ["5", "8", "9", "-", "+", null, "3", "2"], "9": ["8", "=", "/", "*", "-", "+", "6", "5"], "8": ["7", null, "=", "/", "9", "6", "5", "4"], "=": [null, null, null, null, "/", "9", "8", "7"]}, "dvorak": {"$": ["3#", null, null, "5%", "pP", ".>"], "(": ["8*", null, null, "0)", "rR", "cC"], ",": ["'\"", "2@", "3#", ".>", "oO", "aA"], "0": ["9(", null, null, "[{", "lL", "rR"], "4": ["3#", null, null, "5%", "pP", ".>"], "8": ["7&", null, null, "9(", "cC", "gG"], "<": ["'\"", "2@", "3#", ".>", "oO", "aA"], "@": ["1!", null, null, "3#", ",<", "'\""], "D": ["iI", "fF", "gG", "hH", "bB", "xX"], "H": ["dD", "gG", "cC", "tT", "mM", "bB"], "L": ["rR", "0)", "[{", "/?", "sS", "nN"], "P": [".>", "4$", "5%", "yY", "uU", "eE"], "T": ["hH", "cC", "rR", "nN", "wW", "mM"], "X": ["kK", "iI", "dD", "bB", null, null], "\\": ["=+", null, null, null, null, null], "`": [null, null, null, "1!", null, null], "d": ["iI", "fF", "gG", "hH", "bB", "xX"], "h": ["dD", "gG", "cC", "tT", "mM", "bB"], "l": ["rR", "0)", "[{", "/?", "sS", "nN"], "p": [".>", "4$", "5%", "yY", "uU", "eE"], "t": ["hH", "cC", "rR", "nN", "wW", "mM"], "x": ["kK", "iI", "dD", "bB", null, null], "|": ["=+", null, null, null, null, null], "#": ["2@", null, null, "4$", ".>", ",<"], "'": [null, "1!", "2@", ",<", "aA", null], "+": ["/?", "]}", null, "\\|", null, "-_"], "/": ["lL", "[{", "]}", "=+", "-_", "sS"], "3": ["2@", null, null, "4$", ".>", ",<"], "7": ["6^", null, null, "8*", "gG", "fF"], ";": [null, "aA", "oO", "qQ", null, null], "?": ["lL", "[{", "]}", "=+", "-_", "sS"], "C": ["gG", "8*", "9(", "rR", "tT", "hH"], "G": ["fF", "7&", "8*", "cC", "hH", "dD"], "K": ["jJ", "uU", "iI", "xX", null, null], "O": ["aA", ",<", ".>", "eE", "qQ", ";:"], "S": ["nN", "lL", "/?", "-_", "zZ", "vV"], "W": ["mM", "tT", "nN", "vV", null, null], "[": ["0)", null, null, "]}", "/?", "lL"], "_": ["sS", "/?", "=+", null, null, "zZ"], "c": ["gG", "8*", "9(", "rR", "tT", "hH"], "g": ["fF", "7&", "8*", "cC", "hH", "dD"], "k": ["jJ", "uU", "iI", "xX", null, null], "o": ["aA", ",<", ".>", "eE", "qQ", ";:"], "s": ["nN", "lL", "/?", "-_", "zZ", "vV"], "w": ["mM", "tT", "nN", "vV", null, null], "{": ["0)", null, null, "]}", "/?", "lL"], "\"": [null, "1!", "2@", ",<", "aA", null], "&": ["6^", null, null, "8*", "gG", "fF"], "*": ["7&", null, null, "9(", "cC", "gG"], ".": [",<", "3#", "4$", "pP", "eE", "oO"], "2": ["1!", null, null, "3#", ",<", "'\""], "6": ["5%", null, null, "7&", "fF", "yY"], ":": [null, "aA", "oO", "qQ", null, null], ">": [",<", "3#", "4$", "pP", "eE", "oO"], "B": ["xX", "dD", "hH", "mM", null, null], "F": ["yY", "6^", "7&", "gG", "dD", "iI"], "J": ["qQ", "eE", "uU", "kK", null, null], "N": ["tT", "rR", "lL", "sS", "vV", "wW"], "R": ["cC", "9(", "0)", "lL", "nN", "tT"], "V": ["wW", "nN", "sS", "zZ", null, null], "Z": ["vV", "sS", "-_", null, null, null], "^": ["5%", null, null, "7&", "fF", "yY"], "b": ["xX", "dD", "hH", "mM", null, null], "f": ["yY", "6^", "7&", "gG", "dD", "iI"], "j": ["qQ", "eE", "uU", "kK", null, null], "n": ["tT", "rR", "lL", "sS", "vV", "wW"], "r": ["cC", "9(", "0)", "lL", "nN", "tT"], "v": ["wW", "nN", "sS", "zZ", null, null], "z": ["vV", "sS", "-_", null, null, null], "~": [null, null, null, "1!", null, null], "!": ["`~", null, null, "2@", "'\"", null], "%": ["4$", null, null, "6^", "yY", "pP"], ")": ["9(", null, null, "[{", "lL", "rR"], "-": ["sS", "/?", "=+", null, null, "zZ"], "1": ["`~", null, null, "2@", "'\"", null], "5": ["4$", null, null, "6^", "yY", "pP"], "9": ["8*", null, null, "0)", "rR", "cC"], "=": ["/?", "]}", null, "\\|", null, "-_"], "A": [null, "'\"", ",<", "oO", ";:", null], "E": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "I": ["uU", "yY", "fF", "dD", "xX", "kK"], "M": ["bB", "hH", "tT", "wW", null, null], "Q": [";:", "oO", "eE", "jJ", null, null], "U": ["eE", "pP", "yY", "iI", "kK", "jJ"], "Y": ["pP", "5%", "6^", "fF", "iI", "uU"], "]": ["[{", null, null, null, "=+", "/?"], "a": [null, "'\"", ",<", "oO", ";:", null], "e": ["oO", ".>", "pP", "uU", "jJ", "qQ"], "i": ["uU", "yY", "fF", "dD", "xX", "kK"], "m": ["bB", "hH", "tT", "wW", null, null], "q": [";:", "oO", "eE", "jJ", null, null], "u": ["eE", "pP", "yY", "iI", "kK", "jJ"], "y": ["pP", "5%", "6^", "fF", "iI", "uU"], "}": ["[{", null, null, null, "=+", "/?"]}, "keypad": {"+": ["9", "*", "-", null, null, null, null, "6"], "*": ["/", null, null, null, "-", "+", "9", "8"], "-": ["*", null, null, null, null, null, "+", "9"], "/": [null, null, null, null, "*", "9", "8", "7"], ".": ["0", "2", "3", null, null, null, null, null], "1": [null, null, "4", "5", "2", "0", null, null], "0": [null, "1", "2", "3", ".", null, null, null], "3": ["2", "5", "6", null, null, null, ".", "0"], "2": ["1", "4", "5", "6", "3", ".", "0", null], "5": ["4", "7", "8", "9", "6", "3", "2", "1"], "4": [null, null, "7", "8", "5", "2", "1", null], "7": [null, null, null, "/", "8", "5", "4", null], "6": ["5", "8", "9", "+", null, null, "3", "2"], "9": ["8", "/", "*", "-", "+", null, "6", "5"], "8": ["7", null, "/", "*", "9", "6", "5", "4"]}} \ No newline at end of file diff --git a/test/Matchers/SpatialTest.php b/test/Matchers/SpatialTest.php index 44d5304..412c7b2 100644 --- a/test/Matchers/SpatialTest.php +++ b/test/Matchers/SpatialTest.php @@ -122,12 +122,12 @@ public function testShiftedCountForMultipleMatches(): void "shifted count is correct for two matches in a row", SpatialMatch::match($password), 'spatial', - ['!QAZ', '1qaz'], - [[0, 3], [4, 7]], + ['!QAZ', 'QAZ', '1qaz', 'qaz'], + [[0, 3], [1, 3], [4, 7], [5, 7]], [ - 'graph' => ['qwerty', 'qwerty'], - 'turns' => [1, 1], - 'shiftedCount' => [4, 0], + 'graph' => ['qwerty', 'azerty', 'qwerty', 'azerty'], + 'turns' => [1, 2, 1, 2], + 'shiftedCount' => [4, 2, 0, 0], ] ); } diff --git a/test/ZxcvbnTest.php b/test/ZxcvbnTest.php index 962ed49..ce6674c 100644 --- a/test/ZxcvbnTest.php +++ b/test/ZxcvbnTest.php @@ -74,14 +74,14 @@ public function sanityCheckDataProvider() return [ ['password', 0, ['dictionary',], 'less than a second', 3], ['65432', 0, ['sequence',], 'less than a second', 101], - ['sdfgsdfg', 1, ['repeat',], 'less than a second', 2595], + ['sdfgsdfg', 0, ['repeat',], 'less than a second', 459.00000000299997], ['fortitude', 1, ['dictionary',], '1 second', 11308], ['dfjkym', 1, ['bruteforce',], '2 minutes', 1000001], ['fortitude22', 2, ['dictionary', 'repeat',], '2 minutes', 1140700], ['absoluteadnap', 2, ['dictionary', 'dictionary',], '25 minutes', 15187504], ['knifeandspoon', 3, ['dictionary', 'dictionary', 'dictionary'], '1 day', 1108057600], ['h1dden_26191', 3, ['dictionary', 'bruteforce', 'date'], '3 days', 2730628000], - ['4rfv1236yhn!', 4, ['spatial', 'sequence', 'bruteforce'], '1 month', 38980000000], + ['4rfv1236yhn!', 3, ['spatial', 'sequence', 'bruteforce'], '8 days', 6940000000.045], ['BVidSNqe3oXVyE1996', 4, ['bruteforce', 'regex',], 'centuries', 10000000000010000], ]; }