diff options
author | Bryan Bishop <kanzure@gmail.com> | 2013-09-10 21:18:30 -0700 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2013-09-10 21:18:30 -0700 |
commit | 50341bae50b4318800dcea5694e95b239ed8fbb0 (patch) | |
tree | d2060ae537a36cc649b22785c46915dd1c9813ca /pokemontools/vba/keyboard.py | |
parent | cb65c31968305b0572ca5452291afcf058cef3a2 (diff) | |
parent | 42c7b0348386fdd0d3fc3b64ad81ee8ee7779824 (diff) |
Merge pull request #21 from kanzure/vba-automation
Start moving away from jvm/jython.
Diffstat (limited to 'pokemontools/vba/keyboard.py')
-rw-r--r-- | pokemontools/vba/keyboard.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/pokemontools/vba/keyboard.py b/pokemontools/vba/keyboard.py new file mode 100644 index 0000000..4a07e57 --- /dev/null +++ b/pokemontools/vba/keyboard.py @@ -0,0 +1,64 @@ +# -*- 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 os +import itertools +import networkx + +graph = networkx.DiGraph() + +# load graph data from file +data_path = os.path.join(os.path.dirname(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 |