Overview
Comment: | [lo] use LibreOffice API to implement a spellchecker |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | lo |
Files: | files | file ages | folders |
SHA3-256: |
a25b510c2c104ec0eecc1ccac944714b |
User & Date: | olr on 2018-04-04 15:31:57 |
Other Links: | manifest | tags |
Context
2018-04-04
| ||
16:13 | [lo] replace Hunspell by Graphspell + update locales list check-in: e62980249b user: olr tags: trunk, lo | |
15:31 | [lo] use LibreOffice API to implement a spellchecker check-in: a25b510c2c user: olr tags: trunk, lo | |
15:10 | [graphspell] ibdawg: isValid -> True if word is digit check-in: 291494dd43 user: olr tags: trunk, graphspell | |
Changes
Added gc_lang/fr/oxt/Graphspell/Graphspell.py version [db81597a82].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 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",),) |