Index: gc_core/py/oxt/Linguistic.xcu ================================================================== --- gc_core/py/oxt/Linguistic.xcu +++ gc_core/py/oxt/Linguistic.xcu @@ -6,9 +6,14 @@ ${locales} + + + + ${locales} + Index: gc_core/py/oxt/manifest.xml ================================================================== --- gc_core/py/oxt/manifest.xml +++ gc_core/py/oxt/manifest.xml @@ -14,10 +14,14 @@ + + + Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -1,9 +1,9 @@ [args] lang = fr lang_name = French -locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ +locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_BF fr_BJ fr_CD fr_CI fr_CM fr_MA fr_ML fr_MU fr_NE fr_RE fr_SN fr_TG country_default = FR name = Grammalecte implname = grammalecte # always use 3 numbers for version: x.y.z version = 0.6.3 @@ -77,10 +77,12 @@ oxt/_img/Algoo_logo.png = img/Algoo_logo.png oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp # AppLauncher oxt/AppLauncher.py = AppLauncher.py +# Graphspell +oxt/Graphspell.py = Graphspell.py # About oxt/About/About.py = pythonpath/About.py oxt/About/ab_strings.py = pythonpath/ab_strings.py # Dictionaries oxt/Dictionnaires/dictionaries = dictionaries Index: gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu ================================================================== --- gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu +++ gc_lang/fr/oxt/Dictionnaires/dictionaries.xcu @@ -8,11 +8,12 @@ DICT_SPELL - fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ + fr-MC + @@ -21,11 +22,11 @@ DICT_HYPH - fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ + fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-BJ fr-CD fr-CI fr-CM fr-MA fr-ML fr-MU fr-NE fr-RE fr-SN fr-TG %origin%/dictionaries/thes_fr.dat %origin%/dictionaries/thes_fr.idx @@ -32,11 +33,11 @@ DICT_THES - fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-CI fr-SN fr-ML fr-NE fr-TG fr-BJ + fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC fr-BF fr-BJ fr-CD fr-CI fr-CM fr-MA fr-ML fr-MU fr-NE fr-RE fr-SN fr-TG ADDED gc_lang/fr/oxt/Graphspell.py Index: gc_lang/fr/oxt/Graphspell.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/Graphspell.py @@ -0,0 +1,159 @@ +# 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",),) DELETED gc_lang/fr/oxt/Graphspell/Graphspell.py Index: gc_lang/fr/oxt/Graphspell/Graphspell.py ================================================================== --- gc_lang/fr/oxt/Graphspell/Graphspell.py +++ /dev/null @@ -1,159 +0,0 @@ -# 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",),)