Added for each and timout to angular
parent
5bc1ec169b
commit
9ef641fb48
|
@ -2,18 +2,22 @@
|
||||||
# This script includes commands that are to be used for Angular programming
|
# This script includes commands that are to be used for Angular programming
|
||||||
|
|
||||||
from dragonfly import (Grammar, CompoundRule, Dictation, RuleRef, DictList, DictListRef, Text, Key, AppContext, MappingRule, Function, Sequence, Mimic)
|
from dragonfly import (Grammar, CompoundRule, Dictation, RuleRef, DictList, DictListRef, Text, Key, AppContext, MappingRule, Function, Sequence, Mimic)
|
||||||
|
import win32com.client
|
||||||
|
speaker = win32com.client.Dispatch("SAPI.SpVoice")
|
||||||
|
|
||||||
def doSomethingToCommand(command):
|
def doSomethingToCommand(command):
|
||||||
newCommand = Sequence(command)
|
newCommand = Sequence(command)
|
||||||
newCommand.execute()
|
newCommand.execute()
|
||||||
|
|
||||||
class AngularEnabler(CompoundRule):
|
class AngularEnabler(CompoundRule):
|
||||||
spec = "Activate Angular JS" # Spoken form of command.
|
spec = "Activate Angular" # Spoken form of command.
|
||||||
|
|
||||||
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
||||||
AngularBootstrap.disable()
|
AngularBootstrap.disable()
|
||||||
AngularGrammar.enable()
|
AngularGrammar.enable()
|
||||||
print "Angular JS grammar enabled"
|
s = "Angular JS grammar activated"
|
||||||
|
print s
|
||||||
|
speaker.Speak(s)
|
||||||
|
|
||||||
class AngularDisabler(CompoundRule):
|
class AngularDisabler(CompoundRule):
|
||||||
spec = "switch language" # Spoken form of command.
|
spec = "switch language" # Spoken form of command.
|
||||||
|
@ -21,11 +25,12 @@ class AngularDisabler(CompoundRule):
|
||||||
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
||||||
AngularGrammar.disable()
|
AngularGrammar.disable()
|
||||||
AngularBootstrap.enable()
|
AngularBootstrap.enable()
|
||||||
print "Angular JS grammar disabled"
|
s = "Angular JS grammar deactivated"
|
||||||
|
print s
|
||||||
|
speaker.Speak(s)
|
||||||
|
|
||||||
class AngularTestRule(CompoundRule):
|
class AngularTestRule(CompoundRule):
|
||||||
spec = "test Angular JS" # Spoken form of command.
|
spec = "test Angular" # Spoken form of command.
|
||||||
|
|
||||||
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
||||||
print "Angular JS grammar tested"
|
print "Angular JS grammar tested"
|
||||||
|
@ -35,7 +40,9 @@ class AngularControlStructures(MappingRule):
|
||||||
mapping = {
|
mapping = {
|
||||||
"variable": Text("var "),
|
"variable": Text("var "),
|
||||||
"function": Text("function functionName() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"function": Text("function functionName() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
"self function": Text("(function() {") + Key("enter")+ Key("enter"), #+ Text("}())"),
|
"self function": Text("(function() {") + Key("enter") + Key("enter"), #+ Text("}())"),
|
||||||
|
"for each": Text("angular.forEach( , function(o) {") + Key("enter") + Key("enter") + Text("});") + Key("up"), #+ Key("up"),
|
||||||
|
"timeout": Text("$timeout(function() {") + Key("enter") + Key("enter") + Text("}, 100);") + Key("up"), #+ Key("up"),
|
||||||
"code block": Text("{") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"code block": Text("{") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
"if": Text("if() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"if": Text("if() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
"if else": Text("if() {") + Key("enter")+ Key("enter") + Text("}") + Key("enter") + Text("else {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"if else": Text("if() {") + Key("enter")+ Key("enter") + Text("}") + Key("enter") + Text("else {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
|
|
|
@ -19,7 +19,7 @@ class UsefulStuff(MappingRule):
|
||||||
"enter|slap": Key("enter"),
|
"enter|slap": Key("enter"),
|
||||||
"east": Key("end"),
|
"east": Key("end"),
|
||||||
"west": Key("home"),
|
"west": Key("home"),
|
||||||
|
"format": Key("ctrl") + Key("alt") + Key("b"),
|
||||||
}
|
}
|
||||||
|
|
||||||
globalStuff = Grammar("useful custom global commands") # Create a grammar to contain the command rule.
|
globalStuff = Grammar("useful custom global commands") # Create a grammar to contain the command rule.
|
||||||
|
|
|
@ -0,0 +1,246 @@
|
||||||
|
#
|
||||||
|
# This file is a command-module for Dragonfly.
|
||||||
|
# (c) Copyright 2008 by Christo Butcher
|
||||||
|
# Licensed under the LGPL, see <http://www.gnu.org/licenses/>
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
Command-module to control **Windows Explorer**
|
||||||
|
============================================================================
|
||||||
|
|
||||||
|
This module defines various voice-commands for use with Windows Explorer.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This module is still under development.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
If you are using DNS and Natlink, simply place this file in you Natlink
|
||||||
|
macros directory. It will then be automatically loaded by Natlink when
|
||||||
|
you next toggle your microphone or restart Natlink.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pkg_resources
|
||||||
|
pkg_resources.require("dragonfly >= 0.6.5beta1.dev-r76")
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import string
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
from urllib import unquote
|
||||||
|
from dragonfly import (ConnectionGrammar, AppContext, CompoundRule,
|
||||||
|
Choice, Window, Config, Section, Item)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class SingleFile(object):
|
||||||
|
|
||||||
|
def __init__(self, spec, command_line):
|
||||||
|
self.spec = spec
|
||||||
|
self.command_line = command_line
|
||||||
|
|
||||||
|
def execute(self, paths, directory):
|
||||||
|
for path in paths:
|
||||||
|
self.execute_single(path, directory)
|
||||||
|
|
||||||
|
def execute_single(self, path, directory):
|
||||||
|
data = {"path": path, "dir": directory}
|
||||||
|
arguments = [s % data for s in self.command_line]
|
||||||
|
print "Arguments: %r" % arguments
|
||||||
|
process = subprocess.Popen(arguments, stdout=subprocess.PIPE)
|
||||||
|
out, err = process.communicate()
|
||||||
|
print "Output:"; print out and out.strip()
|
||||||
|
print "Error:"; print err and err.strip()
|
||||||
|
|
||||||
|
|
||||||
|
class MultiFile(object):
|
||||||
|
|
||||||
|
def __init__(self, spec, command_line_pre, command_line_post):
|
||||||
|
self.spec = spec
|
||||||
|
self.command_line_pre = command_line_pre
|
||||||
|
self.command_line_post = command_line_post
|
||||||
|
|
||||||
|
def execute(self, paths, directory):
|
||||||
|
data = {"dir": directory}
|
||||||
|
arguments_pre = [s % data for s in self.command_line_pre]
|
||||||
|
arguments_post = [s % data for s in self.command_line_post]
|
||||||
|
arguments = arguments_pre + paths
|
||||||
|
if arguments_post:
|
||||||
|
arguments += arguments_post
|
||||||
|
|
||||||
|
print "Arguments: %r" % arguments
|
||||||
|
process = subprocess.Popen(arguments, stdout=subprocess.PIPE)
|
||||||
|
out, err = process.communicate()
|
||||||
|
print "Output:"; print out and out.strip()
|
||||||
|
print "Error:"; print err and err.strip()
|
||||||
|
|
||||||
|
|
||||||
|
class CreateArchiveHere(object):
|
||||||
|
|
||||||
|
def __init__(self, spec, extension):
|
||||||
|
self.spec = spec
|
||||||
|
self.extension = extension
|
||||||
|
|
||||||
|
def execute(self, paths, directory):
|
||||||
|
archive_path = os.path.splitext(os.path.basename(paths[0]))[0]
|
||||||
|
archive_path = os.path.join(directory, archive_path)
|
||||||
|
archive_path += time.strftime("-%y%m%d")
|
||||||
|
|
||||||
|
def filenames(basename, extension):
|
||||||
|
# yield basename + extension
|
||||||
|
for letter in string.lowercase:
|
||||||
|
yield basename + letter + extension
|
||||||
|
|
||||||
|
available = False
|
||||||
|
for archive_path in filenames(archive_path, self.extension):
|
||||||
|
if not os.path.exists(archive_path):
|
||||||
|
available = True
|
||||||
|
break
|
||||||
|
if not available:
|
||||||
|
print "Warning: could not create archive."
|
||||||
|
return
|
||||||
|
|
||||||
|
arguments = [r"C:\Program Files\7-Zip\7z.exe", "a"]
|
||||||
|
arguments.append("-o" + directory)
|
||||||
|
arguments.append(archive_path)
|
||||||
|
# arguments.append(os.path.splitext(archive_path)[0])
|
||||||
|
arguments.extend(paths)
|
||||||
|
|
||||||
|
print "Arguments: %r" % arguments
|
||||||
|
process = subprocess.Popen(arguments, stdout=subprocess.PIPE)
|
||||||
|
out, err = process.communicate()
|
||||||
|
print "Output:"; print out and out.strip()
|
||||||
|
print "Error:"; print err and err.strip()
|
||||||
|
|
||||||
|
class RenameFile(object):
|
||||||
|
|
||||||
|
python_path = r"C:\Python25\python.exe"
|
||||||
|
rename_dialog_path = os.path.join(os.path.dirname(__file__),
|
||||||
|
"dialog_rename.py")
|
||||||
|
|
||||||
|
def __init__(self, spec):
|
||||||
|
self.spec = spec
|
||||||
|
|
||||||
|
def execute(self, paths, directory):
|
||||||
|
if len(paths) == 0:
|
||||||
|
print "Rename file error: nothing selected."
|
||||||
|
return
|
||||||
|
path = paths[0]
|
||||||
|
|
||||||
|
arguments = [self.python_path, self.rename_dialog_path, path]
|
||||||
|
subprocess.Popen(arguments)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
SingleFile("open with ultra [edit]",
|
||||||
|
[r"C:\Program Files\IDM Computer Solutions\UltraEdit\Uedit32.exe", "%(path)s"]),
|
||||||
|
MultiFile("scan for (virus | viruses) | virus scan",
|
||||||
|
[r"C:\Program Files\F-Secure\Anti-Virus\fsav.exe"], ["/list"]),
|
||||||
|
SingleFile("extract archive here",
|
||||||
|
[r"C:\Program Files\7-Zip\7z.exe", "x", "-o%(dir)s", "%(path)s"]),
|
||||||
|
CreateArchiveHere("create zip archive here", ".zip"),
|
||||||
|
CreateArchiveHere("create [7] archive here", ".7z"),
|
||||||
|
RenameFile("rename file dialog"),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Utility generator function for iterating over COM collections.
|
||||||
|
|
||||||
|
def collection_iter(collection):
|
||||||
|
for index in xrange(collection.Count):
|
||||||
|
yield collection.Item(index)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# This module's main grammar.
|
||||||
|
|
||||||
|
class ControlGrammar(ConnectionGrammar):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
ConnectionGrammar.__init__(
|
||||||
|
self,
|
||||||
|
name="Explorer control",
|
||||||
|
context=AppContext(executable="explorer"),
|
||||||
|
app_name="Shell.Application"
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_active_explorer(self):
|
||||||
|
handle = Window.get_foreground().handle
|
||||||
|
for window in collection_iter(self.application.Windows()):
|
||||||
|
if window.HWND == handle:
|
||||||
|
return window
|
||||||
|
self._log.warning("%s: no active explorer." % self)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_selected_paths(self):
|
||||||
|
window = self.get_active_explorer()
|
||||||
|
items = window.Document.SelectedItems()
|
||||||
|
paths = []
|
||||||
|
for item in collection_iter(items):
|
||||||
|
paths.append(item.Path)
|
||||||
|
print "Selected paths: %r" % paths
|
||||||
|
return paths
|
||||||
|
|
||||||
|
def get_selected_filenames(self):
|
||||||
|
paths = self.get_selected_paths()
|
||||||
|
return [os.path.basename(p) for p in paths]
|
||||||
|
|
||||||
|
def get_current_directory(self):
|
||||||
|
window = self.get_active_explorer()
|
||||||
|
path = window.LocationURL[8:]
|
||||||
|
if path.startswith("file:///"):
|
||||||
|
path = path[8:]
|
||||||
|
return unquote(path)
|
||||||
|
|
||||||
|
grammar = ControlGrammar()
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class ListSelectionRule(CompoundRule):
|
||||||
|
spec = "list current selection"
|
||||||
|
def _process_recognition(self, node, extras):
|
||||||
|
print "Current selection:"
|
||||||
|
for filename in self.grammar.get_selected_filenames():
|
||||||
|
print " - %r" % filename
|
||||||
|
|
||||||
|
grammar.add_rule(ListSelectionRule())
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class CommandRule(CompoundRule):
|
||||||
|
|
||||||
|
spec = "[command] <command>"
|
||||||
|
extras = [Choice("command", dict((c.spec, c) for c in commands))]
|
||||||
|
|
||||||
|
def _process_recognition(self, node, extras):
|
||||||
|
command = extras["command"]
|
||||||
|
paths = self.grammar.get_selected_paths()
|
||||||
|
directory = self.grammar.get_current_directory()
|
||||||
|
print "Selected paths: %r" % paths
|
||||||
|
command.execute(paths, directory)
|
||||||
|
|
||||||
|
grammar.add_rule(CommandRule())
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Load the grammar instance and define how to unload it.
|
||||||
|
|
||||||
|
grammar.load()
|
||||||
|
|
||||||
|
# Unload function which will be called by natlink at unload time.
|
||||||
|
def unload():
|
||||||
|
global grammar
|
||||||
|
if grammar: grammar.unload()
|
||||||
|
grammar = None
|
|
@ -0,0 +1,354 @@
|
||||||
|
#
|
||||||
|
# This file is a command-module for Dragonfly.
|
||||||
|
# (c) Copyright 2008 by Christo Butcher
|
||||||
|
# Licensed under the LGPL, see <http://www.gnu.org/licenses/>
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
Command-module for **Firefox**
|
||||||
|
============================================================================
|
||||||
|
|
||||||
|
This module offers direct control of the `Firefox
|
||||||
|
<http://www.mozilla.com/en-US/firefox/>`_ web browser. It
|
||||||
|
requires the `mouseless-browsing
|
||||||
|
<https://addons.mozilla.org/en-US/firefox/addon/879>`_
|
||||||
|
(mlb) add-on for reliable access to hyperlinks.
|
||||||
|
|
||||||
|
This module includes direct searching using Firefox's
|
||||||
|
search bar and Firefox's keyword searching. It also
|
||||||
|
allows single-utterance submitting of text into form text
|
||||||
|
fields.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
If you are using DNS and Natlink, simply place this file in you Natlink
|
||||||
|
macros directory. It will then be automatically loaded by Natlink when
|
||||||
|
you next toggle your microphone or restart Natlink.
|
||||||
|
|
||||||
|
Customization
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Users should customize this module by editing its
|
||||||
|
configuration file. In this file they should edit the
|
||||||
|
``search.searchbar`` and ``search.keywords`` settings to
|
||||||
|
match their own personal search preferences. These
|
||||||
|
variables map *what you say* to which *search engines* to
|
||||||
|
use.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
import pkg_resources
|
||||||
|
pkg_resources.require("dragonfly >= 0.6.5beta1.dev-r76")
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
from dragonfly import *
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Set up this module's configuration.
|
||||||
|
|
||||||
|
config = Config("Firefox control")
|
||||||
|
config.search = Section("Search-related section")
|
||||||
|
config.search.keywords = Item(
|
||||||
|
default={
|
||||||
|
"wikipedia": "wikipedia",
|
||||||
|
},
|
||||||
|
doc="Mapping of spoken-forms to Firefox search-keywords.",
|
||||||
|
)
|
||||||
|
config.search.searchbar = Item(
|
||||||
|
default=[
|
||||||
|
"google",
|
||||||
|
"yahoo",
|
||||||
|
"amazon",
|
||||||
|
"answers",
|
||||||
|
"creative commons",
|
||||||
|
"eBay",
|
||||||
|
"wikipedia",
|
||||||
|
],
|
||||||
|
doc="Spoken-forms of search engines in the Firefox search-bar; they must be given in the same order here as they are available in Firefox.",
|
||||||
|
)
|
||||||
|
|
||||||
|
config.lang = Section("Language section")
|
||||||
|
config.lang.new_win = Item("new (window | win)")
|
||||||
|
config.lang.new_tab = Item("new (tab | sub)")
|
||||||
|
config.lang.close_tab = Item("close (tab | sub)")
|
||||||
|
config.lang.close_tab_n = Item("close (tab | sub) <n>")
|
||||||
|
config.lang.close_n_tabs = Item("close <n> (tabs | subs)")
|
||||||
|
config.lang.address_bar = Item("address [bar]")
|
||||||
|
config.lang.copy_address = Item("copy address")
|
||||||
|
config.lang.paste_address = Item("paste address")
|
||||||
|
config.lang.search_bar = Item("search bar")
|
||||||
|
config.lang.go_home = Item("go home")
|
||||||
|
config.lang.stop_loading = Item("stop loading")
|
||||||
|
config.lang.toggle_tags = Item("toggle tags")
|
||||||
|
config.lang.fresh_tags = Item("fresh tags")
|
||||||
|
config.lang.caret_browsing = Item("(caret | carrot) browsing")
|
||||||
|
config.lang.bookmark_page = Item("bookmark [this] page")
|
||||||
|
config.lang.save_page_as = Item("save [page | file] as")
|
||||||
|
config.lang.print_page = Item("print [page | file]")
|
||||||
|
config.lang.show_tab_n = Item("show tab <n>")
|
||||||
|
config.lang.back = Item("back [<n>]")
|
||||||
|
config.lang.forward = Item("forward [<n>]")
|
||||||
|
config.lang.next_tab = Item("next tab [<n>]")
|
||||||
|
config.lang.prev_tab = Item("(previous | preev) tab [<n>]")
|
||||||
|
config.lang.normal_size = Item("normal text size")
|
||||||
|
config.lang.smaller_size = Item("smaller text size [<n>]")
|
||||||
|
config.lang.bigger_size = Item("bigger text size [<n>]")
|
||||||
|
config.lang.find = Item("find")
|
||||||
|
config.lang.find_text = Item("find <text>")
|
||||||
|
config.lang.find_next = Item("find next [<n>]")
|
||||||
|
|
||||||
|
config.lang.submit = Item("submit")
|
||||||
|
config.lang.submit_text = Item("submit <text>")
|
||||||
|
config.lang.submit_clipboard = Item("submit (clipboard | clip board)")
|
||||||
|
config.lang.link_open = Item("[link] <link> [open]")
|
||||||
|
config.lang.link_save = Item("save [link] <link> [as]")
|
||||||
|
config.lang.link_save_now = Item("save [link] <link> now now")
|
||||||
|
config.lang.link_select = Item("[link] <link> select")
|
||||||
|
config.lang.link_menu = Item("[link] <link> (menu | pop up)")
|
||||||
|
config.lang.link_force = Item("[link] <link> force")
|
||||||
|
config.lang.link_window = Item("[link] <link> [in [new]] window")
|
||||||
|
config.lang.link_tab = Item("[link] <link> [in [new]] tab")
|
||||||
|
config.lang.link_copy = Item("[link] <link> copy")
|
||||||
|
config.lang.link_copy_into_tab = Item("[link] <link> copy into tab")
|
||||||
|
config.lang.link_list = Item("[link] <link> list")
|
||||||
|
config.lang.link_submit = Item("[link] <link> submit")
|
||||||
|
config.lang.link_submit_text = Item("[link] <link> submit <text>")
|
||||||
|
config.lang.link_submit_clipboard = Item("[link] <link> submit (clipboard | clip board)")
|
||||||
|
config.lang.link_dictation_box = Item("edit [link] <link>")
|
||||||
|
config.lang.link_assign_keyword = Item("assign [a] keyword to [link] <link>")
|
||||||
|
config.lang.tabify_links = Item("tab if I <links>")
|
||||||
|
config.lang.tabify_links_sep = Item("comma")
|
||||||
|
|
||||||
|
config.lang.search_text = Item("[power] search [for] <text>")
|
||||||
|
config.lang.search_keyword_text = Item("[power] search <keyword> [for] <text>")
|
||||||
|
config.lang.search_searchbar_text = Item("[power] search <searchbar> [for] <text>")
|
||||||
|
config.lang.search_clipboard = Item("[power] search [for] (clipboard | clip board)")
|
||||||
|
config.lang.search_keyword_clipboard = Item("[power] search <keyword> [for] clipboard")
|
||||||
|
config.lang.search_searchbar_clipboard = Item("[power] search <searchbar> [for] clipboard")
|
||||||
|
|
||||||
|
#config.generate_config_file()
|
||||||
|
config.load()
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Check and prepare search-related config values.
|
||||||
|
|
||||||
|
keywords = config.search.keywords
|
||||||
|
searchbar = dict([(n,i) for i,n in enumerate(config.search.searchbar)])
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Create the rule to match mouseless-browsing link numbers.
|
||||||
|
|
||||||
|
class LinkRule(Rule):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
element = Number(zero=True)
|
||||||
|
Rule.__init__(self, "link_rule", element, exported=False)
|
||||||
|
|
||||||
|
def value(self, node):
|
||||||
|
# Format and return keystrokes to select the link.
|
||||||
|
digits = str(node.children[0].value())
|
||||||
|
link_keys = "f6,s-f6," + ",".join(["numpad"+i for i in digits])
|
||||||
|
self._log.debug("Link keys: %r" % link_keys)
|
||||||
|
return link_keys
|
||||||
|
|
||||||
|
link = RuleRef(name="link", rule=LinkRule())
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Create the main command rule.
|
||||||
|
|
||||||
|
class CommandRule(MappingRule):
|
||||||
|
|
||||||
|
mapping = {
|
||||||
|
config.lang.new_win: Key("c-n"),
|
||||||
|
config.lang.new_tab: Key("c-t"),
|
||||||
|
config.lang.close_tab: Key("c-w"),
|
||||||
|
config.lang.close_tab_n: Key("0, %(n)d, enter/20, c-w"),
|
||||||
|
config.lang.close_n_tabs: Key("c-w/20:%(n)d"),
|
||||||
|
config.lang.address_bar: Key("a-d"),
|
||||||
|
config.lang.copy_address: Key("a-d, c-c"),
|
||||||
|
config.lang.paste_address: Key("a-d, c-v, enter"),
|
||||||
|
config.lang.search_bar: Key("c-k"),
|
||||||
|
config.lang.go_home: Key("a-home"),
|
||||||
|
config.lang.stop_loading: Key("escape"),
|
||||||
|
config.lang.toggle_tags: Key("f12"),
|
||||||
|
config.lang.fresh_tags: Key("f12, f12"),
|
||||||
|
config.lang.caret_browsing: Key("f7"),
|
||||||
|
config.lang.bookmark_page: Key("c-d"),
|
||||||
|
config.lang.save_page_as: Key("c-s"),
|
||||||
|
config.lang.print_page: Key("c-p"),
|
||||||
|
|
||||||
|
config.lang.show_tab_n: Key("0, %(n)d, enter"),
|
||||||
|
config.lang.back: Key("a-left/15:%(n)d"),
|
||||||
|
config.lang.forward: Key("a-right/15:%(n)d"),
|
||||||
|
config.lang.next_tab: Key("c-tab:%(n)d"),
|
||||||
|
config.lang.prev_tab: Key("cs-tab:%(n)d"),
|
||||||
|
|
||||||
|
config.lang.normal_size: Key("a-v/20, z/20, r"),
|
||||||
|
config.lang.smaller_size: Key("c-minus:%(n)d"),
|
||||||
|
config.lang.bigger_size: Key("cs-equals:%(n)d"),
|
||||||
|
|
||||||
|
config.lang.submit: Key("enter"),
|
||||||
|
config.lang.submit_text: Text("%(text)s") + Key("enter"),
|
||||||
|
config.lang.submit_clipboard: Key("c-v, enter"),
|
||||||
|
|
||||||
|
config.lang.find: Key("c-f"),
|
||||||
|
config.lang.find_text: Key("c-f") + Text("%(text)s"),
|
||||||
|
config.lang.find_next: Key("f3/10:%(n)d"),
|
||||||
|
|
||||||
|
config.lang.link_open: Key("%(link)s, enter"),
|
||||||
|
config.lang.link_save: Key("%(link)s, shift/10, apps/20, k"),
|
||||||
|
config.lang.link_save_now: Key("%(link)s, shift/10, apps/20, k")
|
||||||
|
+ WaitWindow(title="Enter name of file")
|
||||||
|
+ Pause("20") + Key("enter"),
|
||||||
|
config.lang.link_select: Key("%(link)s, shift"),
|
||||||
|
config.lang.link_menu: Key("%(link)s, shift/10, apps"),
|
||||||
|
config.lang.link_force: Key("%(link)s, shift/10, enter"),
|
||||||
|
config.lang.link_window: Key("%(link)s, shift/10, apps/20, w"),
|
||||||
|
config.lang.link_tab: Key("%(link)s, shift/10, apps/20, t"),
|
||||||
|
config.lang.link_copy: Key("%(link)s, shift/10, apps/20, a"),
|
||||||
|
config.lang.link_copy_into_tab: Key("%(link)s, shift/10, apps/20, a/10, c-t/20, c-v, enter"),
|
||||||
|
config.lang.link_list: Key("%(link)s, enter, a-down"),
|
||||||
|
config.lang.link_submit: Key("%(link)s, enter/30, enter"),
|
||||||
|
config.lang.link_submit_text: Key("%(link)s, enter/30")
|
||||||
|
+ Text("%(text)s") + Key("enter"),
|
||||||
|
config.lang.link_submit_clipboard: Key("%(link)s, enter/30, c-v, enter"),
|
||||||
|
config.lang.link_dictation_box: Key("%(link)s, enter/30, cs-d"),
|
||||||
|
config.lang.link_assign_keyword: Key("%(link)s, enter/10, apps/20, k"),
|
||||||
|
|
||||||
|
config.lang.search_text: Key("c-k")
|
||||||
|
+ Text("%(text)s") + Key("enter"),
|
||||||
|
config.lang.search_searchbar_text: Key("c-k, c-up:20, c-down:%(searchbar)d")
|
||||||
|
+ Text("%(text)s") + Key("enter"),
|
||||||
|
config.lang.search_keyword_text: Key("a-d")
|
||||||
|
+ Text("%(keyword)s %(text)s")
|
||||||
|
+ Key("enter"),
|
||||||
|
config.lang.search_clipboard: Key("c-k, c-v, enter"),
|
||||||
|
config.lang.search_searchbar_clipboard: Key("c-k, c-up:20, c-down:%(searchbar)d, c-v, enter"),
|
||||||
|
config.lang.search_keyword_clipboard: Key("a-d") + Text("%(keyword)s")
|
||||||
|
+ Key("c-v, enter"),
|
||||||
|
}
|
||||||
|
extras = [
|
||||||
|
link,
|
||||||
|
IntegerRef("n", 1, 20),
|
||||||
|
Dictation("text"),
|
||||||
|
Choice("keyword", keywords),
|
||||||
|
Choice("searchbar", searchbar),
|
||||||
|
]
|
||||||
|
defaults = {
|
||||||
|
"n": 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Create the command rule for sliding.
|
||||||
|
|
||||||
|
slide_directions = {
|
||||||
|
"up": (0,-1),
|
||||||
|
"down": (0,+1),
|
||||||
|
}
|
||||||
|
slide_speeds = {
|
||||||
|
"1": 10,
|
||||||
|
"2": 20,
|
||||||
|
"3": 30,
|
||||||
|
"4": 40,
|
||||||
|
}
|
||||||
|
slide_default_speed = 15
|
||||||
|
slide_start_spec = "(-15,0.6)"
|
||||||
|
|
||||||
|
slide_grammar = None
|
||||||
|
|
||||||
|
def start_sliding(direction, speed):
|
||||||
|
offset_x = direction[0] * speed
|
||||||
|
offset_y = direction[1] * speed
|
||||||
|
offset_spec = "<%d,%d>" % (offset_x, offset_y)
|
||||||
|
action = Key("escape")
|
||||||
|
action.execute()
|
||||||
|
action = Mouse("%s/25, middle/25, %s" % (slide_start_spec, offset_spec))
|
||||||
|
action.execute()
|
||||||
|
|
||||||
|
global slide_grammar
|
||||||
|
if not slide_grammar:
|
||||||
|
slide_grammar = Grammar("Firefox slide grammar")
|
||||||
|
slide_grammar.add_rule(SlideControlRule())
|
||||||
|
slide_grammar.load()
|
||||||
|
slide_grammar.set_exclusive(True)
|
||||||
|
|
||||||
|
def stop_sliding():
|
||||||
|
action = Key("escape")
|
||||||
|
action.execute()
|
||||||
|
|
||||||
|
global slide_grammar
|
||||||
|
if slide_grammar:
|
||||||
|
slide_grammar.set_exclusive(False)
|
||||||
|
slide_grammar.unload()
|
||||||
|
slide_grammar = None
|
||||||
|
|
||||||
|
class SlideStartRule(MappingRule):
|
||||||
|
|
||||||
|
mapping = {
|
||||||
|
"slide <direction> [<speed>]": Function(start_sliding),
|
||||||
|
}
|
||||||
|
extras = [
|
||||||
|
Choice("direction", slide_directions),
|
||||||
|
Choice("speed", slide_speeds),
|
||||||
|
]
|
||||||
|
defaults = {
|
||||||
|
"speed": slide_default_speed,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class SlideControlRule(MappingRule):
|
||||||
|
|
||||||
|
mapping = {
|
||||||
|
"[slide] <direction> [<speed>]": Function(start_sliding),
|
||||||
|
"[slide] stop": Function(stop_sliding),
|
||||||
|
}
|
||||||
|
extras = [
|
||||||
|
Choice("direction", slide_directions),
|
||||||
|
Choice("speed", slide_speeds),
|
||||||
|
]
|
||||||
|
defaults = {
|
||||||
|
"speed": slide_default_speed,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Create the main command rule.
|
||||||
|
|
||||||
|
class TabifyRule(CompoundRule):
|
||||||
|
|
||||||
|
spec = config.lang.tabify_links
|
||||||
|
sep_element = Compound(config.lang.tabify_links_sep)
|
||||||
|
repeat_element = Sequence([sep_element, link])
|
||||||
|
repetitions = Repetition(child=repeat_element, min=0, max=8)
|
||||||
|
extras = [Sequence(name="links", children=(link, repetitions))]
|
||||||
|
|
||||||
|
def _process_recognition(self, node, extras):
|
||||||
|
link_nodes = node.get_children_by_name("link")
|
||||||
|
for n in link_nodes:
|
||||||
|
action = Key(n.value()) + Key("shift/10, apps/20, t/20")
|
||||||
|
action.execute()
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Create and load this module's grammar.
|
||||||
|
|
||||||
|
context = AppContext(executable="firefox")
|
||||||
|
grammar = Grammar("firefox_general", context=context)
|
||||||
|
grammar.add_rule(CommandRule())
|
||||||
|
grammar.add_rule(SlideStartRule())
|
||||||
|
grammar.add_rule(TabifyRule())
|
||||||
|
grammar.load()
|
||||||
|
|
||||||
|
# Unload function which will be called by natlink at unload time.
|
||||||
|
def unload():
|
||||||
|
global grammar
|
||||||
|
if grammar: grammar.unload()
|
||||||
|
grammar = None
|
|
@ -1,4 +1,5 @@
|
||||||
# Author:Brandon Lovrien
|
# Author: Jeremy Hayes
|
||||||
|
# Modified from: Brandon Lovrien version
|
||||||
# This script includes commands used for HTML coding
|
# This script includes commands used for HTML coding
|
||||||
|
|
||||||
from dragonfly import (Grammar, CompoundRule, Dictation, Text, Key, AppContext, MappingRule, Choice)
|
from dragonfly import (Grammar, CompoundRule, Dictation, Text, Key, AppContext, MappingRule, Choice)
|
||||||
|
@ -57,7 +58,9 @@ class HTMLTags(MappingRule):
|
||||||
"title": "title",
|
"title": "title",
|
||||||
"SRC": "src",
|
"SRC": "src",
|
||||||
"HREF": "href",
|
"HREF": "href",
|
||||||
"type": "type"
|
"type": "type",
|
||||||
|
"value": "value",
|
||||||
|
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
Choice("tagname", {
|
Choice("tagname", {
|
||||||
|
@ -101,7 +104,7 @@ class HTMLTags(MappingRule):
|
||||||
"H1": "h1",
|
"H1": "h1",
|
||||||
"H2": "h2",
|
"H2": "h2",
|
||||||
"H3": "h3",
|
"H3": "h3",
|
||||||
"H4": "h4",
|
"(header 4 |H4)": "h4",
|
||||||
"H5": "h5",
|
"H5": "h5",
|
||||||
"H6": "h6",
|
"H6": "h6",
|
||||||
"head": "head",
|
"head": "head",
|
||||||
|
|
|
@ -40,7 +40,12 @@ class JavaScriptControlStructures(MappingRule):
|
||||||
|
|
||||||
mapping = {
|
mapping = {
|
||||||
"variable": Text("var "),
|
"variable": Text("var "),
|
||||||
"console": Text("console.log();"),
|
"true": Text("true"),
|
||||||
|
"false": Text("false"),
|
||||||
|
"model": Text("model."),
|
||||||
|
"console": Text("console.log();") + Key("left") + Key("left"),
|
||||||
|
"parse Float": Text("parseFloat();") + Key("left") + Key("left"),
|
||||||
|
"parse INT": Text("parseInt();") + Key("left") + Key("left"),
|
||||||
"function": Text("function functionName() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"function": Text("function functionName() {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
"variable function": Text("functionName = function () {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
"variable function": Text("functionName = function () {") + Key("enter")+ Key("enter"), #+ Text("}"),
|
||||||
"self function": Text("(function() {") + Key("enter")+ Key("enter"), #+ Text("}())"),
|
"self function": Text("(function() {") + Key("enter")+ Key("enter"), #+ Text("}())"),
|
||||||
|
@ -101,6 +106,7 @@ class JavaScriptAssignmentOperators(MappingRule):
|
||||||
"multiply equals": Text("*="),
|
"multiply equals": Text("*="),
|
||||||
"divide equals": Text("/="),
|
"divide equals": Text("/="),
|
||||||
"modulus equals": Text("%="),
|
"modulus equals": Text("%="),
|
||||||
|
"modulus": Text("%"),
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue