diff options
author | Bryan Bishop <kanzure@gmail.com> | 2013-09-09 00:12:34 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2013-09-09 00:12:34 -0500 |
commit | 5d41f8a91dc47e41f45ecaeec4ad1640196be37e (patch) | |
tree | e7906202e5f1855c90d3d395173f4c399504a7a8 /pokemontools/vba/keyboard.py | |
parent | 815266f03fb5de060939a271136caf520921654c (diff) |
move vba_keyboard.py -> keyboard.py
Diffstat (limited to 'pokemontools/vba/keyboard.py')
-rw-r--r-- | pokemontools/vba/keyboard.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/pokemontools/vba/keyboard.py b/pokemontools/vba/keyboard.py new file mode 100644 index 0000000..f25fd06 --- /dev/null +++ b/pokemontools/vba/keyboard.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +""" +This file constructs a networkx.DiGraph object called graph, which can be used +to find the shortest path of keypresses on the keyboard to type a word. +""" + +import itertools +import networkx + +graph = networkx.DiGraph() + +# load graph data from file +data_path = os.path.join(os.path.abspath(__file__), "keyboard.data") +graph_data = open(data_path, "r").read() + +for line in graph_data.split("\n"): + if line == "": + continue + elif line[0] == "#": + continue + + (node1, node2, edge_name) = line.split(" ") + graph.add_edge(node1, node2, key=edge_name) + + #print "Adding edge ("+edge_name+") "+node1+" -> "+node2 + +def shortest_path(node1, node2): + """ + Figures out the shortest list of button presses to move from one letter to + another. + """ + buttons = [] + last = None + path = networkx.shortest_path(graph, node1, node2) + for each in path: + if last != None: + buttons.append(convert_nodes_to_button_press(last, each)) + last = each + return buttons + #return [convert_nodes_to_button_press(node3, node4) for (node3, node4) in zip(*(iter(networkx.shortest_path(graph, node1, node2)),) * 2)] + +def convert_nodes_to_button_press(node1, node2): + """ + Determines the button necessary to switch from node1 to node2. + """ + print "getting button press for state transition: " + node1 + " -> " + node2 + return graph.get_edge_data(node1, node2)["key"] + +def plan_typing(text, current="A"): + """ + Plans a sequence of button presses to spell out the given text. + """ + buttons = [] + for target in text: + if target == current: + buttons.append("a") + else: + print "Finding the shortest path between " + current + " and " + target + more_buttons = shortest_path(current, target) + buttons.extend(more_buttons) + buttons.append("a") + current = target + return buttons |