# Graphspell
#
# Spellchecker based on a DAWG (Direct Acyclic Word Graph)
import uno
import unohelper
import traceback
import re
from grammalecte.graphspell import SpellChecker
from com.sun.star.linguistic2 import XSupportedLocales, XSpellChecker, XSpellAlternatives
from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName
from com.sun.star.lang import Locale
lLocale = {
# List of locales in LibreOffice
# https://cgit.freedesktop.org/libreoffice/core/tree/i18nlangtag/source/isolang/isolang.cxx
('la', 'VA', ''), # Latin (for testing purpose)
('fr', 'FR', ''), # France
('fr', 'BE', ''), # Belgique
('fr', 'CA', ''), # Canada
('fr', 'CH', ''), # Suisse
('fr', 'LU', ''), # Luxembourg
#('fr', 'MC', ''), # Monaco
('fr', 'BF', ''), # Burkina Faso
('fr', 'BJ', ''), # Benin
('fr', 'CD', ''), # Congo
('fr', 'CI', ''), # Côte d’Ivoire
('fr', 'CM', ''), # Cameroun
('fr', 'MA', ''), # Maroc
('fr', 'ML', ''), # Mali
('fr', 'MU', ''), # Île Maurice
('fr', 'NE', ''), # Niger
('fr', 'RE', ''), # Réunion
('fr', 'SN', ''), # Sénégal
('fr', 'TG', '') # Togo
}
zElidedWords = re.compile("(?i)^(?:[ldnmtsjcçy]|qu|lorsqu|quoiqu|puisqu|jusqu)['’`‘]")
class Graphspell (unohelper.Base, XSpellChecker, XServiceInfo, XServiceName, XServiceDisplayName, XSupportedLocales):
def __init__ (self, ctx, *args):
try:
self.ctx = ctx
self.sServiceName = "com.sun.star.linguistic2.SpellChecker"
self.sImplementationName = "net.grammalecte.graphspell"
self.tSupportedServiceNames = (self.sServiceName, )
self.xSvMgr = ctx.ServiceManager
self.locales = tuple([ Locale(t[0], t[1], t[2]) for t in lLocale ])
self.oGraphspell = SpellChecker("fr", "fr.bdic")
self.bHunspell
self.xHunspell = None
self.xHunspellLocale = Locale('fr', 'MC', '')
#self.xHunspellLocale = uno.createUnoStruct('com.sun.star.lang.Locale')
#self.xHunspellLocale.Language = 'fr'
#self.xHunspellLocale.Country = 'FR'
print("init done")
except:
print("Graphspell: init")
traceback.print_exc()
# XServiceName
def getServiceName (self):
return self.sImplementationName #self.sServiceName
# XServiceInfo
def getImplementationName (self):
return self.sImplementationName
def supportsService (self, sServiceName):
return (sServiceName in self.tSupportedServiceNames)
def getSupportedServiceNames (self):
return self.tSupportedServiceNames
# XSupportedLocales
def hasLocale (self, aLocale):
if aLocale in self.locales:
return True
for e in self.locales:
if aLocale.Language == e.Language and (e.Country == aLocale.Country or e.Country == ""):
return True
return False
def getLocales (self):
return self.locales
# XSpellChecker
# http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellChecker.html
def isValid (self, aWord, rLocale, aProperties):
try:
aWord = zElidedWords.sub("", aWord.rstrip("."), count=1)
return self.oGraphspell.isValidToken(aWord)
except:
traceback.print_exc()
return False
def spell (self, aWord, aLocale, aProperties):
"returns an object SpellAlternatives"
lSugg = []
for l in self.oGraphspell.suggest(aWord):
lSugg.extend(l)
return SpellAlternatives(aWord, tuple(lSugg))
try:
if not self.xHunspell:
self.xHunspell = self.xSvMgr.createInstance("com.sun.star.linguistic2.SpellChecker")
if self.xHunspell:
return self.xHunspell.spell(aWord, self.xHunspellLocale, aProperties)
except:
traceback.print_exc()
return None
# XServiceDisplayName
def getServiceDisplayName(self, aLocale):
return "Graphspell (fr)"
class SpellAlternatives (unohelper.Base, XSpellAlternatives):
def __init__ (self, sWord, lSugg):
try:
self.sWord = sWord
self.lSugg = lSugg
self.xLocale = Locale('fr', 'FR', '')
except:
traceback.print_exc()
# XSpellAlternatives
# http://www.openoffice.org/api/docs/common/ref/com/sun/star/linguistic2/XSpellAlternatives.html
def getWord (self):
return self.sWord
def getLocale (self):
return self.xLocale
def getFailureType (self):
return 4
# IS_NEGATIVE_WORD = 2
# The word is a negative one, that is, it should not be used.
# CAPTION_ERROR = 3
# The capitalization of the word is wrong.
# SPELLING_ERROR = 4
# The spelling of the word is wrong (or at least not known to be correct).
# No difference -> red underline
def getAlternativesCount (self):
return len(self.lSugg)
def getAlternatives (self):
return self.lSugg
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(Graphspell, "net.grammalecte.graphspell", ("com.sun.star.linguistic2.SpellChecker",),)