Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -5768,10 +5768,11 @@ TEST: quel potentiel électoral réel pour les souverainistes pur sucre ? TEST: Cette scène que décrit ici Yannick est représentative. TEST: attentifs aux spécificités socioculturelles de chaque peuple, constituées dans la longue durée autour d’une langue et de traditions TEST: Il était à l’époque chargé de maintenir en état ces machines. + # # //////////////////////////////////////// RÈGLES DE CONTRÔLE //////////////////////////////////////// # @@ -5965,11 +5966,10 @@ <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") and not morph(word(-2), ":B", False) -2>> =suggFemSing(@) # Accord de nombre erroné : « \2 » devrait être au singulier. __[i]/gn(gn_une_des_accord)__ (une) +des +({w_2}) @@0,$ <<- morphex(\2, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s)") -1>> un # Accord de genre erroné : « \2 » est masculin. <<- __also__ and hasFemForm(\2) -2>> =suggFemPlur(@, True) # Accord de genre erroné : « \1 » est un déterminant féminin. - TEST: un {{slashs}} ->> slash TEST: un {{fromages}}. ->> fromage TEST: Un {{ballons}} ->> ballon TEST: Une {{cinglées}} ->> cinglée Index: graphspell/spellchecker.py ================================================================== --- graphspell/spellchecker.py +++ graphspell/spellchecker.py @@ -1,134 +1,116 @@ # Spellchecker # Wrapper for the IBDAWG class. # Useful to check several dictionaries at once. + +# To avoid iterating over a pile of dictionaries, it is assumed that 3 are enough: +# - the main dictionary, bundled with the package +# - the extended dictionary, added by an organization +# - the personal dictionary, created by the user for its own convenience + + +import traceback from . import ibdawg -dDictionaries = { - "fr": "French.bdic", - "en": "English.bdic" +dDefaultDictionaries = { + "fr": "fr.bdic", + "en": "en.bdic" } class Spellchecker (): - def __init__ (self, sLangCode): - self.sLangCode = sLangCode - self.oMainDic = None - if sLangCode in dDictionaries: - self.oMainDic = ibdawg.IBDAWG(dDictionaries[sLangCode]) - self.lOtherDic = [] - return bool(self.oMainDic) - - - def setMainDictionary (self, sDicName): - try: - self.oMainDic = ibdawg.IBDAWG(sDicName) - return True - except: - print("Error: <" + sDicName + "> not set as main dictionary.") - return False - - def addDictionary (self, sDicName): - try: - self.lOtherDic.append(ibdawg.IBDAWG(sDicName)) - return True - except: - print("Error: <" + sDicName + "> not added to the list.") - return False - - # Return codes: - # 0: invalid - # 1: correct in main dictionary - # 2+: correct in foreign dictionaries - - - # check in the main dictionary only + def __init__ (self, sLangCode, sfMainDic="", sfExtendedDic="", sfPersonalDic=""): + "returns True if the main dictionary is loaded" + self.sLangCode = sLangCode + if not sfMainDic: + sfMainDic = dDefaultDictionaries.get(sLangCode, "") + self.oMainDic = self._loadDictionary(sfMainDic) + self.oExtendedDic = self._loadDictionary(sfExtendedDic) + self.oPersonalDic = self._loadDictionary(sfPersonalDic) + return bool(self.oMainDic) + + def _loadDictionary (self, sfDictionary): + "returns an IBDAWG object" + if not sfDictionary: + return None + try: + return ibdawg.IBDAWG(sfDictionary) + except: + print("Error: <" + sDicName + "> not loaded.") + traceback.print_exc() + return None + + def setMainDictionary (self, sfDictionary): + "returns True if the dictionary is loaded" + self.oMainDic = self._loadDictionary(sfDictionary) + return bool(self.oMainDic) + + def setExtendedDictionary (self, sfDictionary): + "returns True if the dictionary is loaded" + self.oExtendedDic = self._loadDictionary(sfDictionary) + return bool(self.oExtendedDic) + + def setPersonalDictionary (self, sfDictionary): + "returns True if the dictionary is loaded" + self.oPersonalDic = self._loadDictionary(sfDictionary) + return bool(self.oPersonalDic) + + + # IBDAWG functions def isValidToken (self, sToken): - "(in main dictionary) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" + "checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" if self.oMainDic.isValidToken(sToken): - return 1 - return 0 + return True + if self.oExtendedDic and self.oExtendedDic.isValidToken(sToken): + return True + if self.oPersonalDic and self.oPersonalDic.isValidToken(sToken): + return True + return False def isValid (self, sWord): - "(in main dictionary) checks if sWord is valid (different casing tested if the first letter is a capital)" - if self.oMainDic.isValid(sWord): - return 1 - return 0 + "checks if sWord is valid (different casing tested if the first letter is a capital)" + if self.oMainDic.isValid(sToken): + return True + if self.oExtendedDic and self.oExtendedDic.isValid(sToken): + return True + if self.oPersonalDic and self.oPersonalDic.isValid(sToken): + return True + return False def lookup (self, sWord): - "(in main dictionary) checks if sWord is in dictionary as is (strict verification)" - if self.oMainDic.lookup(sWord): - return 1 - return 0 - - - # check in all dictionaries - - def isValidTokenAll (self, sToken): - "(in all dictionaries) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" - if self.oMainDic.isValidToken(sToken): - return 1 - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.isValidToken(sToken): - return i - return 0 - - def isValidAll (self, sWord): - "(in all dictionaries) checks if sWord is valid (different casing tested if the first letter is a capital)" - if self.oMainDic.isValid(sToken): - return 1 - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.isValid(sToken): - return i - return 0 - - def lookupAll (self, sWord): - "(in all dictionaries) checks if sWord is in dictionary as is (strict verification)" - if self.oMainDic.lookup(sToken): - return 1 - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.lookup(sToken): - return i - return 0 - - - # check in dictionaries up to level n - - def isValidTokenLevel (self, sToken, nLevel): - "(in dictionaries up to level n) checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" - if self.oMainDic.isValidToken(sToken): - return 1 - if nLevel >= 2: - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.isValidToken(sToken): - return i - if i == nLevel: - break - return 0 - - def isValidLevel (self, sWord, nLevel): - "(in dictionaries up to level n) checks if sWord is valid (different casing tested if the first letter is a capital)" - if self.oMainDic.isValid(sToken): - return 1 - if nLevel >= 2: - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.isValid(sToken): - return i - if i == nLevel: - break - return 0 - - def lookupLevel (self, sWord, nLevel): - "(in dictionaries up to level n) checks if sWord is in dictionary as is (strict verification)" - if self.oMainDic.lookup(sToken): - return 1 - if nLevel >= 2: - for i, oDic in enumerate(self.lOtherDic, 2): - if oDic.lookup(sToken): - return i - if i == nLevel: - break - return 0 + "checks if sWord is in dictionary as is (strict verification)" + if self.oMainDic.lookup(sToken): + return True + if self.oExtendedDic and self.oExtendedDic.lookup(sToken): + return True + if self.oPersonalDic and self.oPersonalDic.lookup(sToken): + return True + return False + + def getMorph (self, sWord): + "retrieves morphologies list, different casing allowed" + lResult = self.oMainDic.getMorph(sToken) + if self.oExtendedDic: + lResult.extends(self.oExtendedDic.getMorph(sToken)) + if self.oPersonalDic: + lResult.extends(self.oPersonalDic.getMorph(sToken)) + return lResult + + def suggest (self, sWord, nSuggLimit=10): + "generator: returns 1,2 or 3 lists of suggestions" + yield self.oMainDic.suggest(sWord, nSuggLimit) + if self.oExtendedDic: + yield self.oExtendedDic.suggest(sWord, nSuggLimit) + if self.oPersonalDic: + yield self.oPersonalDic.suggest(sWord, nSuggLimit) + + def select (self, sPattern=""): + "generator: returns all entries which morphology fits " + yield from self.oMainDic.select(sPattern) + if self.oExtendedDic: + yield from self.oExtendedDic.select(sPattern) + if self.oPersonalDic: + yield from self.oPersonalDic.select(sPattern)