Index: gc_core/js/lang_core/gc_engine.js ================================================================== --- gc_core/js/lang_core/gc_engine.js +++ gc_core/js/lang_core/gc_engine.js @@ -321,13 +321,13 @@ load: function (sContext="JavaScript", sPath="") { try { if (typeof(require) !== 'undefined') { var spellchecker = require("resource://grammalecte/graphspell/spellchecker.js"); - _oSpellChecker = new spellchecker.SpellChecker("${lang}", "", "${dic_main_filename_js}", "${dic_extended_filename_js}", "${dic_personal_filename_js}"); + _oSpellChecker = new spellchecker.SpellChecker("${lang}", "", "${dic_main_filename_js}", "${dic_extended_filename_js}", "${dic_community_filename_js}", "${dic_personal_filename_js}"); } else { - _oSpellChecker = new SpellChecker("${lang}", sPath, "${dic_main_filename_js}", "${dic_extended_filename_js}", "${dic_personal_filename_js}"); + _oSpellChecker = new SpellChecker("${lang}", sPath, "${dic_main_filename_js}", "${dic_extended_filename_js}", "${dic_community_filename_js}", "${dic_personal_filename_js}"); } _sAppContext = sContext; _dOptions = gc_options.getOptions(sContext).gl_shallowCopy(); // duplication necessary, to be able to reset to default } catch (e) { Index: gc_core/py/lang_core/gc_engine.py ================================================================== --- gc_core/py/lang_core/gc_engine.py +++ gc_core/py/lang_core/gc_engine.py @@ -290,11 +290,11 @@ def load (sContext="Python"): global _oSpellChecker global _sAppContext global _dOptions try: - _oSpellChecker = SpellChecker("${lang}", "${dic_main_filename_py}", "${dic_extended_filename_py}", "${dic_personal_filename_py}") + _oSpellChecker = SpellChecker("${lang}", "${dic_main_filename_py}", "${dic_extended_filename_py}", "${dic_community_filename_py}", "${dic_personal_filename_py}") _sAppContext = sContext _dOptions = dict(gc_options.getOptions(sContext)) # duplication necessary, to be able to reset to default except: traceback.print_exc() Index: gc_core/py/oxt/Grammalecte.py ================================================================== --- gc_core/py/oxt/Grammalecte.py +++ gc_core/py/oxt/Grammalecte.py @@ -1,21 +1,22 @@ -# -*- encoding: UTF-8 -*- # Grammalecte for Writer # License: MPL 2 # A derivative work of Lightproof from László Németh (http://cgit.freedesktop.org/libreoffice/lightproof/) import uno import unohelper +import json import sys import traceback from collections import deque from com.sun.star.linguistic2 import XProofreader, XSupportedLocales from com.sun.star.linguistic2 import ProofreadingResult from com.sun.star.lang import XServiceInfo, XServiceName, XServiceDisplayName from com.sun.star.lang import Locale +import helpers import grammalecte.${lang} as gce #import lightproof_handler_${implname} as opt_handler import Options @@ -36,17 +37,18 @@ gce.load("Writer") # GC options # opt_handler.load(xCurCtx) dOpt = Options.load(xCurCtx) gce.setOptions(dOpt) + # dictionaries options + self.loadUserDictionaries() # store for results of big paragraphs self.dResult = {} self.nMaxRes = 1500 self.lLastRes = deque(maxlen=self.nMaxRes) self.nRes = 0 - #oSpellChecker = gce.getSpellChecker(); - #oSpellChecker.setPersonalDictionary("fr.personal.json") + # XServiceName method implementations def getServiceName (self): return self.ImplementationName @@ -134,12 +136,24 @@ return gce.name # Grammalecte def getSpellChecker (self): return gce.getSpellChecker() + + def loadUserDictionaries (self): + try: + xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", False) + xChild = xSettingNode.getByName("o_${lang}") + if xChild.getPropertyValue("use_personal_dic"): + sJSON = xChild.getPropertyValue("personal_dic") + if sJSON: + oSpellChecker = gce.getSpellChecker(); + oSpellChecker.setPersonalDictionary(json.loads(sJSON)) + except: + traceback.print_exc() g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation(Grammalecte, "org.openoffice.comp.pyuno.Lightproof."+gce.pkg, ("com.sun.star.linguistic2.Proofreader",),) # g_ImplementationHelper.addImplementation( opt_handler.LightproofOptionsEventHandler, \ # "org.openoffice.comp.pyuno.LightproofOptionsEventHandler." + gce.pkg, ("com.sun.star.awt.XContainerWindowEventHandler",),) Index: gc_core/py/oxt/OptionsDialog.xcs ================================================================== --- gc_core/py/oxt/OptionsDialog.xcs +++ gc_core/py/oxt/OptionsDialog.xcs @@ -14,14 +14,30 @@ The data for one leaf. ${xcs_options} + + + + The data for one leaf. + + 1 + 1 + 0 + 1 + + + + + + + ADDED gc_core/py/oxt/helpers.py Index: gc_core/py/oxt/helpers.py ================================================================== --- /dev/null +++ gc_core/py/oxt/helpers.py @@ -0,0 +1,74 @@ +# Helpers for LibreOffice extension + +import os +import traceback + +import uno + +from com.sun.star.beans import PropertyValue +from com.sun.star.uno import RuntimeException as _rtex + + +def xray (myObject): + "XRay - API explorer" + try: + sm = uno.getComponentContext().ServiceManager + mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext()) + scriptPro = mspf.createScriptProvider("") + xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application") + xScript.invoke((myObject,), (), ()) + return + except: + raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext()) + + +def mri (ctx, xTarget): + "MRI - API Explorer" + try: + xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx) + xMri.inspect(xTarget) + except: + raise _rtex("\nPython extension MRI is not installed", uno.getComponentContext()) + + +def getConfigSetting (sNodeConfig, bUpdate=False): + "get a configuration node" + # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False) + xSvMgr = uno.getComponentContext().ServiceManager + xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext()) + xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue") + xPropertyValue.Name = "nodepath" + xPropertyValue.Value = sNodeConfig + if bUpdate: + sService = "com.sun.star.configuration.ConfigurationUpdateAccess" + else: + sService = "com.sun.star.configuration.ConfigurationAccess" + return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode + + +def printServices (o): + for s in o.getAvailableServiceNames(): + print(' > '+s) + + +def getWindowSize (): + "return main window size" + xCurCtx = uno.getComponentContext() + xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx) + xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow + xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT")) + #print(xContainerWindow.Size.Width, ">", xWindowSize.Width) + #print(xContainerWindow.Size.Height, ">", xWindowSize.Height) + xWindowSize.Width = xWindowSize.Width * 0.666 + xWindowSize.Height = xWindowSize.Height * 0.666 + return xWindowSize + + +def getAbsolutePathOf (sPath=""): + xDefaultContext = uno.getComponentContext().ServiceManager.DefaultContext + xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider") + sFullPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR") + if sPath and not sPath.startswith("/"): + sPath = "/" + sPath + sFullPath = sFullPath[8:] + sPath + return os.path.abspath(sFullPath) Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -20,10 +20,14 @@ dic_name = French # extended dictionary lexicon_extended_src = lexicons/French.extended.lex dic_extended_filename = fr.extended dic_extended_name = Français - dictionnaire étendu +# community dictionary +lexicon_community_src = lexicons/French.community.lex +dic_community_filename = fr.community +dic_community_name = Français - dictionnaire communautaire # personal dictionary lexicon_personal_src = lexicons/French.personal.lex dic_personal_filename = fr.personal dic_personal_name = Français - dictionnaire personnel # Finite state automaton compression: 1, 2 (experimental) or 3 (experimental) @@ -73,19 +77,27 @@ 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 -oxt/helpers.py = pythonpath/helpers.py # About oxt/About/About.py = pythonpath/About.py oxt/About/ab_strings.py = pythonpath/ab_strings.py # Dictionaries oxt/Dictionnaires/dictionaries = dictionaries oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py +# Dictionary Options +oxt/DictOptions/DictOptions.py = pythonpath/DictOptions.py +oxt/DictOptions/do_strings.py = pythonpath/do_strings.py +oxt/DictOptions/LexiconEditor.py = pythonpath/LexiconEditor.py +oxt/DictOptions/lxe_strings.py = pythonpath/lxe_strings.py +oxt/DictOptions/SearchWords.py = pythonpath/SearchWords.py +oxt/DictOptions/sw_strings.py = pythonpath/sw_strings.py +oxt/DictOptions/TagsInfo.py = pythonpath/TagsInfo.py +oxt/DictOptions/ti_strings.py = pythonpath/ti_strings.py # ContextMenu oxt/ContextMenu/ContextMenu.py = ContextMenu.py oxt/ContextMenu/jobs.xcu = config/jobs.xcu # TextFormatter oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py ADDED gc_lang/fr/modules-js/conj_generator.js Index: gc_lang/fr/modules-js/conj_generator.js ================================================================== --- /dev/null +++ gc_lang/fr/modules-js/conj_generator.js @@ -0,0 +1,2023 @@ +// JavaScript + +/* + Conjugation generator + beta stage, unfinished, the root for a new way to generate flexions… +*/ + +"use strict"; + + +var conj_generator = { + + conjugate: function (sVerb, sVerbTag="i_____a", bVarPpas=true) { + let lEntry = []; + let cGroup = this.getVerbGroupChar(sVerb); + for (let [nCut, sAdd, sFlexTags, sPattern] of this.getConjRules(sVerb, bVarPpas)) { + if (!sPattern || RegExp(sPattern).test(sVerb)) { + let sFlexion = (nCut > 0) ? sVerb.slice(0, -nCut) + sAdd : sVerb + sAdd; + lEntry.push( [sFlexion, ":V" + cGroup + "_" + sVerbTag + sFlexTags] ); + } + } + return lEntry; + }, + + getVerbGroupChar: function (sVerb) { + sVerb = sVerb.toLowerCase(); + if (sVerb.endsWith("er")) { + return "1"; + } + if (sVerb.endsWith("ir")) { + return "2"; + } + if (sVerb == "être" || sVerb == "avoir") { + return "0"; + } + if (sVerb.endsWith("re")) { + return "3"; + } + return "4"; + }, + + getConjRules: function (sVerb, bVarPpas=true, nGroup=2) { + let lConj = null; + let sVarPpas = (bVarPpas) ? "true" : "false"; + if (sVerb.endsWith("er")) { + // premier groupe, conjugaison en fonction de la terminaison du lemme + // 5 lettres + if (sVerb.slice(-5) in this.oConj["V1"]) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-5)]); + } + // 4 lettres + else if (sVerb.slice(-4) in this.oConj["V1"]) { + if (sVerb.endsWith("eler") || sVerb.endsWith("eter")) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-4)]["1"]); + } else { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-4)]); + } + } + // 3 lettres + else if (sVerb.slice(-3) in this.oConj["V1"]) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-3)]); + } + // 2 lettres + else { + lConj = Array.from(this.oConj["V1"]["er"]); + } + lConj.push(...this.oConj["V1_ppas"][sVarPpas]); + } + else if (sVerb.endsWith("ir") && nGroup <= 2) { + // deuxième groupe + lConj = Array.from(this.oConj["V2"]); + lConj.push(...this.oConj["V2_ppas"][sVarPpas]); + } + else { + // TODO: troisième groupe + lConj = [ [0, "", ":Y/*", false] ]; + } + return lConj; + }, + + oConj: { + "V1_ppas": { + "true": [ + [2, "é", ":Q:A:1ŝ:m:s/*", false], + [2, "és", ":Q:A:m:p/*", false], + [2, "ée", ":Q:A:f:s/*", false], + [2, "ées", ":Q:A:f:p/*", false], + ], + "false": [ + [2, "é", ":Q:e:i/*", false], + ] + }, + + "V2_ppas": { + "true": [ + [2, "i", ":Q:A:m:s/*", false], + [2, "is", ":Q:A:m:p/*", false], + [2, "ie", ":Q:A:f:s/*", false], + [2, "ies", ":Q:A:f:p/*", false], + ], + "false": [ + [2, "i", ":Q:e:i/*", false], + ] + }, + + // deuxième groupe (le seul groupe régulier) + "V2": [ + [2, "ir", ":Y/*", false], + [2, "issant", ":P/*", false], + [2, "is", ":Ip:Is:1s:2s/*", false], + [2, "it", ":Ip:Is:3s/*", false], + [2, "issons", ":Ip:1p/*", false], + [2, "issez", ":Ip:2p/*", false], + [2, "issent", ":Ip:Sp:Sq:3p/*", false], + [2, "issais", ":Iq:1s:2s/*", false], + [2, "issait", ":Iq:3s/*", false], + [2, "issions", ":Iq:Sp:Sq:1p/*", false], + [2, "issiez", ":Iq:Sp:Sq:2p/*", false], + [2, "issaient", ":Iq:3p/*", false], + [2, "îmes", ":Is:1p/*", false], + [2, "îtes", ":Is:2p/*", false], + [2, "irent", ":Is:3p!/*", false], + [2, "irai", ":If:1s/*", false], + [2, "iras", ":If:2s/*", false], + [2, "ira", ":If:3s/*", false], + [2, "irons", ":If:1p/*", false], + [2, "irez", ":If:2p/*", false], + [2, "iront", ":If:3p!/*", false], + [2, "irais", ":K:1s:2s/*", false], + [2, "irait", ":K:3s/*", false], + [2, "irions", ":K:1p/*", false], + [2, "iriez", ":K:2p/*", false], + [2, "iraient", ":K:3p/*", false], + [2, "isse", ":Sp:Sq:1s/*", false], + [2, "isses", ":Sp:Sq:2s/*", false], + [2, "isse", ":Sp:3s/*", false], + [2, "ît", ":Sq:3s/*", false], + [2, "is", ":E:2s/*", false], + [2, "issons", ":E:1p/*", false], + [2, "issez", ":E:2p/*", false] + ], + + // premier groupe (bien plus irrégulier que prétendu) + "V1": { + // a + // verbes en -er, -ger, -yer, -cer + "er": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ger": [ + [2, "er", ":Y/*", false], + [2, "eant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [2, "eons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [2, "eais", ":Iq:1s:2s/*", false], + [2, "eait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "eaient", ":Iq:3p/*", false], + [2, "eai", ":Is:1s/*", false], + [2, "eas", ":Is:2s/*", false], + [2, "ea", ":Is:3s/*", false], + [2, "eâmes", ":Is:1p/*", false], + [2, "eâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [2, "easse", ":Sq:1s/*", false], + [2, "easses", ":Sq:2s/*", false], + [2, "eât", ":Sq:3s/*", false], + [2, "eassions", ":Sq:1p/*", false], + [2, "eassiez", ":Sq:2p/*", false], + [2, "eassent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [2, "eons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "cer": [ + [2, "er", ":Y/*", false], + [3, "çant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [3, "çons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [3, "çais", ":Iq:1s:2s/*", false], + [3, "çait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [3, "çaient", ":Iq:3p/*", false], + [3, "çai", ":Is:1s/*", false], + [3, "ças", ":Is:2s/*", false], + [3, "ça", ":Is:3s/*", false], + [3, "çâmes", ":Is:1p/*", false], + [3, "çâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [3, "çasse", ":Sq:1s/*", false], + [3, "çasses", ":Sq:2s/*", false], + [3, "çât", ":Sq:3s/*", false], + [3, "çassions", ":Sq:1p/*", false], + [3, "çassiez", ":Sq:2p/*", false], + [3, "çassent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [3, "çons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "yer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [3, "ye", ":Ip:Sp:1s:3s/*", "[^ou]yer$"], + [3, "ie", ":Ip:Sp:1s:3s/*", "[aou]yer$"], + [2, "è", ":Ip:1ś/*", false], + [3, "yes", ":Ip:Sp:2s/*", "[^ou]yer$"], + [3, "ies", ":Ip:Sp:2s/*", "[aou]yer$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [3, "yent", ":Ip:Sp:3p/*", "[^ou]yer$"], + [3, "ient", ":Ip:Sp:3p/*", "[aou]yer$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [3, "yerai", ":If:1s/*", "[^ou]yer$"], + [3, "ierai", ":If:1s/*", "[aou]yer$"], + [3, "yeras", ":If:2s/*", "[^ou]yer$"], + [3, "ieras", ":If:2s/*", "[aou]yer$"], + [3, "yera", ":If:3s/*", "[^ou]yer$"], + [3, "iera", ":If:3s/*", "[aou]yer$"], + [3, "yerons", ":If:1p/*", "[^ou]yer$"], + [3, "ierons", ":If:1p/*", "[aou]yer$"], + [3, "yerez", ":If:2p/*", "[^ou]yer$"], + [3, "ierez", ":If:2p/*", "[aou]yer$"], + [3, "yeront", ":If:3p!/*", "[^ou]yer$"], + [3, "ieront", ":If:3p!/*", "[aou]yer$"], + [3, "yerais", ":K:1s:2s/*", "[^ou]yer$"], + [3, "ierais", ":K:1s:2s/*", "[aou]yer$"], + [3, "yerait", ":K:3s/*", "[^ou]yer$"], + [3, "ierait", ":K:3s/*", "[aou]yer$"], + [3, "yerions", ":K:1p/*", "[^ou]yer$"], + [3, "ierions", ":K:1p/*", "[aou]yer$"], + [3, "yeriez", ":K:2p/*", "[^ou]yer$"], + [3, "ieriez", ":K:2p/*", "[aou]yer$"], + [3, "yeraient", ":K:3p/*", "[^ou]yer$"], + [3, "ieraient", ":K:3p/*", "[aou]yer$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [3, "ye", ":E:2s/*", "[^ou]yer$"], + [3, "ie", ":E:2s/*", "[aou]yer$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + // b + // verbes en -ecer, -emer, -ener, -eper, -erer, -eser, -ever, -evrer + // verbes en -eler, -eter (pas de doublement de la consonne: acheter, celer, déceler, receler, ciseler, démanteler, + // écarteler, encasteler, geler, dégeler, congeler, surgeler, marteler, modeler, peler, acheter, racheter, + // bégueter, corseter, crocheter, fileter, fureter, haleter) + // changement du e en è avant syllabe muette + "ecer": [ + [2, "er", ":Y/*", false], + [3, "çant", ":P/*", false], + [4, "èce", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èces", ":Ip:Sp:2s/*", false], + [3, "çons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ècent", ":Ip:Sp:3p/*", false], + [3, "çais", ":Iq:1s:2s/*", false], + [3, "çait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [3, "çaient", ":Iq:3p/*", false], + [3, "çai", ":Is:1s/*", false], + [3, "ças", ":Is:2s/*", false], + [3, "ça", ":Is:3s/*", false], + [3, "çâmes", ":Is:1p/*", false], + [3, "çâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ècerai", ":If:1s/*", false], + [4, "èceras", ":If:2s/*", false], + [4, "ècera", ":If:3s/*", false], + [4, "ècerons", ":If:1p/*", false], + [4, "ècerez", ":If:2p/*", false], + [4, "èceront", ":If:3p!/*", false], + [4, "ècerais", ":K:1s:2s/*", false], + [4, "ècerait", ":K:3s/*", false], + [4, "ècerions", ":K:1p/*", false], + [4, "èceriez", ":K:2p/*", false], + [4, "èceraient", ":K:3p/*", false], + [3, "çasse", ":Sq:1s/*", false], + [3, "çasses", ":Sq:2s/*", false], + [3, "çât", ":Sq:3s/*", false], + [3, "çassions", ":Sq:1p/*", false], + [3, "çassiez", ":Sq:2p/*", false], + [3, "çassent", ":Sq:3p/*", false], + [4, "èce", ":E:2s/*", false], + [3, "çons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eler": { + "1": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èlent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èlerai", ":If:1s/*", false], + [4, "èleras", ":If:2s/*", false], + [4, "èlera", ":If:3s/*", false], + [4, "èlerons", ":If:1p/*", false], + [4, "èlerez", ":If:2p/*", false], + [4, "èleront", ":If:3p!/*", false], + [4, "èlerais", ":K:1s:2s/*", false], + [4, "èlerait", ":K:3s/*", false], + [4, "èlerions", ":K:1p/*", false], + [4, "èleriez", ":K:2p/*", false], + [4, "èleraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + "2": [ + // d. verbes en -eler : doublement de la consonne l. + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "elle", ":Ip:Sp:1s:3s/*", "ppeler$"], + [4, "elle", ":Ip:Sp:1s:3s/M", "[^p].eler$"], + [4, "èle", ":Ip:Sp:1s:3s/R", "[^p].eler$"], + [2, "è", ":Ip:1ś/R", false], + [4, "elles", ":Ip:Sp:2s/*", "ppeler$"], + [4, "elles", ":Ip:Sp:2s/M", "[^p].eler$"], + [4, "èles", ":Ip:Sp:2s/R", "[^p].eler$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ellent", ":Ip:Sp:3p/*", "ppeler$"], + [4, "ellent", ":Ip:Sp:3p/M", "[^p].eler$"], + [4, "èlent", ":Ip:Sp:3p/R", "[^p].eler$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ellerai", ":If:1s/*", "ppeler$"], + [4, "ellerai", ":If:1s/M", "[^p].eler$"], + [4, "èlerai", ":If:1s/R", "[^p].eler$"], + [4, "elleras", ":If:2s/*", "ppeler$"], + [4, "elleras", ":If:2s/M", "[^p].eler$"], + [4, "èleras", ":If:2s/R", "[^p].eler$"], + [4, "ellera", ":If:3s/*", "ppeler$"], + [4, "ellera", ":If:3s/M", "[^p].eler$"], + [4, "èlera", ":If:3s/R", "[^p].eler$"], + [4, "ellerons", ":If:1p/*", "ppeler$"], + [4, "ellerons", ":If:1p/M", "[^p].eler$"], + [4, "èlerons", ":If:1p/R", "[^p].eler$"], + [4, "ellerez", ":If:2p/*", "ppeler$"], + [4, "ellerez", ":If:2p/M", "[^p].eler$"], + [4, "èlerez", ":If:2p/R", "[^p].eler$"], + [4, "elleront", ":If:3p!/*", "ppeler$"], + [4, "elleront", ":If:3p!/M", "[^p].eler$"], + [4, "èleront", ":If:3p!/R", "[^p].eler$"], + [4, "ellerais", ":K:1s:2s/*", "ppeler$"], + [4, "ellerais", ":K:1s:2s/M", "[^p].eler$"], + [4, "èlerais", ":K:1s:2s/R", "[^p].eler$"], + [4, "ellerait", ":K:3s/*", "ppeler$"], + [4, "ellerait", ":K:3s/M", "[^p].eler$"], + [4, "èlerait", ":K:3s/R", "[^p].eler$"], + [4, "ellerions", ":K:1p/*", "ppeler$"], + [4, "ellerions", ":K:1p/M", "[^p].eler$"], + [4, "èlerions", ":K:1p/R", "[^p].eler$"], + [4, "elleriez", ":K:2p/*", "ppeler$"], + [4, "elleriez", ":K:2p/M", "[^p].eler$"], + [4, "èleriez", ":K:2p/R", "[^p].eler$"], + [4, "elleraient", ":K:3p/*", "ppeler$"], + [4, "elleraient", ":K:3p/M", "[^p].eler$"], + [4, "èleraient", ":K:3p/R", "[^p].eler$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "elle", ":E:2s/*", "ppeler$"], + [4, "elle", ":E:2s/M", "[^p].eler$"], + [4, "èle", ":E:2s/R", "[^p].eler$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + }, + + "emer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ème", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èmes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èment", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èmerai", ":If:1s/*", false], + [4, "èmeras", ":If:2s/*", false], + [4, "èmera", ":If:3s/*", false], + [4, "èmerons", ":If:1p/*", false], + [4, "èmerez", ":If:2p/*", false], + [4, "èmeront", ":If:3p!/*", false], + [4, "èmerais", ":K:1s:2s/*", false], + [4, "èmerait", ":K:3s/*", false], + [4, "èmerions", ":K:1p/*", false], + [4, "èmeriez", ":K:2p/*", false], + [4, "èmeraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ème", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ener": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ène", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ènes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ènent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ènerai", ":If:1s/*", false], + [4, "èneras", ":If:2s/*", false], + [4, "ènera", ":If:3s/*", false], + [4, "ènerons", ":If:1p/*", false], + [4, "ènerez", ":If:2p/*", false], + [4, "èneront", ":If:3p!/*", false], + [4, "ènerais", ":K:1s:2s/*", false], + [4, "ènerait", ":K:3s/*", false], + [4, "ènerions", ":K:1p/*", false], + [4, "èneriez", ":K:2p/*", false], + [4, "èneraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ène", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eper": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èpe", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èpes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èpent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èperai", ":If:1s/*", false], + [4, "èperas", ":If:2s/*", false], + [4, "èpera", ":If:3s/*", false], + [4, "èperons", ":If:1p/*", false], + [4, "èperez", ":If:2p/*", false], + [4, "èperont", ":If:3p!/*", false], + [4, "èperais", ":K:1s:2s/*", false], + [4, "èperait", ":K:3s/*", false], + [4, "èperions", ":K:1p/*", false], + [4, "èperiez", ":K:2p/*", false], + [4, "èperaient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èpe", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "erer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ère", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ères", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èrerai", ":If:1s/*", false], + [4, "èreras", ":If:2s/*", false], + [4, "èrera", ":If:3s/*", false], + [4, "èrerons", ":If:1p/*", false], + [4, "èrerez", ":If:2p/*", false], + [4, "èreront", ":If:3p!/*", false], + [4, "èrerais", ":K:1s:2s/*", false], + [4, "èrerait", ":K:3s/*", false], + [4, "èrerions", ":K:1p/*", false], + [4, "èreriez", ":K:2p/*", false], + [4, "èreraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ère", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eser": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èse", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èses", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èsent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èserai", ":If:1s/*", false], + [4, "èseras", ":If:2s/*", false], + [4, "èsera", ":If:3s/*", false], + [4, "èserons", ":If:1p/*", false], + [4, "èserez", ":If:2p/*", false], + [4, "èseront", ":If:3p!/*", false], + [4, "èserais", ":K:1s:2s/*", false], + [4, "èserait", ":K:3s/*", false], + [4, "èserions", ":K:1p/*", false], + [4, "èseriez", ":K:2p/*", false], + [4, "èseraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èse", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eter": { + "1": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ète", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ètes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ètent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èterai", ":If:1s/*", false], + [4, "èteras", ":If:2s/*", false], + [4, "ètera", ":If:3s/*", false], + [4, "èterons", ":If:1p/*", false], + [4, "èterez", ":If:2p/*", false], + [4, "èteront", ":If:3p!/*", false], + [4, "èterais", ":K:1s:2s/*", false], + [4, "èterait", ":K:3s/*", false], + [4, "èterions", ":K:1p/*", false], + [4, "èteriez", ":K:2p/*", false], + [4, "èteraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ète", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + "2": [ + // d. verbes en -eter : doublement de la consonne t + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ette", ":Ip:Sp:1s:3s/*", "jeter$"], + [4, "ette", ":Ip:Sp:1s:3s/M", "[^j]eter$"], + [4, "ète", ":Ip:Sp:1s:3s/R", "[^j]eter$"], + [2, "è", ":Ip:1ś/R", false], + [4, "ettes", ":Ip:Sp:2s/*", "jeter$"], + [4, "ettes", ":Ip:Sp:2s/M", "[^j]eter$"], + [4, "ètes", ":Ip:Sp:2s/R", "[^j]eter$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ettent", ":Ip:Sp:3p/*", "jeter$"], + [4, "ettent", ":Ip:Sp:3p/M", "[^j]eter$"], + [4, "ètent", ":Ip:Sp:3p/R", "[^j]eter$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "etterai", ":If:1s/*", "jeter$"], + [4, "etterai", ":If:1s/M", "[^j]eter$"], + [4, "èterai", ":If:1s/R", "[^j]eter$"], + [4, "etteras", ":If:2s/*", "jeter$"], + [4, "etteras", ":If:2s/M", "[^j]eter$"], + [4, "èteras", ":If:2s/R", "[^j]eter$"], + [4, "ettera", ":If:3s/*", "jeter$"], + [4, "ettera", ":If:3s/M", "[^j]eter$"], + [4, "ètera", ":If:3s/R", "[^j]eter$"], + [4, "etterons", ":If:1p/*", "jeter$"], + [4, "etterons", ":If:1p/M", "[^j]eter$"], + [4, "èterons", ":If:1p/R", "[^j]eter$"], + [4, "etterez", ":If:2p/*", "jeter$"], + [4, "etterez", ":If:2p/M", "[^j]eter$"], + [4, "èterez", ":If:2p/R", "[^j]eter$"], + [4, "etteront", ":If:3p!/*", "jeter$"], + [4, "etteront", ":If:3p!/M", "[^j]eter$"], + [4, "èteront", ":If:3p!/R", "[^j]eter$"], + [4, "etterais", ":K:1s:2s/*", "jeter$"], + [4, "etterais", ":K:1s:2s/M", "[^j]eter$"], + [4, "èterais", ":K:1s:2s/R", "[^j]eter$"], + [4, "etterait", ":K:3s/*", "jeter$"], + [4, "etterait", ":K:3s/M", "[^j]eter$"], + [4, "èterait", ":K:3s/R", "[^j]eter$"], + [4, "etterions", ":K:1p/*", "jeter$"], + [4, "etterions", ":K:1p/M", "[^j]eter$"], + [4, "èterions", ":K:1p/R", "[^j]eter$"], + [4, "etteriez", ":K:2p/*", "jeter$"], + [4, "etteriez", ":K:2p/M", "[^j]eter$"], + [4, "èteriez", ":K:2p/R", "[^j]eter$"], + [4, "etteraient", ":K:3p/*", "jeter$"], + [4, "etteraient", ":K:3p/M", "[^j]eter$"], + [4, "èteraient", ":K:3p/R", "[^j]eter$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ette", ":E:2s/*", "jeter$"], + [4, "ette", ":E:2s/M", "[^j]eter$"], + [4, "ète", ":E:2s/R", "[^j]eter$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ] + }, + + "ever": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ève", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èves", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èvent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èverai", ":If:1s/*", false], + [4, "èveras", ":If:2s/*", false], + [4, "èvera", ":If:3s/*", false], + [4, "èverons", ":If:1p/*", false], + [4, "èverez", ":If:2p/*", false], + [4, "èveront", ":If:3p!/*", false], + [4, "èverais", ":K:1s:2s/*", false], + [4, "èverait", ":K:3s/*", false], + [4, "èverions", ":K:1p/*", false], + [4, "èveriez", ":K:2p/*", false], + [4, "èveraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ève", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "evrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èvre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èvres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èvrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [5, "èvrerai", ":If:1s/*", false], + [5, "èvreras", ":If:2s/*", false], + [5, "èvrera", ":If:3s/*", false], + [5, "èvrerons", ":If:1p/*", false], + [5, "èvrerez", ":If:2p/*", false], + [5, "èvreront", ":If:3p!/*", false], + [5, "èvrerais", ":K:1s:2s/*", false], + [5, "èvrerait", ":K:3s/*", false], + [5, "èvrerions", ":K:1p/*", false], + [5, "èvreriez", ":K:2p/*", false], + [5, "èvreraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èvre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + // c + // verbes en -ébrer, -écer, -écher, -écrer, -éder, -éger, -égler, -égner, -égrer, -éguer, + // -éler, -émer, -éner, -éper, -équer, -érer, -éser, -éter, -étrer, -évrer, -éyer + // changement du é en è + + "écer": [ + [2, "er", ":Y/*", false], + [4, "éçant", ":P/*", false], + [4, "èce", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èces", ":Ip:Sp:2s/*", false], + [4, "éçons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ècent", ":Ip:Sp:3p/*", false], + [4, "éçais", ":Iq:1s:2s/*", false], + [4, "éçait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [4, "éçaient", ":Iq:3p/*", false], + [4, "éçai", ":Is:1s/*", false], + [4, "éças", ":Is:2s/*", false], + [4, "éça", ":Is:3s/*", false], + [4, "éçâmes", ":Is:1p/*", false], + [4, "éçâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ècerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èceras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ècera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ècerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ècerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èceront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ècerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ècerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ècerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èceriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èceraient", ":K:3p/R", false], + [4, "éçasse", ":Sq:1s/*", false], + [4, "éçasses", ":Sq:2s/*", false], + [4, "éçât", ":Sq:3s/*", false], + [4, "éçassions", ":Sq:1p/*", false], + [4, "éçassiez", ":Sq:2p/*", false], + [4, "éçassent", ":Sq:3p/*", false], + [4, "èce", ":E:2s/*", false], + [4, "éçons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éger": [ + [2, "er", ":Y/*", false], + [4, "égeant", ":P/*", false], + [4, "ège", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èges", ":Ip:Sp:2s/*", false], + [4, "égeons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ègent", ":Ip:Sp:3p/*", false], + [4, "égeais", ":Iq:1s:2s/*", false], + [4, "égeait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [4, "égeaient", ":Iq:3p/*", false], + [4, "égeai", ":Is:1s/*", false], + [4, "égeas", ":Is:2s/*", false], + [4, "égea", ":Is:3s/*", false], + [4, "égeâmes", ":Is:1p/*", false], + [4, "égeâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ègerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "ègeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ègera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ègerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ègerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "ègeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ègerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ègerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ègerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "ègeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "ègeraient", ":K:3p/R", false], + [4, "égeasse", ":Sq:1s/*", false], + [4, "égeasses", ":Sq:2s/*", false], + [4, "égeât", ":Sq:3s/*", false], + [4, "égeassions", ":Sq:1p/*", false], + [4, "égeassiez", ":Sq:2p/*", false], + [4, "égeassent", ":Sq:3p/*", false], + [4, "ège", ":E:2s/*", false], + [4, "égeons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ébrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èbre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èbres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èbrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èbrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èbreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èbrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èbrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èbrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èbreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èbrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èbrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èbrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èbreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èbreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èbre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "écher": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èche", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èches", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èchent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ècherai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ècheras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èchera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ècherons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ècherez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ècheront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ècherais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ècherait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ècherions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ècheriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ècheraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èche", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "écrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ècre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ècres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ècrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ècrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ècreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ècrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ècrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ècrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ècreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ècrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ècrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ècrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ècreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ècreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ècre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éder": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ède", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èdes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èdent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èderai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èderas", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èdera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èderons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èderez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èderont", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èderais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èderait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èderions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èderiez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èderaient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ède", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égler": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èglent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èglerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègleras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èglera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èglerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èglerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègleront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èglerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èglerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èglerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègleriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègleraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égner": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègne", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègnes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ègnent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ègnerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègneras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ègnera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ègnerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ègnerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègneront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ègnerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ègnerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ègnerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègneriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègneraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègne", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ègrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ègrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ègrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ègrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ègrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ègrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ègrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ègrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éguer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègue", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègues", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èguent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èguerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègueras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èguera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èguerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èguerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègueront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èguerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èguerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èguerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègueriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègueraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègue", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éler": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èlent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èlerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èleras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èlera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èlerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èlerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èleront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èlerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èlerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èlerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èleriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èleraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "émer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ème", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èmes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èment", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èmerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èmeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èmera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èmerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èmerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èmeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èmerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èmerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èmerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èmeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èmeraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ème", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éner": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ène", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ènes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ènent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ènerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èneras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ènera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ènerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ènerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èneront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ènerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ènerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ènerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èneriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èneraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ène", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éper": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èpe", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èpes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èpent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èperai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èperas", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èpera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èperons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èperez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èperont", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èperais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èperait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èperions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èperiez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èperaient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èpe", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "équer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èque", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èques", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èquent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èquerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èqueras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èquera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èquerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èquerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èqueront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èquerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èquerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èquerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èqueriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èqueraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èque", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "érer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ère", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ères", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ère", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éser": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èse", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èses", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èsent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èserai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èseras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èsera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èserons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èserez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èseront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èserais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èserait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èserions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èseriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èseraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èse", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éter": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ète", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ètes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ètent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èterai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èteras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ètera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èterons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èterez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èteront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èterais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èterait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èterions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èteriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èteraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ète", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "étrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ètre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ètres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ètrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ètrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ètreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ètrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ètrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ètrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ètreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ètrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ètrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ètrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ètreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ètreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ètre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "évrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èvre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èvres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èvrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èvrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èvreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èvrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èvrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èvrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èvreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èvrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èvrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èvrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èvreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èvreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èvre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éyer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èye", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èyes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èyent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èyerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èyeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èyera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èyerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èyerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èyeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èyerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èyerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èyerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èyeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èyeraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èye", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ] + } + } +}; Index: gc_lang/fr/modules-js/lexicographe.js ================================================================== --- gc_lang/fr/modules-js/lexicographe.js +++ gc_lang/fr/modules-js/lexicographe.js @@ -12,104 +12,104 @@ if (typeof (require) !== 'undefined') { var helpers = require("resource://grammalecte/graphspell/helpers.js"); } const _dTag = new Map([ - [':G', "[mot grammatical]"], - [':N', " nom,"], - [':A', " adjectif,"], - [':M1', " prénom,"], - [':M2', " patronyme,"], - [':MP', " nom propre,"], - [':W', " adverbe,"], - [':X', " adverbe de négation,"], - [':U', " adverbe interrogatif,"], - [':J', " interjection,"], - [':B', " nombre,"], - [':T', " titre,"], - - [':R', " préposition,"], - [':Rv', " préposition verbale,"], - [':D', " déterminant,"], - [':Dd', " déterminant démonstratif,"], - [':De', " déterminant exclamatif,"], - [':Dp', " déterminant possessif,"], - [':Di', " déterminant indéfini,"], - [':Dn', " déterminant négatif,"], - [':Od', " pronom démonstratif,"], - [':Oi', " pronom indéfini,"], - [':On', " pronom indéfini négatif,"], - [':Ot', " pronom interrogatif,"], - [':Or', " pronom relatif,"], - [':Ow', " pronom adverbial,"], - [':Os', " pronom personnel sujet,"], - [':Oo', " pronom personnel objet,"], - [':C', " conjonction,"], - [':Ĉ', " conjonction (él.),"], - [':Cc', " conjonction de coordination,"], - [':Cs', " conjonction de subordination,"], - [':Ĉs', " conjonction de subordination (él.),"], - - [':Ŵ', " locution adverbiale (él.),"], - [':Ñ', " locution nominale (él.),"], - [':Â', " locution adjectivale (él.),"], - [':Ṽ', " locution verbale (él.),"], - [':Ŕ', " locution prépositive (él.),"], - [':Ĵ', " locution interjective (él.),"], - - [':Zp', " préfixe,"], - [':Zs', " suffixe,"], - - [':V1', " verbe (1ᵉʳ gr.),"], - [':V2', " verbe (2ᵉ gr.),"], - [':V3', " verbe (3ᵉ gr.),"], - [':V0e', " verbe,"], - [':V0a', " verbe,"], - - [':O1', " 1ʳᵉ pers.,"], - [':O2', " 2ᵉ pers.,"], - [':O3', " 3ᵉ pers.,"], - - [':e', " épicène"], - [':m', " masculin"], - [':f', " féminin"], - [':s', " singulier"], - [':p', " pluriel"], - [':i', " invariable"], - - [':Y', " infinitif,"], - [':P', " participe présent,"], - [':Q', " participe passé,"], - - [':Ip', " présent,"], - [':Iq', " imparfait,"], - [':Is', " passé simple,"], - [':If', " futur,"], - [':K', " conditionnel présent,"], - [':Sp', " subjonctif présent,"], - [':Sq', " subjonctif imparfait,"], - [':E', " impératif,"], - - [':1s', " 1ʳᵉ p. sg.,"], - [':1ŝ', " présent interr. 1ʳᵉ p. sg.,"], - [':1ś', " présent interr. 1ʳᵉ p. sg.,"], - [':2s', " 2ᵉ p. sg.,"], - [':3s', " 3ᵉ p. sg.,"], - [':1p', " 1ʳᵉ p. pl.,"], - [':2p', " 2ᵉ p. pl.,"], - [':3p', " 3ᵉ p. pl.,"], - [':3p!', " 3ᵉ p. pl.,"], - - [';S', " : symbole (unité de mesure)"], - - ['/*', ""], - ['/C', " {classique}"], - ['/M', ""], - ['/R', " {réforme}"], - ['/A', ""], - ['/X', ""] + [':N', [" nom,", "Nom"]], + [':A', [" adjectif,", "Adjectif"]], + [':M1', [" prénom,", "Prénom"]], + [':M2', [" patronyme,", "Patronyme, matronyme, nom de famille…"]], + [':MP', [" nom propre,", "Nom propre"]], + [':W', [" adverbe,", "Adverbe"]], + [':J', [" interjection,", "Interjection"]], + [':B', [" nombre,", "Nombre"]], + [':T', [" titre,", "Titre de civilité"]], + + [':e', [" épicène", "épicène"]], + [':m', [" masculin", "masculin"]], + [':f', [" féminin", "féminin"]], + [':s', [" singulier", "singulier"]], + [':p', [" pluriel", "pluriel"]], + [':i', [" invariable", "invariable"]], + + [':V1', [" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"]], + [':V2', [" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"]], + [':V3', [" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"]], + [':V0e', [" verbe,", "Verbe auxiliaire être"]], + [':V0a', [" verbe,", "Verbe auxiliaire avoir"]], + + [':Y', [" infinitif,", "Infinitif"]], + [':P', [" participe présent,", "Participe présent"]], + [':Q', [" participe passé,", "Participe passé"]], + + [':Ip', [" présent,", "Indicatif présent"]], + [':Iq', [" imparfait,", "Indicatif imparfait"]], + [':Is', [" passé simple,", "Indicatif passé simple"]], + [':If', [" futur,", "Indicatif futur"]], + [':K', [" conditionnel présent,", "Conditionnel présent"]], + [':Sp', [" subjonctif présent,", "Subjonctif présent"]], + [':Sq', [" subjonctif imparfait,", "Subjonctif imparfait"]], + [':E', [" impératif,", "Impératif"]], + + [':1s', [" 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier"]], + [':1ŝ', [" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':1ś', [" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':2s', [" 2ᵉ p. sg.,", "Verbe à la 2ᵉ personne du singulier"]], + [':3s', [" 3ᵉ p. sg.,", "Verbe à la 3ᵉ personne du singulier"]], + [':1p', [" 1ʳᵉ p. pl.,", "Verbe à la 1ʳᵉ personne du pluriel"]], + [':2p', [" 2ᵉ p. pl.,", "Verbe à la 2ᵉ personne du pluriel"]], + [':3p', [" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel"]], + [':3p!', [" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel (prononciation distinctive)"]], + + [':G', ["[mot grammatical]", "Mot grammatical"]], + [':X', [" adverbe de négation,", "Adverbe de négation"]], + [':U', [" adverbe interrogatif,", "Adverbe interrogatif"]], + [':R', [" préposition,", "Préposition"]], + [':Rv', [" préposition verbale,", "Préposition verbale"]], + [':D', [" déterminant,", "Déterminant"]], + [':Dd', [" déterminant démonstratif,", "Déterminant démonstratif"]], + [':De', [" déterminant exclamatif,", "Déterminant exclamatif"]], + [':Dp', [" déterminant possessif,", "Déterminant possessif"]], + [':Di', [" déterminant indéfini,", "Déterminant indéfini"]], + [':Dn', [" déterminant négatif,", "Déterminant négatif"]], + [':Od', [" pronom démonstratif,", "Pronom démonstratif"]], + [':Oi', [" pronom indéfini,", "Pronom indéfini"]], + [':On', [" pronom indéfini négatif,", "Pronom indéfini négatif"]], + [':Ot', [" pronom interrogatif,", "Pronom interrogatif"]], + [':Or', [" pronom relatif,", "Pronom relatif"]], + [':Ow', [" pronom adverbial,", "Pronom adverbial"]], + [':Os', [" pronom personnel sujet,", "Pronom personnel sujet"]], + [':Oo', [" pronom personnel objet,", "Pronom personnel objet"]], + [':O1', [" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"]], + [':O2', [" 2ᵉ pers.,", "Pronom : 2ᵉ personne"]], + [':O3', [" 3ᵉ pers.,", "Pronom : 3ᵉ personne"]], + [':C', [" conjonction,", "Conjonction"]], + [':Ĉ', [" conjonction (él.),", "Conjonction (élément)"]], + [':Cc', [" conjonction de coordination,", "Conjonction de coordination"]], + [':Cs', [" conjonction de subordination,", "Conjonction de subordination"]], + [':Ĉs', [" conjonction de subordination (él.),", "Conjonction de subordination (élément)"]], + + [':Ñ', [" locution nominale (él.),", "Locution nominale (élément)"]], + [':Â', [" locution adjectivale (él.),", "Locution adjectivale (élément)"]], + [':Ṽ', [" locution verbale (él.),", "Locution verbale (élément)"]], + [':Ŵ', [" locution adverbiale (él.),", "Locution adverbiale (élément)"]], + [':Ŕ', [" locution prépositive (él.),", "Locution prépositive (élément)"]], + [':Ĵ', [" locution interjective (él.),", "Locution interjective (élément)"]], + + [':Zp', [" préfixe,", "Préfixe"]], + [':Zs', [" suffixe,", "Suffixe"]], + + [';S', [" : symbole (unité de mesure)", "Symbole (unité de mesure)"]], + + ['/*', ["", "sous-dictionnaire "]], + ['/C', [" ", "sous-dictionnaire "]], + ['/M', ["", "sous-dictionnaire "]], + ['/R', [" ", "sous-dictionnaire "]], + ['/A', ["", "sous-dictionnaire "]], + ['/X', ["", "sous-dictionnaire "]] ]); + const _dLocTag = new Map([ [':L', "locution"], [':LN', "locution nominale"], [':LA', "locution adjectivale"], @@ -376,11 +376,11 @@ _formatTags (sTags) { let sRes = ""; sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1"); let m; while ((m = this._zTag.exec(sTags)) !== null) { - sRes += _dTag.get(m[0]); + sRes += _dTag.get(m[0])[0]; } if (sRes.startsWith(" verbe") && !sRes.includes("infinitif")) { sRes += " [" + sTags.slice(1, sTags.indexOf(" ")) + "]"; } if (!sRes) { ADDED gc_lang/fr/modules/conj_generator.py Index: gc_lang/fr/modules/conj_generator.py ================================================================== --- /dev/null +++ gc_lang/fr/modules/conj_generator.py @@ -0,0 +1,2000 @@ +# Conjugation generator +# beta stage, unfinished, the root for a new way to generate flexions… + +import re + + +def conjugate (sVerb, sVerbTag="i_____a", bVarPpas=True): + lConj = [] + cGroup = getVerbGroupChar(sVerb) + for nCut, sAdd, sFlexTags, sPattern in getConjRules(sVerb, bVarPpas): + if not sPattern or re.search(sPattern, sVerb): + sFlexion = sVerb[0:-nCut] + sAdd if nCut else sVerb + sAdd + lConj.append((sFlexion, ":V" + cGroup + "_" + sVerbTag + sFlexTags)) + return lConj + + +def getVerbGroupChar (sVerb, ): + sVerb = sVerb.lower() + if sVerb.endswith("er"): + return "1" + if sVerb.endswith("ir"): + return "2" + if sVerb == "être" or sVerb == "avoir": + return "0" + if sVerb.endswith("re"): + return "3" + return "4" + + +def getConjRules (sVerb, bVarPpas=True, nGroup=2): + if sVerb.endswith("er"): + # premier groupe, conjugaison en fonction de la terminaison du lemme + # 5 lettres + if sVerb[-5:] in oConj["V1"]: + lConj = list(oConj["V1"][sVerb[-5:]]) + # 4 lettres + elif sVerb[-4:] in oConj["V1"]: + if sVerb.endswith(("eler", "eter")): + lConj = list(oConj["V1"][sVerb[-4:]]["1"]) + else: + lConj = list(oConj["V1"][sVerb[-4:]]) + # 3 lettres + elif sVerb[-3:] in oConj["V1"]: + lConj = list(oConj["V1"][sVerb[-3:]]) + # 2 lettres + else: + lConj = list(oConj["V1"]["er"]) + lConj.extend(oConj["V1_ppas"][bVarPpas]) + elif sVerb.endswith("ir") and nGroup <= 2: + # deuxième groupe + lConj = list(oConj["V2"]) + lConj.extend(oConj["V2_ppas"][bVarPpas]) + else: + # TODO: troisième groupe + lConj = [ [0, "", ":Y/*", False] ] + return lConj + + +oConj = { + "V1_ppas": { + True: [ + [2, "é", ":Q:A:1ŝ:m:s/*", False], + [2, "és", ":Q:A:m:p/*", False], + [2, "ée", ":Q:A:f:s/*", False], + [2, "ées", ":Q:A:f:p/*", False], + ], + False: [ + [2, "é", ":Q:e:i/*", False], + ] + }, + + "V2_ppas": { + True: [ + [2, "i", ":Q:A:m:s/*", False], + [2, "is", ":Q:A:m:p/*", False], + [2, "ie", ":Q:A:f:s/*", False], + [2, "ies", ":Q:A:f:p/*", False], + ], + False: [ + [2, "i", ":Q:e:i/*", False], + ] + }, + + # deuxième groupe (le seul groupe régulier) + "V2": [ + [2, "ir", ":Y/*", False], + [2, "issant", ":P/*", False], + [2, "is", ":Ip:Is:1s:2s/*", False], + [2, "it", ":Ip:Is:3s/*", False], + [2, "issons", ":Ip:1p/*", False], + [2, "issez", ":Ip:2p/*", False], + [2, "issent", ":Ip:Sp:Sq:3p/*", False], + [2, "issais", ":Iq:1s:2s/*", False], + [2, "issait", ":Iq:3s/*", False], + [2, "issions", ":Iq:Sp:Sq:1p/*", False], + [2, "issiez", ":Iq:Sp:Sq:2p/*", False], + [2, "issaient", ":Iq:3p/*", False], + [2, "îmes", ":Is:1p/*", False], + [2, "îtes", ":Is:2p/*", False], + [2, "irent", ":Is:3p!/*", False], + [2, "irai", ":If:1s/*", False], + [2, "iras", ":If:2s/*", False], + [2, "ira", ":If:3s/*", False], + [2, "irons", ":If:1p/*", False], + [2, "irez", ":If:2p/*", False], + [2, "iront", ":If:3p!/*", False], + [2, "irais", ":K:1s:2s/*", False], + [2, "irait", ":K:3s/*", False], + [2, "irions", ":K:1p/*", False], + [2, "iriez", ":K:2p/*", False], + [2, "iraient", ":K:3p/*", False], + [2, "isse", ":Sp:Sq:1s/*", False], + [2, "isses", ":Sp:Sq:2s/*", False], + [2, "isse", ":Sp:3s/*", False], + [2, "ît", ":Sq:3s/*", False], + [2, "is", ":E:2s/*", False], + [2, "issons", ":E:1p/*", False], + [2, "issez", ":E:2p/*", False] + ], + + # premier groupe (bien plus irrégulier que prétendu) + "V1": { + # a + # verbes en -er, -ger, -yer, -cer + "er": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ger": [ + [2, "er", ":Y/*", False], + [2, "eant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [2, "eons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [2, "eais", ":Iq:1s:2s/*", False], + [2, "eait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "eaient", ":Iq:3p/*", False], + [2, "eai", ":Is:1s/*", False], + [2, "eas", ":Is:2s/*", False], + [2, "ea", ":Is:3s/*", False], + [2, "eâmes", ":Is:1p/*", False], + [2, "eâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [2, "easse", ":Sq:1s/*", False], + [2, "easses", ":Sq:2s/*", False], + [2, "eât", ":Sq:3s/*", False], + [2, "eassions", ":Sq:1p/*", False], + [2, "eassiez", ":Sq:2p/*", False], + [2, "eassent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [2, "eons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "cer": [ + [2, "er", ":Y/*", False], + [3, "çant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [3, "çons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [3, "çais", ":Iq:1s:2s/*", False], + [3, "çait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [3, "çaient", ":Iq:3p/*", False], + [3, "çai", ":Is:1s/*", False], + [3, "ças", ":Is:2s/*", False], + [3, "ça", ":Is:3s/*", False], + [3, "çâmes", ":Is:1p/*", False], + [3, "çâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [3, "çasse", ":Sq:1s/*", False], + [3, "çasses", ":Sq:2s/*", False], + [3, "çât", ":Sq:3s/*", False], + [3, "çassions", ":Sq:1p/*", False], + [3, "çassiez", ":Sq:2p/*", False], + [3, "çassent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [3, "çons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "yer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [3, "ye", ":Ip:Sp:1s:3s/*", "[^ou]yer$"], + [3, "ie", ":Ip:Sp:1s:3s/*", "[aou]yer$"], + [2, "è", ":Ip:1ś/*", False], + [3, "yes", ":Ip:Sp:2s/*", "[^ou]yer$"], + [3, "ies", ":Ip:Sp:2s/*", "[aou]yer$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [3, "yent", ":Ip:Sp:3p/*", "[^ou]yer$"], + [3, "ient", ":Ip:Sp:3p/*", "[aou]yer$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [3, "yerai", ":If:1s/*", "[^ou]yer$"], + [3, "ierai", ":If:1s/*", "[aou]yer$"], + [3, "yeras", ":If:2s/*", "[^ou]yer$"], + [3, "ieras", ":If:2s/*", "[aou]yer$"], + [3, "yera", ":If:3s/*", "[^ou]yer$"], + [3, "iera", ":If:3s/*", "[aou]yer$"], + [3, "yerons", ":If:1p/*", "[^ou]yer$"], + [3, "ierons", ":If:1p/*", "[aou]yer$"], + [3, "yerez", ":If:2p/*", "[^ou]yer$"], + [3, "ierez", ":If:2p/*", "[aou]yer$"], + [3, "yeront", ":If:3p!/*", "[^ou]yer$"], + [3, "ieront", ":If:3p!/*", "[aou]yer$"], + [3, "yerais", ":K:1s:2s/*", "[^ou]yer$"], + [3, "ierais", ":K:1s:2s/*", "[aou]yer$"], + [3, "yerait", ":K:3s/*", "[^ou]yer$"], + [3, "ierait", ":K:3s/*", "[aou]yer$"], + [3, "yerions", ":K:1p/*", "[^ou]yer$"], + [3, "ierions", ":K:1p/*", "[aou]yer$"], + [3, "yeriez", ":K:2p/*", "[^ou]yer$"], + [3, "ieriez", ":K:2p/*", "[aou]yer$"], + [3, "yeraient", ":K:3p/*", "[^ou]yer$"], + [3, "ieraient", ":K:3p/*", "[aou]yer$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [3, "ye", ":E:2s/*", "[^ou]yer$"], + [3, "ie", ":E:2s/*", "[aou]yer$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + # b + # verbes en -ecer, -emer, -ener, -eper, -erer, -eser, -ever, -evrer + # verbes en -eler, -eter (pas de doublement de la consonne: acheter, celer, déceler, receler, ciseler, démanteler, + # écarteler, encasteler, geler, dégeler, congeler, surgeler, marteler, modeler, peler, acheter, racheter, + # bégueter, corseter, crocheter, fileter, fureter, haleter) + # changement du e en è avant syllabe muette + "ecer": [ + [2, "er", ":Y/*", False], + [3, "çant", ":P/*", False], + [4, "èce", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èces", ":Ip:Sp:2s/*", False], + [3, "çons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ècent", ":Ip:Sp:3p/*", False], + [3, "çais", ":Iq:1s:2s/*", False], + [3, "çait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [3, "çaient", ":Iq:3p/*", False], + [3, "çai", ":Is:1s/*", False], + [3, "ças", ":Is:2s/*", False], + [3, "ça", ":Is:3s/*", False], + [3, "çâmes", ":Is:1p/*", False], + [3, "çâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ècerai", ":If:1s/*", False], + [4, "èceras", ":If:2s/*", False], + [4, "ècera", ":If:3s/*", False], + [4, "ècerons", ":If:1p/*", False], + [4, "ècerez", ":If:2p/*", False], + [4, "èceront", ":If:3p!/*", False], + [4, "ècerais", ":K:1s:2s/*", False], + [4, "ècerait", ":K:3s/*", False], + [4, "ècerions", ":K:1p/*", False], + [4, "èceriez", ":K:2p/*", False], + [4, "èceraient", ":K:3p/*", False], + [3, "çasse", ":Sq:1s/*", False], + [3, "çasses", ":Sq:2s/*", False], + [3, "çât", ":Sq:3s/*", False], + [3, "çassions", ":Sq:1p/*", False], + [3, "çassiez", ":Sq:2p/*", False], + [3, "çassent", ":Sq:3p/*", False], + [4, "èce", ":E:2s/*", False], + [3, "çons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eler": { + "1": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èlent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èlerai", ":If:1s/*", False], + [4, "èleras", ":If:2s/*", False], + [4, "èlera", ":If:3s/*", False], + [4, "èlerons", ":If:1p/*", False], + [4, "èlerez", ":If:2p/*", False], + [4, "èleront", ":If:3p!/*", False], + [4, "èlerais", ":K:1s:2s/*", False], + [4, "èlerait", ":K:3s/*", False], + [4, "èlerions", ":K:1p/*", False], + [4, "èleriez", ":K:2p/*", False], + [4, "èleraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + "2": [ + # d. verbes en -eler : doublement de la consonne l. + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "elle", ":Ip:Sp:1s:3s/*", "ppeler$"], + [4, "elle", ":Ip:Sp:1s:3s/M", "[^p].eler$"], + [4, "èle", ":Ip:Sp:1s:3s/R", "[^p].eler$"], + [2, "è", ":Ip:1ś/R", False], + [4, "elles", ":Ip:Sp:2s/*", "ppeler$"], + [4, "elles", ":Ip:Sp:2s/M", "[^p].eler$"], + [4, "èles", ":Ip:Sp:2s/R", "[^p].eler$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ellent", ":Ip:Sp:3p/*", "ppeler$"], + [4, "ellent", ":Ip:Sp:3p/M", "[^p].eler$"], + [4, "èlent", ":Ip:Sp:3p/R", "[^p].eler$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ellerai", ":If:1s/*", "ppeler$"], + [4, "ellerai", ":If:1s/M", "[^p].eler$"], + [4, "èlerai", ":If:1s/R", "[^p].eler$"], + [4, "elleras", ":If:2s/*", "ppeler$"], + [4, "elleras", ":If:2s/M", "[^p].eler$"], + [4, "èleras", ":If:2s/R", "[^p].eler$"], + [4, "ellera", ":If:3s/*", "ppeler$"], + [4, "ellera", ":If:3s/M", "[^p].eler$"], + [4, "èlera", ":If:3s/R", "[^p].eler$"], + [4, "ellerons", ":If:1p/*", "ppeler$"], + [4, "ellerons", ":If:1p/M", "[^p].eler$"], + [4, "èlerons", ":If:1p/R", "[^p].eler$"], + [4, "ellerez", ":If:2p/*", "ppeler$"], + [4, "ellerez", ":If:2p/M", "[^p].eler$"], + [4, "èlerez", ":If:2p/R", "[^p].eler$"], + [4, "elleront", ":If:3p!/*", "ppeler$"], + [4, "elleront", ":If:3p!/M", "[^p].eler$"], + [4, "èleront", ":If:3p!/R", "[^p].eler$"], + [4, "ellerais", ":K:1s:2s/*", "ppeler$"], + [4, "ellerais", ":K:1s:2s/M", "[^p].eler$"], + [4, "èlerais", ":K:1s:2s/R", "[^p].eler$"], + [4, "ellerait", ":K:3s/*", "ppeler$"], + [4, "ellerait", ":K:3s/M", "[^p].eler$"], + [4, "èlerait", ":K:3s/R", "[^p].eler$"], + [4, "ellerions", ":K:1p/*", "ppeler$"], + [4, "ellerions", ":K:1p/M", "[^p].eler$"], + [4, "èlerions", ":K:1p/R", "[^p].eler$"], + [4, "elleriez", ":K:2p/*", "ppeler$"], + [4, "elleriez", ":K:2p/M", "[^p].eler$"], + [4, "èleriez", ":K:2p/R", "[^p].eler$"], + [4, "elleraient", ":K:3p/*", "ppeler$"], + [4, "elleraient", ":K:3p/M", "[^p].eler$"], + [4, "èleraient", ":K:3p/R", "[^p].eler$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "elle", ":E:2s/*", "ppeler$"], + [4, "elle", ":E:2s/M", "[^p].eler$"], + [4, "èle", ":E:2s/R", "[^p].eler$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + }, + + "emer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ème", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èmes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èment", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èmerai", ":If:1s/*", False], + [4, "èmeras", ":If:2s/*", False], + [4, "èmera", ":If:3s/*", False], + [4, "èmerons", ":If:1p/*", False], + [4, "èmerez", ":If:2p/*", False], + [4, "èmeront", ":If:3p!/*", False], + [4, "èmerais", ":K:1s:2s/*", False], + [4, "èmerait", ":K:3s/*", False], + [4, "èmerions", ":K:1p/*", False], + [4, "èmeriez", ":K:2p/*", False], + [4, "èmeraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ème", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ener": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ène", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ènes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ènent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ènerai", ":If:1s/*", False], + [4, "èneras", ":If:2s/*", False], + [4, "ènera", ":If:3s/*", False], + [4, "ènerons", ":If:1p/*", False], + [4, "ènerez", ":If:2p/*", False], + [4, "èneront", ":If:3p!/*", False], + [4, "ènerais", ":K:1s:2s/*", False], + [4, "ènerait", ":K:3s/*", False], + [4, "ènerions", ":K:1p/*", False], + [4, "èneriez", ":K:2p/*", False], + [4, "èneraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ène", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eper": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èpe", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èpes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èpent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èperai", ":If:1s/*", False], + [4, "èperas", ":If:2s/*", False], + [4, "èpera", ":If:3s/*", False], + [4, "èperons", ":If:1p/*", False], + [4, "èperez", ":If:2p/*", False], + [4, "èperont", ":If:3p!/*", False], + [4, "èperais", ":K:1s:2s/*", False], + [4, "èperait", ":K:3s/*", False], + [4, "èperions", ":K:1p/*", False], + [4, "èperiez", ":K:2p/*", False], + [4, "èperaient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èpe", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "erer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ère", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ères", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èrerai", ":If:1s/*", False], + [4, "èreras", ":If:2s/*", False], + [4, "èrera", ":If:3s/*", False], + [4, "èrerons", ":If:1p/*", False], + [4, "èrerez", ":If:2p/*", False], + [4, "èreront", ":If:3p!/*", False], + [4, "èrerais", ":K:1s:2s/*", False], + [4, "èrerait", ":K:3s/*", False], + [4, "èrerions", ":K:1p/*", False], + [4, "èreriez", ":K:2p/*", False], + [4, "èreraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ère", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eser": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èse", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èses", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èsent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èserai", ":If:1s/*", False], + [4, "èseras", ":If:2s/*", False], + [4, "èsera", ":If:3s/*", False], + [4, "èserons", ":If:1p/*", False], + [4, "èserez", ":If:2p/*", False], + [4, "èseront", ":If:3p!/*", False], + [4, "èserais", ":K:1s:2s/*", False], + [4, "èserait", ":K:3s/*", False], + [4, "èserions", ":K:1p/*", False], + [4, "èseriez", ":K:2p/*", False], + [4, "èseraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èse", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eter": { + "1": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ète", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ètes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ètent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èterai", ":If:1s/*", False], + [4, "èteras", ":If:2s/*", False], + [4, "ètera", ":If:3s/*", False], + [4, "èterons", ":If:1p/*", False], + [4, "èterez", ":If:2p/*", False], + [4, "èteront", ":If:3p!/*", False], + [4, "èterais", ":K:1s:2s/*", False], + [4, "èterait", ":K:3s/*", False], + [4, "èterions", ":K:1p/*", False], + [4, "èteriez", ":K:2p/*", False], + [4, "èteraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ète", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + "2": [ + # d. verbes en -eter : doublement de la consonne t + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ette", ":Ip:Sp:1s:3s/*", "jeter$"], + [4, "ette", ":Ip:Sp:1s:3s/M", "[^j]eter$"], + [4, "ète", ":Ip:Sp:1s:3s/R", "[^j]eter$"], + [2, "è", ":Ip:1ś/R", False], + [4, "ettes", ":Ip:Sp:2s/*", "jeter$"], + [4, "ettes", ":Ip:Sp:2s/M", "[^j]eter$"], + [4, "ètes", ":Ip:Sp:2s/R", "[^j]eter$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ettent", ":Ip:Sp:3p/*", "jeter$"], + [4, "ettent", ":Ip:Sp:3p/M", "[^j]eter$"], + [4, "ètent", ":Ip:Sp:3p/R", "[^j]eter$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "etterai", ":If:1s/*", "jeter$"], + [4, "etterai", ":If:1s/M", "[^j]eter$"], + [4, "èterai", ":If:1s/R", "[^j]eter$"], + [4, "etteras", ":If:2s/*", "jeter$"], + [4, "etteras", ":If:2s/M", "[^j]eter$"], + [4, "èteras", ":If:2s/R", "[^j]eter$"], + [4, "ettera", ":If:3s/*", "jeter$"], + [4, "ettera", ":If:3s/M", "[^j]eter$"], + [4, "ètera", ":If:3s/R", "[^j]eter$"], + [4, "etterons", ":If:1p/*", "jeter$"], + [4, "etterons", ":If:1p/M", "[^j]eter$"], + [4, "èterons", ":If:1p/R", "[^j]eter$"], + [4, "etterez", ":If:2p/*", "jeter$"], + [4, "etterez", ":If:2p/M", "[^j]eter$"], + [4, "èterez", ":If:2p/R", "[^j]eter$"], + [4, "etteront", ":If:3p!/*", "jeter$"], + [4, "etteront", ":If:3p!/M", "[^j]eter$"], + [4, "èteront", ":If:3p!/R", "[^j]eter$"], + [4, "etterais", ":K:1s:2s/*", "jeter$"], + [4, "etterais", ":K:1s:2s/M", "[^j]eter$"], + [4, "èterais", ":K:1s:2s/R", "[^j]eter$"], + [4, "etterait", ":K:3s/*", "jeter$"], + [4, "etterait", ":K:3s/M", "[^j]eter$"], + [4, "èterait", ":K:3s/R", "[^j]eter$"], + [4, "etterions", ":K:1p/*", "jeter$"], + [4, "etterions", ":K:1p/M", "[^j]eter$"], + [4, "èterions", ":K:1p/R", "[^j]eter$"], + [4, "etteriez", ":K:2p/*", "jeter$"], + [4, "etteriez", ":K:2p/M", "[^j]eter$"], + [4, "èteriez", ":K:2p/R", "[^j]eter$"], + [4, "etteraient", ":K:3p/*", "jeter$"], + [4, "etteraient", ":K:3p/M", "[^j]eter$"], + [4, "èteraient", ":K:3p/R", "[^j]eter$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ette", ":E:2s/*", "jeter$"], + [4, "ette", ":E:2s/M", "[^j]eter$"], + [4, "ète", ":E:2s/R", "[^j]eter$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ] + }, + + "ever": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ève", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èves", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èvent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èverai", ":If:1s/*", False], + [4, "èveras", ":If:2s/*", False], + [4, "èvera", ":If:3s/*", False], + [4, "èverons", ":If:1p/*", False], + [4, "èverez", ":If:2p/*", False], + [4, "èveront", ":If:3p!/*", False], + [4, "èverais", ":K:1s:2s/*", False], + [4, "èverait", ":K:3s/*", False], + [4, "èverions", ":K:1p/*", False], + [4, "èveriez", ":K:2p/*", False], + [4, "èveraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ève", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "evrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èvre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èvres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èvrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [5, "èvrerai", ":If:1s/*", False], + [5, "èvreras", ":If:2s/*", False], + [5, "èvrera", ":If:3s/*", False], + [5, "èvrerons", ":If:1p/*", False], + [5, "èvrerez", ":If:2p/*", False], + [5, "èvreront", ":If:3p!/*", False], + [5, "èvrerais", ":K:1s:2s/*", False], + [5, "èvrerait", ":K:3s/*", False], + [5, "èvrerions", ":K:1p/*", False], + [5, "èvreriez", ":K:2p/*", False], + [5, "èvreraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èvre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + # c + # verbes en -ébrer, -écer, -écher, -écrer, -éder, -éger, -égler, -égner, -égrer, -éguer, + # -éler, -émer, -éner, -éper, -équer, -érer, -éser, -éter, -étrer, -évrer, -éyer + # changement du é en è + + "écer": [ + [2, "er", ":Y/*", False], + [4, "éçant", ":P/*", False], + [4, "èce", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èces", ":Ip:Sp:2s/*", False], + [4, "éçons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ècent", ":Ip:Sp:3p/*", False], + [4, "éçais", ":Iq:1s:2s/*", False], + [4, "éçait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [4, "éçaient", ":Iq:3p/*", False], + [4, "éçai", ":Is:1s/*", False], + [4, "éças", ":Is:2s/*", False], + [4, "éça", ":Is:3s/*", False], + [4, "éçâmes", ":Is:1p/*", False], + [4, "éçâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ècerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èceras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ècera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ècerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ècerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èceront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ècerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ècerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ècerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èceriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èceraient", ":K:3p/R", False], + [4, "éçasse", ":Sq:1s/*", False], + [4, "éçasses", ":Sq:2s/*", False], + [4, "éçât", ":Sq:3s/*", False], + [4, "éçassions", ":Sq:1p/*", False], + [4, "éçassiez", ":Sq:2p/*", False], + [4, "éçassent", ":Sq:3p/*", False], + [4, "èce", ":E:2s/*", False], + [4, "éçons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éger": [ + [2, "er", ":Y/*", False], + [4, "égeant", ":P/*", False], + [4, "ège", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èges", ":Ip:Sp:2s/*", False], + [4, "égeons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ègent", ":Ip:Sp:3p/*", False], + [4, "égeais", ":Iq:1s:2s/*", False], + [4, "égeait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [4, "égeaient", ":Iq:3p/*", False], + [4, "égeai", ":Is:1s/*", False], + [4, "égeas", ":Is:2s/*", False], + [4, "égea", ":Is:3s/*", False], + [4, "égeâmes", ":Is:1p/*", False], + [4, "égeâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ègerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "ègeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ègera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ègerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ègerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "ègeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ègerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ègerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ègerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "ègeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "ègeraient", ":K:3p/R", False], + [4, "égeasse", ":Sq:1s/*", False], + [4, "égeasses", ":Sq:2s/*", False], + [4, "égeât", ":Sq:3s/*", False], + [4, "égeassions", ":Sq:1p/*", False], + [4, "égeassiez", ":Sq:2p/*", False], + [4, "égeassent", ":Sq:3p/*", False], + [4, "ège", ":E:2s/*", False], + [4, "égeons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ébrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èbre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èbres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èbrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èbrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èbreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èbrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èbrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èbrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èbreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èbrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èbrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èbrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èbreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èbreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èbre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "écher": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èche", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èches", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èchent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ècherai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ècheras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èchera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ècherons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ècherez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ècheront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ècherais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ècherait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ècherions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ècheriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ècheraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èche", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "écrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ècre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ècres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ècrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ècrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ècreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ècrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ècrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ècrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ècreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ècrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ècrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ècrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ècreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ècreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ècre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éder": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ède", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èdes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èdent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èderai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èderas", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èdera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èderons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èderez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èderont", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èderais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èderait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èderions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èderiez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èderaient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ède", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égler": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èglent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èglerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègleras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èglera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èglerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èglerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègleront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èglerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èglerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èglerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègleriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègleraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égner": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègne", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègnes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ègnent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ègnerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègneras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ègnera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ègnerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ègnerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègneront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ègnerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ègnerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ègnerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègneriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègneraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègne", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ègrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ègrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ègrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ègrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ègrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ègrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ègrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ègrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éguer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègue", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègues", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èguent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èguerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègueras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èguera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èguerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èguerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègueront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èguerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èguerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èguerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègueriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègueraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègue", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éler": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èlent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èlerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èleras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èlera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èlerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èlerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èleront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èlerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èlerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èlerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èleriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èleraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "émer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ème", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èmes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èment", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èmerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èmeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èmera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èmerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èmerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èmeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èmerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èmerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èmerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èmeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èmeraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ème", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éner": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ène", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ènes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ènent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ènerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èneras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ènera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ènerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ènerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èneront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ènerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ènerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ènerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èneriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èneraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ène", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éper": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èpe", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èpes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èpent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èperai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èperas", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èpera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èperons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èperez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èperont", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èperais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èperait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èperions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èperiez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èperaient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èpe", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "équer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èque", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èques", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èquent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èquerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èqueras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èquera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èquerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èquerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èqueront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èquerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èquerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èquerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èqueriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èqueraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èque", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "érer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ère", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ères", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ère", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éser": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èse", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èses", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èsent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èserai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èseras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èsera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èserons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èserez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èseront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èserais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èserait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èserions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èseriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èseraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èse", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éter": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ète", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ètes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ètent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èterai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èteras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ètera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èterons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èterez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èteront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èterais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èterait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èterions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èteriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èteraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ète", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "étrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ètre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ètres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ètrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ètrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ètreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ètrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ètrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ètrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ètreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ètrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ètrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ètrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ètreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ètreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ètre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "évrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èvre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èvres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èvrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èvrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èvreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èvrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èvrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èvrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èvreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èvrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èvrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èvrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èvreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èvreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èvre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éyer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èye", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èyes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èyent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èyerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èyeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èyera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èyerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èyerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èyeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èyerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èyerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èyerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èyeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èyeraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èye", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ] + } +} Index: gc_lang/fr/modules/lexicographe.py ================================================================== --- gc_lang/fr/modules/lexicographe.py +++ gc_lang/fr/modules/lexicographe.py @@ -5,103 +5,102 @@ import re import traceback _dTAGS = { - ':G': "", - ':N': " nom,", - ':A': " adjectif,", - ':M1': " prénom,", - ':M2': " patronyme,", - ':MP': " nom propre,", - ':W': " adverbe,", - ':X': " adverbe de négation,", - ':U': " adverbe interrogatif,", - ':J': " interjection,", - ':B': " nombre,", - ':T': " titre,", - - ':R': " préposition,", - ':Rv': " préposition verbale,", - ':D': " déterminant,", - ':Dd': " déterminant démonstratif,", - ':De': " déterminant exclamatif,", - ':Dp': " déterminant possessif,", - ':Di': " déterminant indéfini,", - ':Dn': " déterminant négatif,", - ':Od': " pronom démonstratif,", - ':Oi': " pronom indéfini,", - ':On': " pronom indéfini négatif,", - ':Ot': " pronom interrogatif,", - ':Or': " pronom relatif,", - ':Ow': " pronom adverbial,", - ':Os': " pronom personnel sujet,", - ':Oo': " pronom personnel objet,", - ':C': " conjonction,", - ':Ĉ': " conjonction (él.),", - ':Cc': " conjonction de coordination,", - ':Cs': " conjonction de subordination,", - ':Ĉs': " conjonction de subordination (él.),", - - ':Ŵ': " locution adverbiale (él.),", - ':Ñ': " locution nominale (él.),", - ':Â': " locution adjectivale (él.),", - ':Ṽ': " locution verbale (él.),", - ':Ŕ': " locution prépositive (él.),", - ':Ĵ': " locution interjective (él.),", - - ':Zp': " préfixe,", - ':Zs': " suffixe,", - - ':V1': " verbe (1ᵉʳ gr.),", - ':V2': " verbe (2ᵉ gr.),", - ':V3': " verbe (3ᵉ gr.),", - ':V0e': " verbe,", - ':V0a': " verbe,", - - ':O1': " 1ʳᵉ pers.,", - ':O2': " 2ᵉ pers.,", - ':O3': " 3ᵉ pers.,", - - ':e': " épicène", - ':m': " masculin", - ':f': " féminin", - ':s': " singulier", - ':p': " pluriel", - ':i': " invariable", - - ':Y': " infinitif,", - ':P': " participe présent,", - ':Q': " participe passé,", - - ':Ip': " présent,", - ':Iq': " imparfait,", - ':Is': " passé simple,", - ':If': " futur,", - ':K': " conditionnel présent,", - ':Sp': " subjonctif présent,", - ':Sq': " subjonctif imparfait,", - ':E': " impératif,", - - ':1s': " 1ʳᵉ p. sg.,", - ':1ŝ': " présent interr. 1ʳᵉ p. sg.,", - ':1ś': " présent interr. 1ʳᵉ p. sg.,", - ':2s': " 2ᵉ p. sg.,", - ':3s': " 3ᵉ p. sg.,", - ':1p': " 1ʳᵉ p. pl.,", - ':2p': " 2ᵉ p. pl.,", - ':3p': " 3ᵉ p. pl.,", - ':3p!': " 3ᵉ p. pl.,", - - ';S': " : symbole (unité de mesure)", - - '/*': "", - '/C': " {classique}", - '/M': "", - '/R': " {réforme}", - '/A': "", - '/X': "" + ':N': (" nom,", "Nom"), + ':A': (" adjectif,", "Adjectif"), + ':M1': (" prénom,", "Prénom"), + ':M2': (" patronyme,", "Patronyme, matronyme, nom de famille…"), + ':MP': (" nom propre,", "Nom propre"), + ':W': (" adverbe,", "Adverbe"), + ':J': (" interjection,", "Interjection"), + ':B': (" nombre,", "Nombre"), + ':T': (" titre,", "Titre de civilité"), + + ':e': (" épicène", "épicène"), + ':m': (" masculin", "masculin"), + ':f': (" féminin", "féminin"), + ':s': (" singulier", "singulier"), + ':p': (" pluriel", "pluriel"), + ':i': (" invariable", "invariable"), + + ':V1': (" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"), + ':V2': (" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"), + ':V3': (" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"), + ':V0e': (" verbe,", "Verbe auxiliaire être"), + ':V0a': (" verbe,", "Verbe auxiliaire avoir"), + + ':Y': (" infinitif,", "Infinitif"), + ':P': (" participe présent,", "Participe présent"), + ':Q': (" participe passé,", "Participe passé"), + + ':Ip': (" présent,", "Indicatif présent"), + ':Iq': (" imparfait,", "Indicatif imparfait"), + ':Is': (" passé simple,", "Indicatif passé simple"), + ':If': (" futur,", "Indicatif futur"), + ':K': (" conditionnel présent,", "Conditionnel présent"), + ':Sp': (" subjonctif présent,", "Subjonctif présent"), + ':Sq': (" subjonctif imparfait,", "Subjonctif imparfait"), + ':E': (" impératif,", "Impératif"), + + ':1s': (" 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier"), + ':1ŝ': (" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"), + ':1ś': (" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"), + ':2s': (" 2ᵉ p. sg.,", "Verbe à la 2ᵉ personne du singulier"), + ':3s': (" 3ᵉ p. sg.,", "Verbe à la 3ᵉ personne du singulier"), + ':1p': (" 1ʳᵉ p. pl.,", "Verbe à la 1ʳᵉ personne du pluriel"), + ':2p': (" 2ᵉ p. pl.,", "Verbe à la 2ᵉ personne du pluriel"), + ':3p': (" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel"), + ':3p!': (" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel (prononciation distinctive)"), + + ':G': ("", "Mot grammatical"), + ':X': (" adverbe de négation,", "Adverbe de négation"), + ':U': (" adverbe interrogatif,", "Adverbe interrogatif"), + ':R': (" préposition,", "Préposition"), + ':Rv': (" préposition verbale,", "Préposition verbale"), + ':D': (" déterminant,", "Déterminant"), + ':Dd': (" déterminant démonstratif,", "Déterminant démonstratif"), + ':De': (" déterminant exclamatif,", "Déterminant exclamatif"), + ':Dp': (" déterminant possessif,", "Déterminant possessif"), + ':Di': (" déterminant indéfini,", "Déterminant indéfini"), + ':Dn': (" déterminant négatif,", "Déterminant négatif"), + ':Od': (" pronom démonstratif,", "Pronom démonstratif"), + ':Oi': (" pronom indéfini,", "Pronom indéfini"), + ':On': (" pronom indéfini négatif,", "Pronom indéfini négatif"), + ':Ot': (" pronom interrogatif,", "Pronom interrogatif"), + ':Or': (" pronom relatif,", "Pronom relatif"), + ':Ow': (" pronom adverbial,", "Pronom adverbial"), + ':Os': (" pronom personnel sujet,", "Pronom personnel sujet"), + ':Oo': (" pronom personnel objet,", "Pronom personnel objet"), + ':O1': (" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"), + ':O2': (" 2ᵉ pers.,", "Pronom : 2ᵉ personne"), + ':O3': (" 3ᵉ pers.,", "Pronom : 3ᵉ personne"), + ':C': (" conjonction,", "Conjonction"), + ':Ĉ': (" conjonction (él.),", "Conjonction (élément)"), + ':Cc': (" conjonction de coordination,", "Conjonction de coordination"), + ':Cs': (" conjonction de subordination,", "Conjonction de subordination"), + ':Ĉs': (" conjonction de subordination (él.),", "Conjonction de subordination (élément)"), + + ':Ñ': (" locution nominale (él.),", "Locution nominale (élément)"), + ':Â': (" locution adjectivale (él.),", "Locution adjectivale (élément)"), + ':Ṽ': (" locution verbale (él.),", "Locution verbale (élément)"), + ':Ŵ': (" locution adverbiale (él.),", "Locution adverbiale (élément)"), + ':Ŕ': (" locution prépositive (él.),", "Locution prépositive (élément)"), + ':Ĵ': (" locution interjective (él.),", "Locution interjective (élément)"), + + ':Zp': (" préfixe,", "Préfixe"), + ':Zs': (" suffixe,", "Suffixe"), + + ';S': (" : symbole (unité de mesure)", "Symbole (unité de mesure)"), + + '/*': ("", "sous-dictionnaire "), + '/C': (" ", "sous-dictionnaire "), + '/M': ("", "sous-dictionnaire "), + '/R': (" ", "sous-dictionnaire "), + '/A': ("", "sous-dictionnaire "), + '/X': ("", "sous-dictionnaire ") } _dPFX = { 'd': "(de), déterminant épicène invariable", 'l': "(le/la), déterminant masculin/féminin singulier", @@ -204,11 +203,11 @@ def formatTags (self, sTags): sRes = "" sTags = re.sub("(?<=V[1-3])[itpqnmr_eaxz]+", "", sTags) sTags = re.sub("(?<=V0[ea])[itpqnmr_eaxz]+", "", sTags) for m in self._zTag.finditer(sTags): - sRes += _dTAGS.get(m.group(0), " [{}]".format(m.group(0))) + sRes += _dTAGS.get(m.group(0), " [{}]".format(m.group(0)))[0] if sRes.startswith(" verbe") and not sRes.endswith("infinitif"): sRes += " [{}]".format(sTags[1:sTags.find(" ")]) return sRes.rstrip(",") def _formatSuffix (self, s): Index: gc_lang/fr/oxt/AppLauncher.py ================================================================== --- gc_lang/fr/oxt/AppLauncher.py +++ gc_lang/fr/oxt/AppLauncher.py @@ -40,10 +40,18 @@ xDialog.run() elif sCmd == "TF": import TextFormatter xDialog = TextFormatter.TextFormatter(self.ctx) xDialog.run(self.sLang) + elif sCmd == "DI": + import DictOptions + xDialog = DictOptions.DictOptions(self.ctx) + xDialog.run(self.sLang) + elif sCmd == "LE": + import LexiconEditor + xDialog = LexiconEditor.LexiconEditor(self.ctx) + xDialog.run(self.sLang) elif sCmd == "DS": import DictionarySwitcher xDialog = DictionarySwitcher.FrenchDictionarySwitcher(self.ctx) xDialog.run(self.sLang) elif sCmd == "MA": ADDED gc_lang/fr/oxt/DictOptions/DictOptions.py Index: gc_lang/fr/oxt/DictOptions/DictOptions.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/DictOptions.py @@ -0,0 +1,141 @@ +# Dictionary Options +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback +import time + +import helpers +import do_strings + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.beans import PropertyValue + + +class DictOptions (unohelper.Base, XActionListener, XJobExecutor): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xContainer = None + self.xDialog = None + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def run (self, sLang): + dUI = do_strings.getUI(sLang) + + self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 200 + self.xDialog.Height = 210 + self.xDialog.Title = dUI.get('title', "#title#") + xWindowSize = helpers.getWindowSize() + self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX = 10 + nY1 = 10 + nY2 = nY1 + 50 + nY3 = nY2 + 70 + + nWidth = self.xDialog.Width - 20 + nHeight = 10 + + # Spell checker section + self._addWidget("spelling_section", 'FixedLine', nX, nY1, nWidth, nHeight, Label = dUI.get("spelling_section", "#err"), FontDescriptor = xFDTitle) + self.xGraphspell = self._addWidget('activate_main', 'CheckBox', nX, nY1+15, nWidth, nHeight, Label = dUI.get('activate_main', "#err")) + self._addWidget('activate_main_descr', 'FixedText', nX, nY1+25, nWidth, nHeight*2, Label = dUI.get('activate_main_descr', "#err"), MultiLine = True) + + # Spell suggestion engine section + self._addWidget("suggestion_section", 'FixedLine', nX, nY2, nWidth, nHeight, Label = dUI.get("suggestion_section", "#err"), FontDescriptor = xFDTitle) + self.xGraphspellSugg = self._addWidget('activate_spell_sugg', 'CheckBox', nX, nY2+15, nWidth, nHeight, Label = dUI.get('activate_spell_sugg', "#err")) + self._addWidget('activate_spell_sugg_descr', 'FixedText', nX, nY2+25, nWidth, nHeight*4, Label = dUI.get('activate_spell_sugg_descr', "#err"), MultiLine = True) + + # Personal dictionary section + self._addWidget("personal_section", 'FixedLine', nX, nY3, nWidth, nHeight, Label = dUI.get("personal_section", "#err"), FontDescriptor = xFDTitle) + self.xPersonalDic = self._addWidget('activate_personal', 'CheckBox', nX, nY3+15, nWidth, nHeight, Label = dUI.get('activate_personal', "#err")) + self._addWidget('activate_personnal_descr', 'FixedText', nX, nY3+25, nWidth, nHeight*3, Label = dUI.get('activate_personal_descr', "#err"), MultiLine = True) + + # Button + self._addWidget('apply_button', 'Button', self.xDialog.Width-115, self.xDialog.Height-25, 50, 14, Label = dUI.get('apply_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500) + self._addWidget('cancel_button', 'Button', self.xDialog.Width-60, self.xDialog.Height-25, 50, 14, Label = dUI.get('cancel_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000) + + self._loadOptions() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xContainer.getControl('apply_button').addActionListener(self) + self.xContainer.getControl('apply_button').setActionCommand('Apply') + self.xContainer.getControl('cancel_button').addActionListener(self) + self.xContainer.getControl('cancel_button').setActionCommand('Cancel') + self.xContainer.setVisible(False) + toolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(toolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == 'Apply': + xChild = self.xSettingNode.getByName("o_fr") + xChild.setPropertyValue("use_graphspell", self.xGraphspell.State) + xChild.setPropertyValue("use_graphspell_sugg", self.xGraphspellSugg.State) + #xChild.setPropertyValue("extended_dic", self.xExtendedDic.State) + xChild.setPropertyValue("use_personal_dic", self.xPersonalDic.State) + self.xSettingNode.commitChanges() + else: + pass + self.xContainer.endExecute() + except: + traceback.print_exc() + + # XJobExecutor + def trigger (self, args): + try: + dialog = DictOptions(self.ctx) + dialog.run() + except: + traceback.print_exc() + + def _loadOptions (self): + try: + xChild = self.xSettingNode.getByName("o_fr") + self.xGraphspell.State = xChild.getPropertyValue("use_graphspell") + self.xGraphspellSugg.State = xChild.getPropertyValue("use_graphspell_sugg") + #self.xExtendedDic.State = xChild.getPropertyValue("extended_dic") + self.xPersonalDic.State = xChild.getPropertyValue("use_personal_dic") + except: + traceback.print_exc() + + +#g_ImplementationHelper = unohelper.ImplementationHelper() +#g_ImplementationHelper.addImplementation(DictOptions, 'net.grammalecte.graphspell.DictOptions', ('com.sun.star.task.Job',)) ADDED gc_lang/fr/oxt/DictOptions/LexiconEditor.py Index: gc_lang/fr/oxt/DictOptions/LexiconEditor.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/LexiconEditor.py @@ -0,0 +1,621 @@ +# Lexicon Editor +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import json +import re +import os +import traceback + +import helpers +import lxe_strings +import grammalecte.graphspell as sc +import grammalecte.graphspell.dawg as dawg +import grammalecte.graphspell.ibdawg as ibdawg +import grammalecte.fr.conj as conj +import grammalecte.fr.conj_generator as conjgen + +import SearchWords +import TagsInfo + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.awt import XKeyListener + +from com.sun.star.awt.MessageBoxButtons import BUTTONS_OK +# BUTTONS_OK, BUTTONS_OK_CANCEL, BUTTONS_YES_NO, BUTTONS_YES_NO_CANCEL, BUTTONS_RETRY_CANCEL, BUTTONS_ABORT_IGNORE_RETRY +# DEFAULT_BUTTON_OK, DEFAULT_BUTTON_CANCEL, DEFAULT_BUTTON_RETRY, DEFAULT_BUTTON_YES, DEFAULT_BUTTON_NO, DEFAULT_BUTTON_IGNORE +from com.sun.star.awt.MessageBoxType import INFOBOX, ERRORBOX # MESSAGEBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX + +def MessageBox (xDocument, sMsg, sTitle, nBoxType=INFOBOX, nBoxButtons=BUTTONS_OK): + xParentWin = xDocument.CurrentController.Frame.ContainerWindow + ctx = uno.getComponentContext() + xToolkit = ctx.ServiceManager.createInstanceWithContext("com.sun.star.awt.Toolkit", ctx) + xMsgBox = xToolkit.createMessageBox(xParentWin, nBoxType, nBoxButtons, sTitle, sMsg) + return xMsgBox.execute() + + +def _waitPointer (funcDecorated): + def wrapper (*args, **kwargs): + # self is the first parameter if the decorator is applied on a object + self = args[0] + # before + xPointer = self.xSvMgr.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx) + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT")) + xWindowPeer = self.xContainer.getPeer() + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + # processing + result = funcDecorated(*args, **kwargs) + # after + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW")) + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?) + # return + return result + return wrapper + + +class LexiconEditor (unohelper.Base, XActionListener, XKeyListener, XJobExecutor): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + self.oPersonalDicJSON = None + # data + self.sLemma = "" + self.lGeneratedFlex = [] + # options node + self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang): + # ui lang + self.sLang = sLang + self.dUI = lxe_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 570 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + xWindowSize = helpers.getWindowSize() + self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = 20 + + nY0 = 5 + nY1 = nY0 + 13 + nY2 = nY1 + 25 # nom commun + nY3 = nY2 + 95 # nom propre + nY4 = nY3 + 45 # verbe + nY5 = nY4 + 68 # adverbe + nY6 = nY5 + 13 # autre + + nXB = nX1 + 185 + nXC = nXB + 165 + + nHeight = 10 + + #### Dictionary section + self._addWidget("dictionary_section", 'FixedLine', nX1, nY0, 180, nHeight, Label = self.dUI.get("dictionary_section", "#err"), FontDescriptor = xFDTitle, TextColor = 0x000088) + self._addWidget("save_date_label", 'FixedText', nXB, nY0+2, 80, nHeight, Label = self.dUI.get("save_date_label", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self._addWidget("num_of_entries_label2", 'FixedText', nXC, nY0+2, 65, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xDateDic = self._addWidget("save_date", 'FixedText', nXB+85, nY0+2, 75, nHeight, Label = self.dUI.get("void", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xNumDic = self._addWidget("num_of_entries2", 'FixedText', nXC+70, nY0+2, 45, nHeight, Label = "0", FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xImport = self._addWidget('import_button', 'Button', self.xDialog.Width-90, nY0, 40, 12, Label = self.dUI.get('import_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000055) + self.xExport = self._addWidget('export_button', 'Button', self.xDialog.Width-50, nY0, 40, 12, Label = self.dUI.get('export_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000055) + + #### Add word + self._addWidget("add_section", 'FixedLine', nX1, nY1, 180, nHeight, Label = self.dUI.get("add_section", "#err"), FontDescriptor = xFDTitle) + self.xLemma = self._addWidget('lemma', 'Edit', nX1, nY1+10, 110, 14, FontDescriptor = xFDTitle) + self._addWidget('search_button', 'Button', nX1+115, nY1+11, 45, 12, Label = self.dUI.get('search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x555500) + self._addWidget('information_button', 'Button', nX1+165, nY1+11, 15, 12, Label = self.dUI.get('information_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x555500) + + # Radio buttons: main POS tag + # Note: the only way to group RadioButtons is to create them successively + self.xNA = self._addWidget('nom_adj', 'RadioButton', nX1, nY2+12, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A") + self.xN = self._addWidget('nom', 'RadioButton', nX1, nY2+22, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N") + self.xA = self._addWidget('adj', 'RadioButton', nX1, nY2+32, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A") + self.xM1 = self._addWidget('M1', 'RadioButton', nX1, nY3+12, 60, nHeight, Label = self.dUI.get("M1", "#err"), HelpText = ":M1") + self.xM2 = self._addWidget('M2', 'RadioButton', nX1, nY3+22, 60, nHeight, Label = self.dUI.get("M2", "#err"), HelpText = ":M2") + self.xMP = self._addWidget('MP', 'RadioButton', nX1, nY3+32, 60, nHeight, Label = self.dUI.get("MP", "#err"), HelpText = ":MP") + self.xV = self._addWidget('verb', 'RadioButton', nX1, nY4+2, 35, nHeight, Label = self.dUI.get("verb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":V") + self.xW = self._addWidget('adv', 'RadioButton', nX1, nY5+2, 35, nHeight, Label = self.dUI.get("adverb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":W") + self.xX = self._addWidget('other', 'RadioButton', nX1, nY6+2, 35, nHeight, Label = self.dUI.get("other", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":X") + + # Nom, adjectif + self._addWidget("fl_nom_adj", 'FixedLine', nX1, nY2, 180, nHeight, Label = self.dUI.get("common_name", "#err"), FontDescriptor = xFDSubTitle) + self.xSepi = self._addWidget('Sepi', 'RadioButton', nX1+65, nY2+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xSmas = self._addWidget('Smas', 'RadioButton', nX1+65, nY2+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xSfem = self._addWidget('Sfem', 'RadioButton', nX1+65, nY2+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + self._addWidget("fl_sep1", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSs = self._addWidget('Ss', 'RadioButton', nX1+120, nY2+12, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s") + self.xSx = self._addWidget('Sx', 'RadioButton', nX1+120, nY2+22, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x") + self.xSinv = self._addWidget('Sinv', 'RadioButton', nX1+120, nY2+32, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i") + + self._addWidget("alt_lemma_label", 'FixedLine', nX1+10, nY2+42, 170, nHeight, Label = self.dUI.get("alt_lemma", "#err")) + self.xAltLemma = self._addWidget('alt_lemma', 'Edit', nX1+10, nY2+52, 110, nHeight) + self.xNA2 = self._addWidget('nom_adj2', 'RadioButton', nX1+10, nY2+65, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A") + self.xN2 = self._addWidget('nom2', 'RadioButton', nX1+10, nY2+75, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N") + self.xA2 = self._addWidget('adj2', 'RadioButton', nX1+10, nY2+85, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A") + self._addWidget("fl_sep2", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSepi2 = self._addWidget('Sepi2', 'RadioButton', nX1+75, nY2+65, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xSmas2 = self._addWidget('Smas2', 'RadioButton', nX1+75, nY2+75, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xSfem2 = self._addWidget('Sfem2', 'RadioButton', nX1+75, nY2+85, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + self._addWidget("fl_sep3", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSs2 = self._addWidget('Ss2', 'RadioButton', nX1+130, nY2+65, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s") + self.xSx2 = self._addWidget('Sx2', 'RadioButton', nX1+130, nY2+75, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x") + self.xSinv2 = self._addWidget('Sinv2', 'RadioButton', nX1+130, nY2+85, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i") + + # Nom propre + self._addWidget("fl_M", 'FixedLine', nX1, nY3, 180, nHeight, Label = self.dUI.get("proper_name", "#err"), FontDescriptor = xFDSubTitle) + self.xMepi = self._addWidget('Mepi', 'RadioButton', nX1+65, nY3+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xMmas = self._addWidget('Mmas', 'RadioButton', nX1+65, nY3+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xMfem = self._addWidget('Mfem', 'RadioButton', nX1+65, nY3+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + + # Verbe + self._addWidget("fl_verb", 'FixedLine', nX2+30, nY4, 140, nHeight, FontDescriptor = xFDSubTitle) + self.xV_i = self._addWidget('v_i', 'CheckBox', nX2, nY4+12, 60, nHeight, Label = self.dUI.get("v_i", "#err")) + self.xV_t = self._addWidget('v_t', 'CheckBox', nX2, nY4+20, 60, nHeight, Label = self.dUI.get("v_t", "#err")) + self.xV_n = self._addWidget('v_n', 'CheckBox', nX2, nY4+28, 60, nHeight, Label = self.dUI.get("v_n", "#err")) + self.xV_p = self._addWidget('v_p', 'CheckBox', nX2, nY4+36, 60, nHeight, Label = self.dUI.get("v_p", "#err")) + self.xV_m = self._addWidget('v_m', 'CheckBox', nX2, nY4+44, 60, nHeight, Label = self.dUI.get("v_m", "#err")) + + self._addWidget('aux', 'FixedText', nX2+75, nY4+10, 90, nHeight, Label = self.dUI.get("aux", "#err")) + self.xV_ae = self._addWidget('v_ae', 'CheckBox', nX2+75, nY4+20, 90, nHeight, Label = self.dUI.get("v_ae", "#err")) + self.xV_aa = self._addWidget('v_aa', 'CheckBox', nX2+75, nY4+28, 90, nHeight, Label = self.dUI.get("v_aa", "#err")) + + self.xV_pp = self._addWidget('v_pp', 'CheckBox', nX2+75, nY4+44, 90, nHeight, Label = self.dUI.get("v_pp", "#err")) + + self._addWidget('v_pattern_label', 'FixedText', nX2+10, nY4+56, 70, nHeight, Label = self.dUI.get('v_pattern', "#err"), Align = 2) + self.xVpattern = self._addWidget('v_pattern', 'Edit', nX2+85, nY4+56, 80, nHeight) + + # Adverbe + self._addWidget("fl_adv", 'FixedLine', nX2+30, nY5, 140, nHeight, FontDescriptor = xFDSubTitle) + + # Autre + self._addWidget("fl_other", 'FixedLine', nX2+30, nY6, 140, nHeight, FontDescriptor = xFDSubTitle) + self._addWidget('flexion_label', 'FixedText', nX2, nY6+11, 35, nHeight, Label = self.dUI.get('flexion', "#err")) + self.xFlexion = self._addWidget('flexion', 'Edit', nX2+40, nY6+10, 100, nHeight) + self._addWidget('tags_label', 'FixedText', nX2, nY6+23, 35, nHeight, Label = self.dUI.get('tags', "#err")) + self.xTags = self._addWidget('tags', 'Edit', nX2+40, nY6+22, 100, nHeight) + + #### Generated words + self._addWidget("gwords_section", 'FixedLine', nXB, nY1, 160, nHeight, Label = self.dUI.get("new_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModelNew = self._addGrid("list_grid_gwords", nXB, nY1+10, 160, 255, [ + {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 80}, + {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 80} + ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI")) + self.xAdd = self._addWidget('add_button', 'Button', nXB, nY1+270, 75, 12, Label = self.dUI.get('add_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500, Enabled = False) + self.xDelete = self._addWidget('delete_button', 'Button', nXB+80, nY1+270, 80, 12, Label = self.dUI.get('delete_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + #### Lexicon section + self._addWidget("lexicon_section", 'FixedLine', nXC, nY1, 200, nHeight, Label = self.dUI.get("lexicon_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModelLex = self._addGrid("list_grid_lexicon", nXC, nY1+10, 200, 255, [ + {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 65}, + {"Title": self.dUI.get("lex_lemma", "#err"), "ColumnWidth": 50}, + {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 65} + ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI")) + self._addWidget("num_of_entries_label1", 'FixedText', nXC, nY1+272, 60, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"), FontDescriptor = xFDSubTitle) + self.xNumLex = self._addWidget("num_of_entries1", 'FixedText', nXC+65, nY1+272, 40, nHeight, Label = "0", FontDescriptor = xFDSubTitle) + self.xSave = self._addWidget('save_button', 'Button', nXC+110, nY1+270, 45, 12, Label = self.dUI.get('save_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + self._addWidget('close_button', 'Button', nXC+160, nY1+270, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + self.loadLexicon() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlNew = self.xContainer.getControl('list_grid_gwords') + self.xGridControlLex = self.xContainer.getControl('list_grid_lexicon') + #helpers.xray(self.xContainer.getControl('lemma')) + self._createKeyListeners(['lemma', 'alt_lemma', "v_pattern", 'flexion', 'tags'], "Update") + self._createActionListeners(['nom_adj', 'nom', 'adj', 'M1', 'M2', 'MP', 'verb', 'adv', 'other', \ + 'Sepi', 'Smas', 'Sfem', 'Ss', 'Sx', 'Sinv', 'nom_adj2', 'nom2', 'adj2', \ + 'Sepi2', 'Smas2', 'Sfem2', 'Ss2', 'Sx2', 'Sinv2', 'Mepi', 'Mmas', 'Mfem', \ + 'v_i', 'v_t', 'v_n', 'v_p', 'v_m', 'v_ae', 'v_aa', 'v_pp'], "Update") + self.xContainer.getControl('search_button').addActionListener(self) + self.xContainer.getControl('search_button').setActionCommand('SearchWords') + self.xContainer.getControl('information_button').addActionListener(self) + self.xContainer.getControl('information_button').setActionCommand('TagsInfo') + self.xContainer.getControl('add_button').addActionListener(self) + self.xContainer.getControl('add_button').setActionCommand('Add') + self.xContainer.getControl('delete_button').addActionListener(self) + self.xContainer.getControl('delete_button').setActionCommand('Delete') + self.xContainer.getControl('save_button').addActionListener(self) + self.xContainer.getControl('save_button').setActionCommand('Save') + self.xContainer.getControl('import_button').addActionListener(self) + self.xContainer.getControl('import_button').setActionCommand('Import') + self.xContainer.getControl('export_button').addActionListener(self) + self.xContainer.getControl('export_button').setActionCommand('Export') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + def _createKeyListeners (self, lNames, sAction): + for sName in lNames: + self.xContainer.getControl(sName).addKeyListener(self) + + def _createActionListeners (self, lNames, sAction): + for sName in lNames: + self.xContainer.getControl(sName).addActionListener(self) + self.xContainer.getControl(sName).setActionCommand(sAction) + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "Update": + self.updateGenWords() + elif xActionEvent.ActionCommand == "SearchWords": + self.launchSearchWords() + elif xActionEvent.ActionCommand == "TagsInfo": + self.launchTagsInfo() + elif xActionEvent.ActionCommand == "Add": + self.addToLexicon() + elif xActionEvent.ActionCommand == "Delete": + self.deleteSelectedEntries() + elif xActionEvent.ActionCommand == "Save": + self.saveLexicon() + elif xActionEvent.ActionCommand == "Import": + self.importDictionary() + elif xActionEvent.ActionCommand == "Export": + self.exportDictionary() + elif xActionEvent.ActionCommand == 'Info': + pass + elif xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + # XKeyListener + def keyPressed (self, xKeyEvent): + pass + + def keyReleased (self, xKeyEvent): + self.updateGenWords() + + # XJobExecutor + def trigger (self, args): + try: + xDialog = LexiconEditor(self.ctx) + xDialog.run() + except: + traceback.print_exc() + + # Code + def launchSearchWords (self): + xDialog = SearchWords.SearchWords(self.ctx) + xDialog.run(self.sLang, self.oPersonalDicJSON) + + def launchTagsInfo (self): + xDialog = TagsInfo.TagsInfo(self.ctx) + xDialog.run(self.sLang) + + #@_waitPointer (don’t: strange behavior when dialog is not finished) + def loadLexicon (self): + xGridDataModel = self.xGridModelLex.GridDataModel + xGridDataModel.removeAllRows() + xChild = self.xSettingNode.getByName("o_fr") + sJSON = xChild.getPropertyValue("personal_dic") + if sJSON: + try: + self.oPersonalDicJSON = json.loads(sJSON) + oIBDAWG = ibdawg.IBDAWG(self.oPersonalDicJSON) + for i, aEntry in enumerate(oIBDAWG.select()): + xGridDataModel.addRow(i, aEntry) + self.xNumLex.Label = str(i) + self.xNumDic.Label = str(i) + self.xDateDic.Label = oIBDAWG.sDate + except: + sMessage = self.dUI.get('not_loaded', "#err") + sMessage += traceback.format_exc() + MessageBox(self.xDocument, sMessage, self.dUI.get('load_title', "#err"), ERRORBOX) + else: + self.xNumLex.Label = 0 + self.xNumDic.Label = 0 + self.xDateDic.Label = self.dUI.get("void", "#err") + + @_waitPointer + def importDictionary (self): + spfImported = os.path.join(os.environ['USERPROFILE'], "fr.personal.json") + if os.path.isfile(spfImported): + with open(spfImported, "r", encoding="utf-8") as hDst: + sJSON = hDst.read() + try: + sTest = json.loads(sJSON) + except: + sMessage = self.dUI.get('wrong_json', "#err_msg: %s") % spfImported + MessageBox(self.xDocument, sMessage, self.dUI.get('import_title', "#err"), ERRORBOX) + else: + xChild = self.xSettingNode.getByName("o_fr") + xChild.setPropertyValue("personal_dic", sJSON) + self.loadLexicon() + else: + sMessage = self.dUI.get('file_not_found', "#err_msg: %s") % spfImported + MessageBox(self.xDocument, sMessage, self.dUI.get('import_title', "#err"), ERRORBOX) + + @_waitPointer + def saveLexicon (self): + xGridDataModel = self.xGridModelLex.GridDataModel + lEntry = [] + for i in range(xGridDataModel.RowCount): + lEntry.append(xGridDataModel.getRowData(i)) + xChild = self.xSettingNode.getByName("o_fr") + if lEntry: + oDAWG = dawg.DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel") + self.oPersonalDicJSON = oDAWG.getBinaryAsJSON() + xChild.setPropertyValue("personal_dic", json.dumps(self.oPersonalDicJSON, ensure_ascii=False)) + self.xSettingNode.commitChanges() + self.xNumDic.Label = str(self.oPersonalDicJSON["nEntry"]) + self.xDateDic.Label = self.oPersonalDicJSON["sDate"] + else: + xChild.setPropertyValue("personal_dic", "") + self.xSettingNode.commitChanges() + self.xNumDic.Label = "0" + self.xDateDic.Label = self.dUI.get("void", "#err") + + def exportDictionary (self): + try: + spfExported = os.path.join(os.environ['USERPROFILE'], "fr.personal.json") + xChild = self.xSettingNode.getByName("o_fr") + sJSON = xChild.getPropertyValue("personal_dic") + if sJSON: + with open(spfExported, "w", encoding="utf-8") as hDst: + hDst.write(sJSON) + sMessage = self.dUI.get('export_message', "#err_msg: %s") % spfExported + else: + sMessage = self.dUI.get('empty_dictionary', "#err") + MessageBox(self.xDocument, sMessage, self.dUI.get('export_title', "#err")) + except: + sMessage = traceback.format_exc() + MessageBox(self.xDocument, sMessage, self.dUI.get('export_title', "#err"), ERRORBOX) + + # FilePicker doesn’t work at all… + #xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.SystemFilePicker', self.ctx) + #xFilePicker.appendFilter("Supported files", "*.json; *.bdic") + #xFilePicker.setDisplayDirectory("") + #xFilePicker.setMultiSelectionMode(True) + #nResult = xFilePicker.execute() + #if nResult == 1: + #pass + #lFile = xFilePicker.getSelectedFiles() + #lFile = xFilePicker.getFiles() + + def _getRadioValue (self, *args): + for x in args: + if x.State: + return x.HelpText + return None + + @_waitPointer + def updateGenWords (self): + self.lGeneratedFlex = [] + self.sLemma = self.xLemma.Text.strip() + if self.sLemma: + if self._getRadioValue(self.xNA, self.xN, self.xA): + # Substantif + sPOS = self._getRadioValue(self.xNA, self.xN, self.xA) + sGenderTag = self._getRadioValue(self.xSepi, self.xSmas, self.xSfem) + if sGenderTag: + if self.xSs.State: + self.lGeneratedFlex.append((self.sLemma, sPOS+sGenderTag+":s/*")) + self.lGeneratedFlex.append((self.sLemma+"s", sPOS+sGenderTag+":p/*")) + elif self.xSx.State: + self.lGeneratedFlex.append((self.sLemma, sPOS+sGenderTag+":s/*")) + self.lGeneratedFlex.append((self.sLemma+"x", sPOS+sGenderTag+":p/*")) + elif self.xSinv.State: + self.lGeneratedFlex.append((self.sLemma, sPOS+sGenderTag+":i/*")) + sLemma2 = self.xAltLemma.Text.strip() + if sLemma2 and self._getRadioValue(self.xNA2, self.xN2, self.xA2) and self._getRadioValue(self.xSepi2, self.xSmas2, self.xSfem2): + sTag2 = self._getRadioValue(self.xNA2, self.xN2, self.xA2) + self._getRadioValue(self.xSepi2, self.xSmas2, self.xSfem2) + if self.xSs2.State: + self.lGeneratedFlex.append((sLemma2, sTag2+":s/*")) + self.lGeneratedFlex.append((sLemma2+"s", sTag2+":p/*")) + elif self.xSx2.State: + self.lGeneratedFlex.append((sLemma2, sTag2+":s/*")) + self.lGeneratedFlex.append((sLemma2+"x", sTag2+":p/*")) + elif self.xSinv2.State: + self.lGeneratedFlex.append((sLemma2, sTag2+":i/*")) + elif self._getRadioValue(self.xM1, self.xM2, self.xMP): + # Nom propre + sPOS = self._getRadioValue(self.xM1, self.xM2, self.xMP) + self.sLemma = self.sLemma[0:1].upper() + self.sLemma[1:]; + sGenderTag = self._getRadioValue(self.xMepi, self.xMmas, self.xMfem) + if sGenderTag: + self.lGeneratedFlex.append((self.sLemma, sPOS+sGenderTag+":i/*")) + elif self.xV.State: + # Verbe + if self.sLemma.endswith(("er", "ir", "re")): + self.sLemma = self.sLemma.lower() + c_i = "i" if self.xV_i.State else "_" + c_t = "t" if self.xV_t.State else "_" + c_n = "n" if self.xV_n.State else "_" + c_p = "p" if self.xV_p.State else "_" + c_m = "m" if self.xV_m.State else "_" + c_ae = "e" if self.xV_ae.State else "_" + c_aa = "a" if self.xV_aa.State else "_" + sVerbTag = c_i + c_t + c_n + c_p + c_m + c_ae + c_aa + if "p" in sVerbTag and not sVerbTag.startswith("___p_"): + sVerbTag = sVerbTag.replace("p", "q") + if not sVerbTag.endswith("__") and not sVerbTag.startswith("____"): + sVerbPattern = self.xVpattern.Text.strip() + if not sVerbPattern: + # Utilisation du générateur de conjugaison + for sFlexion, sFlexTags in conjgen.conjugate(self.sLemma, sVerbTag, not bool(self.xV_pp.State)): + self.lGeneratedFlex.append((sFlexion, sFlexTags)) + else: + # copie du motif d’un autre verbe : utilisation du conjugueur + if conj.isVerb(sVerbPattern): + oVerb = conj.Verb(self.sLemma, sVerbPattern) + for sTag1, dFlex in oVerb.dConj.items(): + if sTag1 != ":Q": + for sTag2, sConj in dFlex.items(): + if sTag2.startswith(":") and sConj: + self.lGeneratedFlex.append((sConj, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2)) + else: + # participes passés + if dFlex[":Q3"]: + if dFlex[":Q2"]: + self.lGeneratedFlex.append((dFlex[":Q1"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:s/*")) + self.lGeneratedFlex.append((dFlex[":Q2"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:p/*")) + else: + self.lGeneratedFlex.append((dFlex[":Q1"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:i/*")) + self.lGeneratedFlex.append((dFlex[":Q3"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:s/*")) + self.lGeneratedFlex.append((dFlex[":Q4"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:p/*")) + else: + self.lGeneratedFlex.append((dFlex[":Q1"], ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:e:i/*")) + elif self.xW.State: + # Adverbe + self.sLemma = self.sLemma.lower(); + self.lGeneratedFlex.append((self.sLemma, ":W/*")) + elif self.xX.State: + # Autre + sFlexion = self.xFlexion.Text.strip() + sTags = self.xTags.Text.strip() + if sFlexion and sTags.startswith(":"): + self.lGeneratedFlex.append((sFlexion, sTags)) + self._showGenWords() + + def _showGenWords (self): + xGridDataModel = self.xGridModelNew.GridDataModel + xGridDataModel.removeAllRows() + if not self.lGeneratedFlex: + self.xAdd.Enabled = False + return + for i, (sFlexion, sTag) in enumerate(self.lGeneratedFlex): + xGridDataModel.addRow(i, (sFlexion, sTag)) + self.xAdd.Enabled = True + + def _resetWidgets (self): + self.xLemma.Text = "" + self.xNA.State = False + self.xN.State = False + self.xA.State = False + self.xM1.State = False + self.xM2.State = False + self.xMP.State = False + self.xV.State = False + self.xW.State = False + self.xX.State = False + self.xSepi.State = False + self.xSmas.State = False + self.xSfem.State = False + self.xSs.State = False + self.xSx.State = False + self.xSinv.State = False + self.xAltLemma.Text = "" + self.xNA2.State = False + self.xN2.State = False + self.xA2.State = False + self.xSepi2.State = False + self.xSmas2.State = False + self.xSfem2.State = False + self.xSs2.State = False + self.xSx2.State = False + self.xSinv2.State = False + self.xMepi.State = False + self.xMmas.State = False + self.xMfem.State = False + self.xV_i.State = False + self.xV_t.State = False + self.xV_n.State = False + self.xV_p.State = False + self.xV_m.State = False + self.xV_ae.State = False + self.xV_aa.State = False + self.xV_pp.State = False + self.xVpattern.Text = "" + self.xFlexion.Text = "" + self.xTags.Text = "" + self.xGridModelNew.GridDataModel.removeAllRows() + + @_waitPointer + def addToLexicon (self): + self.xAdd.Enabled = False + xGridDataModelNew = self.xGridModelNew.GridDataModel + xGridDataModelLex = self.xGridModelLex.GridDataModel + nStart = xGridDataModelLex.RowCount + for i in range(xGridDataModelNew.RowCount): + sFlexion, sTag = xGridDataModelNew.getRowData(i) + xGridDataModelLex.addRow(nStart + i, (sFlexion, self.sLemma, sTag)) + self.xSave.Enabled = True + self.xNumLex.Label = str(int(self.xNumLex.Label) + xGridDataModelNew.RowCount) + self._resetWidgets() + + @_waitPointer + def deleteSelectedEntries (self): + # generated entries + xGridDataModel = self.xGridModelNew.GridDataModel + #helpers.xray(xGridDataModel) + for i in self.xGridControlNew.getSelectedRows(): + if i < xGridDataModel.RowCount: + xGridDataModel.removeRow(i) + self.xGridControlNew.deselectAllRows() + # lexicon + xGridDataModel = self.xGridModelLex.GridDataModel + nSelectedEntries = len(self.xGridControlLex.getSelectedRows()) + for i in self.xGridControlLex.getSelectedRows(): + if i < xGridDataModel.RowCount: + xGridDataModel.removeRow(i) + self.xGridControlLex.deselectAllRows() + self.xNumLex.Label = str(xGridDataModel.RowCount) + + +#g_ImplementationHelper = unohelper.ImplementationHelper() +#g_ImplementationHelper.addImplementation(LexiconEditor, 'net.grammalecte.LexiconEditor', ('com.sun.star.task.Job',)) ADDED gc_lang/fr/oxt/DictOptions/SearchWords.py Index: gc_lang/fr/oxt/DictOptions/SearchWords.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/SearchWords.py @@ -0,0 +1,199 @@ +# Search +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback + +import helpers +import sw_strings +import grammalecte.graphspell as sc +import grammalecte.graphspell.ibdawg as ibdawg + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener + + +def _waitPointer (funcDecorated): + def wrapper (*args, **kwargs): + # self is the first parameter if the decorator is applied on a object + self = args[0] + # before + xPointer = self.xSvMgr.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx) + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT")) + xWindowPeer = self.xContainer.getPeer() + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + # processing + result = funcDecorated(*args, **kwargs) + # after + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW")) + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?) + # return + return result + return wrapper + + +class SearchWords (unohelper.Base, XActionListener): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + self.oSpellChecker = None + # options node + self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang, oPersonalDicJSON): + # ui lang + self.dUI = sw_strings.getUI(sLang) + self.oPersonalDicJSON = oPersonalDicJSON + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 350 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + #xWindowSize = helpers.getWindowSize() + #self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + #self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = nX1 + 130 + + nY0 = 5 + nY1 = nY0 + 20 + nY2 = nY1 + 60 + + nHeight = 10 + + #### Search + self._addWidget("search_section", 'FixedLine', nX1, nY0, 120, nHeight, Label = self.dUI.get("search_section", "#err"), FontDescriptor = xFDTitle) + self._addWidget("similar_search_section", 'FixedLine', nX1, nY1, 120, nHeight, Label = self.dUI.get("similar_search_section", "#err"), FontDescriptor = xFDSubTitle) + self.xWord = self._addWidget('word', 'Edit', nX1, nY1+10, 100, nHeight) + self._addWidget('similar_search_button', 'Button', nX1, nY1+22, 55, 12, Label = self.dUI.get('similar_search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + + + self._addWidget("regex_search_section", 'FixedLine', nX1, nY2, 120, nHeight, Label = self.dUI.get("regex_search_section", "#err"), FontDescriptor = xFDSubTitle) + self._addWidget('flexion_label', 'FixedText', nX1, nY2+10, 30, nHeight, Label = self.dUI.get('flexion', "#err")) + self.xFlexion = self._addWidget('flexion', 'Edit', nX1+35, nY2+10, 85, nHeight) + self._addWidget('tags_label', 'FixedText', nX1, nY2+22, 30, nHeight, Label = self.dUI.get('tags', "#err")) + self.xTags = self._addWidget('tags', 'Edit', nX1+35, nY2+22, 85, nHeight) + self._addWidget('regex_search_button', 'Button', nX1, nY2+34, 55, 12, Label = self.dUI.get('regex_search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + self._addWidget('result_warning', 'FixedText', nX1, nY2+50, 120, nHeight*7, Label = self.dUI.get('result_warning', '#err'), MultiLine = True) + + #### Results + self._addWidget("result_section", 'FixedLine', nX2, nY0, 200, nHeight, Label = self.dUI.get("result_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModel = self._addGrid("list_grid_search", nX2, nY0+10, 200, 265, [ + {"Title": self.dUI.get("res_flexion", "#err"), "ColumnWidth": 70}, + {"Title": self.dUI.get("res_lemma", "#err"), "ColumnWidth": 60}, + {"Title": self.dUI.get("res_tags", "#err"), "ColumnWidth": 70} + ]) + + self._addWidget('close_button', 'Button', self.xDialog.Width-50, self.xDialog.Height-20, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlSearch = self.xContainer.getControl('list_grid_search') + self.xGridControlInfo = self.xContainer.getControl('list_grid_info') + self.xContainer.getControl('similar_search_button').addActionListener(self) + self.xContainer.getControl('similar_search_button').setActionCommand('SearchSimilar') + self.xContainer.getControl('regex_search_button').addActionListener(self) + self.xContainer.getControl('regex_search_button').setActionCommand('SearchRegex') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "SearchSimilar": + self.searchSimilar() + elif xActionEvent.ActionCommand == "SearchRegex": + self.searchRegex() + elif xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + def initSpellChecker (self): + if not self.oSpellChecker: + self.oSpellChecker = sc.SpellChecker("fr", "fr.bdic", "", "", self.oPersonalDicJSON) + + @_waitPointer + def searchSimilar (self): + self.initSpellChecker() + sWord = self.xWord.Text.strip() + if sWord: + xGridDataModel = self.xGridModel.GridDataModel + xGridDataModel.removeAllRows() + lResult = self.oSpellChecker.getSimilarEntries(sWord, 20); + for i, aEntry in enumerate(lResult): + xGridDataModel.addRow(i, aEntry) + + @_waitPointer + def searchRegex (self): + self.initSpellChecker() + sFlexPattern = self.xFlexion.Text.strip() + sTagsPattern = self.xTags.Text.strip() + xGridDataModel = self.xGridModel.GridDataModel + xGridDataModel.removeAllRows() + for i, aEntry in enumerate(self.oSpellChecker.select(sFlexPattern, sTagsPattern)): + xGridDataModel.addRow(i, aEntry) + i += 1 + if i >= 2000: + break ADDED gc_lang/fr/oxt/DictOptions/TagsInfo.py Index: gc_lang/fr/oxt/DictOptions/TagsInfo.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/TagsInfo.py @@ -0,0 +1,146 @@ +# Lexicon editor: Information +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback + +import helpers +import ti_strings + +import grammalecte.fr.lexicographe as lxg + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener + + + +class TagsInfo (unohelper.Base, XActionListener): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang): + # ui lang + self.dUI = ti_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 360 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + #xWindowSize = helpers.getWindowSize() + #self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + #self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = 20 + nX3 = 120 + + nY0 = 5 + nY1 = nY0 + 13 + nY2 = nY1 + 60 + nY3 = nY2 + 60 + nY4 = nY3 + 80 + + nXB = nX1 + 110 + + nHeight = 10 + + #### Add word + self._addWidget("add_section", 'FixedLine', nX1, nY0, 100, nHeight, Label = self.dUI.get("information_section", "#err"), FontDescriptor = xFDTitle) + + self._addWidget('save_label', 'FixedText', nX1, nY1, 100, nHeight, Label = self.dUI.get('save', "#err"), FontDescriptor = xFDTitle) + self._addWidget('save_desc_label', 'FixedText', nX1, nY1+10, 100, nHeight*5, Label = self.dUI.get('save_desc', "#err"), MultiLine=True) + + self._addWidget('duplicates_label', 'FixedText', nX1, nY2, 100, nHeight, Label = self.dUI.get('duplicates', "#err"), FontDescriptor = xFDTitle) + self._addWidget('duplicates_desc_label', 'FixedText', nX1, nY2+10, 100, nHeight*5, Label = self.dUI.get('duplicates_desc', "#err"), MultiLine=True) + + self._addWidget('compilation_label', 'FixedText', nX1, nY3, 100, nHeight, Label = self.dUI.get('compilation', "#err"), FontDescriptor = xFDTitle) + self._addWidget('compilation_desc_label', 'FixedText', nX1, nY3+10, 100, nHeight*7, Label = self.dUI.get('compilation_desc', "#err"), MultiLine=True) + + self._addWidget('warning_label', 'FixedText', nX1, nY4, 100, nHeight, Label = self.dUI.get('warning', "#err"), FontDescriptor = xFDTitle) + self._addWidget('warning_desc_label', 'FixedText', nX1, nY4+10, 100, nHeight*7, Label = self.dUI.get('warning_desc', "#err"), MultiLine=True) + + #### Tags + self._addWidget("tags_section", 'FixedLine', nXB, nY0, 230, nHeight, Label = self.dUI.get("tags_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModel = self._addGrid("list_grid_tags", nXB, nY0+10, 230, 265, [ + {"Title": self.dUI.get("tags", "#err"), "ColumnWidth": 40}, + {"Title": self.dUI.get("meaning", "#err"), "ColumnWidth": 190} + ]) + + self._addWidget('close_button', 'Button', self.xDialog.Width-50, self.xDialog.Height-20, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + self.loadData() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlInfo = self.xContainer.getControl('list_grid_tags') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + def loadData (self): + xGridDataModel = self.xGridModel.GridDataModel + for i, sKey in enumerate(lxg._dTAGS): + xGridDataModel.addRow(i, [sKey, lxg._dTAGS[sKey][1]]) ADDED gc_lang/fr/oxt/DictOptions/do_strings.py Index: gc_lang/fr/oxt/DictOptions/do_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/do_strings.py @@ -0,0 +1,43 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Options des dictionnaires", + + "spelling_section": "Correcteur orthographique", + "activate_main": "Activer le correcteur orthographique de Grammalecte", + "activate_main_descr": "Supplante le correcteur orthographique inclus dans LibreOffice (Hunspell).", + + "suggestion_section": "Moteur de suggestion orthographique", + "activate_spell_sugg": "Activer le moteur de suggestion de Grammalecte", + "activate_spell_sugg_descr": "Désactivée, cette option remplace la suggestion orthographique de Grammalecte par celle fournie par LibreOffice (Hunspell). Les mots inclus dans le dictionnaire personnalisé ne seront plus inclus aux suggestions.", + + "personal_section": "Dictionnaire personnel", + "activate_personal": "Utiliser", + "activate_personal_descr": "Le dictionnaire personnel est une commodité pour ajouter le vocabulaire qui vous est utile. Il ne supplante pas le dictionnaire commun ; il ne fait qu’ajouter de nouveaux mots.", + + "apply_button": "Appliquer", + "cancel_button": "Annuler", + }, + "en": { + "title": "Grammalecte · Options for dictionaries", + + "spelling_section": "Spell checker", + "activate_main": "Activate the spell checker from Grammalecte", + "activate_main_descr": "Overrides the spell checker included in LibreOffice (Hunspell)", + + "suggestion_section": "Spell suggestion engine", + "activate_spell_sugg": "Activate the suggestion engine of Grammalecte", + "activate_spell_sugg_descr": "Disactivated, this option replace the spell suggestion engine of Grammalecte by the one of LibreOffice (Hunspell). Words included in the personal dictionary won’t be included among suggestions.", + + "personal_section": "Personal dictionary", + "activate_personal": "Use", + "activate_personal_descr": "The personal dictionary is a commodity to add the vocabulary you want. It doesn’t override the common dictionary ; it only adds new words.", + + "apply_button": "Apply", + "cancel_button": "Cancel", + }, +} ADDED gc_lang/fr/oxt/DictOptions/lxe_strings.py Index: gc_lang/fr/oxt/DictOptions/lxe_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/lxe_strings.py @@ -0,0 +1,95 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Éditeur lexical", + + # Ajout + "add_section": "Nouveau mot (lemme)", + "lemma": "Lemme", + "search_button": "Recherche", + "information_button": "", + + # catégories + "common_name": "Nom commun", + "nom_adj": "Nom et adjectif", + "nom": "Nom", + "adj": "Adjectif", + "alt_lemma": "[optionnel] Autre forme (masculine, féminine, variante, etc.)", + + "proper_name": "Nom propre", + "M1": "Prénom", + "M2": "Patronyme", + "MP": "Autre", + + "gender": "Genre", + "epi": "épicène", + "mas": "masculin", + "fem": "féminin", + "plural": "Pluriel", + "-s": "pluriel en ·s", + "-x": "pluriel en ·x", + "inv": "invariable", + + "verb": "Verbe", + "v_i": "intransitif", + "v_t": "transitif", + "v_n": "transitif indirect", + "v_p": "pronominal", + "v_m": "impersonnel", + "aux": "Auxiliaire au passé composé", + "v_ae": "être", + "v_aa": "avoir", + "v_pp": "Participe passé invariable", + "v_pattern": "Verbe modèle [optionnel]", + + "adverb": "Adverbe", + + "other": "Autre", + "flexion": "Flexion", + "tags": "Étiquettes", + + # Lexicon + "new_section": "Mots générés", + "lexicon_section": "Votre lexique", + "lex_#": "#", + "lex_flex": "Flexions", + "lex_lemma": "Lemmes", + "lex_tags": "Étiquettes", + + "add_button": "Ajouter au lexique", + "delete_button": "Supprimer la sélection", + "save_button": "Enregistrer", + + # Dictionary + "dictionary_section": "Dictionnaire personnel", + "save_date_label": "Date d’enregistrement :", + "num_of_entries_label": "Nombre d’entrées :", + "import_button": "Importer", + "import_title": "Importation du dictionnaire", + "export_button": "Exporter", + "export_title": "Exportation du dictionnaire", + "export_message": "Fichier exporté : ‹%s›", + "empty_dictionary": "Le dictionnaire est vide. Aucun fichier créé.", + "file_not_found": "Le fichier ‹%s› ne semble pas exister.", + "wrong_json": "Le fichier ‹%s› n’est pas un fichier JSON valide.", + "load_title": "Chargement du dictionnaire.", + "not_loaded": "Le fichier n’a pas pu être chargé.\n", + "void": "[néant]", + + # Close button + "close_button": "Fermer", + + ## + "verb_information": "" + }, + # Traduction délibérément limitée + "en": { + "title": "Grammalecte · Lexicon editor", + + "close_button": "Close", + }, +} ADDED gc_lang/fr/oxt/DictOptions/sw_strings.py Index: gc_lang/fr/oxt/DictOptions/sw_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/sw_strings.py @@ -0,0 +1,34 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Recherche et informations", + + "search_section": "Recherche", + + "similar_search_section": "Graphies similaires", + "similar_search_button": "Chercher", + + "regex_search_section": "Expression régulières", + "flexion": "Flexion", + "tags": "Étiquettes", + "regex_search_button": "Chercher", + "result_warning": "La recherche par expressions régulières peut générer un nombre gigantesque de résultats. Seules les 2000 premières occurrences trouvées seront affichées. La recherche peut être longue, parce tout le graphe de mots, qui contient 500 000 flexions, sera parcouru si besoin.", + + "result_section": "Résultats", + "res_flexion": "Flexions", + "res_lemma": "Lemmes", + "res_tags": "Étiquettes", + + "close_button": "Fermer", + }, + + "en": { + "title": "Grammalecte · Search and informations", + + "close_button": "Close", + }, +} ADDED gc_lang/fr/oxt/DictOptions/ti_strings.py Index: gc_lang/fr/oxt/DictOptions/ti_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/ti_strings.py @@ -0,0 +1,37 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Informations", + + "information_section": "Informations", + + "save": "Enregistrement", + "save_desc": "Les modifications apportées au lexique ne sont enregistrées dans le dictionnaire qu’au moment où vous cliquez sur ‹Enregistrer› dans l’onglet ‹Lexique›.", + + "duplicates": "Doublons", + "duplicates_desc": "Il est inutile de purger votre lexique des doublons éventuels. Les doublons sont automatiquement supprimés lors de la création du dictionnaire.", + + "compilation": "Compilation du dictionnaire", + "compilation_desc": "Le dictionnaire est compilé comme un graphe de mots sous la forme d’une chaîne binaire dans un fichier JSON. Cette opération peut prendre du temps et consommer beaucoup de mémoire si votre lexique contient plusieurs dizaines de milliers d’entrées.", + + "warning": "Avertissement", + "warning_desc": "Il est déconseillé d’utiliser la catégorie ‹Autre› pour générer autre chose que des noms, des adjectifs, des noms propres, des verbes et des adverbes. Il n’y a aucune garantie que les étiquettes pour les autres catégories, notamment les mots grammaticaux, ne changeront pas.", + + "tags_section": "Signification des étiquettes", + "tags": "Étiquettes", + "meaning": "Signification", + + + "close_button": "Fermer", + }, + + "en": { + "title": "Grammalecte · Informations", + + "close_button": "Close", + }, +} Index: gc_lang/fr/oxt/TextFormatter/TextFormatter.py ================================================================== --- gc_lang/fr/oxt/TextFormatter/TextFormatter.py +++ gc_lang/fr/oxt/TextFormatter/TextFormatter.py @@ -383,17 +383,12 @@ for key, lWidget in self.dCheckboxWidgets.items(): w = getattr(self, key) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State - # get extension path - xDefaultContext = self.ctx.ServiceManager.DefaultContext - xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider") - sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR") - sExtPath = sExtPath[8:] + "/pythonpath/tf_options.py" # remove "file:///" - sExtPath = os.path.abspath(sExtPath) # write file + sExtPath = helpers.getAbsolutePathOf("/pythonpath/tf_options.py") if os.path.isfile(sExtPath): hOpt = open(sExtPath, "w") hOpt.write("dDefaultOpt = " + str(tf_options.dDefaultOpt) + "\n") hOpt.write("dOpt = " + str(dOpt)) hOpt.close() Index: gc_lang/fr/oxt/addons.xcu ================================================================== --- gc_lang/fr/oxt/addons.xcu +++ gc_lang/fr/oxt/addons.xcu @@ -75,11 +75,11 @@ service:net.grammalecte.AppLauncher?EN ~Recenseur de mots… - ~Enumerator of words… + Enumerato~r of words… _self @@ -134,10 +134,48 @@ org.dicollecte.images:Grammalecte + + service:net.grammalecte.AppLauncher?DI + + + + ~Options des dictionnaires… + Dictionaries ~options… + + + _self + + + com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument + + + org.dicollecte.images:Frenchflag + + + + + service:net.grammalecte.AppLauncher?LE + + + + Éditeur ~lexical… + ~Lexicon editor… + + + _self + + + com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument + + + org.dicollecte.images:Frenchflag + + + service:net.grammalecte.AppLauncher?DS @@ -152,19 +190,19 @@ org.dicollecte.images:Frenchflag - + private:separator com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument - + service:net.grammalecte.AppLauncher?About DELETED gc_lang/fr/oxt/helpers.py Index: gc_lang/fr/oxt/helpers.py ================================================================== --- gc_lang/fr/oxt/helpers.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf8 -*- - -import uno -import traceback - -from com.sun.star.beans import PropertyValue - - -# XRay - API explorer -from com.sun.star.uno import RuntimeException as _rtex -def xray (myObject): - try: - sm = uno.getComponentContext().ServiceManager - mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext()) - scriptPro = mspf.createScriptProvider("") - xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application") - xScript.invoke((myObject,), (), ()) - return - except: - raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext()) - - -# MRI - API Explorer -def mri (ctx, xTarget): - try: - xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx) - xMri.inspect(xTarget) - except: - raise _rtex("\Python extension MRI is not installed", uno.getComponentContext()) - - -def getConfigSetting (sNodeConfig, bUpdate): - "get a configuration node" - # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False) - xSvMgr = uno.getComponentContext().ServiceManager - xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext()) - xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue") - xPropertyValue.Name = "nodepath" - xPropertyValue.Value = sNodeConfig - if bUpdate: - sService = "com.sun.star.configuration.ConfigurationUpdateAccess" - else: - sService = "com.sun.star.configuration.ConfigurationAccess" - return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode - - -def printServices (o): - for s in o.getAvailableServiceNames(): - print(' > '+s) - - -def getWindowSize (): - "return main window size" - xCurCtx = uno.getComponentContext() - xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx) - xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow - xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT")) - #print(xContainerWindow.Size.Width, ">", xWindowSize.Width) - #print(xContainerWindow.Size.Height, ">", xWindowSize.Height) - xWindowSize.Width = xWindowSize.Width * 0.666 - xWindowSize.Height = xWindowSize.Height * 0.666 - return xWindowSize ADDED gc_lang/fr/tb/content/file_handler.js Index: gc_lang/fr/tb/content/file_handler.js ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/file_handler.js @@ -0,0 +1,99 @@ +// JavaScript + +"use strict"; + +// Assuming that Cc, Ci and Cu are already loaded + +const {TextDecoder, TextEncoder, OS} = Components.utils.import("resource://gre/modules/osfile.jsm", {}); + + +const oFileHandler = { + // https://developer.mozilla.org/fr/docs/Mozilla/JavaScript_code_modules/OSFile.jsm/OS.File_for_the_main_thread + + xDataFolder: null, + + prepareDataFolder: function () { + let xDirectoryService = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties); + // this is a reference to the profile dir (ProfD) now. + let xExtFolder = xDirectoryService.get("ProfD", Ci.nsIFile); + xExtFolder.append("grammalecte-data"); + if (!xExtFolder.exists() || !xExtFolder.isDirectory()) { + // read and write permissions to owner and group, read-only for others. + xExtFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 774); + } + this.xDataFolder = xExtFolder; + }, + + createPathFileName: function (sFilename) { + let spfDest = this.xDataFolder.path; + spfDest += (/^[A-Z]:/.test(this.xDataFolder.path)) ? "\\" + sFilename : "/" + sFilename; + return spfDest; + }, + + loadFile: async function (sFilename) { + if (!this.xDataFolder) { + this.prepareDataFolder(); + } + try { + let xDecoder = new TextDecoder(); + let array = await OS.File.read(this.createPathFileName(sFilename)); + return xDecoder.decode(array); + } + catch (e) { + console.error(e); + return null; + } + }, + + loadAs: function (callback) { + let xFilePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + xFilePicker.init(window, "Charger fichier", Ci.nsIFilePicker.modeOpen); + xFilePicker.appendFilters(Ci.nsIFilePicker.filterAll | Ci.nsIFilePicker.filterText); + xFilePicker.open(async function (nReturnValue) { + if (nReturnValue == Ci.nsIFilePicker.returnOK || nReturnValue == Ci.nsIFilePicker.returnReplace) { + console.log(xFilePicker.file.path); + try { + let xDecoder = new TextDecoder(); + let array = await OS.File.read(xFilePicker.file.path); + callback(xDecoder.decode(array)); + } + catch (e) { + console.error(e); + callback(null); + } + } + }); + }, + + saveFile: function (sFilename, sData) { + if (!this.xDataFolder) { + this.prepareDataFolder(); + } + let xEncoder = new TextEncoder(); + let xEncodedRes = xEncoder.encode(sData); + console.log("save dictionary: " + this.createPathFileName(sFilename)); + OS.File.writeAtomic(this.createPathFileName(sFilename), xEncodedRes); + //OS.File.writeAtomic(this.createPathFileName(sFilename), xEncodedRes, {tmpPath: "file.txt.tmp"}); // error with a temporary file (can’t move it) + }, + + deleteFile: function (sFilename) { + if (!this.xDataFolder) { + this.prepareDataFolder(); + } + OS.File.remove(this.createPathFileName(sFilename), {ignoreAbsent: true}); + }, + + saveAs: function (sData) { + // save anywhere with file picker + let xFilePicker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + xFilePicker.init(window, "Enregistrer sous", Ci.nsIFilePicker.modeSave); + xFilePicker.appendFilters(Ci.nsIFilePicker.filterAll | Ci.nsIFilePicker.filterText); + xFilePicker.open(function (nReturnValue) { + if (nReturnValue == Ci.nsIFilePicker.returnOK || nReturnValue == Ci.nsIFilePicker.returnReplace) { + let xEncoder = new TextEncoder(); + let xEncodedRes = xEncoder.encode(sData); + OS.File.writeAtomic(xFilePicker.file.path, xEncodedRes, {tmpPath: "file.txt.tmp"}); + } + }); + } +} ADDED gc_lang/fr/tb/content/lex_editor.css Index: gc_lang/fr/tb/content/lex_editor.css ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/lex_editor.css @@ -0,0 +1,118 @@ +/* CSS */ + +button { + font-weight: bold; +} + +/* + Dictionary +*/ +.dictionary { + font-size: 18px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} +.dic_text { + font-size: 18px; + color: hsl(210, 50%, 50%); +} +.align_right { + text-align: right; +} + + +/* + Add new words +*/ +.section { + font-size: 16px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} + +.subsection { + font-size: 14px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} + +.option { + width: 120px; + font-size: 12px; +} + +.m_left { + margin-left: 20px; +} + +.m_left2 { + margin-left: 40px; +} + +.v_usage { + width: 150px; +} +.v_textbox { + width: 200px; +} + +.other_label { + width: 80px; +} +.other_textbox { + width: 250px; +} + +#generated_words_table { + width: 400px; + height: 600px; +} + +.delete_entry { + color: hsl(0, 100%, 50%); + font-weight: bold; +} + +/* + Lexicon tab +*/ + +#lexicon_table { + width: 600px; + height: 650px; +} + +.info_label { + width: 120px; +} +.data { + width: 90px; +} + +/* + Search tab +*/ + +#search_table { + width: 600px; + height: 650px; +} + +.bold { + font-weight: bold; +} +description { + width: 200px; +} + +/* + Informations tab +*/ + +#tags_table { + width: 600px; + height: 650px; + font-family: "Courier new", "Ubuntu Mono", Courier, Consolas, monospace; +} + + ADDED gc_lang/fr/tb/content/lex_editor.js Index: gc_lang/fr/tb/content/lex_editor.js ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/lex_editor.js @@ -0,0 +1,562 @@ +// JavaScript + +"use strict"; + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; +const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker."); + + +/* + Common functions +*/ + +function showError (e) { + Cu.reportError(e); + console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); +} + +function createNode (sType, oAttr) { + try { + let xNode = document.createElement(sType); + for (let sParam in oAttr) { + xNode.setAttribute(sParam, oAttr[sParam]); + } + return xNode; + } + catch (e) { + showError(e); + } +} + +function enableElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).disabled = false; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + +function disableElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).disabled = true; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + + + +class Table { + + constructor (sNodeId, lColumn, lColumnWidth, sProgressBarId, sResultId="") { + this.sNodeId = sNodeId; + this.xTable = document.getElementById(sNodeId); + this.nColumn = lColumn.length; + this.lColumn = lColumn; + this.lColumnWidth = lColumnWidth; + this.xProgressBar = document.getElementById(sProgressBarId); + this.xNumEntry = document.getElementById(sResultId); + this.iEntryIndex = 0; + this.lEntry = []; + this.nEntry = 0 + this._createHeader(); + } + + _createHeader () { + let xListheadNode = createNode("listhead"); + for (let sColumn of this.lColumn) { + xListheadNode.appendChild(createNode("listheader", { label: sColumn })); + } + this.xTable.appendChild(xListheadNode); + let xListcolsNode = createNode("listcols"); + for (let cColumn of this.lColumnWidth) { + xListcolsNode.appendChild(createNode("listcol", { flex: cColumn })); + } + this.xTable.appendChild(xListcolsNode); + } + + clear () { + while (this.xTable.firstChild) { + this.xTable.removeChild(this.xTable.firstChild); + } + this.iEntryIndex = 0; + this._createHeader(); + } + + fill (lFlex) { + this.clear(); + if (lFlex.length > 0) { + this.xProgressBar.max = lFlex.length; + this.xProgressBar.value = 1; + for (let lData of lFlex) { + this._addRow(lData); + this.xProgressBar.value += 1; + } + this.xProgressBar.value = this.xProgressBar.max; + window.setTimeout(() => { this.xProgressBar.value = 0; }, 3000); + } + this.lEntry = lFlex; + this.nEntry = lFlex.length; + this.showEntryNumber(); + } + + addEntries (lFlex) { + this.lEntry.push(...lFlex); + for (let lData of lFlex) { + this._addRow(lData); + } + this.nEntry += lFlex.length; + this.showEntryNumber(); + } + + showEntryNumber () { + if (this.xNumEntry) { + this.xNumEntry.value = this.nEntry; + } + } + + _addRow (lData) { + let xRowNode = createNode("listitem", { id: this.sNodeId + "_item_" + this.iEntryIndex, value: this.iEntryIndex }); + for (let data of lData) { + xRowNode.appendChild(createNode("listcell", { label: data })); + } + this.xTable.appendChild(xRowNode); + this.iEntryIndex += 1; + } + + deleteSelection () { + for (let xItem of this.xTable.selectedItems) { + this.lEntry[parseInt(xItem.value)] = null; + xItem.style.display = "none"; + this.nEntry -= 1; + } + this.showEntryNumber(); + } + + getEntries () { + return this.lEntry.filter((e) => e !== null); + } +} + + +const oGenerator = { + + sLemma: "", + + cMainTag: "", + + lFlexion: [], + + listen: function () { + document.getElementById("lemma").addEventListener("keyup", () => { this.update(); }, false); + // nom commun + document.getElementById("tag_N").addEventListener("click", () => { this.update("N"); }, false); + document.getElementById("nom_adj").addEventListener("click", () => { this.update(); }, false); + document.getElementById("nom").addEventListener("click", () => { this.update(); }, false); + document.getElementById("adj").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_epi").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_mas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_fem").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_s").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_x").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_inv").addEventListener("click", () => { this.update(); }, false); + document.getElementById("lemma2").addEventListener("keyup", () => { this.update(); }, false); + // nom propre + document.getElementById("tag_M").addEventListener("click", () => { this.update("M"); }, false); + document.getElementById("M1").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M2").addEventListener("click", () => { this.update(); }, false); + document.getElementById("MP").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_epi").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_mas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_fem").addEventListener("click", () => { this.update(); }, false); + // verbe + document.getElementById("tag_V").addEventListener("click", () => { this.update("V"); }, false); + document.getElementById("v_i").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_t").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_n").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_p").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_m").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_ae").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_aa").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_ppas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("verbe_modele").addEventListener("keyup", () => { this.update(); }, false); + // adverbe + document.getElementById("tag_W").addEventListener("click", () => { this.update("W"); }, false); + // autre + document.getElementById("tag_X").addEventListener("click", () => { this.update("X"); }, false); + document.getElementById("flexion").addEventListener("keyup", () => { this.update(); }, false); + document.getElementById("tags").addEventListener("keyup", () => { this.update(); }, false); + // ajout + document.getElementById("add_to_lexicon").addEventListener("click", () => { this.addToLexicon(); }, false); + document.getElementById("delete_selection").addEventListener("click", () => { oGenWordsTable.deleteSelection(); }, false); + }, + + clear: function () { + try { + // nom commun + document.getElementById("tag_N").checked = false; + document.getElementById("nom_adj").checked = false; + document.getElementById("nom").checked = false; + document.getElementById("adj").checked = false; + document.getElementById("N_epi").checked = false; + document.getElementById("N_mas").checked = false; + document.getElementById("N_fem").checked = false; + document.getElementById("N_s").checked = false; + document.getElementById("N_x").checked = false; + document.getElementById("N_inv").checked = false; + document.getElementById("lemma2").value = ""; + // nom propre + document.getElementById("tag_M").checked = false; + document.getElementById("M1").checked = false; + document.getElementById("M2").checked = false; + document.getElementById("MP").checked = false; + document.getElementById("M_epi").checked = false; + document.getElementById("M_mas").checked = false; + document.getElementById("M_fem").checked = false; + // verbe + document.getElementById("tag_V").checked = false; + document.getElementById("v_i").checked = false; + document.getElementById("v_t").checked = false; + document.getElementById("v_n").checked = false; + document.getElementById("v_p").checked = false; + document.getElementById("v_m").checked = false; + document.getElementById("v_ae").checked = false; + document.getElementById("v_aa").checked = false; + document.getElementById("v_ppas").checked = false; + document.getElementById("verbe_modele").value = ""; + // adverbe + document.getElementById("tag_W").checked = false; + // autre + document.getElementById("tag_X").checked = false; + document.getElementById("flexion").value = ""; + document.getElementById("tags").value = ""; + } + catch (e) { + showError(e); + } + }, + + lTag: ["N", "M", "V", "W", "X"], + + setMainTag: function (cTag) { + this.cMainTag = cTag; + for (let c of this.lTag) { + if (c !== cTag) { + document.getElementById("tag_"+c).checked = false; + } + } + }, + + update: function (cTag=null) { + if (cTag !== null) { + this.setMainTag(cTag); + } + try { + this.lFlexion = []; + this.sLemma = document.getElementById("lemma").value.trim(); + if (this.sLemma.length > 0) { + switch (this.cMainTag) { + case "N": + if (!this.getRadioValue("pos_nom_commun") || !this.getRadioValue("genre_nom_commun")) { + break; + } + let sTag = this.getRadioValue("pos_nom_commun") + this.getRadioValue("genre_nom_commun"); + switch (this.getRadioValue("pluriel_nom_commun")) { + case "s": + this.lFlexion.push([this.sLemma, sTag+":s/*"]); + this.lFlexion.push([this.sLemma+"s", sTag+":p/*"]); + break; + case "x": + this.lFlexion.push([this.sLemma, sTag+":s/*"]); + this.lFlexion.push([this.sLemma+"x", sTag+":p/*"]); + break; + case "i": + this.lFlexion.push([this.sLemma, sTag+":i/*"]); + break; + } + let sLemma2 = document.getElementById("lemma2").value.trim(); + if (sLemma2.length > 0 && this.getRadioValue("pos_nom_commun2") && this.getRadioValue("genre_nom_commun2")) { + let sTag2 = this.getRadioValue("pos_nom_commun2") + this.getRadioValue("genre_nom_commun2"); + switch (this.getRadioValue("pluriel_nom_commun2")) { + case "s": + this.lFlexion.push([sLemma2, sTag2+":s/*"]); + this.lFlexion.push([sLemma2+"s", sTag2+":p/*"]); + break; + case "x": + this.lFlexion.push([sLemma2, sTag2+":s/*"]); + this.lFlexion.push([sLemma2+"x", sTag2+":p/*"]); + break; + case "i": + this.lFlexion.push([sLemma2, sTag2+":i/*"]); + break; + } + } + break; + case "V": { + if (!this.sLemma.endsWith("er") && !this.sLemma.endsWith("ir") && !this.sLemma.endsWith("re")) { + break; + } + this.sLemma = this.sLemma.toLowerCase(); + let cGroup = ""; + let c_i = (document.getElementById("v_i").checked) ? "i" : "_"; + let c_t = (document.getElementById("v_t").checked) ? "t" : "_"; + let c_n = (document.getElementById("v_n").checked) ? "n" : "_"; + let c_p = (document.getElementById("v_p").checked) ? "p" : "_"; + let c_m = (document.getElementById("v_m").checked) ? "m" : "_"; + let c_ae = (document.getElementById("v_ae").checked) ? "e" : "_"; + let c_aa = (document.getElementById("v_aa").checked) ? "a" : "_"; + let sVerbTag = c_i + c_t + c_n + c_p + c_m + c_ae + c_aa; + if (sVerbTag.includes("p") && !sVerbTag.startsWith("___p_")) { + sVerbTag = sVerbTag.replace("p", "q"); + } + if (!sVerbTag.endsWith("__") && !sVerbTag.startsWith("____")) { + let sVerbPattern = document.getElementById("verbe_modele").value.trim(); + if (sVerbPattern.length == 0) { + // utilisation du générateur de conjugaison + let bVarPpas = !document.getElementById("v_ppas").checked; + for (let [sFlexion, sFlexTags] of conj_generator.conjugate(this.sLemma, sVerbTag, bVarPpas)) { + this.lFlexion.push([sFlexion, sFlexTags]); + } + } else { + // copie du motif d’un autre verbe : utilisation du conjugueur + if (conj.isVerb(sVerbPattern)) { + let oVerb = new Verb(this.sLemma, sVerbPattern); + for (let [sTag1, dFlex] of oVerb.dConj.entries()) { + if (sTag1 !== ":Q") { + for (let [sTag2, sConj] of dFlex.entries()) { + if (sTag2.startsWith(":") && sConj !== "") { + this.lFlexion.push([sConj, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2]); + } + } + } else { + // participes passés + if (dFlex.get(":Q3") !== "") { + if (dFlex.get(":Q2") !== "") { + this.lFlexion.push([dFlex.get(":Q1"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:s/*"]); + this.lFlexion.push([dFlex.get(":Q2"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:p/*"]); + } else { + this.lFlexion.push([dFlex.get(":Q1"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:i/*"]); + } + this.lFlexion.push([dFlex.get(":Q3"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:s/*"]); + this.lFlexion.push([dFlex.get(":Q4"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:p/*"]); + } else { + this.lFlexion.push([dFlex.get(":Q1"), ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:e:i/*"]); + } + } + } + } + } + } + break; + } + case "W": + this.sLemma = this.sLemma.toLowerCase(); + this.lFlexion.push([this.sLemma, ":W/*"]); + break; + case "M": + this.sLemma = this.sLemma.slice(0,1).toUpperCase() + this.sLemma.slice(1); + let sPOSTag = this.getRadioValue("pos_nom_propre"); + let sGenderTag = this.getRadioValue("genre_nom_propre"); + if (sGenderTag) { + this.lFlexion.push([this.sLemma, sPOSTag+sGenderTag+":i/*"]); + } + break; + case "X": + let sFlexion = document.getElementById("flexion").value.trim(); + let sTags = document.getElementById("tags").value.trim(); + if (sFlexion.length > 0 && sTags.startsWith(":")) { + this.lFlexion.push([sFlexion, sTags]); + } + break; + } + } + oGenWordsTable.fill(this.lFlexion); + } + catch (e) { + showError(e); + } + }, + + getRadioValue: function (sName) { + if (document.getElementById(sName)) { + for (let xNode of document.getElementById(sName).children) { + if (xNode.selected) { + return xNode.value; + } + } + } + return null; + }, + + createFlexLemmaTagArray: function () { + let lEntry = []; + for (let [sFlex, sTags] of oGenWordsTable.getEntries()) { + lEntry.push([sFlex, this.sLemma, sTags]); + } + return lEntry; + }, + + addToLexicon: function () { + try { + oLexiconTable.addEntries(this.createFlexLemmaTagArray()); + oGenWordsTable.clear(); + document.getElementById("lemma").value = ""; + document.getElementById("lemma").focus(); + enableElement("save_button"); + this.clear(); + this.cMainTag = ""; + } + catch (e) { + showError(e); + } + } +} + + +const oBinaryDict = { + + oIBDAWG: null, + + load: async function () { + let sJSON = await oFileHandler.loadFile("fr.personal.json"); + this._load(sJSON); + }, + + _load: function (sJSON, bSave=false) { + if (sJSON) { + try { + let oJSON = JSON.parse(sJSON); + this.oIBDAWG = new IBDAWG(oJSON); + } + catch (e) { + this.setDictData(0, "#Erreur. Voir la console."); + console.error(e); + return; + } + if (bSave) { + oFileHandler.saveFile("fr.personal.json", JSON.stringify(oJSON)); + } + let lEntry = []; + for (let aRes of this.oIBDAWG.select()) { + lEntry.push(aRes); + } + oLexiconTable.fill(lEntry); + this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); + enableElement("export_button"); + } else { + this.setDictData(0, "[néant]"); + disableElement("export_button"); + } + }, + + import: function () { + oFileHandler.loadAs(this._import.bind(this)); + }, + + _import: function (sJSON) { + this._load(sJSON, true); + }, + + setDictData: function (nEntries, sDate) { + document.getElementById("dic_num_entries").value = nEntries; + document.getElementById("dic_save_date").value = sDate; + }, + + listen: function () { + document.getElementById("delete_button").addEventListener("click", () => { oLexiconTable.deleteSelection(); }, false); + document.getElementById("save_button").addEventListener("click", () => { this.build(); }, false); + document.getElementById("export_button").addEventListener("click", () => { this.export(); }, false); + document.getElementById("import_button").addEventListener("click", () => { this.import(); }, false); + }, + + build: function () { + let xProgressNode = document.getElementById("wait_progress"); + let lEntry = oLexiconTable.getEntries(); + if (lEntry.length > 0) { + let oDAWG = new DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel", xProgressNode); + let oJSON = oDAWG.createBinaryJSON(1); + oFileHandler.saveFile("fr.personal.json", JSON.stringify(oJSON)); + this.oIBDAWG = new IBDAWG(oJSON); + this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); + //browser.runtime.sendMessage({ sCommand: "setDictionary", dParam: {sType: "personal", oDict: oJSON}, dInfo: {} }); + enableElement("export_button"); + } else { + oFileHandler.deleteFile("fr.personal.json"); + this.setDictData(0, "[néant]"); + disableElement("export_button"); + } + }, + + export: function () { + let sJSON = JSON.stringify(this.oIBDAWG.getJSON()); + oFileHandler.saveAs(sJSON); + } +} + + +const oSearch = { + + oSpellChecker: null, + + load: function () { + this.oSpellChecker = new SpellChecker("fr", "", "fr.json"); + }, + + listen: function () { + document.getElementById("search_similar_button").addEventListener("click", () => { this.searchSimilar(); }, false); + document.getElementById("search_regex_button").addEventListener("click", () => { this.searchRegex() }, false); + }, + + searchSimilar: function () { + oSearchTable.clear(); + let sWord = document.getElementById("search_similar").value; + if (sWord !== "") { + let lResult = this.oSpellChecker.getSimilarEntries(sWord, 20); + oSearchTable.fill(lResult); + } + }, + + searchRegex: function () { + let sFlexPattern = document.getElementById("search_flexion_pattern").value.trim(); + let sTagsPattern = document.getElementById("search_tags_pattern").value.trim(); + let lEntry = []; + let i = 0; + for (let aRes of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { + lEntry.push(aRes); + i++; + if (i >= 2000) { + break; + } + } + oSearchTable.fill(lEntry); + } +} + + +const oTagsInfo = { + load: function () { + let lEntry = []; + for (let [sTag, [_, sLabel]] of _dTag) { + lEntry.push([sTag, sLabel.trim()]); + } + oTagsTable.fill(lEntry); + } +} + + +const oGenWordsTable = new Table("generated_words_table", ["Flexions", "Étiquettes"], [1, 1], "progress_new_words"); +const oLexiconTable = new Table("lexicon_table", ["Flexions", "Lemmes", "Étiquettes"], [10, 7, 10], "progress_lexicon", "num_entries"); +const oSearchTable = new Table("search_table", ["Flexions", "Lemmes", "Étiquettes"], [10, 7, 10], "progress_search", "search_num_entries"); +const oTagsTable = new Table("tags_table", ["Étiquette", "Signification"], [1, 10], "progress_lexicon"); + +conj.init(helpers.loadFile("resource://grammalecte/fr/conj_data.json")); + + +oTagsInfo.load(); +oSearch.load(); +oBinaryDict.load(); +oBinaryDict.listen(); +oGenerator.listen(); +oSearch.listen(); ADDED gc_lang/fr/tb/content/lex_editor.xul Index: gc_lang/fr/tb/content/lex_editor.xul ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/lex_editor.xul @@ -0,0 +1,332 @@ + + + + + + + + + + +