Added spell checker
This commit is contained in:
parent
5116a224e3
commit
6cf3397f36
@ -1,4 +1,4 @@
|
|||||||
import spellchecker
|
import spellchecker
|
||||||
import platform
|
import platform
|
||||||
if platform.system() == "Windows":
|
if platform.system() == "Windows":
|
||||||
from wx_ui import *
|
from wx_ui import *
|
@ -1,6 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger("extra.SpellChecker.spellChecker")
|
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
@ -9,62 +8,62 @@ import languageHandler
|
|||||||
from enchant.checker import SpellChecker
|
from enchant.checker import SpellChecker
|
||||||
from enchant.errors import DictNotFoundError
|
from enchant.errors import DictNotFoundError
|
||||||
from enchant import tokenize
|
from enchant import tokenize
|
||||||
import twitterFilter
|
|
||||||
|
log = logging.getLogger("extra.SpellChecker.spellChecker")
|
||||||
|
|
||||||
class spellChecker(object):
|
class spellChecker(object):
|
||||||
def __init__(self, text, dictionary):
|
def __init__(self, text, dictionary):
|
||||||
super(spellChecker, self).__init__()
|
super(spellChecker, self).__init__()
|
||||||
log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,))
|
log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,))
|
||||||
self.active = True
|
self.active = True
|
||||||
try:
|
try:
|
||||||
if config.app["app-settings"]["language"] == "system":
|
if config.app["app-settings"]["language"] == "system":
|
||||||
log.debug("Using the system language")
|
log.debug("Using the system language")
|
||||||
self.checker = SpellChecker(filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter])
|
self.checker = SpellChecker(languageHandler.curLang, filters=[tokenize.EmailFilter, tokenize.URLFilter])
|
||||||
else:
|
else:
|
||||||
log.debug("Using language: %s" % (languageHandler.getLanguage(),))
|
log.debug("Using language: %s" % (languageHandler.getLanguage(),))
|
||||||
self.checker = SpellChecker(languageHandler.getLanguage(), filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter])
|
self.checker = SpellChecker(languageHandler.curLang, filters=[tokenize.EmailFilter, tokenize.URLFilter])
|
||||||
self.checker.set_text(text)
|
self.checker.set_text(text)
|
||||||
except DictNotFoundError:
|
except DictNotFoundError:
|
||||||
log.exception("Dictionary for language %s not found." % (dictionary,))
|
print "no dict"
|
||||||
wx_ui.dict_not_found_error()
|
log.exception("Dictionary for language %s not found." % (dictionary,))
|
||||||
self.active = False
|
wx_ui.dict_not_found_error()
|
||||||
if self.active == True:
|
self.active = False
|
||||||
log.debug("Creating dialog...")
|
if self.active == True:
|
||||||
self.dialog = wx_ui.spellCheckerDialog()
|
log.debug("Creating dialog...")
|
||||||
widgetUtils.connect_event(self.dialog.ignore, widgetUtils.BUTTON_PRESSED, self.ignore)
|
self.dialog = wx_ui.spellCheckerDialog()
|
||||||
widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll)
|
widgetUtils.connect_event(self.dialog.ignore, widgetUtils.BUTTON_PRESSED, self.ignore)
|
||||||
widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace)
|
widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll)
|
||||||
widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll)
|
widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace)
|
||||||
self.check()
|
widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll)
|
||||||
self.dialog.get_response()
|
self.check()
|
||||||
self.fixed_text = self.checker.get_text()
|
self.dialog.get_response()
|
||||||
|
self.fixed_text = self.checker.get_text()
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
try:
|
try:
|
||||||
self.checker.next()
|
self.checker.next()
|
||||||
textToSay = _(u"Misspelled word: %s") % (self.checker.word,)
|
textToSay = _(u"Misspelled word: %s") % (self.checker.word,)
|
||||||
context = u"... %s %s %s" % (self.checker.leading_context(10), self.checker.word, self.checker.trailing_context(10))
|
context = u"... %s %s %s" % (self.checker.leading_context(10), self.checker.word, self.checker.trailing_context(10))
|
||||||
self.dialog.set_title(textToSay)
|
self.dialog.set_title(textToSay)
|
||||||
output.speak(textToSay)
|
output.speak(textToSay)
|
||||||
self.dialog.set_word_and_suggestions(word=self.checker.word, context=context, suggestions=self.checker.suggest())
|
self.dialog.set_word_and_suggestions(word=self.checker.word, context=context, suggestions=self.checker.suggest())
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
log.debug("Process finished.")
|
log.debug("Process finished.")
|
||||||
wx_ui.finished()
|
wx_ui.finished()
|
||||||
self.dialog.Destroy()
|
self.dialog.Destroy()
|
||||||
# except AttributeError:
|
|
||||||
# pass
|
|
||||||
|
|
||||||
def ignore(self, ev):
|
def ignore(self, ev):
|
||||||
self.check()
|
self.check()
|
||||||
|
|
||||||
def ignoreAll(self, ev):
|
def ignoreAll(self, ev):
|
||||||
self.checker.ignore_always(word=self.checker.word)
|
self.checker.ignore_always(word=self.checker.word)
|
||||||
self.check()
|
self.check()
|
||||||
|
|
||||||
def replace(self, ev):
|
def replace(self, ev):
|
||||||
self.checker.replace(self.dialog.get_selected_suggestion())
|
self.checker.replace(self.dialog.get_selected_suggestion())
|
||||||
self.check()
|
self.check()
|
||||||
|
|
||||||
def replaceAll(self, ev):
|
def replaceAll(self, ev):
|
||||||
self.checker.replace_always(self.dialog.get_selected_suggestion())
|
self.checker.replace_always(self.dialog.get_selected_suggestion())
|
||||||
self.check()
|
self.check()
|
@ -1,15 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import re
|
|
||||||
from enchant.tokenize import Filter
|
|
||||||
|
|
||||||
class TwitterFilter(Filter):
|
|
||||||
"""Filter skipping over twitter usernames and hashtags.
|
|
||||||
This filter skips any words matching the following regular expression:
|
|
||||||
^[#@](\S){1, }$
|
|
||||||
That is, any words that resemble users and hashtags.
|
|
||||||
"""
|
|
||||||
_pattern = re.compile(r"^[#@](\S){1,}$")
|
|
||||||
def _skip(self,word):
|
|
||||||
if self._pattern.match(word):
|
|
||||||
return True
|
|
||||||
return False
|
|
@ -18,62 +18,62 @@
|
|||||||
############################################################
|
############################################################
|
||||||
import wx
|
import wx
|
||||||
import application
|
import application
|
||||||
|
|
||||||
class spellCheckerDialog(wx.Dialog):
|
class spellCheckerDialog(wx.Dialog):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(spellCheckerDialog, self).__init__(None, 1)
|
super(spellCheckerDialog, self).__init__(None, 1)
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
word = wx.StaticText(panel, -1, _(u"Misspelled word"))
|
word = wx.StaticText(panel, -1, _(u"Misspelled word"))
|
||||||
self.word = wx.TextCtrl(panel, -1)
|
self.word = wx.TextCtrl(panel, -1)
|
||||||
wordBox = wx.BoxSizer(wx.HORIZONTAL)
|
wordBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
wordBox.Add(word, 0, wx.ALL, 5)
|
wordBox.Add(word, 0, wx.ALL, 5)
|
||||||
wordBox.Add(self.word, 0, wx.ALL, 5)
|
wordBox.Add(self.word, 0, wx.ALL, 5)
|
||||||
context = wx.StaticText(panel, -1, _(u"Context"))
|
context = wx.StaticText(panel, -1, _(u"Context"))
|
||||||
self.context = wx.TextCtrl(panel, -1)
|
self.context = wx.TextCtrl(panel, -1)
|
||||||
contextBox = wx.BoxSizer(wx.HORIZONTAL)
|
contextBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
contextBox.Add(context, 0, wx.ALL, 5)
|
contextBox.Add(context, 0, wx.ALL, 5)
|
||||||
contextBox.Add(self.context, 0, wx.ALL, 5)
|
contextBox.Add(self.context, 0, wx.ALL, 5)
|
||||||
suggest = wx.StaticText(panel, -1, _(u"Suggestions"))
|
suggest = wx.StaticText(panel, -1, _(u"Suggestions"))
|
||||||
self.suggestions = wx.ListBox(panel, -1, choices=[], style=wx.LB_SINGLE)
|
self.suggestions = wx.ListBox(panel, -1, choices=[], style=wx.LB_SINGLE)
|
||||||
suggestionsBox = wx.BoxSizer(wx.HORIZONTAL)
|
suggestionsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
suggestionsBox.Add(suggest, 0, wx.ALL, 5)
|
suggestionsBox.Add(suggest, 0, wx.ALL, 5)
|
||||||
suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5)
|
suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5)
|
||||||
self.ignore = wx.Button(panel, -1, _(u"Ignore"))
|
self.ignore = wx.Button(panel, -1, _(u"Ignore"))
|
||||||
self.ignoreAll = wx.Button(panel, -1, _(u"Ignore all"))
|
self.ignoreAll = wx.Button(panel, -1, _(u"Ignore all"))
|
||||||
self.replace = wx.Button(panel, -1, _(u"Replace"))
|
self.replace = wx.Button(panel, -1, _(u"Replace"))
|
||||||
self.replaceAll = wx.Button(panel, -1, _(u"Replace all"))
|
self.replaceAll = wx.Button(panel, -1, _(u"Replace all"))
|
||||||
close = wx.Button(panel, wx.ID_CANCEL)
|
close = wx.Button(panel, wx.ID_CANCEL)
|
||||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btnBox.Add(self.ignore, 0, wx.ALL, 5)
|
btnBox.Add(self.ignore, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.ignoreAll, 0, wx.ALL, 5)
|
btnBox.Add(self.ignoreAll, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.replace, 0, wx.ALL, 5)
|
btnBox.Add(self.replace, 0, wx.ALL, 5)
|
||||||
btnBox.Add(self.replaceAll, 0, wx.ALL, 5)
|
btnBox.Add(self.replaceAll, 0, wx.ALL, 5)
|
||||||
btnBox.Add(close, 0, wx.ALL, 5)
|
btnBox.Add(close, 0, wx.ALL, 5)
|
||||||
sizer.Add(wordBox, 0, wx.ALL, 5)
|
sizer.Add(wordBox, 0, wx.ALL, 5)
|
||||||
sizer.Add(contextBox, 0, wx.ALL, 5)
|
sizer.Add(contextBox, 0, wx.ALL, 5)
|
||||||
sizer.Add(suggestionsBox, 0, wx.ALL, 5)
|
sizer.Add(suggestionsBox, 0, wx.ALL, 5)
|
||||||
sizer.Add(btnBox, 0, wx.ALL, 5)
|
sizer.Add(btnBox, 0, wx.ALL, 5)
|
||||||
panel.SetSizer(sizer)
|
panel.SetSizer(sizer)
|
||||||
self.SetClientSize(sizer.CalcMin())
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
|
def get_response(self):
|
||||||
|
return self.ShowModal()
|
||||||
|
|
||||||
def get_response(self):
|
def set_title(self, title):
|
||||||
return self.ShowModal()
|
return self.SetTitle(title)
|
||||||
|
|
||||||
def set_title(self, title):
|
def set_word_and_suggestions(self, word, context, suggestions):
|
||||||
return self.SetTitle(title)
|
self.word.SetValue(word)
|
||||||
|
self.context.ChangeValue(context)
|
||||||
|
self.suggestions.Set(suggestions)
|
||||||
|
self.suggestions.SetFocus()
|
||||||
|
|
||||||
def set_word_and_suggestions(self, word, context, suggestions):
|
def get_selected_suggestion(self):
|
||||||
self.word.SetValue(word)
|
return self.suggestions.GetStringSelection()
|
||||||
self.context.ChangeValue(context)
|
|
||||||
self.suggestions.Set(suggestions)
|
|
||||||
self.suggestions.SetFocus()
|
|
||||||
|
|
||||||
def get_selected_suggestion(self):
|
|
||||||
return self.suggestions.GetStringSelection()
|
|
||||||
|
|
||||||
def dict_not_found_error():
|
def dict_not_found_error():
|
||||||
wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in {0}").format(application.name,), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in {0}").format(application.name,), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||||
|
|
||||||
def finished():
|
def finished():
|
||||||
wx.MessageDialog(None, _(u"Spell check complete."), application.name, style=wx.OK).ShowModal()
|
wx.MessageDialog(None, _(u"Spell check complete."), application.name, style=wx.OK).ShowModal()
|
||||||
|
Loading…
Reference in New Issue
Block a user