[nvda-addons] commit/googleSpeechRecognition: 2 new changesets

  • From: commits-noreply@xxxxxxxxxxxxx
  • To: nvda-addons@xxxxxxxxxxxxx
  • Date: Fri, 02 Aug 2013 13:01:10 -0000

2 new commits in googleSpeechRecognition:

https://bitbucket.org/nvdaaddonteam/googlespeechrecognition/commits/f96fc8b086c0/
Changeset:   f96fc8b086c0
Branch:      None
User:        parkcorp
Date:        2013-08-02 14:59:32
Summary:     added very poor gui implementation which doesn't save config yet.

Affected #:  4 files

diff --git a/addon/globalPlugins/googleSpeechRecognition/__init__.py 
b/addon/globalPlugins/googleSpeechRecognition/__init__.py
index 94dbbb3..2b6320e 100644
--- a/addon/globalPlugins/googleSpeechRecognition/__init__.py
+++ b/addon/globalPlugins/googleSpeechRecognition/__init__.py
@@ -1,5 +1,13 @@
 # encoding: utf-8
-
+from cStringIO import StringIO
+from configobj import ConfigObj
+from validate import Validator
+import os
+import config
+import gui
+from langslist import langslist
+from dialogs import MultipleChoiceDialog
+import wx
 import brailleInput
 import globalPluginHandler
 import globalVars
@@ -9,6 +17,19 @@ import addonHandler
 from spk2txt import spk2txt
 addonHandler.initTranslation()
 
+config.initConfigPath()
+configPath = globalVars.appArgs.configPath
+config_FileName = os.path.join(configPath, (__file__), 
"googleSpeechRecognition.ini")
+
+confspec = ConfigObj(StringIO("""#Configuration file
+
+       langs = string(default=en)
+"""), encoding="UTF-8", list_values=False)
+confspec.newlines = "\r\n"
+conf = ConfigObj(config_FileName, configspec = confspec, indent_type = "\t", 
encoding="UTF-8")
+val = Validator()
+conf.validate(val)
+lng = conf["langs"]
 
 class GlobalPlugin(globalPluginHandler.GlobalPlugin):
 
@@ -18,7 +39,51 @@ class GlobalPlugin(globalPluginHandler.GlobalPlugin):
                        return
                self.recognizer = None
                self.text = ''
+               self.createMenu()
 
+       def createMenu(self):
+               self.prefsMenu = 
gui.mainFrame.sysTrayIcon.menu.GetMenuItems()[0].GetSubMenu()
+               self.googleSpeechRecognitionSettingsItem = 
self.prefsMenu.Append(wx.ID_ANY, 
+                       # Translators: name of the option in the menu.
+                       _("Google &Speech Recognition Settings..."),
+                       # Translators: tooltip text for the menu item.
+                       _("Select languages to be used for recognition."))
+               gui.mainFrame.sysTrayIcon.Bind(wx.EVT_MENU, self.onSettings, 
self.googleSpeechRecognitionSettingsItem)
+
+       def terminate(self):
+               try:
+                       
self.prefsMenu.RemoveItem(self.googleSpeechRecognitionSettingsItem)
+               except wx.PyDeadObjectError:
+                       pass
+
+       def onSettings(self, evt):
+               message = _("Choose the position for Save log menu")
+               title = _("Save Log settings (2)")
+               lst = langslist.keys()
+               dlg = MultipleChoiceDialog(gui.mainFrame, message, title, lst)
+               #try:
+                       #dlg.SetValue(lng)
+               #except TypeError:
+               #dlg.SetValue(0)
+               gui.mainFrame.prePopup()
+               try:
+                       result = dlg.ShowModal()
+               except AttributeError:
+                       pass
+               gui.mainFrame.postPopup()
+               if result == wx.ID_OK:
+                       #tones.beep(500,300)
+               #dlg.Destroy()
+                       global lng
+                       lng = dlg.GetValue()
+                       self.__init__()
+                       conf["langs"] = lng
+                       try:
+                               conf.validate(val, copy=True)
+                               conf.write()
+                       except Exception, e:
+                               pass    
+                       
        def script_record(self,gesture):
                if not self.recognizer:
                        self.recognizer = spk2txt()
@@ -32,7 +97,6 @@ class GlobalPlugin(globalPluginHandler.GlobalPlugin):
                        self.recognizer = None
                        ui.message(self.text)
 
-
        def script_accept(self,gesture):
                brailleInput.handler.sendChars(self.text)
 

diff --git a/addon/globalPlugins/googleSpeechRecognition/dialogs.py 
b/addon/globalPlugins/googleSpeechRecognition/dialogs.py
new file mode 100644
index 0000000..2682118
--- /dev/null
+++ b/addon/globalPlugins/googleSpeechRecognition/dialogs.py
@@ -0,0 +1,438 @@
+#----------------------------------------------------------------------
+# Name:        wx.lib.dialogs
+# Purpose:     ScrolledMessageDialog, MultipleChoiceDialog and
+#              function wrappers for the common dialogs by Kevin Altis.
+#
+# Author:      Various
+#
+# Created:     3-January-2002
+# RCS-ID:      $Id: dialogs.py 45088 2007-03-27 01:49:46Z RD $
+# Copyright:   (c) 2002 by Total Control Software
+# Licence:     wxWindows license
+#----------------------------------------------------------------------
+# 12/01/2003 - Jeff Grimmett (grimmtooth@xxxxxxxxxxxx)
+#
+# o Updated for 2.5 compatability.
+#
+# 12/18/2003 - Jeff Grimmett (grimmtooth@xxxxxxxxxxxx)
+#
+# o wxScrolledMessageDialog -> ScrolledMessageDialog
+# o wxMultipleChoiceDialog -> MultipleChoiceDialog
+#
+
+import  wx
+import  layoutf
+
+#----------------------------------------------------------------------
+
+class ScrolledMessageDialog(wx.Dialog):
+    def __init__(self, parent, msg, caption,
+                 pos=wx.DefaultPosition, size=(500,300),
+                 style=wx.DEFAULT_DIALOG_STYLE):
+        wx.Dialog.__init__(self, parent, -1, caption, pos, size, style)
+        x, y = pos
+        if x == -1 and y == -1:
+            self.CenterOnScreen(wx.BOTH)
+
+        self.text = text = wx.TextCtrl(self, -1, msg, 
+                                       style=wx.TE_MULTILINE | wx.TE_READONLY)
+
+        ok = wx.Button(self, wx.ID_OK, "OK")
+        ok.SetDefault()
+        lc = layoutf.Layoutf('t=t5#1;b=t5#2;l=l5#1;r=r5#1', (self,ok)) 
+        text.SetConstraints(lc)
+
+        lc = layoutf.Layoutf('b=b5#1;x%w50#1;w!80;h*', (self,))
+        ok.SetConstraints(lc)
+        self.SetAutoLayout(1)
+        self.Layout()
+
+
+class MultipleChoiceDialog(wx.Dialog):
+    def __init__(self, parent, msg, title, lst, pos = wx.DefaultPosition,
+                 size = (200,200), style = wx.DEFAULT_DIALOG_STYLE):
+        wx.Dialog.__init__(self, parent, -1, title, pos, size, style)
+        
+        x, y = pos
+        if x == -1 and y == -1:
+            self.CenterOnScreen(wx.BOTH)
+
+        stat = wx.StaticText(self, -1, msg)
+        self.lbox = wx.ListBox(self, 100, wx.DefaultPosition, wx.DefaultSize, 
+                               lst, wx.LB_MULTIPLE)
+
+        ok = wx.Button(self, wx.ID_OK, "OK")
+        ok.SetDefault()
+        cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
+        
+        dlgsizer = wx.BoxSizer(wx.VERTICAL)
+        dlgsizer.Add(stat, 0, wx.ALL, 4)
+        dlgsizer.Add(self.lbox, 1, wx.EXPAND | wx.ALL, 4)
+        
+        btnsizer = wx.StdDialogButtonSizer()
+        btnsizer.AddButton(ok)
+        btnsizer.AddButton(cancel)
+        btnsizer.Realize()
+        
+        dlgsizer.Add(btnsizer, 0, wx.ALL | wx.ALIGN_RIGHT, 4)
+        
+        self.SetSizer(dlgsizer)
+        
+        self.lst = lst
+        self.Layout()
+
+    def GetValue(self):
+        return self.lbox.GetSelections()
+
+    def GetValueString(self):
+        sel = self.lbox.GetSelections()
+        val = [ self.lst[i] for i in sel ]
+        return tuple(val)
+
+
+#----------------------------------------------------------------------
+"""
+function wrappers for wxPython system dialogs
+Author: Kevin Altis
+Date:   2003-1-2
+Rev:    3
+
+This is the third refactor of the PythonCard dialog.py module
+for inclusion in the main wxPython distribution. There are a number of
+design decisions and subsequent code refactoring to be done, so I'm
+releasing this just to get some feedback.
+
+rev 3:
+- result dictionary replaced by DialogResults class instance
+- should message arg be replaced with msg? most wxWindows dialogs
+  seem to use the abbreviation?
+
+rev 2:
+- All dialog classes have been replaced by function wrappers
+- Changed arg lists to more closely match wxWindows docs and 
wxPython.lib.dialogs
+- changed 'returned' value to the actual button id the user clicked on
+- added a returnedString value for the string version of the return value
+- reworked colorDialog and fontDialog so you can pass in just a color or font
+    for the most common usage case
+- probably need to use colour instead of color to match the English English
+    spelling in wxWindows (sigh)
+- I still think we could lose the parent arg and just always use None
+"""
+
+class DialogResults:
+    def __init__(self, returned):
+        self.returned = returned
+        self.accepted = returned in (wx.ID_OK, wx.ID_YES)
+        self.returnedString = returnedString(returned)
+
+    def __repr__(self):
+        return str(self.__dict__)
+
+def returnedString(ret):
+    if ret == wx.ID_OK:
+        return "Ok"
+    elif ret == wx.ID_CANCEL:
+        return "Cancel"
+    elif ret == wx.ID_YES:
+        return "Yes"
+    elif ret == wx.ID_NO:
+        return "No"
+
+
+## findDialog was created before wxPython got a Find/Replace dialog
+## but it may be instructive as to how a function wrapper can
+## be added for your own custom dialogs
+## this dialog is always modal, while wxFindReplaceDialog is
+## modeless and so doesn't lend itself to a function wrapper
+def findDialog(parent=None, searchText='', wholeWordsOnly=0, caseSensitive=0):
+    dlg = wx.Dialog(parent, -1, "Find", wx.DefaultPosition, (380, 120))
+
+    wx.StaticText(dlg, -1, 'Find what:', (7, 10))
+    wSearchText = wx.TextCtrl(dlg, -1, searchText, (80, 7), (195, -1))
+    wSearchText.SetValue(searchText)
+    wx.Button(dlg, wx.ID_OK, "Find Next", (285, 5), 
wx.DefaultSize).SetDefault()
+    wx.Button(dlg, wx.ID_CANCEL, "Cancel", (285, 35), wx.DefaultSize)
+
+    wWholeWord = wx.CheckBox(dlg, -1, 'Match whole word only',
+                            (7, 35), wx.DefaultSize, wx.NO_BORDER)
+
+    if wholeWordsOnly:
+        wWholeWord.SetValue(1)
+
+    wCase = wx.CheckBox(dlg, -1, 'Match case', (7, 55), wx.DefaultSize, 
wx.NO_BORDER)
+
+    if caseSensitive:
+        wCase.SetValue(1)
+
+    wSearchText.SetSelection(0, len(wSearchText.GetValue()))
+    wSearchText.SetFocus()
+
+    result = DialogResults(dlg.ShowModal())
+    result.searchText = wSearchText.GetValue()
+    result.wholeWordsOnly = wWholeWord.GetValue()
+    result.caseSensitive = wCase.GetValue()
+    dlg.Destroy()
+    return result
+
+
+def colorDialog(parent=None, colorData=None, color=None):
+    if colorData:
+        dialog = wx.ColourDialog(parent, colorData)
+    else:
+        dialog = wx.ColourDialog(parent)
+        dialog.GetColourData().SetChooseFull(1)
+
+    if color is not None:
+        dialog.GetColourData().SetColour(color)
+
+    result = DialogResults(dialog.ShowModal())
+    result.colorData = dialog.GetColourData()
+    result.color = result.colorData.GetColour().Get()
+    dialog.Destroy()
+    return result
+
+
+## it is easier to just duplicate the code than
+## try and replace color with colour in the result
+def colourDialog(parent=None, colourData=None, colour=None):
+    if colourData:
+        dialog = wx.ColourDialog(parent, colourData)
+    else:
+        dialog = wx.ColourDialog(parent)
+        dialog.GetColourData().SetChooseFull(1)
+
+    if colour is not None:
+        dialog.GetColourData().SetColour(color)
+
+    result = DialogResults(dialog.ShowModal())
+    result.colourData = dialog.GetColourData()
+    result.colour = result.colourData.GetColour().Get()
+    dialog.Destroy()
+    return result
+
+
+def fontDialog(parent=None, fontData=None, font=None):
+    if fontData is None:
+        fontData = wx.FontData()
+        fontData.SetColour(wx.BLACK)
+        
fontData.SetInitialFont(wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT))
+
+    if font is not None:
+        fontData.SetInitialFont(font)
+
+    dialog = wx.FontDialog(parent, fontData)
+    result = DialogResults(dialog.ShowModal())
+
+    if result.accepted:
+        fontData = dialog.GetFontData()
+        result.fontData = fontData
+        result.color = fontData.GetColour().Get()
+        result.colour = result.color
+        result.font = fontData.GetChosenFont()
+    else:
+        result.color = None
+        result.colour = None
+        result.font = None
+
+    dialog.Destroy()
+    return result
+
+
+def textEntryDialog(parent=None, message='', title='', defaultText='',
+                    style=wx.OK | wx.CANCEL):
+    dialog = wx.TextEntryDialog(parent, message, title, defaultText, style)
+    result = DialogResults(dialog.ShowModal())
+    result.text = dialog.GetValue()
+    dialog.Destroy()
+    return result
+
+
+def messageDialog(parent=None, message='', title='Message box',
+                  aStyle = wx.OK | wx.CANCEL | wx.CENTRE,
+                  pos=wx.DefaultPosition):
+    dialog = wx.MessageDialog(parent, message, title, aStyle, pos)
+    result = DialogResults(dialog.ShowModal())
+    dialog.Destroy()
+    return result
+
+
+## KEA: alerts are common, so I'm providing a class rather than
+## requiring the user code to set up the right icons and buttons
+## the with messageDialog function
+def alertDialog(parent=None, message='', title='Alert', 
pos=wx.DefaultPosition):
+    return messageDialog(parent, message, title, wx.ICON_EXCLAMATION | wx.OK, 
pos)
+
+
+def scrolledMessageDialog(parent=None, message='', title='', 
pos=wx.DefaultPosition,
+                          size=(500,300)):
+
+    dialog = ScrolledMessageDialog(parent, message, title, pos, size)
+    result = DialogResults(dialog.ShowModal())
+    dialog.Destroy()
+    return result
+
+
+def fileDialog(parent=None, title='Open', directory='', filename='', 
wildcard='*.*',
+               style=wx.OPEN | wx.MULTIPLE):
+
+    dialog = wx.FileDialog(parent, title, directory, filename, wildcard, style)
+    result = DialogResults(dialog.ShowModal())
+    if result.accepted:
+        result.paths = dialog.GetPaths()
+    else:
+        result.paths = None
+    dialog.Destroy()
+    return result
+
+
+## openFileDialog and saveFileDialog are convenience functions
+## they represent the most common usages of the fileDialog
+## with the most common style options
+def openFileDialog(parent=None, title='Open', directory='', filename='',
+                   wildcard='All Files (*.*)|*.*',
+                   style=wx.OPEN | wx.MULTIPLE):
+    return fileDialog(parent, title, directory, filename, wildcard, style)
+
+
+def saveFileDialog(parent=None, title='Save', directory='', filename='',
+                   wildcard='All Files (*.*)|*.*',
+                   style=wx.SAVE | wx.OVERWRITE_PROMPT):
+    return fileDialog(parent, title, directory, filename, wildcard, style)
+
+
+def dirDialog(parent=None, message='Choose a directory', path='', style=0,
+              pos=wx.DefaultPosition, size=wx.DefaultSize):
+
+    dialog = wx.DirDialog(parent, message, path, style, pos, size)
+    result = DialogResults(dialog.ShowModal())
+    if result.accepted:
+        result.path = dialog.GetPath()
+    else:
+        result.path = None
+    dialog.Destroy()
+    return result
+
+directoryDialog = dirDialog
+
+
+def singleChoiceDialog(parent=None, message='', title='', lst=[], 
+                       style=wx.OK | wx.CANCEL | wx.CENTRE):
+    dialog = wx.SingleChoiceDialog(parent, message, title, list(lst), style | 
wx.DEFAULT_DIALOG_STYLE)
+    result = DialogResults(dialog.ShowModal())
+    result.selection = dialog.GetStringSelection()
+    dialog.Destroy()
+    return result
+
+
+def multipleChoiceDialog(parent=None, message='', title='', lst=[],
+                         pos=wx.DefaultPosition, size=wx.DefaultSize):
+
+    dialog = wx.MultiChoiceDialog(parent, message, title, lst,
+                                  wx.CHOICEDLG_STYLE, pos)
+    result = DialogResults(dialog.ShowModal())
+    result.selection = tuple([lst[i] for i in dialog.GetSelections()])
+    dialog.Destroy()
+    return result
+
+
+if __name__ == '__main__':
+    #import os
+    #print os.getpid()
+    
+    class MyApp(wx.App):
+
+        def OnInit(self):
+            self.frame = frame = wx.Frame(None, -1, "Dialogs", size=(400, 240))
+            panel = wx.Panel(frame, -1)
+            self.panel = panel
+
+
+            dialogNames = [
+                'alertDialog',
+                'colorDialog',
+                'directoryDialog',
+                'fileDialog',
+                'findDialog',
+                'fontDialog',
+                'messageDialog',
+                'multipleChoiceDialog',
+                'openFileDialog',
+                'saveFileDialog',
+                'scrolledMessageDialog',
+                'singleChoiceDialog',
+                'textEntryDialog',
+            ]
+
+            self.nameList = wx.ListBox(panel, -1,
+                                       size=(130, 180),
+                                       choices=dialogNames,
+                                       style=wx.LB_SINGLE)
+            self.Bind(wx.EVT_LISTBOX, self.OnNameListSelected, self.nameList)
+
+            tstyle = wx.TE_RICH2 | wx.TE_PROCESS_TAB | wx.TE_MULTILINE
+            self.text1 = wx.TextCtrl(panel, -1, size=(200, 180), style=tstyle)
+
+            sizer = wx.BoxSizer(wx.HORIZONTAL)
+            sizer.Add(self.nameList, 0, wx.EXPAND|wx.ALL, 20)
+            sizer.Add(self.text1, 1,  wx.EXPAND|wx.ALL, 20)
+
+            panel.SetSizer(sizer)
+
+            self.SetTopWindow(frame)
+            frame.Show(1)
+            return 1
+
+
+        def OnNameListSelected(self, evt):
+            import pprint
+            sel = evt.GetString()
+            result = None
+            if sel == 'alertDialog':
+                result = alertDialog(message='Danger Will Robinson')
+            elif sel == 'colorDialog':
+                result = colorDialog()
+            elif sel == 'directoryDialog':
+                result = directoryDialog()
+            elif sel == 'fileDialog':
+                wildcard = "JPG files 
(*.jpg;*.jpeg)|*.jpeg;*.JPG;*.JPEG;*.jpg|GIF files (*.gif)|*.GIF;*.gif|All 
Files (*.*)|*.*"
+                result = fileDialog(None, 'Open', '', '', wildcard)
+            elif sel == 'findDialog':
+                result = findDialog()
+            elif sel == 'fontDialog':
+                result = fontDialog()
+            elif sel == 'messageDialog':
+                result = messageDialog(None, 'Hello from Python and wxPython!',
+                          'A Message Box', wx.OK | wx.ICON_INFORMATION)
+                          #wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | 
wx.ICON_INFORMATION)
+                #result = messageDialog(None, 'message', 'title')
+            elif sel == 'multipleChoiceDialog':
+                result = multipleChoiceDialog(None, "message", "title", 
['one', 'two', 'three'])
+            elif sel == 'openFileDialog':
+                result = openFileDialog()
+            elif sel == 'saveFileDialog':
+                result = saveFileDialog()
+            elif sel == 'scrolledMessageDialog':
+                msg = "Can't find the file dialog.py"
+                try:
+                    # read this source file and then display it
+                    import sys
+                    filename = sys.argv[-1]
+                    fp = open(filename)
+                    message = fp.read()
+                    fp.close()
+                except:
+                    pass
+                result = scrolledMessageDialog(None, message, filename)
+            elif sel == 'singleChoiceDialog':
+                result = singleChoiceDialog(None, "message", "title", ['one', 
'two', 'three'])
+            elif sel == 'textEntryDialog':
+                result = textEntryDialog(None, "message", "title", "text")
+
+            if result:
+                #self.text1.SetValue(pprint.pformat(result.__dict__))
+                self.text1.SetValue(str(result))
+
+    app = MyApp(True)
+    app.MainLoop()
+
+

diff --git a/addon/globalPlugins/googleSpeechRecognition/langslist.py 
b/addon/globalPlugins/googleSpeechRecognition/langslist.py
new file mode 100644
index 0000000..3d4f94e
--- /dev/null
+++ b/addon/globalPlugins/googleSpeechRecognition/langslist.py
@@ -0,0 +1,124 @@
+#langslist.py
+# Copyright (C) 2012-2013 Aleksey Sadovoy AKA Lex <lex@xxxxxxxxxx>,
+#ruslan <ru2020slan@xxxxxxxxx>,
+#beqa <beqaprogger@xxxxxxxxx>
+#other nvda contributors
+#This file is covered by the GNU General Public License.
+#See the file COPYING for more details.
+
+from languageHandler import getLanguageDescription
+def g(code):
+       """Return an NVDA language description for code, if one is available. 
Otherwise, return the one from needed_codes. If that fails, return the code."""
+       res = getLanguageDescription(code)
+       if res is not None: return res
+       if code in needed_codes:
+               return needed_codes[code]
+       return code
+
+needed_codes = {
+       # Translators: An option to automatically detect source language for 
translation.
+       "auto":_("Automatically detect language"),
+       # Translators: The name of a language supported by this add-on.
+       "ar":_("Arabic"),
+       # Translators: The name of a language supported by this add-on.
+       "bn":_("Bangla"),
+       # Translators: The name of a language supported by this add-on.
+       "cy":_("Welsh"),
+       # Translators: The name of a language supported by this add-on.
+       "eo":_("Esperanto"),
+       # Translators: The name of a language supported by this add-on.
+       "gu":_("Gujarati"),
+       # Translators: The name of a language supported by this add-on.
+       "ht":_("Creole Haiti"),
+       # Translators: The name of a language supported by this add-on.
+       "hy":_("Armenian"),
+       # Translators: The name of a language supported by this add-on.
+       "la":_("Latin"),
+       # Translators: The name of a language supported by this add-on.
+       "no":_(u'Norwegian'),
+       # Translators: The name of a language supported by this add-on.
+       "sr":_("Serbian (Latin)"),
+       # Translators: The name of a language supported by this add-on.
+       "sw":_("Swahili"),
+       # Translators: The name of a language supported by this add-on.
+       "tl":_("Tagalog"),
+       # Translators: The name of a language supported by this add-on.
+       "yi":_("Yiddish"),
+       # Translators: The name of a language supported by this add-on.
+       'zh-CN':_('Chinese (Simplified)'),
+       # Translators: The name of a language supported by this add-on.
+       "zh-TW":_("Chinese (Traditional)"),
+}
+
+langcodes = [
+       "auto",
+       "af",
+       "ar",
+       "az",
+       "sq",
+       "eu",
+       "be",
+       "bn",
+       "bg",
+       "ca",
+       "cs",
+       "cy",
+       "da",
+       "de",
+       "el",
+       "en",
+       "eo",
+       "es",
+       "et",
+       "fa",
+       "fi",
+       "fr",
+       "ga",
+       "gl",
+       "gu",
+       "he",
+       "hi",
+       "hr",
+       "ht",
+       "hu",
+       "hy",
+       "id",
+       "is",
+       "it",
+       "ja",
+       "ka",
+       "ko",
+       "kn",
+       "la",
+       "lv",
+       "lt",
+       "mk",
+       "ms",
+       "mt",
+       "no",
+       "nl",
+       "pl",
+       "pt",
+       "ro",
+       "ru",
+       "sk",
+       "sl",
+       "sr",
+       "sv",
+       "sw",
+       "ta",
+       "te",
+       "th",
+       "tl",
+       "tr",
+       "uk",
+       "ur",
+       "vi",
+       "yi",
+       "zh-CN",
+       "zh-TW",
+]
+
+langslist = {}
+for code in langcodes:
+       langslist[g(code)] = code

diff --git a/addon/globalPlugins/googleSpeechRecognition/layoutf.py 
b/addon/globalPlugins/googleSpeechRecognition/layoutf.py
new file mode 100644
index 0000000..65a4bdc
--- /dev/null
+++ b/addon/globalPlugins/googleSpeechRecognition/layoutf.py
@@ -0,0 +1,267 @@
+# 12/09/2003 - Jeff Grimmett (grimmtooth@xxxxxxxxxxxx)
+#
+# o Updated for wx namespace
+# 
+# 12/18/2003 - Jeff Grimmett (grimmtooth@xxxxxxxxxxxx)
+#
+# o wxScrolledMessageDialog -> ScrolledMessageDialog
+# 
+
+import  re
+import  wx
+
+class Layoutf(wx.LayoutConstraints):
+    """
+The class Layoutf(wxLayoutConstraints) presents a simplification
+of the wxLayoutConstraints syntax. The name Layoutf is choosen
+because of the similarity with C's printf function.
+
+Quick Example:
+
+    lc = Layoutf('t=t#1;l=r10#2;r!100;h%h50#1', (self, self.panel))
+
+is equivalent to
+
+    lc = wxLayoutContraints()
+    lc.top.SameAs(self, wxTop)
+    lc.left.SameAs(self.panel, wxRight, 10)
+    lc.right.Absolute(100)
+    lc.height.PercentOf(self, wxHeight, 50)
+
+Usage:
+
+    You can give a constraint string to the Layoutf constructor,
+or use the 'pack' method. The following are equivalent:
+
+    lc = Layoutf('t=t#1;l=r#2;r!100;h%h50#1', (self, self.panel))
+
+and
+
+    lc = Layoutf()
+    lc.pack('t=t#1;l=r#2;r!100;h%h50#1', (self, self.panel))
+
+    Besides 'pack' there's also 'debug_pack' which does not set
+constraints, but prints traditional wxLayoutConstraint calls to
+stdout.
+
+    The calls to the Layoutf constructor and pack methods have
+the following argument list:
+
+    (constraint_string, objects_tuple)
+
+Constraint String syntax:
+
+    Constraint directives are separated by semi-colons. You
+generally (always?) need four directives to completely describe a
+subwindow's location.
+
+    A single directive has either of the following forms:
+
+    1. <own attribute><compare operation>[numerical argument]
+    for example r!100 -> lc.right.Absolute(100) )
+    and w* -> lc.width.AsIs()
+
+    2. <own attribute><compare operation>[numerical argument]
+       #<compare object nr.>
+    for example t_10#2 (lc.top.Below(<second obj>, 10)
+
+    3. <own attribute><compare operation><compare attribute>
+       [numerical argument]#<compare object nr.>
+    for example w%h50#2 ( lc.width.PercentOf(<second obj>,
+    wxHeight, 50) and t=b#1 ( lc.top.SameAs(<first obj>,
+    wxBottom) )
+
+    Which one you need is defined by the <compare operation>
+type. The following take type 1 (no object to compare with):
+
+    '!': 'Absolute', '?': 'Unconstrained', '*': 'AsIs'
+
+These take type 2 (need to be compared with another object)
+
+    '<': 'LeftOf', '>': 'RightOf', '^': 'Above', '_': 'Below'
+
+These take type 3 (need to be compared to another object
+attribute)
+
+    '=': 'SameAs', '%': 'PercentOf'
+
+For all types, the <own attribute> letter can be any of
+
+    't': 'top', 'l': 'left', 'b': 'bottom',
+    'r': 'right', 'h': 'height', 'w': 'width',
+    'x': 'centreX', 'y': 'centreY'
+
+If the operation takes an (optional) numerical argument, place it
+in [numerical argument].  For type 3 directives, the <compare
+attribute> letter can be any of
+
+    't': 'wxTop', 'l': 'wxLeft', 'b': 'wxBottom'
+    'r': 'wxRight', 'h': 'wxHeight', 'w': 'wxWidth',
+    'x': 'wxCentreX', 'y': 'wxCentreY'
+
+Note that these are the same letters as used for <own attribute>,
+so you'll only need to remember one set. Finally, the object
+whose attribute is refered to, is specified by #<compare object
+nr>, where <compare object nr> is the 1-based (stupid, I know,
+but I've gotten used to it) index of the object in the
+objects_tuple argument.
+
+Bugs:
+
+Not entirely happy about the logic in the order of arguments
+after the <compare operation> character.
+
+Not all wxLayoutConstraint methods are included in the
+syntax. However, the type 3 directives are generally the most
+used. Further excuse: wxWindows layout constraints are at the
+time of this writing not documented.
+
+"""
+
+    attr_d = { 't': 'top', 'l': 'left', 'b': 'bottom',
+             'r': 'right', 'h': 'height', 'w': 'width',
+             'x': 'centreX', 'y': 'centreY' }
+    op_d = { '=': 'SameAs', '%': 'PercentOf', '<': 'LeftOf',
+              '>': 'RightOf', '^': 'Above', '_': 'Below',
+               '!': 'Absolute', '?': 'Unconstrained', '*': 'AsIs' }
+    cmp_d = { 't': 'wx.Top', 'l': 'wx.Left', 'b': 'wx.Bottom',
+             'r': 'wx.Right', 'h': 'wx.Height', 'w': 'wx.Width',
+             'x': 'wx.CentreX', 'y': 'wx.CentreY' }
+
+    rexp1 = re.compile('^\s*([tlrbhwxy])\s*([!\?\*])\s*(\d*)\s*$')
+    rexp2 = 
re.compile('^\s*([tlrbhwxy])\s*([=%<>^_])\s*([tlrbhwxy]?)\s*(\d*)\s*#(\d+)\s*$')
+
+    def __init__(self,pstr=None,winlist=None):
+        wx.LayoutConstraints.__init__(self)
+        if pstr:
+            self.pack(pstr,winlist)
+
+    def pack(self, pstr, winlist):
+        pstr = pstr.lower()
+        for item in pstr.split(';'):
+            m = self.rexp1.match(item)
+            if m:
+                g = list(m.groups())
+                attr = getattr(self, self.attr_d[g[0]])
+                func = getattr(attr, self.op_d[g[1]])
+                if g[1] == '!':
+                    func(int(g[2]))
+                else:
+                    func()
+                continue
+            m = self.rexp2.match(item)
+            if not m: raise ValueError
+            g = list(m.groups())
+            attr = getattr(self, self.attr_d[g[0]])
+            func = getattr(attr, self.op_d[g[1]])
+            if g[3]: g[3] = int(g[3])
+            else: g[3] = None;
+            g[4] = int(g[4]) - 1
+            if g[1] in '<>^_':
+                if g[3]: func(winlist[g[4]], g[3])
+                else: func(winlist[g[4]])
+            else:
+                cmp = eval(self.cmp_d[g[2]])
+                if g[3]: func(winlist[g[4]], cmp, g[3])
+                else: func(winlist[g[4]], cmp)
+
+    def debug_pack(self, pstr, winlist):
+        pstr = pstr.lower()
+        for item in pstr.split(';'):
+            m = self.rexp1.match(item)
+            if m:
+                g = list(m.groups())
+                attr = getattr(self, self.attr_d[g[0]])
+                func = getattr(attr, self.op_d[g[1]])
+                if g[1] == '!':
+                    print "%s.%s.%s(%s)" % \
+                     ('self',self.attr_d[g[0]],self.op_d[g[1]],g[2])
+                else:
+                    print "%s.%s.%s()" % \
+                     ('self',self.attr_d[g[0]],self.op_d[g[1]])
+                continue
+            m = self.rexp2.match(item)
+            if not m: raise ValueError
+            g = list(m.groups())
+            if g[3]: g[3] = int(g[3])
+            else: g[3] = 0;
+            g[4] = int(g[4]) - 1
+            if g[1] in '<>^_':
+                if g[3]: print "%s.%s.%s(%s,%d)" % \
+                 ('self',self.attr_d[g[0]],self.op_d[g[1]],winlist[g[4]],
+                  g[3])
+                else: print "%s.%s.%s(%s)" % \
+                 ('self',self.attr_d[g[0]],self.op_d[g[1]],winlist[g[4]])
+            else:
+                if g[3]: print "%s.%s.%s(%s,%s,%d)" % \
+                 ('self',self.attr_d[g[0]],self.op_d[g[1]],winlist[g[4]],
+                  self.cmp_d[g[2]],g[3])
+                else: print "%s.%s.%s(%s,%s)" % \
+                 ('self',self.attr_d[g[0]],self.op_d[g[1]],winlist[g[4]],
+                  self.cmp_d[g[2]])
+
+if __name__=='__main__':
+
+    class TestLayoutf(wx.Frame):
+        def __init__(self, parent):
+            wx.Frame.__init__(self, parent, -1, 'Test Layout Constraints',
+                              wx.DefaultPosition, (500, 300))
+            self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+
+            self.SetAutoLayout(True)
+
+            self.panelA = wx.Window(self, -1, style=wx.SIMPLE_BORDER)
+            self.panelA.SetBackgroundColour(wx.BLUE)
+            
self.panelA.SetConstraints(Layoutf('t=t10#1;l=l10#1;b=b10#1;r%r50#1',(self,)))
+
+            self.panelB = wx.Window(self, -1, style=wx.SIMPLE_BORDER)
+            self.panelB.SetBackgroundColour(wx.RED)
+            
self.panelB.SetConstraints(Layoutf('t=t10#1;r=r10#1;b%b30#1;l>10#2', 
(self,self.panelA)))
+
+            self.panelC = wx.Window(self, -1, style=wx.SIMPLE_BORDER)
+            self.panelC.SetBackgroundColour(wx.WHITE)
+            
self.panelC.SetConstraints(Layoutf('t_10#3;r=r10#1;b=b10#1;l>10#2', 
(self,self.panelA,self.panelB)))
+
+            b = wx.Button(self.panelA, -1, ' About: ')
+            b.SetConstraints(Layoutf('X=X#1;Y=Y#1;h*;w%w50#1', (self.panelA,)))
+            self.Bind(wx.EVT_BUTTON, self.OnAbout, b)
+
+            b = wx.Button(self.panelB, 100, ' Panel B ')
+            b.SetConstraints(Layoutf('t=t2#1;r=r4#1;h*;w*', (self.panelB,)))
+
+            self.panelD = wx.Window(self.panelC, -1, style=wx.SIMPLE_BORDER)
+            self.panelD.SetBackgroundColour(wx.GREEN)
+            self.panelD.SetConstraints(Layoutf('b%h50#1;r%w50#1;h=h#2;w=w#2', 
(self.panelC, b)))
+
+            b = wx.Button(self.panelC, -1, ' Panel C ')
+            b.SetConstraints(Layoutf('t_#1;l>#1;h*;w*', (self.panelD,)))
+            self.Bind(wx.EVT_BUTTON, self.OnButton, b)
+
+            wx.StaticText(self.panelD, -1, "Panel D", (4, 
4)).SetBackgroundColour(wx.GREEN)
+
+        def OnButton(self, event):
+            self.Close(True)
+
+        def OnAbout(self, event):
+            import  wx.lib.dialogs
+            msg = wx.lib.dialogs.ScrolledMessageDialog(self, Layoutf.__doc__, 
"about")
+            msg.ShowModal()
+            msg.Destroy()
+
+        def OnCloseWindow(self, event):
+            self.Destroy()
+
+    class TestApp(wx.App):
+        def OnInit(self):
+            frame = TestLayoutf(None)
+            frame.Show(1)
+            self.SetTopWindow(frame)
+            return 1
+
+    app = TestApp(0)
+    app.MainLoop()
+
+
+
+
+


https://bitbucket.org/nvdaaddonteam/googlespeechrecognition/commits/0f6be35b13d1/
Changeset:   0f6be35b13d1
Branch:      master
User:        parkcorp
Date:        2013-08-02 15:00:32
Summary:     avoid errors when using as an addon.

Affected #:  1 file

diff --git a/addon/globalPlugins/googleSpeechRecognition/spk2txt.py 
b/addon/globalPlugins/googleSpeechRecognition/spk2txt.py
index aa1d4a6..72741ef 100644
--- a/addon/globalPlugins/googleSpeechRecognition/spk2txt.py
+++ b/addon/globalPlugins/googleSpeechRecognition/spk2txt.py
@@ -1,11 +1,16 @@
 # encoding: utf-8
+import sys
+import os
 import urllib2
 import tempfile 
 import pyaudio
 import wave
 import json
 import time
+impPath = os.path.abspath(os.path.dirname(__file__))
+sys.path.append(impPath)
 import plumbum
+del sys.path[-1]
 import threading
 from plumbum.cmd import flac

Repository URL: https://bitbucket.org/nvdaaddonteam/googlespeechrecognition/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
----------------------------------------------------------------

NVDA add-ons Central: A list for discussing NVDA add-ons

To post a message, send an email to nvda-addons@xxxxxxxxxxxxx.

To unsubscribe, send an email with the subject line of "unsubscribe" (without 
quotes) to nvda-addons-request@xxxxxxxxxxxxx.

If you have questions for list moderators, please send a message to 
nvda-addons-moderators@xxxxxxxxxxxxx.

Community addons can be found here: http://addons.nvda-project.org

Other related posts: