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 @@ <info> <desc>The data for one leaf.</desc> </info> ${xcs_options} </group> + + <group oor:name="o_${lang}"> + <info> + <desc>The data for one leaf.</desc> + </info> + <prop oor:name="use_graphspell" oor:type="xs:int"><value>1</value></prop> + <prop oor:name="use_graphspell_sugg" oor:type="xs:int"><value>1</value></prop> + <prop oor:name="use_extended_dic" oor:type="xs:int"><value>0</value></prop> + <prop oor:name="use_personal_dic" oor:type="xs:int"><value>1</value></prop> + <prop oor:name="extended_dic" oor:type="xs:string"><value></value></prop> + <prop oor:name="personal_dic" oor:type="xs:string"><value></value></prop> + </group> </templates> <component> <group oor:name="Leaves"> <node-ref oor:name="${lang}" oor:node-type="${lang}" /> </group> + + <group oor:name="Other"> + <node-ref oor:name="o_${lang}" oor:node-type="o_${lang}" /> + </group> </component> </oor:component-schema> 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,23 @@ 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 # 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,2022 @@ +// 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)) { + lEntry.push( [sVerb.slice(0, -nCut) + sAdd, ":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] + ] + } + } +}; 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,1999 @@ +# 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): + lConj.append((sVerb[0:-nCut]+sAdd, ":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/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,532 @@ +# Lexicon Editor +# by Olivier R. +# License: GPL 3 + +import unohelper +import uno +import json +import re +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 + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.awt import XKeyListener + + +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.oSpellChecker = 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.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 = "-", 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.xExport = self._addWidget('export_button', 'Button', nXC+150, nY0, 50, 12, Label = self.dUI.get('export_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + + #### 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, 120, 14, FontDescriptor = xFDTitle) + + # 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, 120, 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('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('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 == "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 == "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 + #@_waitPointer (don’t: strange behavior) + def loadLexicon (self): + xChild = self.xSettingNode.getByName("o_fr") + sJSON = xChild.getPropertyValue("personal_dic") + if sJSON != "": + oIBDAWG = ibdawg.IBDAWG(json.loads(sJSON)) + xGridDataModel = self.xGridModelLex.GridDataModel + for i, sLine in enumerate(oIBDAWG.select()): + sFlexion, sLemma, sTag = sLine.split("\t") + xGridDataModel.addRow(i, (sFlexion, sLemma, sTag)) + self.xNumLex.Label = str(i) + self.xNumDic.Label = str(i) + self.xDateDic.Label = oIBDAWG.sDate + + @_waitPointer + def saveLexicon (self): + xGridDataModel = self.xGridModelLex.GridDataModel + lEntry = [] + for i in range(xGridDataModel.RowCount): + lEntry.append(xGridDataModel.getRowData(i)) + oDAWG = dawg.DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel") + oJSON = oDAWG.getBinaryAsJSON() + xChild = self.xSettingNode.getByName("o_fr") + xChild.setPropertyValue("personal_dic", json.dumps(oJSON, ensure_ascii=False)) + self.xSettingNode.commitChanges() + self.xNumLex.Label = str(oJSON["nEntry"]) + self.xNumDic.Label = str(oJSON["nEntry"]) + self.xDateDic.Label = oJSON["sDate"] + + 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 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, 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) + + @_waitPointer + def importDictionary (self): + pass + + @_waitPointer + def exportDictionary (self): + 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() + + +#g_ImplementationHelper = unohelper.ImplementationHelper() +#g_ImplementationHelper.addImplementation(LexiconEditor, 'net.grammalecte.LexiconEditor', ('com.sun.star.task.Job',)) 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,80 @@ +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", + + # 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": "Participes passés variables", + "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 :", + "export_button": "Exporter", + + # + "close_button": "Fermer", + }, + # Traduction délibérément limitée + "en": { + "title": "Grammalecte · Lexical editor", + + "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 @@ <value>service:net.grammalecte.AppLauncher?EN</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> <value xml:lang="fr">~Recenseur de mots…</value> - <value xml:lang="en-US">~Enumerator of words…</value> + <value xml:lang="en-US">Enumerato~r of words…</value> </prop> <prop oor:name="Target" oor:type="xs:string"> <value>_self</value> </prop> <prop oor:name="Context" oor:type="xs:string"> @@ -134,10 +134,48 @@ <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Grammalecte</value> </prop> </node> <node oor:name="m7" oor:op="replace"> + <prop oor:name="URL" oor:type="xs:string"> + <value>service:net.grammalecte.AppLauncher?DI</value> + </prop> + <prop oor:name="Title" oor:type="xs:string"> + <value/> + <value xml:lang="fr">~Options des dictionnaires…</value> + <value xml:lang="en-US">Dictionaries ~options…</value> + </prop> + <prop oor:name="Target" oor:type="xs:string"> + <value>_self</value> + </prop> + <prop oor:name="Context" oor:type="xs:string"> + <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> + </prop> + <prop oor:name="ImageIdentifier" oor:type="xs:string"> + <value>org.dicollecte.images:Frenchflag</value> + </prop> + </node> + <node oor:name="m8" oor:op="replace"> + <prop oor:name="URL" oor:type="xs:string"> + <value>service:net.grammalecte.AppLauncher?LE</value> + </prop> + <prop oor:name="Title" oor:type="xs:string"> + <value/> + <value xml:lang="fr">Éditeur ~lexical…</value> + <value xml:lang="en-US">~Lexicon editor…</value> + </prop> + <prop oor:name="Target" oor:type="xs:string"> + <value>_self</value> + </prop> + <prop oor:name="Context" oor:type="xs:string"> + <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> + </prop> + <prop oor:name="ImageIdentifier" oor:type="xs:string"> + <value>org.dicollecte.images:Frenchflag</value> + </prop> + </node> + <node oor:name="m9" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?DS</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> @@ -152,19 +190,19 @@ </prop> <prop oor:name="ImageIdentifier" oor:type="xs:string"> <value>org.dicollecte.images:Frenchflag</value> </prop> </node> - <node oor:name="m8" oor:op="replace"> + <node oor:name="m10" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>private:separator</value> </prop> <prop oor:name="Context" oor:type="xs:string"> <value>com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument</value> </prop> </node> - <node oor:name="m9" oor:op="replace"> + <node oor:name="m11" oor:op="replace"> <prop oor:name="URL" oor:type="xs:string"> <value>service:net.grammalecte.AppLauncher?About</value> </prop> <prop oor:name="Title" oor:type="xs:string"> <value/> 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,79 @@ +// 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; + } + }, + + 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,91 @@ +/* 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; +} + 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,485 @@ +// 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; }, 2000); + } + 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 = true; + 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.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"); + if (sJSON != "") { + let oJSON = JSON.parse(sJSON); + this.oIBDAWG = new IBDAWG(oJSON); + let lEntry = []; + for (let s of this.oIBDAWG.select()) { + lEntry.push(s.split("\t")); + } + oLexiconTable.fill(lEntry); + this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); + enableElement("export_button"); + } else { + this.setDictData(0, "[néant]"); + disableElement("export_button"); + } + }, + + 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"); + } + }, + + import: function () { + console.log("import"); + }, + + export: function () { + let sJSON = JSON.stringify(this.oIBDAWG.getJSON()); + oFileHandler.saveAs(sJSON); + } +} + + +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"); + +conj.init(helpers.loadFile("resource://grammalecte/fr/conj_data.json")); + +oBinaryDict.load(); +oBinaryDict.listen(); +oGenerator.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,225 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> +<?xml-stylesheet href="chrome://grammarchecker/content/lex_editor.css" type="text/css"?> + +<!DOCTYPE dialog SYSTEM "chrome://grammarchecker/locale/lex_editor.dtd"> + +<dialog + id="grammalecte-lexicon-editor-window" + title="&window.title;" + orient="vertical" + buttons="cancel" + buttonlabelcancel="&button.cancel.label;" + ondialogcancel="return;" + width="500" + onload="document.getElementById('grammalecte-lexicon-editor-window').centerWindowOnScreen();" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <!-- Other elements go here --> + <hbox> + <label class="dictionary" value="Dictionnaire personnel" /> + <spacer flex="1" /> + <label class="dic_text align_right" value="Enregistré le :" /> + <label id="dic_save_date" class="dic_text" value="[néant]" /> + <spacer flex="1" /> + <label id="dic_num_entries" class="dic_text align_right" value="0" /> + <label class="dic_text" value="entrées" /> + <spacer flex="1" /> + <button id="export_button" label="Exporter" /> + </hbox> + + <tabbox id="tabs" selectedIndex="0"> + <tabs> + <tab label="&tab.editor.label;"/> + <tab label="&tab.lexicon.label;"/> + </tabs> + + <tabpanels> + + <!-- NEW WORD --> + <tabpanel orient="vertical"> + + <hbox> + + <vbox> + <dialogheader title="Nouveau mot (lemme)" description="Générateur" /> + <textbox id="lemma" value="" /> + + <checkbox id="tag_N" class="subsection" label="Nom et adjectif" /> + <hbox class="m_left"> + <radiogroup id="pos_nom_commun" orient="vertical"> + <radio id="nom_adj" class="option" label="Nom et adjectif" value=":N:A" /> + <radio id="nom" class="option" label="Nom" value=":N" /> + <radio id="adj" class="option" label="Adjectif" value=":A" /> + </radiogroup> + <radiogroup id="genre_nom_commun" orient="vertical"> + <radio id="N_epi" class="option" label="épicène" value=":e" /> + <radio id="N_mas" class="option" label="masculin" value=":m" /> + <radio id="N_fem" class="option" label="féminin" value=":f" /> + </radiogroup> + <radiogroup id="pluriel_nom_commun" orient="vertical"> + <radio id="N_s" class="option" label="pluriel en ·s" value="s" /> + <radio id="N_x" class="option" label="pluriel en ·x" value="x" /> + <radio id="N_inv" class="option" label="invariable" value="i" /> + </radiogroup> + </hbox> + <vbox class="m_left2"> + <label class="subsection" value="[optionnel] Autre forme (masculine, féminine, variante…)" /> + <textbox id="lemma2" value="" /> + <hbox> + <radiogroup id="pos_nom_commun2" orient="vertical"> + <radio id="nom_adj2" class="option" label="Nom et adjectif" value=":N:A" /> + <radio id="nom2" class="option" label="Nom" value=":N" /> + <radio id="adj2" class="option" label="Adjectif" value=":A" /> + </radiogroup> + <radiogroup id="genre_nom_commun2" orient="vertical"> + <radio id="N_epi2" class="option" label="épicène" value=":e" /> + <radio id="N_mas2" class="option" label="masculin" value=":m" /> + <radio id="N_fem2" class="option" label="féminin" value=":f" /> + </radiogroup> + <radiogroup id="pluriel_nom_commun2" orient="vertical"> + <radio id="N_s2" class="option" label="pluriel en ·s" value="s" /> + <radio id="N_x2" class="option" label="pluriel en ·x" value="x" /> + <radio id="N_inv2" class="option" label="invariable" value="inv" /> + </radiogroup> + </hbox> + </vbox> + + <checkbox id="tag_M" class="subsection" label="Nom propre" /> + <hbox class="m_left"> + <radiogroup id="pos_nom_propre" orient="vertical"> + <radio id="M1" class="option" label="Prénom" value=":M1" /> + <radio id="M2" class="option" label="Patronyme" value=":M2" /> + <radio id="MP" class="option" label="Autre" value=":MP" /> + </radiogroup> + <radiogroup id="genre_nom_propre" orient="vertical"> + <radio id="M_epi" class="option" label="épicène" value=":e" /> + <radio id="M_mas" class="option" label="masculin" value=":m" /> + <radio id="M_fem" class="option" label="féminin" value=":f" /> + </radiogroup> + </hbox> + + <checkbox id="tag_V" class="subsection" label="Verbe" /> + <hbox class="m_left"> + <vbox> + <checkbox id="v_i" class="v_usage" label="intransitif" /> + <checkbox id="v_t" class="v_usage" label="transitif" /> + <checkbox id="v_n" class="v_usage" label="transitif indirect" /> + <checkbox id="v_p" class="v_usage" label="pronominal" /> + <checkbox id="v_m" class="v_usage" label="impersonnel" /> + </vbox> + <vbox> + <label value="Auxilaire avec le passé composé" /> + <checkbox id="v_ae" class="v_usage" label="être" /> + <checkbox id="v_aa" class="v_usage" label="avoir" /> + <label value="" /> + <checkbox id="v_ppas" class="v_usage" label="Participes passés variables" /> + </vbox> + </hbox> + <hbox class="m_left"> + <label class="subsection" value="Verbe modèle [optionnel]" /> + <textbox id="verbe_modele" class="v_textbox" value="" /> + </hbox> + + <checkbox id="tag_W" class="subsection" label="Adverbe" /> + + <checkbox id="tag_X" class="subsection" label="Autre" /> + <vbox class="m_left"> + <hbox> + <label class="subsection other_label" value="Flexion" /> + <textbox id="flexion" class="other_textbox" value="" /> + </hbox> + <hbox> + <label class="subsection other_label" value="Étiquettes" /> + <textbox id="tags" class="other_textbox" value="" /> + </hbox> + </vbox> + </vbox> + + <vbox> + <dialogheader title="Mots générés" description="" /> + <listbox id="generated_words_table" seltype="multiple"> + <!-- + <listhead> + <listheader label="Flexions"/> + <listheader label="Étiquettes"/> + </listhead> + + <listcols> + <listcol flex="1"/> + <listcol flex="1"/> + </listcols> + + <listitem> + <listcell label="George"/> + <listcell label="House"/> + </listitem> + --> + </listbox> + <progressmeter id="progress_new_words" value="0"/> + <hbox> + <button id="delete_selection" label="Effacer la sélection" /> + <spacer flex="1" /> + <button id="add_to_lexicon" label="Ajouter au lexique" /> + </hbox> + </vbox> + </hbox> + </tabpanel> + + <!-- LEXICON --> + <tabpanel orient="vertical"> + <dialogheader title="&dialogheader.lexicon.label;" description="" /> + <hbox> + <vbox> + <hbox> + <label class="info_label" value="Nombre d’entrées : " /> + <label id="num_entries" class="data" value="0" /> + </hbox> + <spacer flex="1" /> + <button id="delete_button" label="Supprimer la sélection" /> + <spacer flex="20" /> + <progressmeter id="progress_lexicon" value="0"/> + <button id="save_button" label="Enregistrer" /> + + </vbox> + + <vbox> + <listbox id="lexicon_table" seltype="multiple"> + <!-- + <listhead> + <listheader label="Flexions"/> + <listheader label="Lemmes"/> + <listheader label="Étiquettes"/> + </listhead> + + <listcols> + <listcol flex="4"/> + <listcol flex="3"/> + <listcol flex="4"/> + </listcols> + + <listitem> + <listcell label="George"/> + <listcell label="House Painter"/> + <listcell label="House"/> + </listitem> + --> + </listbox> + </vbox> + </hbox> + </tabpanel> + + </tabpanels> + + </tabbox> + + <script type="application/x-javascript" src="resource://grammalecte/graphspell/helpers.js" /> + <script type="application/x-javascript" src="resource://grammalecte/graphspell/str_transform.js" /> + <script type="application/x-javascript" src="resource://grammalecte/graphspell/dawg.js" /> + <script type="application/x-javascript" src="resource://grammalecte/graphspell/ibdawg.js" /> + <script type="application/x-javascript" src="resource://grammalecte/fr/conj.js" /> + <script type="application/x-javascript" src="resource://grammalecte/fr/conj_generator.js" /> + <script type="application/x-javascript" src="file_handler.js" /> + <script type="application/x-javascript" src="lex_editor.js" /> + +</dialog> Index: gc_lang/fr/tb/content/overlay.js ================================================================== --- gc_lang/fr/tb/content/overlay.js +++ gc_lang/fr/tb/content/overlay.js @@ -47,20 +47,28 @@ loadGC: function () { if (this.xGCEWorker === null) { // Grammar checker echo('Loading Grammalecte'); this.xGCEWorker = new BasePromiseWorker('chrome://promiseworker/content/gce_worker.js'); + let that = this; let xPromise = this.xGCEWorker.post('loadGrammarChecker', [prefs.getCharPref("sGCOptions"), "Thunderbird"]); xPromise.then( function (aVal) { echo(aVal); prefs.setCharPref("sGCOptions", aVal); + if (prefs.getBoolPref("bPersonalDictionary")) { + let sDicJSON = oFileHandler.loadFile("fr.personal.json"); + if (sDicJSON) { + that.xGCEWorker.post('setDictionary', ["personal", sDicJSON]); + } + } }, function (aReason) { echo('Promise rejected - ', aReason); } ).catch( function (aCaught) { echo('Promise Error - ', aCaught); } ); + } }, fullTests: function () { echo('Performing tests... Wait...'); let xPromise = this.xGCEWorker.post('fullTests', ['{"nbsp":true, "esp":true, "unit":true, "num":true}']); @@ -500,10 +508,13 @@ oTextFormatter.openPanel(); }, onOpenConjugueur: function (e) { this.openDialog("chrome://grammarchecker/content/conjugueur.xul", "", "chrome, resizable=no"); }, + onOpenLexiconEditor: function (e) { + this.openDialog("chrome://grammarchecker/content/lex_editor.xul", "", "chrome, resizable=no"); + }, onAbout: function (e) { this.openDialog("chrome://grammarchecker/content/about.xul", "", "chrome, dialog, modal, resizable=no"); } }; Index: gc_lang/fr/tb/content/overlay.xul ================================================================== --- gc_lang/fr/tb/content/overlay.xul +++ gc_lang/fr/tb/content/overlay.xul @@ -6,10 +6,11 @@ <overlay id="grammarchecker-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/> <script type="application/x-javascript" src="overlay.js"/> + <script type="application/x-javascript" src="file_handler.js"/> <script type="application/x-javascript" src="spellchecker.js"/> <script type="application/x-javascript" src="editor.js"/> <stringbundleset id="stringbundleset"> <stringbundle id="grammarchecker-strings" src="chrome://grammarchecker/locale/grammarchecker.properties"/> @@ -44,10 +45,11 @@ <menuitem id="gl-item-conj" class="menuitem-iconic" label="&grammalectemenu.conjugueur;" oncommand="oGrammarChecker.onOpenConjugueur(event);"/> <menuseparator/> <menuitem id="gl-item-analyze" class="menuitem-iconic" label="&grammalectemenu.start;" oncommand="oGrammarChecker.onParseText(event);"/> <menuitem id="gl-item-options" class="menuitem-iconic" label="&grammalectemenu.gc_options;" onclick="oGrammarChecker.onOpenGCOptions(event);"/> <menuitem id="gl-item-options" class="menuitem-iconic" label="&grammalectemenu.spell_options;" onclick="oGrammarChecker.onOpenSpellOptions(event);"/> + <menuitem id="gl-item-options" class="menuitem-iconic" label="&grammalectemenu.lexicon_editor;" onclick="oGrammarChecker.onOpenLexiconEditor(event);"/> <menuitem id="gl-item-options" class="menuitem-iconic" label="&grammalectemenu.other_options;" onclick="oGrammarChecker.onOpenOptions(event);"/> <menuseparator/> <menuitem id="gl-item-about" class="menuitem-iconic" label="&grammalectemenu.about;" oncommand="oGrammarChecker.onAbout(event);"/> </menupopup> </toolbarbutton> Index: gc_lang/fr/tb/defaults/preferences/grammarchecker.js ================================================================== --- gc_lang/fr/tb/defaults/preferences/grammarchecker.js +++ gc_lang/fr/tb/defaults/preferences/grammarchecker.js @@ -1,11 +1,10 @@ -pref("extensions.grammarchecker.urlpref1", "http://localhost:8081"); -pref("extensions.grammarchecker.urlpref2", "https://languagetool.org:8081/"); -pref("extensions.grammarchecker.langpref", "en"); -pref("extensions.grammarchecker.mothertongue", ""); pref("extensions.grammarchecker.sGCOptions", ""); pref("extensions.grammarchecker.sTFOptions", ""); pref("extensions.grammarchecker.bDictModern", false); pref("extensions.grammarchecker.bDictClassic", true); pref("extensions.grammarchecker.bDictReform", false); pref("extensions.grammarchecker.bDictClassicReform", false); pref("extensions.grammarchecker.bCheckSignature", true); +pref("extensions.grammarchecker.bExtendedDictionary", false); +pref("extensions.grammarchecker.bCommunityDictionary", false); +pref("extensions.grammarchecker.bPersonalDictionary", true); ADDED gc_lang/fr/tb/locale/en/lex_editor.dtd Index: gc_lang/fr/tb/locale/en/lex_editor.dtd ================================================================== --- /dev/null +++ gc_lang/fr/tb/locale/en/lex_editor.dtd @@ -0,0 +1,9 @@ +<!ENTITY window.title "Grammalecte · Lexical editor lexical"> + +<!ENTITY button.cancel.label "Close"> + +<!ENTITY dialogheader.newword.label "New word"> +<!ENTITY dialogheader.lexicon.label "Your lexicon"> + +<!ENTITY tab.editor.label "Add"> +<!ENTITY tab.lexicon.label "Lexicon"> Index: gc_lang/fr/tb/locale/en/overlay.dtd ================================================================== --- gc_lang/fr/tb/locale/en/overlay.dtd +++ gc_lang/fr/tb/locale/en/overlay.dtd @@ -5,10 +5,11 @@ <!ENTITY grammalectemenu.textformatter "Text formatter…"> <!ENTITY grammalectemenu.conjugueur "Conjugation tool…"> <!ENTITY grammalectemenu.start "Proofread the text…"> <!ENTITY grammalectemenu.spell_options "Spelling options…"> <!ENTITY grammalectemenu.gc_options "Grammar options…"> +<!ENTITY grammalectemenu.lexicon_editor "Lexical editor…"> <!ENTITY grammalectemenu.other_options "Other options…"> <!ENTITY grammalectemenu.about "About Grammalecte…"> <!ENTITY detected_mistakes "Detected mistakes"> ADDED gc_lang/fr/tb/locale/fr/lex_editor.dtd Index: gc_lang/fr/tb/locale/fr/lex_editor.dtd ================================================================== --- /dev/null +++ gc_lang/fr/tb/locale/fr/lex_editor.dtd @@ -0,0 +1,9 @@ +<!ENTITY window.title "Grammalecte · Éditeur lexical"> + +<!ENTITY button.cancel.label "Fermer"> + +<!ENTITY dialogheader.newword.label "Nouveau mot"> +<!ENTITY dialogheader.lexicon.label "Votre lexique"> + +<!ENTITY tab.editor.label "Ajout"> +<!ENTITY tab.lexicon.label "Lexique"> Index: gc_lang/fr/tb/locale/fr/overlay.dtd ================================================================== --- gc_lang/fr/tb/locale/fr/overlay.dtd +++ gc_lang/fr/tb/locale/fr/overlay.dtd @@ -5,10 +5,11 @@ <!ENTITY grammalectemenu.textformatter "Formateur de texte…"> <!ENTITY grammalectemenu.conjugueur "Conjugueur…"> <!ENTITY grammalectemenu.start "Analyser le texte…"> <!ENTITY grammalectemenu.spell_options "Options orthographiques…"> <!ENTITY grammalectemenu.gc_options "Options grammaticales…"> +<!ENTITY grammalectemenu.lexicon_editor "Éditeur lexical…"> <!ENTITY grammalectemenu.other_options "Autres options…"> <!ENTITY grammalectemenu.about "À propos de Grammalecte…"> <!ENTITY detected_mistakes "Erreurs détectées"> Index: gc_lang/fr/tb/worker/gce_worker.js ================================================================== --- gc_lang/fr/tb/worker/gce_worker.js +++ gc_lang/fr/tb/worker/gce_worker.js @@ -75,10 +75,31 @@ catch (e) { console.log("# Error: " + e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); } } } + +function setDictionary (sTypeDic, sDicJSON) { + try { + console.log("set dictionary: " + sTypeDic); + let oJSON = JSON.parse(sDicJSON); + switch (sTypeDic) { + case "extended": + break; + case "community": + break; + case "personal": + oSpellChecker.setPersonalDictionary(oJSON); + break; + default: + console.log("[GCE worker] unknown dictionary type"); + } + } + catch (e) { + console.error(e); + } +} function parse (sText, sCountry, bDebug, bContext) { let aGrammErr = gce.parse(sText, sCountry, bDebug, bContext); return JSON.stringify(aGrammErr); } Index: gc_lang/fr/webext/content_scripts/menu.css ================================================================== --- gc_lang/fr/webext/content_scripts/menu.css +++ gc_lang/fr/webext/content_scripts/menu.css @@ -12,43 +12,36 @@ box-sizing: border-box; display: none; margin: -8px 0 0 -8px; width: 16px; height: 16px; - background-color: hsla(210, 80%, 80%, .5); - border: 4px solid hsla(210, 80%, 60%, .5); - border-top: 4px solid hsla(210, 100%, 40%, .7); - border-bottom: 4px solid hsla(210, 100%, 40%, .7); + background-color: hsla(210, 80%, 40%, .2); + border: 4px solid hsla(210, 80%, 30%, .5); + border-top: 4px solid hsla(210, 100%, 70%, .9); + border-bottom: 4px solid hsla(210, 100%, 70%, .9); border-radius: 50%; text-align: center; cursor: pointer; - box-shadow: 0 0 0 0 hsla(210, 50%, 50%, .5); + box-shadow: 0 0 0 0 hsla(210, 80%, 50%, .5); /*z-index: 2147483640; /* maximum is 2147483647: https://stackoverflow.com/questions/491052/minimum-and-maximum-value-of-z-index */ animation: grammalecte-spin 2s ease 1; } .grammalecte_menu_main_button:hover { - border: 4px solid hsla(210, 80%, 35%, .5); - background-color: hsla(210, 80%, 55%, .5); + background-color: hsla(180, 100%, 55%, .6); animation: grammalecte-spin .5s linear infinite; } @keyframes grammalecte-spin { 0% { transform: rotate(0deg) scale(1); - border-top: 4px solid hsla(210, 100%, 40%, .7); - border-bottom: 4px solid hsla(210, 100%, 40%, .7); - } - 70% { - transform: rotate(180deg) scale(.8); - border-top: 4px solid hsla(0, 100%, 40%, .7); - border-bottom: 4px solid hsla(0, 100%, 40%, .7); - box-shadow: 0 0 0 20px hsla(210, 50%, 50%, 0); + } + 50% { + transform: rotate(180deg) scale(.9); + box-shadow: 0 0 0 10px hsla(210, 50%, 50%, 0); } 100% { transform: rotate(360deg) scale(1); - border-top: 4px solid hsla(210, 100%, 40%, .7); - border-bottom: 4px solid hsla(210, 100%, 40%, .7); box-shadow: 0 0 0 0 hsla(210, 50%, 50%, 0); } } Index: gc_lang/fr/webext/content_scripts/panel.css ================================================================== --- gc_lang/fr/webext/content_scripts/panel.css +++ gc_lang/fr/webext/content_scripts/panel.css @@ -125,37 +125,30 @@ visibility: hidden; box-sizing: border-box; width: 40px; height: 40px; position: absolute; - top: 0px; + top: 2px; right: 200px; - background-color: hsla(210, 80%, 80%, .5); - border: 10px solid hsla(210, 80%, 60%, .5); - border-top: 10px solid hsla(210, 100%, 40%, .7); - border-bottom: 10px solid hsla(210, 100%, 40%, .7); + background-color: hsla(210, 100%, 30%, .1); + border: 3px solid hsla(210, 100%, 30%, .1); + border-top: 3px solid hsla(210, 100%, 50%, .8); border-radius: 50%; text-align: center; cursor: pointer; - box-shadow: 0 0 0 0 hsla(210, 50%, 50%, .5); - animation: grammalecte-spin-big .5s linear infinite; + box-shadow: 0 0 0 0 hsla(210, 80%, 50%, .5); + animation: grammalecte-spin-big 2s linear infinite; } @keyframes grammalecte-spin-big { 0% { transform: rotate(0deg) scale(1); - border-top: 10px solid hsla(210, 100%, 40%, .7); - border-bottom: 10px solid hsla(210, 100%, 40%, .7); - } - 70% { - transform: rotate(180deg) scale(.8); - border-top: 10px solid hsla(0, 100%, 40%, .7); - border-bottom: 10px solid hsla(0, 100%, 40%, .7); - box-shadow: 0 0 0 20px hsla(210, 50%, 50%, 0); + } + 50% { + transform: rotate(180deg) scale(.9); + box-shadow: 0 0 0 10px hsla(210, 50%, 50%, 0); } 100% { transform: rotate(360deg) scale(1); - border-top: 10px solid hsla(210, 100%, 40%, .7); - border-bottom: 10px solid hsla(210, 100%, 40%, .7); box-shadow: 0 0 0 0 hsla(210, 50%, 50%, 0); } } DELETED gc_lang/fr/webext/panel/lex_conj_data.js Index: gc_lang/fr/webext/panel/lex_conj_data.js ================================================================== --- gc_lang/fr/webext/panel/lex_conj_data.js +++ /dev/null @@ -1,1952 +0,0 @@ -// JavaScript - -"use strict"; - -// beta stage, unfinished, may be useless or the root for a new way to generate flexions… - -/* - Règles de conjugaison -*/ - -const oConj = { - "V1_ppas": { - "var": [ - [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], - ], - "invar": [ - [2, "é", ":Q:e:i/*", false], - ] - }, - - "V2_ppas": { - "var": [ - [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], - ], - "invar": [ - [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/webext/panel/lex_editor.css ================================================================== --- gc_lang/fr/webext/panel/lex_editor.css +++ gc_lang/fr/webext/panel/lex_editor.css @@ -25,20 +25,20 @@ color: #505050; } .inbox { - width: 600px; + width: 800px; margin: 20px auto 10px auto; padding: 10px 30px 30px 30px; background: hsl(0, 0%, 100%); border: 2px solid #F0F0F0; border-radius: 20px; } h1 { - margin: 5px 0 20px 0; + margin: 5px 0 5px 0; color: hsl(210, 50%, 50%); font: bold 30px "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif; text-align: center; } h2 { @@ -51,71 +51,81 @@ color: hsl(210, 50%, 50%); font: bold 16px "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif; } #buttons { - padding: 10px; + padding: 2px; justify-content: center; } #lexicon_button { background-color: hsl(210, 80%, 90%); } .main_button { margin: 0 5px; - padding: 10px 30px; + width: 100px; + padding: 10px 20px; background-color: hsl(210, 10%, 95%); border-radius: 5px; + text-align: center; cursor: pointer; } +.big_block { + margin: 10px 0; + padding: 10px; + background-color: hsl(210, 20%, 96%); + border-radius: 5px; +} #add_word_page { display: none; } + +.columns { + display: flex; +} + +#word_generator { + width: 400px; +} +#generated_words { + width: 400px; +} #editor { display: none; } -#categories { - display: flex; - padding: 10px 0; -} #word_section2 { display: none; } .category { + margin-right: 5px; padding: 10px; border-radius: 3px; + background-color: hsl(210, 20%, 96%); cursor: pointer; } .category:hover { - background-color: hsl(0, 0%, 90%); -} - -.separator { - border-left: 1px solid hsl(210, 0%, 90%); -} - -#section_vide { - padding: 50px; - font-size: 24px; - text-align: center; - background-color: hsl(0, 20%, 90%); - color: hsl(0, 20%, 50%); - border-radius: 5px; -} + background-color: hsl(210, 20%, 90%); +} + .section { display: none; padding: 10px; } .container { display: flex; } +.dic_container { + display: flex; + align-items: center; + justify-content: space-between; +} .block { flex-grow: 1; margin: 5px; padding: 10px 15px 15px 15px; @@ -129,27 +139,31 @@ } .widelabel { display: inline-block; min-width: 80px; } + +.description { + font-size: 12px; +} .examples_true { flex-grow: 1; margin: 2px; padding: 10px; background-color: hsl(120, 10%, 90%); color: hsl(120, 10%, 50%); - font-size: 14px; + font-size: 12px; border-radius: 3px; } .examples_false { flex-grow: 1; margin: 2px; padding: 10px; background-color: hsl(0, 10%, 90%); color: hsl(0, 10%, 50%); - font-size: 14px; + font-size: 12px; border-radius: 3px; } ul { margin-left: 30px; @@ -156,11 +170,10 @@ } input[type=text] { display: inline-block; width: 250px; - margin-left: 5px; padding: 5px 10px; border: 2px solid hsl(0, 0%, 80%); border-radius: 3px; height: 24px; background: transparent; @@ -170,53 +183,38 @@ input[placeholder] { color: hsl(0, 0%, 50%); } -#actions { - display: none; - padding: 10px; -} - -#results { - padding: 10px; - background-color: hsl(210, 10%, 90%); - border-radius: 3px; - margin: 5px 0; - font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; -} + #buttonline { + margin-top: 5px; text-align: right; } #add_to_lexicon { display: inline-block; - padding: 7px 10px; - font-size: 20px; - background-color: hsl(0, 30%, 30%); - color: hsl(0, 30%, 60%); + padding: 5px 10px; + font-size: 16px; + background-color: hsl(150, 50%, 50%); + color: hsl(150, 50%, 96%); border-radius: 3px; - text-transform: uppercase; text-align: center; - text-decoration: none; cursor: pointer; } #add_to_lexicon:hover { - background-color: hsl(0, 60%, 40%); - color: hsl(0, 60%, 70%); - box-shadow: 0 0 2px hsl(0, 60%, 50%); + background-color: hsl(150, 60%, 40%); + color: hsl(150, 60%, 90%); + box-shadow: 0 0 2px hsl(150, 60%, 50%); } #lexicon_page { } -#no_elem_line { - display: none; -} .button_block { margin: 5px 0px; background-color: hsl(210, 10%, 90%); border-radius: 5px; @@ -239,20 +237,19 @@ } #import_button { display: none; } -#build_progress { - display: none; +#wait_progress { width: 100%; + height: 4px; } -#display_progress { - display: none; +table { + border: 1px solid hsl(210, 10%, 50%); width: 100%; } - th { padding: 5px 10px; border-left: 1px solid hsl(210, 10%, 90%); text-align: left; } @@ -263,5 +260,19 @@ .delete_entry { cursor: pointer; font-weight: bold; color: hsl(0, 100%, 50%); } + + +details { + font-size: 11px; + font-variant: small-caps; + color: hsl(210, 50%, 50%); + cursor: pointer; +} +details > * { + font-size: 12px; + font-variant: normal; + color: hsl(210, 0%, 0%); + cursor: auto; +} Index: gc_lang/fr/webext/panel/lex_editor.html ================================================================== --- gc_lang/fr/webext/panel/lex_editor.html +++ gc_lang/fr/webext/panel/lex_editor.html @@ -1,313 +1,261 @@ <!DOCTYPE HTML> <html> - <head> - <link rel="stylesheet" type="text/css" href="lex_editor.css" /> - <title>Grammalecte · Éditeur lexical</title> - <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> - </head> - - <body> - - <div class="inbox"> - - <h1>Éditeur lexical</h1> - - <div id="buttons" class="container"> - <div id="lexicon_button" class="main_button">Lexique</div> - <div id="add_word_button" class="main_button">Ajout</div> - </div> - - <div id="add_word_page"> - <h2>Nouveau mot (lemme)</h2> - <input type="text" id="lemma" name="lemma" maxlength="60" value="" placeholder="votre mot" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" autofocus /> - - <div id="editor"> - - <div id="categories"> - <div class="category" id="select_nom" data-tag="N">Nom, adjectif</div> - <div class="category" id="select_verbe" data-tag="V">Verbe</div> - <div class="category" id="select_adverbe" data-tag="W">Adverbe</div> - <div class="category separator" id="select_prenom" data-tag="M1">Prénom</div> - <div class="category" id="select_patronyme" data-tag="M2">Patronyme</div> - <div class="category" id="select_nom_propre" data-tag="MP">Nom propre</div> - <div class="category separator" id="select_autre" data-tag="X">Autre</div> - </div> - - - <div id="sections"> - - <div id="section_vide"> - Sélectionnez une catégorie. - </div> - - <div id="section_nom" class="section"> - <h2>Nom, adjectif</h2> - <p class="typeline"> - <input type="radio" id="up_type_nom" name="POS" value=":N" /> <label class="widelabel" for="up_type_nom">Nom</label> - <input type="radio" id="up_type_adj" name="POS" value=":A" /> <label class="widelabel" for="up_type_adj">Adjectif</label> - <input type="radio" id="up_type_nomadj" name="POS" value=":N:A" /> <label class="widelabel" for="up_type_nomadj">Nom & adjectif</label> - </p> - <div class="container"> - <div class="block"> - <h3>Genre</h3> - <p><input type="radio" id="up_nom_genre_e" name="genre" value=":e" /><label for="up_nom_genre_e"> épicène</label></p> - <p><input type="radio" id="up_nom_genre_m" name="genre" value=":m" /><label for="up_nom_genre_m"> masculin</label></p> - <p><input type="radio" id="up_nom_genre_f" name="genre" value=":f" /><label for="up_nom_genre_f"> féminin</label></p> - </div> - <div class="block"> - <h3>Pluriel</h3> - <p><input type="radio" id="up_nom_pluriel_s" name="pluriel" value="s" /><label for="up_nom_pluriel_s"> pluriel en ·s</label></p> - <p><input type="radio" id="up_nom_pluriel_x" name="pluriel" value="x" /><label for="up_nom_pluriel_x"> pluriel en ·x</label></p> - <p><input type="radio" id="up_nom_pluriel_i" name="pluriel" value="i" /><label for="up_nom_pluriel_i"> invariable</label></p> - </div> - </div> - - <h2>[optionnel] Autre forme (masculine, féminine, variante, etc.)</h2> - <input type="text" id="lemma2" name="lemma2" maxlength="60" value="" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" placeholder="votre mot" /> - <div id="word_section2"> - <p class="typeline"> - <input type="radio" id="up_type_nom2" name="POS2" value=":N" /> <label class="widelabel" for="up_type_nom2">Nom</label> - <input type="radio" id="up_type_adj2" name="POS2" value=":A" /> <label class="widelabel" for="up_type_adj2">Adjectif</label> - <input type="radio" id="up_type_nomadj2" name="POS2" value=":N:A" /> <label class="widelabel" for="up_type_nomadj2">Nom & adjectif</label> - </p> - <div class="container"> - <div class="block"> - <h3>Genre</h3> - <p><input type="radio" id="up_nom2_genre_e" name="genre2" value=":e" /><label for="up_nom2_genre_e"> épicène</label></p> - <p><input type="radio" id="up_nom2_genre_m" name="genre2" value=":m" /><label for="up_nom2_genre_m"> masculin</label></p> - <p><input type="radio" id="up_nom2_genre_f" name="genre2" value=":f" /><label for="up_nom2_genre_f"> féminin</label></p> - </div> - <div class="block"> - <h3>Pluriel</h3> - <p><input type="radio" id="up_nom2_pluriel_s" name="pluriel2" value="s" /><label for="up_nom2_pluriel_s"> pluriel en ·s</label></p> - <p><input type="radio" id="up_nom2_pluriel_x" name="pluriel2" value="x" /><label for="up_nom2_pluriel_x"> pluriel en ·x</label></p> - <p><input type="radio" id="up_nom2_pluriel_i" name="pluriel2" value="i" /><label for="up_nom2_pluriel_i"> invariable</label></p> - </div> - </div> - </div> - </div> - - <div id="section_verbe" class="section"> - <h2>Verbe</h2> - <div class="block"> - <h3><input type="checkbox" id="up_v_i" value="i" /><label for="up_v_i"> intransitif</label></h3> - <div class="description">Cochez cette case si ce verbe peut s’utiliser sans complément d’objet.</div> - <details> - <div class="container"> - <div class="examples_true">Je dors.<br/>Tu pars.<br/>Elle pense.<br/>Nous écrivons.<br/>Vous manifestez.<br/>Ils viennent.</div> - <div class="examples_false">J’appartiens à ce groupe…</div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_t" value="t" /><label for="up_v_t"> transitif direct</label></h3> - <div class="description">Cochez cette case si ce verbe peut s’utiliser avec un complément d’objet direct (COD).</div> - <details> - <div class="container"> - <div class="examples_true">Je mange <i>une pomme</i>.<br/>Tu donnes <i>une bonne impression</i>.<br/>Elle écrit <i>un livre</i>.<br/>Nous fabriquons <i>une œuvre</i>.</div> - <div class="examples_false">Je pars.<br/>J’appartiens à…</div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_n" value="n" /><label for="up_v_n"> transitif indirect</label></h3> - <div class="description">Cochez cette case, si ce verbe peut s’utiliser avec un complément d’objet indirect (COI). Attention à ne pas confondre avec un complément circonstanciel de temps, de lieu ou de manière.</div> - <details> - <div class="container"> - <div class="examples_true">Je donne un cadeau <i>à sa femme</i>.<br/>Elle appartient <i>à ce groupe</i>.</div> - <div class="examples_false"></div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_p" value="p" /><label for="up_v_p"> pronominal</label></h3> - <div class="description">Cochez cette case si ce verbe peut s’utiliser pronominalement.</div> - <details> - <div class="container"> - <div class="examples_true">Je me suis trompé.<br/>Tu t’es étonné toi-même.<br/>Elle s’est souvenu de ses études.<br/>Nous nous sommes égarés.<br/>Vous vous êtes retrouvées.<br/>Ils se sont rappelé leur enfance.</div> - <div class="examples_false">Je me suis venu.<br/>tu t’es arrivé.<br/>elle s’est marché.<br/>nous nous sommes courus.<br/>vous vous êtes acculés.<br/>Elles se sont capitulées.</div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_m" value="m" /><label for="up_v_m"> impersonnel</label></h3> - <div class="description">Cochez cette case si ce verbe ne peut s’utiliser à la première personne, mais uniquement à la troisième personne du singulier ou du pluriel.</div> - <details> - <div class="container"> - <div class="examples_true">Il pleut.</div> - <div class="examples_false">Je pleus.</div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_ae" value="e" /><label for="up_v_ae"> passé composé avec l’auxiliaire “être”</label></h3> - <div class="description">Cochez cette case si ce verbe s’emploie au passé composé avec l’auxilaire “être”.</div> - <details> - <div class="container"> - <div class="examples_true">Je suis venu.<br/>Je suis parti.</div> - <div class="examples_false">J’ai venu.<br/>J’ai parti.</div> - </div> - </details> - </div> - <div class="block"> - <h3><input type="checkbox" id="up_v_aa" value="a" /><label for="up_v_aa"> passé composé avec l’auxiliaire “avoir”</label></h3> - <div class="description">Cochez cette case si ce verbe s’emploie au passé composé avec l’auxilaire “avoir”.</div> - <details> - <div class="container"> - <div class="examples_true">J’ai mangé.<br/>J’ai prié.</div> - <div class="examples_false">Je suis mangé.<br/>Je suis prié.</div> - </div> - </details> - </div> - - <div class="block"> - <h3><input type="checkbox" id="up_partpas" checked /><label for="up_partpas"> participes passés variables</label></h3> - <p>Cette option est ignorée si vous utilisez un verbe modèle.</p> - </div> - - <div class="block"> - <h3>Verbe modèle [optionnel]</h3> - <p>Indiquer un verbe qui doit servir de modèle n’est pas nécessaire pour la très grande majorité des verbes du 1ᵉʳ groupe et du 2ᵉ groupe. Failes-le seulement si les formes fléchies engendrées automatiquement ne vous satisfont pas.</p> - <input type="text" id="verb_pattern" name="verb_pattern" maxlength="60" value="" placeholder="verbe modèle" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ-]+$" /> - <details> - <p>Il est fortement recommandé d’appliquer les règles d’un verbe du même groupe que celui que vous créez. Mais aucune restriction n’est imposée.</p> - <p><b>Classification des groupes :</b></p> - <ul> - <li><b>1ᵉʳ groupe</b> : verbes finissant par -<i>er</i>. Attention : contrairement au préjugé commun, ce groupe est irrégulier. Beaucoup de verbes voient leur racine modifiée dans certaines formes conjuguées : - <ul> - <li>ajout ou modification de diacritiques (verbes finissant par -<i>cer</i>, -<i>ecer</i>, -<i>emer</i>, -<i>ener</i>, -<i>eper</i>, -<i>erer</i>, -<i>eser</i>, -<i>ever</i>, -<i>evrer</i>, -<i>eler</i>, -<i>eter</i>, -<i>ébrer</i>, -<i>écer</i>, -<i>écher</i>, -<i>écrer</i>, -<i>éder</i>, -<i>éger</i>, -<i>égler</i>, -<i>égner</i>, -<i>égrer</i>, -<i>éguer</i>, -<i>éler</i>, -<i>émer</i>, -<i>éner</i>, -<i>éper</i>, -<i>équer</i>, -<i>érer</i>, -<i>éser</i>, -<i>éter</i>, -<i>étrer</i>, -<i>évrer</i>, -<i>éyer</i>),</li> - <li>un ‹e› euphonique est ajouté sur la plupart des verbes finissant par -<i>ger</i>,</li> - <li>certains verbes finissant par -<i>yer</i> remplacent éventuellement le ‹y› par un ‹i›,</li> - <li>doublement irrégulier de certaines consonnes (<i>geler</i> ne se conjugue pas comme <i>appeler</i>, <i>acheter</i> ne se conjugue pas comme <i>jeter</i>)</li> - <li>irrégularités diverses (<i>aller</i>, <i>envoyer</i>, <i>renvoyer</i>)… - </ul></li> - <li><b>2ᵉ groupe</b> : verbes finissant par -<i>ir</i>. Ce groupe est de loin le plus régulier. Mais de nombreux verbes finissant par -<i>ir</i> appartiennent au 3ᵉ groupe.</li> - <li><b>3ᵉ groupe</b>. Autres verbes irréguliers.</li> - <li>Les verbes <i>être</i> et <i>avoir</i> n’appartiennent à aucun groupe. Il est recommandé de ne pas s’en servir comme modèle.</li> - </ul> - </details> - </div> - </div> - - <div id="section_adverbe" class="section"> - <h2>Adverbe</h2> - <p>Les adverbes sont invariables en genre et en nombre.</p> - </div> - - <div id="section_prenom" class="section"> - <h2>Prénom</h2> - <div class="container"> - <div class="block"> - <h3>Genre</h3> - <p><input type="radio" id="up_prenom_genre_e" name="genre_m1" value=":e" /><label for="up_prenom_genre_e"> épicène</label></p> - <p><input type="radio" id="up_prenom_genre_m" name="genre_m1" value=":m" /><label for="up_prenom_genre_m"> masculin</label></p> - <p><input type="radio" id="up_prenom_genre_f" name="genre_m1" value=":f" /><label for="up_prenom_genre_f"> féminin</label></p> - </div> - <div class="block"> - <h3>Pluriel</h3> - <p>Les prénoms sont invariables en nombre.</p> - </div> - </div> - </div> - - <div id="section_patronyme" class="section"> - <h2>Patronyme</h2> - <div class="container"> - <div class="block"> - <h3>Genre</h3> - <p><input type="radio" id="up_patronyme_genre_e" name="genre_m2" value=":e" /><label for="up_patronyme_genre_e"> épicène</label></p> - <p><input type="radio" id="up_patronyme_genre_m" name="genre_m2" value=":m" /><label for="up_patronyme_genre_m"> masculin</label></p> - <p><input type="radio" id="up_patronyme_genre_f" name="genre_m2" value=":f" /><label for="up_patronyme_genre_f"> féminin</label></p> - </div> - <div class="block"> - <h3>Pluriel</h3> - <p>Les noms de famille sont invariables en nombre.</p> - </div> - </div> - </div> - - <div id="section_nom_propre" class="section"> - <h2>Nom propre</h2> - <div class="container"> - <div class="block"> - <h3>Genre</h3> - <p><input type="radio" id="up_nom_propre_genre_e" name="genre_mp" value=":e" /><label for="up_nom_propre_genre_e"> épicène</label></p> - <p><input type="radio" id="up_nom_propre_genre_m" name="genre_mp" value=":m" /><label for="up_nom_propre_genre_m"> masculin</label></p> - <p><input type="radio" id="up_nom_propre_genre_f" name="genre_mp" value=":f" /><label for="up_nom_propre_genre_f"> féminin</label></p> - </div> - <div class="block"> - <h3>Pluriel</h3> - <p>Les noms propres sont invariables en nombre.</p> - </div> - </div> - </div> - - <div id="section_autre" class="section"> - <h2>Autre</h2> - <p>Indiquez les étiquettes grammaticales que vous voulez appliquer au mot. À utiliser seulement si vous savez ce que vous faites.</p> - <h3>Flexion</h3> - <p><input type="text" id="flexion" name="flexion" maxlength="20" value="" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" placeholder="flexion" /></p> - <h3>Étiquettes</h3> - <p><input type="text" id="tags" name="tags" maxlength="20" value="" pattern="^:[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ:._-]+$" placeholder="étiquettes" /></p> - </div> - </div> - </div> - - <div id="actions"> - <h2>Mots générés</h2> - <h3>Forme fléchie (lemme), étiquettes</h3> - <pre id="results"> - - </pre> - - <div id="buttonline"> - <div id="add_to_lexicon">Ajouter au dictionnaire</div> - </div> - </div> - </div> - - <div id="lexicon_page"> - - <h2>Votre lexique</h2> - - <div class="button_block"> - <div id="save_button" class="fright"> - Enregistrer - </div> - <h3>Lexique</h3> - <p>Nombre d’entrées ajoutées : <span id="num_added_entries">0</span>.</p> - <p>Nombre d’entrées supprimées : <span id="num_deleted_entries">0</span>.</p> - <p>Nombre d’entrées : <span id="num_entries">0</span>.</p> - <p><progress id="build_progress" value="0"></p> - <div id="export_button" class="fright"> - Exporter - </div> - <div id="import_button" class="fright"> - Importer - </div> - <h3>Dictionnaire enregistré</h3> - <p>Dernière sauvegarde : <span id="save_date">néant</span>.</p> - <p>Nombre d’entrées : <span id="num_entries_saved">0</span>.</p> - </div> - - - <p id="no_elem_line">Aucun élément.</p> - <p><progress id="display_progress" value="0"></p> - - <table id="table"> - - </table> - </div> - </div> - - - <script src="../grammalecte/graphspell/helpers.js"></script> - <script src="../grammalecte/graphspell/str_transform.js"></script> - <script src="../grammalecte/graphspell/dawg.js"></script> - <script src="../grammalecte/graphspell/ibdawg.js"></script> - <script src="../grammalecte/fr/conj.js"></script> - <script src="lex_conj_data.js"></script> - <script src="lex_editor.js"></script> - </body> - + <head> + <link rel="stylesheet" type="text/css" href="lex_editor.css" /> + <title>Grammalecte · Éditeur lexical</title> + <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + </head> + + <body> + + <div class="inbox"> + + <h1>Éditeur lexical</h1> + + <div class="big_block"> + <div class="dic_container"> + <div><h3>Dictionnaire personnel</h3></div> + <div>Enregistré le : <span id="dic_save_date">—</span></div> + <div><span id="dic_num_entries">0</span> entrées</div> + <div id="export_button" class="fright">Exporter</div> + <div id="import_button" class="fright">Importer</div> + </div> + <progress id="wait_progress" value="0"></progress> + </div> + + <div id="buttons" class="container"> + <div id="lexicon_button" class="main_button">Lexique</div> + <div id="add_word_button" class="main_button">Ajout</div> + </div> + + <div id="add_word_page"> + <div class="columns"> + <div id="word_generator"> + <h2>Nouveau mot (lemme)</h2> + <input type="text" id="lemma" name="lemma" maxlength="60" value="" placeholder="votre mot" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" autofocus /> + + <div id="editor"> + + <div id="sections"> + <h3 class="category" id="select_nom" data-tag="N">Nom commun</h3> + <div id="section_nom" class="section"> + <p class="typeline"> + <input type="radio" id="up_type_nom" name="POS" value=":N" /> <label class="widelabel" for="up_type_nom">Nom</label> + <input type="radio" id="up_type_adj" name="POS" value=":A" /> <label class="widelabel" for="up_type_adj">Adjectif</label> + <input type="radio" id="up_type_nomadj" name="POS" value=":N:A" /> <label class="widelabel" for="up_type_nomadj">Nom & adjectif</label> + </p> + <div class="container"> + <div class="block"> + <h3>Genre</h3> + <p><input type="radio" id="up_nom_genre_e" name="genre" value=":e" /><label for="up_nom_genre_e"> épicène</label></p> + <p><input type="radio" id="up_nom_genre_m" name="genre" value=":m" /><label for="up_nom_genre_m"> masculin</label></p> + <p><input type="radio" id="up_nom_genre_f" name="genre" value=":f" /><label for="up_nom_genre_f"> féminin</label></p> + </div> + <div class="block"> + <h3>Pluriel</h3> + <p><input type="radio" id="up_nom_pluriel_s" name="pluriel" value="s" /><label for="up_nom_pluriel_s"> pluriel en ·s</label></p> + <p><input type="radio" id="up_nom_pluriel_x" name="pluriel" value="x" /><label for="up_nom_pluriel_x"> pluriel en ·x</label></p> + <p><input type="radio" id="up_nom_pluriel_i" name="pluriel" value="i" /><label for="up_nom_pluriel_i"> invariable</label></p> + </div> + </div> + + <h3>[optionnel] Autre forme (masculine, féminine, variante, etc.)</h3> + <input type="text" id="lemma2" name="lemma2" maxlength="60" value="" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" placeholder="votre mot" /> + <div id="word_section2"> + <p class="typeline"> + <input type="radio" id="up_type_nom2" name="POS2" value=":N" /> <label class="widelabel" for="up_type_nom2">Nom</label> + <input type="radio" id="up_type_adj2" name="POS2" value=":A" /> <label class="widelabel" for="up_type_adj2">Adjectif</label> + <input type="radio" id="up_type_nomadj2" name="POS2" value=":N:A" /> <label class="widelabel" for="up_type_nomadj2">Nom & adjectif</label> + </p> + <div class="container"> + <div class="block"> + <h3>Genre</h3> + <p><input type="radio" id="up_nom2_genre_e" name="genre2" value=":e" /><label for="up_nom2_genre_e"> épicène</label></p> + <p><input type="radio" id="up_nom2_genre_m" name="genre2" value=":m" /><label for="up_nom2_genre_m"> masculin</label></p> + <p><input type="radio" id="up_nom2_genre_f" name="genre2" value=":f" /><label for="up_nom2_genre_f"> féminin</label></p> + </div> + <div class="block"> + <h3>Pluriel</h3> + <p><input type="radio" id="up_nom2_pluriel_s" name="pluriel2" value="s" /><label for="up_nom2_pluriel_s"> pluriel en ·s</label></p> + <p><input type="radio" id="up_nom2_pluriel_x" name="pluriel2" value="x" /><label for="up_nom2_pluriel_x"> pluriel en ·x</label></p> + <p><input type="radio" id="up_nom2_pluriel_i" name="pluriel2" value="i" /><label for="up_nom2_pluriel_i"> invariable</label></p> + </div> + </div> + </div> + </div> + + <h3 class="category" id="select_verbe" data-tag="V">Verbe</h3> + <div id="section_verbe" class="section"> + <div class="block"> + <h3><input type="checkbox" id="up_v_i" value="i" /><label for="up_v_i"> intransitif</label></h3> + <div class="description">Le verbe peut s’utiliser sans complément d’objet.</div> + <details> + <div class="container"> + <div class="examples_true">Je dors.<br/>Tu pars.<br/>Elle pense.<br/>Nous écrivons.<br/>Vous manifestez.<br/>Ils viennent.</div> + <div class="examples_false">J’appartiens à ce groupe…<br/>J’accède au niveau supérieur.</div> + </div> + </details> + </div> + <div class="block"> + <h3><input type="checkbox" id="up_v_t" value="t" /><label for="up_v_t"> transitif direct</label></h3> + <div class="description">Ce verbe peut s’utiliser avec un complément d’objet direct (COD).</div> + <details> + <div class="container"> + <div class="examples_true">Je mange <i>une pomme</i>.<br/>Tu donnes <i>une bonne impression</i>.<br/>Elle écrit <i>un livre</i>.<br/>Nous fabriquons <i>une œuvre</i>.</div> + <div class="examples_false">Je pars ce matin.<br/>J’appartiens à…</div> + </div> + </details> + </div> + <div class="block"> + <h3><input type="checkbox" id="up_v_n" value="n" /><label for="up_v_n"> transitif indirect</label></h3> + <div class="description">Ce verbe peut s’utiliser avec un complément d’objet indirect (COI). Attention à ne pas confondre avec un complément circonstanciel de temps, de lieu ou de manière.</div> + <details> + <div class="container"> + <div class="examples_true">Je donne un cadeau <i>à sa femme</i>.<br/>Elle appartient <i>à ce groupe</i>.</div> + <div class="examples_false">Elle danse à l’opéra.</div> + </div> + </details> + </div> + <div class="block"> + <h3><input type="checkbox" id="up_v_p" value="p" /><label for="up_v_p"> pronominal</label></h3> + <div class="description">Ce verbe peut s’utiliser pronominalement.</div> + <details> + <div class="container"> + <div class="examples_true">Je me suis trompé.<br/>Tu t’es étonné toi-même.<br/>Elle s’est souvenu de ses études.<br/>Nous nous sommes égarés.<br/>Vous vous êtes retrouvées.<br/>Ils se sont rappelé leur enfance.</div> + <div class="examples_false">Je me suis venu.<br/>tu t’es arrivé.<br/>elle s’est marché.<br/>nous nous sommes courus.<br/>vous vous êtes acculés.<br/>Elles se sont capitulées.</div> + </div> + </details> + </div> + <div class="block"> + <h3><input type="checkbox" id="up_v_m" value="m" /><label for="up_v_m"> impersonnel</label></h3> + <div class="description">Ce verbe ne peut s’utiliser à la première personne, mais uniquement à la troisième personne du singulier ou du pluriel.</div> + <details> + <div class="container"> + <div class="examples_true">Il pleut.<br/>Il faut.</div> + <div class="examples_false">Je pleus.<br/>Nous fallons.</div> + </div> + </details> + </div> + <div class="block"> + <h3>Auxiliaire pour le passé composé</label></h3> + <div><input type="checkbox" id="up_v_ae" value="e" /><label for="up_v_ae"> être</label></div> + <details> + <div class="container"> + <div class="examples_true">Je suis venu.<br/>Je suis parti.</div> + <div class="examples_false">J’ai venu.<br/>J’ai parti.</div> + </div> + </details> + <div><input type="checkbox" id="up_v_aa" value="a" /><label for="up_v_aa"> avoir</label></div> + <details> + <div class="container"> + <div class="examples_true">J’ai mangé.<br/>J’ai prié.</div> + <div class="examples_false">Je suis mangé.<br/>Je suis prié.</div> + </div> + </details> + </div> + + <div class="block"> + <h3><input type="checkbox" id="up_partpas" checked /><label for="up_partpas"> participes passés variables</label></h3> + <p class="description">Cette option est ignorée si vous utilisez un verbe modèle.</p> + </div> + + <div class="block"> + <h3>Verbe modèle [optionnel]</h3> + <p class="description">Indiquer un verbe qui doit servir de modèle n’est pas nécessaire pour la très grande majorité des verbes du 1ᵉʳ groupe et du 2ᵉ groupe. Faites-le seulement si les formes fléchies engendrées automatiquement ne vous satisfont pas.</p> + <input type="text" id="verb_pattern" name="verb_pattern" maxlength="60" value="" placeholder="verbe modèle" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ-]+$" /> + <details> + <p>Il est fortement recommandé d’appliquer les règles d’un verbe du même groupe que celui que vous créez. Mais aucune restriction n’est imposée.</p> + <p><b>Classification des groupes :</b></p> + <ul> + <li> + <b>1ᵉʳ groupe</b> : verbes finissant par -<i>er</i>. Attention : contrairement au préjugé commun, ce groupe est irrégulier. Beaucoup de verbes voient leur racine modifiée dans certaines formes conjuguées : + <ul> + <li>ajout ou modification de diacritiques (verbes finissant par -<i>cer</i>, -<i>ecer</i>, -<i>emer</i>, -<i>ener</i>, -<i>eper</i>, -<i>erer</i>, -<i>eser</i>, -<i>ever</i>, -<i>evrer</i>, -<i>eler</i>, -<i>eter</i>, -<i>ébrer</i>, -<i>écer</i>, -<i>écher</i>, -<i>écrer</i>, -<i>éder</i>, -<i>éger</i>, -<i>égler</i>, -<i>égner</i>, -<i>égrer</i>, -<i>éguer</i>, -<i>éler</i>, -<i>émer</i>, -<i>éner</i>, -<i>éper</i>, -<i>équer</i>, -<i>érer</i>, -<i>éser</i>, -<i>éter</i>, -<i>étrer</i>, -<i>évrer</i>, -<i>éyer</i>),</li> + <li>un ‹e› euphonique est ajouté sur la plupart des verbes finissant par -<i>ger</i>,</li> + <li>certains verbes finissant par -<i>yer</i> remplacent éventuellement le ‹y› par un ‹i›,</li> + <li>doublement irrégulier de certaines consonnes (<i>geler</i> ne se conjugue pas comme <i>appeler</i>, <i>acheter</i> ne se conjugue pas comme <i>jeter</i>)</li> + <li>irrégularités diverses (<i>aller</i>, <i>envoyer</i>, <i>renvoyer</i>)…</li> + </ul> + </li> + <li><b>2ᵉ groupe</b> : verbes finissant par -<i>ir</i>. Ce groupe est de loin le plus régulier. Mais de nombreux verbes finissant par -<i>ir</i> appartiennent au 3ᵉ groupe.</li> + <li><b>3ᵉ groupe</b>. Autres verbes irréguliers.</li> + <li>Les verbes <i>être</i> et <i>avoir</i> n’appartiennent à aucun groupe. Il est recommandé de ne pas s’en servir comme modèle.</li> + </ul> + </details> + </div> + </div> + + <h3 class="category" id="select_adverbe" data-tag="W">Adverbe</h3> + <div id="section_adverbe" class="section"> + <p>Les adverbes sont invariables en genre et en nombre.</p> + </div> + + <h3 class="category" id="select_nom_propre" data-tag="M">Nom propre</h3> + <div id="section_nom_propre" class="section"> + <div class="container"> + <div class="block"> + <h3>Genre</h3> + <p><input type="radio" id="up_nom_propre_M1" name="pos_nom_propre" value=":M1" /><label for="up_nom_propre_M1"> Prénom</label></p> + <p><input type="radio" id="up_nom_propre_M2" name="pos_nom_propre" value=":M2" /><label for="up_nom_propre_M2"> Patronyme</label></p> + <p><input type="radio" id="up_nom_propre_MP" name="pos_nom_propre" value=":MP" /><label for="up_nom_propre_MP"> Autre</label></p> + </div> + <div class="block"> + <h3>Genre</h3> + <p><input type="radio" id="up_nom_propre_genre_e" name="genre_m" value=":e" /><label for="up_nom_propre_genre_e"> épicène</label></p> + <p><input type="radio" id="up_nom_propre_genre_m" name="genre_m" value=":m" /><label for="up_nom_propre_genre_m"> masculin</label></p> + <p><input type="radio" id="up_nom_propre_genre_f" name="genre_m" value=":f" /><label for="up_nom_propre_genre_f"> féminin</label></p> + </div> + </div> + </div> + <h3 class="category" id="select_autre" data-tag="X">Autre</h3> + <div id="section_autre" class="section"> + <p>Indiquez les étiquettes grammaticales que vous voulez appliquer au mot. À utiliser seulement si vous savez ce que vous faites.</p> + <h3>Flexion</h3> + <p><input type="text" id="flexion" name="flexion" maxlength="20" value="" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" placeholder="flexion" /></p> + <h3>Étiquettes</h3> + <p><input type="text" id="tags" name="tags" maxlength="20" value="" pattern="^:[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ:._-]+$" placeholder="étiquettes" /></p> + </div> + </div> + </div> + </div> <!-- #new_word_generator --> + + <div id="generated_words"> + <h2>Mots générés</h2> + <table id="generated_words_table"> + + </table> + <div id="buttonline"> + <div id="add_to_lexicon">Ajouter au lexique</div> + </div> + </div> <!-- #generated_words --> + </div> <!-- .columns --> + </div> <!-- #add_word_page --> + + + <div id="lexicon_page"> + <h2>Votre lexique</h2> + <div class="big_block"> + <div id="save_button" class="fright"> + Enregistrer + </div> + <p>Nombre d’entrées : <span id="num_entries">0</span>.</p> + </div> + + <table id="lexicon_table"> + + </table> + </div> <!-- #lexicon_page --> + + </div> + + + <script src="../grammalecte/graphspell/helpers.js"></script> + <script src="../grammalecte/graphspell/str_transform.js"></script> + <script src="../grammalecte/graphspell/dawg.js"></script> + <script src="../grammalecte/graphspell/ibdawg.js"></script> + <script src="../grammalecte/fr/conj.js"></script> + <script src="../grammalecte/fr/conj_generator.js"></script> + <script src="lex_editor.js"></script> + </body> + </html> Index: gc_lang/fr/webext/panel/lex_editor.js ================================================================== --- gc_lang/fr/webext/panel/lex_editor.js +++ gc_lang/fr/webext/panel/lex_editor.js @@ -8,10 +8,19 @@ if (typeof(browser) !== "object") { var browser = chrome; bChrome = true; } + +/* + Common functions +*/ + +function showError (e) { + console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); +} + function createNode (sType, oAttr, oDataset=null) { try { let xNode = document.createElement(sType); Object.assign(xNode, oAttr); if (oDataset) { @@ -22,87 +31,199 @@ catch (e) { showError(e); } } -function showError (e) { - console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); -} - - -document.getElementById("lexicon_button").addEventListener("click", () => { oWidgets.showPage("lexicon"); }, false); -document.getElementById("add_word_button").addEventListener("click", () => { oWidgets.showPage("lemma"); }, false); - -document.getElementById("table").addEventListener("click", (xEvent) => { oWidgets.onTableClick(xEvent); }, false); -document.getElementById("save_button").addEventListener("click", () => { oLexicon.save(); }, false); -document.getElementById("export_button").addEventListener("click", () => { oBinaryDict.export(); }, false); - -document.getElementById("editor").addEventListener("click", (xEvent) => { oWidgets.onSelectionClick(xEvent); }, false); -document.getElementById("lemma").addEventListener("keyup", () => { oWidgets.onWrite(); }, false); -document.getElementById("lemma2").addEventListener("keyup", () => { oWidgets.onWrite2(); }, false); -document.getElementById("verb_pattern").addEventListener("keyup", () => { oFlexGen.update(); }, false); -document.getElementById("flexion").addEventListener("keyup", () => { oFlexGen.update(); }, false); -document.getElementById("tags").addEventListener("keyup", () => { oFlexGen.update(); }, false); -document.getElementById("add_to_lexicon").addEventListener("click", () => { oFlexGen.addToLexicon(); }, false); - - - -/* - ACTIONS -*/ - -const oWidgets = { - - showPage: function (sPage) { - if (sPage == "lexicon") { - this.hideElement("add_word_page"); - this.showElement("lexicon_page"); - document.getElementById("lexicon_button").style.backgroundColor = "hsl(210, 80%, 90%)"; - document.getElementById("add_word_button").style.backgroundColor = "hsl(210, 10%, 95%)"; - } else { - this.hideElement("lexicon_page"); - this.showElement("add_word_page"); - document.getElementById("lexicon_button").style.backgroundColor = "hsl(210, 10%, 95%)"; - document.getElementById("add_word_button").style.backgroundColor = "hsl(210, 80%, 90%)"; - document.getElementById("lemma").focus(); - } - }, - - showElement: function (sElemId) { - if (document.getElementById(sElemId)) { - document.getElementById(sElemId).style.display = "block"; - } else { - console.log("HTML node named <" + sElemId + "> not found.") - } - }, - - hideElement: function (sElemId) { - if (document.getElementById(sElemId)) { - document.getElementById(sElemId).style.display = "none"; - } else { - console.log("HTML node named <" + sElemId + "> not found.") - } - }, - - hideAllSections: function () { - for (let xElem of document.getElementById("sections").childNodes) { - if (xElem.id) { - xElem.style.display = "none"; - } +function showElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).style.display = "block"; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + +function hideElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).style.display = "none"; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + +function showPage (sPage) { + if (sPage == "lexicon") { + hideElement("add_word_page"); + showElement("lexicon_page"); + document.getElementById("lexicon_button").style.backgroundColor = "hsl(210, 80%, 90%)"; + document.getElementById("add_word_button").style.backgroundColor = "hsl(210, 10%, 95%)"; + } else { + hideElement("lexicon_page"); + showElement("add_word_page"); + document.getElementById("lexicon_button").style.backgroundColor = "hsl(210, 10%, 95%)"; + document.getElementById("add_word_button").style.backgroundColor = "hsl(210, 80%, 90%)"; + document.getElementById("lemma").focus(); + } +} + + +document.getElementById("lexicon_button").addEventListener("click", () => { showPage("lexicon"); }, false); +document.getElementById("add_word_button").addEventListener("click", () => { showPage("lemma"); }, false); + +document.getElementById("save_button").addEventListener("click", () => { oBinaryDict.build(); }, false); + + + +class Table { + + constructor (sNodeId, lColumn, sProgressBarId, sResultId="") { + this.sNodeId = sNodeId; + this.xTable = document.getElementById(sNodeId); + this.nColumn = lColumn.length; + this.lColumn = lColumn; + this.xProgressBar = document.getElementById(sProgressBarId); + this.xNumEntry = document.getElementById(sResultId); + this.iEntryIndex = 0; + this.lEntry = []; + this.nEntry = 0 + this._createHeader(); + this.listen(); + } + + _createHeader () { + let xRowNode = createNode("tr"); + xRowNode.appendChild(createNode("th", { textContent: "·", width: "12px" })); + //xRowNode.appendChild(createNode("th", { textContent: "#" })); + for (let sColumn of this.lColumn) { + xRowNode.appendChild(createNode("th", { textContent: sColumn })); + } + this.xTable.appendChild(xRowNode); + } + + 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; + } + 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.textContent = this.nEntry; + } + } + + _addRow (lData) { + let xRowNode = createNode("tr", { id: this.sNodeId + "_row_" + this.iEntryIndex }); + xRowNode.appendChild(createNode("td", { textContent: "×", className: "delete_entry", title: "Effacer cette entrée" }, { id_entry: this.iEntryIndex })); + //xRowNode.appendChild(createNode("td", { textContent: this.iEntryIndex })); + for (let data of lData) { + xRowNode.appendChild(createNode("td", { textContent: data })); + } + this.xTable.appendChild(xRowNode); + this.iEntryIndex += 1; + } + + listen () { + this.xTable.addEventListener("click", (xEvent) => { this.onTableClick(xEvent); }, false); + } + + onTableClick (xEvent) { + try { + let xElem = xEvent.target; + if (xElem.className) { + if (xElem.className == "delete_entry") { + this.deleteRow(xElem.dataset.id_entry); + } + } + } + catch (e) { + showError(e); + } + } + + deleteRow (iEntry) { + this.lEntry[parseInt(iEntry)] = null; + if (document.getElementById(this.sNodeId + "_row_" + iEntry)) { + document.getElementById(this.sNodeId + "_row_" + iEntry).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("editor").addEventListener("click", (xEvent) => { this.onSelectionClick(xEvent); }, false); + document.getElementById("lemma").addEventListener("keyup", () => { this.onWrite(); }, false); + document.getElementById("lemma2").addEventListener("keyup", () => { this.onWrite2(); }, false); + document.getElementById("verb_pattern").addEventListener("keyup", () => { this.update(); }, false); + document.getElementById("flexion").addEventListener("keyup", () => { this.update(); }, false); + document.getElementById("tags").addEventListener("keyup", () => { this.update(); }, false); + document.getElementById("add_to_lexicon").addEventListener("click", () => { this.addToLexicon(); }, false); + }, + + lSection: ["nom", "verbe", "adverbe", "nom_propre", "autre"], + + hideAllSections: function () { + for (let sSection of this.lSection) { + hideElement("section_" + sSection); + document.getElementById("select_" + sSection).style.backgroundColor = ""; } }, showSection: function (sName) { this.clear(); this.hideAllSections(); - this.showElement(sName); + if (document.getElementById(sName).style.display == "none") { + showElement(sName); + } else { + hideElement(sName); + } }, clear: function () { try { document.getElementById("lemma2").value = ""; - this.hideElement("word_section2"); + hideElement("word_section2"); // nom, adjectif, noms propres for (let xElem of document.getElementsByName("POS")) { xElem.checked = false; } for (let xElem of document.getElementsByName("POS2")) { @@ -142,14 +263,15 @@ try { let xElem = xEvent.target; if (xElem.id) { if (xElem.id.startsWith("select_")) { this.showSection("section_" + xElem.id.slice(7)); - oFlexGen.setMainTag(xElem.dataset.tag); - oFlexGen.update(); + xElem.style.backgroundColor = "hsl(210, 50%, 90%)"; + this.cMainTag = xElem.dataset.tag; + this.update(); } else if (xElem.id.startsWith("up_")) { - oFlexGen.update(); + this.update(); } } } catch (e) { showError(e); @@ -156,196 +278,73 @@ } }, onWrite: function () { if (document.getElementById("lemma").value.trim() !== "") { - this.showElement("editor"); - oFlexGen.update(); + showElement("editor"); + this.update(); } else { - this.showSection("section_vide"); - this.hideElement("editor"); - this.hideElement("actions"); + hideElement("editor"); } }, onWrite2: function () { if (document.getElementById("lemma2").value.trim() !== "") { - this.showElement("word_section2"); - oFlexGen.update(); - } else { - this.hideElement("word_section2"); - } - }, - - createTableHeader: function () { - let xRowNode = createNode("tr"); - xRowNode.appendChild(createNode("th", { textContent: "·" })); - xRowNode.appendChild(createNode("th", { textContent: "#" })); - xRowNode.appendChild(createNode("th", { textContent: "Forme fléchie" })); - xRowNode.appendChild(createNode("th", { textContent: "Lemme" })); - xRowNode.appendChild(createNode("th", { textContent: "Étiquettes" })); - return xRowNode; - }, - - createRowNode: function (n, sFlexion, sLemma, sTags) { - let xRowNode = createNode("tr", { id: "row_" + n }); - xRowNode.appendChild(createNode("td", { textContent: "×", className: "delete_entry", title: "Effacer cette entrée" }, { id_entry: n })); - xRowNode.appendChild(createNode("td", { textContent: n })); - xRowNode.appendChild(createNode("td", { textContent: sFlexion })); - xRowNode.appendChild(createNode("td", { textContent: sLemma })); - xRowNode.appendChild(createNode("td", { textContent: sTags })); - return xRowNode; - }, - - displayTable: function (lFlex) { - this.clearTable(); - if (lFlex.length > 0) { - this.showElement("display_progress"); - let xDisplayProgress = document.getElementById("display_progress"); - let xTable = document.getElementById("table"); - let n = 0; - xDisplayProgress.max = lFlex.length; - xDisplayProgress.value = 1; - this.hideElement("no_elem_line"); - xTable.appendChild(this.createTableHeader()); - for (let [sFlexion, sLemma, sTags] of lFlex) { - xTable.appendChild(this.createRowNode(n, sFlexion, sLemma, sTags)); - n += 1; - xDisplayProgress.value += 1; - } - xDisplayProgress.value = xDisplayProgress.max; - this.hideElement("display_progress"); - } else { - this.showElement("no_elem_line"); - } - this.updateData(); - }, - - clearTable: function () { - let xTable = document.getElementById("table"); - while (xTable.firstChild) { - xTable.removeChild(xTable.firstChild); - } - }, - - onTableClick: function (xEvent) { - try { - let xElem = xEvent.target; - if (xElem.className) { - if (xElem.className == "delete_entry") { - this.deleteEntry(xElem.dataset.id_entry); - } - } - } - catch (e) { - showError(e); - } - }, - - addEntriesToTable: function (iStart, lFlex) { - let xTable = document.getElementById("table"); - if (lFlex.length > 0) { - if (document.getElementById("no_elem_line").style.display !== "none") { - this.hideElement("no_elem_line"); - xTable.appendChild(this.createTableHeader()); - } - for (let [sFlexion, sLemma, sTags] of lFlex) { - xTable.appendChild(this.createRowNode(iStart, sFlexion, sLemma, sTags)); - iStart += 1; - } - } - this.updateData(); - }, - - deleteEntry: function (iEntry) { - oLexicon.deleteEntry(iEntry); - this.hideElement("row_"+iEntry); - this.showElement("save_button"); - this.updateData(); - }, - - updateData: function () { - document.getElementById("num_added_entries").textContent = oLexicon.nAddedEntries; - document.getElementById("num_deleted_entries").textContent = oLexicon.nDeletedEntries; - document.getElementById("num_entries").textContent = oLexicon.nEntries; - }, - - setDictData: function (nEntries, sDate) { - document.getElementById("num_entries_saved").textContent = nEntries; - document.getElementById("save_date").textContent = sDate; - } -} - - - -const oFlexGen = { - - cMainTag: "", - - lFlexion: [], - - clear: function () { - this.lFlexion = []; - oWidgets.hideElement("actions"); - }, - - setMainTag: function (sValue) { - this.cMainTag = sValue; - }, - - addFlexion: function (sFlexion, sLemma, sTag) { - this.lFlexion.push( [sFlexion, sLemma, sTag] ); + showElement("word_section2"); + this.update(); + } else { + hideElement("word_section2"); + } }, update: function () { try { - this.clear(); - let sGenderTag = ""; - let sLemma = document.getElementById("lemma").value.trim(); - if (sLemma.length > 0) { + this.lFlexion = []; + this.sLemma = document.getElementById("lemma").value.trim(); + if (this.sLemma.length > 0) { switch (this.cMainTag) { case "N": if (!this.getRadioValue("POS") || !this.getRadioValue("genre")) { break; } let sTag = this.getRadioValue("POS") + this.getRadioValue("genre"); switch (this.getRadioValue("pluriel")) { case "s": - this.addFlexion(sLemma, sLemma, sTag+":s/*"); - this.addFlexion(sLemma+"s", sLemma, sTag+":p/*"); + this.lFlexion.push([this.sLemma, sTag+":s/*"]); + this.lFlexion.push([this.sLemma+"s", sTag+":p/*"]); break; case "x": - this.addFlexion(sLemma, sLemma, sTag+":s/*"); - this.addFlexion(sLemma+"x", sLemma, sTag+":p/*"); + this.lFlexion.push([this.sLemma, sTag+":s/*"]); + this.lFlexion.push([this.sLemma+"x", sTag+":p/*"]); break; case "i": - this.addFlexion(sLemma, sLemma, sTag+":i/*"); + this.lFlexion.push([this.sLemma, sTag+":i/*"]); break; } let sLemma2 = document.getElementById("lemma2").value.trim(); if (sLemma2.length > 0 && this.getRadioValue("POS2") && this.getRadioValue("genre2")) { let sTag2 = this.getRadioValue("POS2") + this.getRadioValue("genre2"); switch (this.getRadioValue("pluriel2")) { case "s": - this.addFlexion(sLemma2, sLemma, sTag2+":s/*"); - this.addFlexion(sLemma2+"s", sLemma, sTag2+":p/*"); + this.lFlexion.push([sLemma2, sTag2+":s/*"]); + this.lFlexion.push([sLemma2+"s", sTag2+":p/*"]); break; case "x": - this.addFlexion(sLemma2, sLemma, sTag2+":s/*"); - this.addFlexion(sLemma2+"x", sLemma, sTag2+":p/*"); + this.lFlexion.push([sLemma2, sTag2+":s/*"]); + this.lFlexion.push([sLemma2+"x", sTag2+":p/*"]); break; case "i": - this.addFlexion(sLemma2, sLemma, sTag2+":i/*"); + this.lFlexion.push([sLemma2, sTag2+":i/*"]); break; } } break; case "V": { - if (!sLemma.endsWith("er") && !sLemma.endsWith("ir") && !sLemma.endsWith("re")) { + if (!this.sLemma.endsWith("er") && !this.sLemma.endsWith("ir") && !this.sLemma.endsWith("re")) { break; } - sLemma = sLemma.toLowerCase(); + this.sLemma = this.sLemma.toLowerCase(); let cGroup = ""; let c_i = (document.getElementById("up_v_i").checked) ? "i" : "_"; let c_t = (document.getElementById("up_v_t").checked) ? "t" : "_"; let c_n = (document.getElementById("up_v_n").checked) ? "n" : "_"; let c_p = (document.getElementById("up_v_p").checked) ? "p" : "_"; @@ -354,219 +353,108 @@ let c_aa = (document.getElementById("up_v_aa").checked) ? "a" : "_"; let sVerbTag = c_i + c_t + c_n + c_p + c_m + c_ae + c_aa; if (!sVerbTag.endsWith("__") && !sVerbTag.startsWith("____")) { let sVerbPattern = document.getElementById("verb_pattern").value.trim(); if (sVerbPattern.length == 0) { - if (!sLemma.endsWith("er") && !sLemma.endsWith("ir")) { - break; - } - // tables de conjugaison du 1er et du 2e groupe - let cGroup = (sLemma.endsWith("er")) ? "1" : "2"; - for (let [nCut, sAdd, sFlexTags, sPattern] of this._getConjRules(sLemma)) { - if (!sPattern || RegExp(sPattern).test(sLemma)) { - this.addFlexion(sLemma.slice(0,-nCut)+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags); - } - } - // participes passés - let bPpasVar = (document.getElementById("up_partpas").checked) ? "var" : "invar"; - let lPpasRules = (sLemma.endsWith("er")) ? oConj["V1_ppas"][bPpasVar] : oConj["V2_ppas"][bPpasVar]; - for (let [nCut, sAdd, sFlexTags, sPattern] of lPpasRules) { - if (!sPattern || RegExp(sPattern).test(sLemma)) { - this.addFlexion(sLemma.slice(0,-nCut)+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags); - } + // utilisation du générateur de conjugaison + let bVarPpas = document.getElementById("up_partpas").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(sLemma, 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.addFlexion(sConj, sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2); + this.lFlexion.push([sConj, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2]); } } } else { // participes passés if (dFlex.get(":Q3") !== "") { if (dFlex.get(":Q2") !== "") { - this.addFlexion(dFlex.get(":Q1"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:s/*"); - this.addFlexion(dFlex.get(":Q2"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:p/*"); - } else { - this.addFlexion(dFlex.get(":Q1"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:i/*"); - } - this.addFlexion(dFlex.get(":Q3"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:s/*"); - this.addFlexion(dFlex.get(":Q4"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:p/*"); - } else { - this.addFlexion(dFlex.get(":Q1"), sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:e:i/*"); + 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": - sLemma = sLemma.toLowerCase(); - this.addFlexion(sLemma, sLemma, ":W/*"); - break; - case "M1": - sLemma = sLemma.slice(0,1).toUpperCase() + sLemma.slice(1); - sGenderTag = this.getRadioValue("genre_m1"); - if (sGenderTag) { - this.addFlexion(sLemma, sLemma, ":M1"+sGenderTag+":i/*"); - } - break; - case "M2": - sLemma = sLemma.slice(0,1).toUpperCase() + sLemma.slice(1); - sGenderTag = this.getRadioValue("genre_m2"); - if (sGenderTag) { - this.addFlexion(sLemma, sLemma, ":M2"+sGenderTag+":i/*"); - } - break; - case "MP": - sGenderTag = this.getRadioValue("genre_mp"); - if (sGenderTag) { - this.addFlexion(sLemma, sLemma, ":MP"+sGenderTag+":i/*"); + 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_m"); + 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.addFlexion(sFlexion, sLemma, sTags); + this.lFlexion.push([sFlexion, sTags]); } break; } } - this.show(); + oGenWordsTable.fill(this.lFlexion); } catch (e) { showError(e); } }, - _getConjRules: function (sVerb) { - if (sVerb.endsWith("ir")) { - // deuxième groupe - return oConj["V2"]; - } else if (sVerb.endsWith("er")) { - // premier groupe, conjugaison en fonction de la terminaison du lemme - // 5 lettres - if (sVerb.slice(-5) in oConj["V1"]) { - return oConj["V1"][sVerb.slice(-5)]; - } - // 4 lettres - if (sVerb.slice(-4) in oConj["V1"]) { - if (sVerb.endsWith("eler") || sVerb.endsWith("eter")) { - return oConj["V1"][sVerb.slice(-4)]["1"]; - } - return oConj["V1"][sVerb.slice(-4)]; - } - // 3 lettres - if (sVerb.slice(-3) in oConj["V1"]) { - return oConj["V1"][sVerb.slice(-3)]; - } - return oConj["V1"]["er"]; - } else { - // troisième groupe - return [ [0, "", ":Y/*", false] ]; - } - }, - getRadioValue: function (sName) { if (document.querySelector('input[name="' + sName + '"]:checked')) { return document.querySelector('input[name="' + sName + '"]:checked').value; } return null; }, - show: function () { - let sText = ""; - for (let [sFlexion, sLemma, sTag] of this.lFlexion) { - sText += sFlexion + " (" + sLemma + ") " + sTag + "\n"; - } - if (sText) { - document.getElementById("results").textContent = sText; - oWidgets.showElement("actions"); - } else { - oWidgets.hideElement("actions"); - } + createFlexLemmaTagArray: function () { + let lEntry = []; + for (let [sFlex, sTags] of oGenWordsTable.getEntries()) { + lEntry.push([sFlex, this.sLemma, sTags]); + } + return lEntry; }, addToLexicon: function () { try { - oLexicon.addFlexions(this.lFlexion); + oLexiconTable.addEntries(this.createFlexLemmaTagArray()); + oGenWordsTable.clear(); document.getElementById("lemma").value = ""; document.getElementById("lemma").focus(); - oWidgets.showSection("section_vide"); - oWidgets.hideElement("editor"); - oWidgets.hideElement("actions"); - oWidgets.clear(); - oWidgets.showElement("save_button"); + this.hideAllSections(); + hideElement("editor"); + showElement("save_button"); this.clear(); this.cMainTag = ""; } catch (e) { showError(e); } } } - - -const oLexicon = { - - lFlexion: [], - nEntries: 0, - nDeletedEntries: 0, - nAddedEntries: 0, - - set: function (lFlexion) { - this.lFlexion = lFlexion; - this.resetModif(); - oWidgets.displayTable(this.lFlexion); - if (this.lFlexion.length > 0) { - oWidgets.showElement("export_button"); - } else { - oWidgets.hideElement("export_button"); - } - }, - - addFlexions: function (lNewFlex) { - let iStart = this.lFlexion.length; - for (let aFlex of lNewFlex) { - this.lFlexion.push(aFlex); - } - this.nAddedEntries += lNewFlex.length; - this.nEntries += lNewFlex.length; - oWidgets.addEntriesToTable(iStart, lNewFlex); - }, - - deleteEntry: function (iEntry) { - this.lFlexion[parseInt(iEntry)] = null; - this.nDeletedEntries++; - this.nEntries--; - }, - - resetModif: function () { - this.nEntries = this.lFlexion.length; - this.nAddedEntries = 0; - this.nDeletedEntries = 0; - }, - - save: function () { - oWidgets.hideElement("save_button"); - this.lFlexion = this.lFlexion.filter((e) => e !== null); - oBinaryDict.build(this.lFlexion); - this.resetModif(); - oWidgets.displayTable(this.lFlexion); - oWidgets.updateData(); - } -} - const oBinaryDict = { oIBDAWG: null, @@ -579,48 +467,61 @@ xPromise.then(this._load.bind(this), showError); }, _load: function (oResult) { if (!oResult.hasOwnProperty("oPersonalDictionary")) { - oWidgets.hideElement("export_button"); + hideElement("export_button"); return; } let oJSON = oResult.oPersonalDictionary; this.oIBDAWG = new IBDAWG(oJSON); let lEntry = []; for (let s of this.oIBDAWG.select()) { lEntry.push(s.split("\t")); } - oLexicon.set(lEntry); - oWidgets.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); - oWidgets.showElement("export_button"); - }, - - build: function (lEntry) { - oWidgets.showElement("build_progress"); - let xProgressNode = document.getElementById("build_progress"); - let oDAWG = new DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel", xProgressNode); - let oJSON = oDAWG.createBinaryJSON(1); - this.save(oJSON); - this.oIBDAWG = new IBDAWG(oJSON); - oWidgets.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); - oWidgets.hideElement("build_progress"); - oWidgets.showElement("export_button"); - browser.runtime.sendMessage({ sCommand: "setDictionary", dParam: {sType: "personal", oDict: oJSON}, dInfo: {} }); - }, - - save: function (oJSON) { - browser.storage.local.set({ "oPersonalDictionary": oJSON }); + oLexiconTable.fill(lEntry); + this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); + showElement("export_button"); + }, + + setDictData: function (nEntries, sDate) { + document.getElementById("dic_num_entries").textContent = nEntries; + document.getElementById("dic_save_date").textContent = sDate; + }, + + listen: function () { + 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); + browser.storage.local.set({ "oPersonalDictionary": 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: {} }); + } + showElement("export_button"); }, import: function () { - // TO DO + console.log("import"); }, export: function () { let xBlob = new Blob([ JSON.stringify(this.oIBDAWG.getJSON()) ], {type: 'application/json'}); let sURL = URL.createObjectURL(xBlob); browser.downloads.download({ filename: "fr.personal.json", url: sURL, saveAs: true }); } } + +const oLexiconTable = new Table("lexicon_table", ["Flexions", "Lemmes", "Étiquettes"], "wait_progress", "num_entries"); +const oGenWordsTable = new Table("generated_words_table", ["Flexions", "Étiquettes"], "wait_progress"); + oBinaryDict.load(); +oBinaryDict.listen(); +oGenerator.listen(); Index: gc_lang/fr/webext/panel/main.js ================================================================== --- gc_lang/fr/webext/panel/main.js +++ gc_lang/fr/webext/panel/main.js @@ -142,10 +142,23 @@ function showTestResult (sText) { document.getElementById("tests_result").textContent = sText; } + +function openConjugueurTab () { + if (bChrome) { + browser.tabs.create({ + url: browser.extension.getURL("panel/conjugueur.html") + }); + return; + } + let xConjTab = browser.tabs.create({ + url: browser.extension.getURL("panel/conjugueur.html") + }); + xConjTab.then(onCreated, onError); +} function openConjugueurTab () { if (bChrome) { browser.tabs.create({ url: browser.extension.getURL("panel/conjugueur.html") Index: graphspell-js/dawg.js ================================================================== --- graphspell-js/dawg.js +++ graphspell-js/dawg.js @@ -78,10 +78,14 @@ lEntry.push([sFlex, dAff.get(sAff), dTag.get(sTag)]); } if (lEntry.length == 0) { throw "Error. Empty lexicon"; } + + lEntry = [...new Set(lEntry.map(e => JSON.stringify(e)))].map(s => JSON.parse(s)); + // Set can’t distinguish similar lists, so we transform list item in string given to the Set + // then we transform items in list a new. // Preparing DAWG console.log(" > Preparing list of words"); let lVal = lChar.concat(lAff).concat(lTag); let lWord = []; Index: graphspell-js/spellchecker.js ================================================================== --- graphspell-js/spellchecker.js +++ graphspell-js/spellchecker.js @@ -2,11 +2,12 @@ // Wrapper for the IBDAWG class. // Useful to check several dictionaries at once. // To avoid iterating over a pile of dictionaries, it is assumed that 3 are enough: // - the main dictionary, bundled with the package -// - the extended dictionary, added by an organization +// - the extended dictionary +// - the community dictionary, added by an organization // - the personal dictionary, created by the user for its own convenience "use strict"; @@ -26,19 +27,23 @@ ]); class SpellChecker { - constructor (sLangCode, sPath="", mainDic="", extentedDic="", personalDic="") { + constructor (sLangCode, sPath="", mainDic="", extentedDic="", communityDic="", personalDic="") { // returns true if the main dictionary is loaded this.sLangCode = sLangCode; if (!mainDic) { mainDic = dDefaultDictionaries.gl_get(sLangCode, ""); } this.oMainDic = this._loadDictionary(mainDic, sPath, true); this.oExtendedDic = this._loadDictionary(extentedDic, sPath); + this.oCommunityDic = this._loadDictionary(communityDic, sPath); this.oPersonalDic = this._loadDictionary(personalDic, sPath); + this.bExtendedDic = Boolean(this.oExtendedDic); + this.bCommunityDic = Boolean(this.oCommunityDic); + this.bPersonalDic = Boolean(this.oPersonalDic); this.oTokenizer = null; } _loadDictionary (dictionary, sPath, bNecessary=false) { // returns an IBDAWG object @@ -85,18 +90,52 @@ } setExtendedDictionary (dictionary) { // returns true if the dictionary is loaded this.oExtendedDic = this._loadDictionary(dictionary); - return Boolean(this.oExtendedDic); + this.bExtendedDic = Boolean(this.oExtendedDic); + return this.bExtendedDic; + } + + setCommunityDictionary (dictionary) { + // returns true if the dictionary is loaded + this.oCommunityDic = this._loadDictionary(dictionary); + this.bCommunityDic = Boolean(this.oCommunityDic); + return this.bCommunityDic; } setPersonalDictionary (dictionary) { // returns true if the dictionary is loaded this.oPersonalDic = this._loadDictionary(dictionary); - return Boolean(this.oPersonalDic); + this.bPersonalDic = Boolean(this.oPersonalDic); + return this.bPersonalDic; + } + + activateExtendedDictionary () { + this.bExtendedDic = Boolean(this.oExtendedDic); + } + + activateCommunityDictionary () { + this.bCommunityDic = Boolean(this.oCommunityDic); + } + + activatePersonalDictionary () { + this.bPersonalDic = Boolean(this.oPersonalDic); + } + + deactivateExtendedDictionary () { + this.bExtendedDic = false; + } + + deactivateCommunityDictionary () { + this.bCommunityDic = false; + } + + deactivatePersonalDictionary () { + this.bPersonalDic = false; } + // parse text functions parseParagraph (sText) { if (!this.oTokenizer) { @@ -116,14 +155,17 @@ isValidToken (sToken) { // checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked) if (this.oMainDic.isValidToken(sToken)) { return true; } - if (this.oExtendedDic && this.oExtendedDic.isValidToken(sToken)) { + if (this.bExtendedDic && this.oExtendedDic.isValidToken(sToken)) { + return true; + } + if (this.bCommunityDic && this.oCommunityDic.isValidToken(sToken)) { return true; } - if (this.oPersonalDic && this.oPersonalDic.isValidToken(sToken)) { + if (this.bPersonalDic && this.oPersonalDic.isValidToken(sToken)) { return true; } return false; } @@ -130,14 +172,17 @@ isValid (sWord) { // checks if sWord is valid (different casing tested if the first letter is a capital) if (this.oMainDic.isValid(sWord)) { return true; } - if (this.oExtendedDic && this.oExtendedDic.isValid(sWord)) { + if (this.bExtendedDic && this.oExtendedDic.isValid(sWord)) { + return true; + } + if (this.bCommunityDic && this.oCommunityDic.isValid(sToken)) { return true; } - if (this.oPersonalDic && this.oPersonalDic.isValid(sWord)) { + if (this.bPersonalDic && this.oPersonalDic.isValid(sWord)) { return true; } return false; } @@ -144,52 +189,64 @@ lookup (sWord) { // checks if sWord is in dictionary as is (strict verification) if (this.oMainDic.lookup(sWord)) { return true; } - if (this.oExtendedDic && this.oExtendedDic.lookup(sWord)) { + if (this.bExtendedDic && this.oExtendedDic.lookup(sWord)) { + return true; + } + if (this.bCommunityDic && this.oCommunityDic.lookup(sToken)) { return true; } - if (this.oPersonalDic && this.oPersonalDic.lookup(sWord)) { + if (this.bPersonalDic && this.oPersonalDic.lookup(sWord)) { return true; } return false; } getMorph (sWord) { // retrieves morphologies list, different casing allowed let lResult = this.oMainDic.getMorph(sWord); - if (this.oExtendedDic) { + if (this.bExtendedDic) { lResult.push(...this.oExtendedDic.getMorph(sWord)); } - if (this.oPersonalDic) { + if (this.bCommunityDic) { + lResult.push(...this.oCommunityDic.getMorph(sWord)); + } + if (this.bPersonalDic) { lResult.push(...this.oPersonalDic.getMorph(sWord)); } return lResult; } * suggest (sWord, nSuggLimit=10) { // generator: returns 1, 2 or 3 lists of suggestions yield this.oMainDic.suggest(sWord, nSuggLimit); - if (this.oExtendedDic) { + if (this.bExtendedDic) { yield this.oExtendedDic.suggest(sWord, nSuggLimit); } - if (this.oPersonalDic) { + if (this.bCommunityDic) { + yield this.oCommunityDic.suggest(sWord, nSuggLimit); + } + if (this.bPersonalDic) { yield this.oPersonalDic.suggest(sWord, nSuggLimit); } } * select (sPattern="") { // generator: returns all entries which morphology fits <sPattern> yield* this.oMainDic.select(sPattern) - if (this.oExtendedDic) { + if (this.bExtendedDic) { yield* this.oExtendedDic.select(sPattern); } - if (this.oPersonalDic) { + if (this.bCommunityDic) { + yield* this.oCommunityDic.select(sPattern); + } + if (this.bPersonalDic) { yield* this.oPersonalDic.select(sPattern); } } } if (typeof(exports) !== 'undefined') { exports.SpellChecker = SpellChecker; } Index: graphspell/dawg.py ================================================================== --- graphspell/dawg.py +++ graphspell/dawg.py @@ -25,11 +25,11 @@ if os.path.isfile(spf): with open(spf, "r", encoding="utf-8") as hSrc: for sLine in hSrc: sLine = sLine.strip() if sLine and not sLine.startswith("#"): - yield sLine + yield sLine.split("\t") else: raise OSError("# Error. File not found or not loadable: " + spf) @@ -39,11 +39,11 @@ # We store suffix/affix codes and tags within the graph after the “real” word. # A word is a list of numbers [ c1, c2, c3 . . . cN, iAffix, iTags] # Each arc is an index in self.lArcVal, where are stored characters, suffix/affix codes for stemming and tags. # Important: As usual, the last node (after ‘iTags’) is tagged final, AND the node after ‘cN’ is ALSO tagged final. - def __init__ (self, spfSrc, cStemming, sLangCode, sLangName="", sDicName=""): + def __init__ (self, src, cStemming, sLangCode, sLangName="", sDicName=""): print("===== Direct Acyclic Word Graph - Minimal Acyclic Finite State Automaton =====") cStemming = cStemming.upper() if cStemming == "A": funcStemmingGen = st.defineAffixCode elif cStemming == "S": @@ -51,60 +51,59 @@ elif cStemming == "N": funcStemmingGen = st.noStemming else: raise ValueError("# Error. Unknown stemming code: {}".format(cStemming)) - lEntry = [] + aEntry = set() lChar = ['']; dChar = {}; nChar = 1; dCharOccur = {} lAff = []; dAff = {}; nAff = 0; dAffOccur = {} lTag = []; dTag = {}; nTag = 0; dTagOccur = {} nErr = 0 - + # read lexicon - for sLine in readFile(spfSrc): - sFlex, sStem, sTag = sLine.split("\t") + if type(src) is str: + iterable = readFile(src) + else: + iterable = src + for sFlex, sStem, sTag in iterable: addWordToCharDict(sFlex) # chars for c in sFlex: if c not in dChar: dChar[c] = nChar lChar.append(c) nChar += 1 dCharOccur[c] = dCharOccur.get(c, 0) + 1 # affixes to find stem from flexion - aff = funcStemmingGen(sFlex, sStem) - if aff not in dAff: - dAff[aff] = nAff - lAff.append(aff) + sAff = funcStemmingGen(sFlex, sStem) + if sAff not in dAff: + dAff[sAff] = nAff + lAff.append(sAff) nAff += 1 - dAffOccur[aff] = dCharOccur.get(aff, 0) + 1 + dAffOccur[sAff] = dCharOccur.get(sAff, 0) + 1 # tags if sTag not in dTag: dTag[sTag] = nTag lTag.append(sTag) nTag += 1 dTagOccur[sTag] = dTagOccur.get(sTag, 0) + 1 - lEntry.append((sFlex, dAff[aff], dTag[sTag])) - if not lEntry: + aEntry.add((sFlex, dAff[sAff], dTag[sTag])) + if not aEntry: raise ValueError("# Error. Empty lexicon") # Preparing DAWG print(" > Preparing list of words") lVal = lChar + lAff + lTag - lWord = [ [dChar[c] for c in sFlex] + [iAff+nChar] + [iTag+nChar+nAff] for sFlex, iAff, iTag in lEntry ] - lEntry = None + lWord = [ [dChar[c] for c in sFlex] + [iAff+nChar] + [iTag+nChar+nAff] for sFlex, iAff, iTag in aEntry ] + aEntry = None # Dictionary of arc values occurrency, to sort arcs of each node dValOccur = dict( [ (dChar[c], dCharOccur[c]) for c in dChar ] \ + [ (dAff[aff]+nChar, dAffOccur[aff]) for aff in dAff ] \ + [ (dTag[tag]+nChar+nAff, dTagOccur[tag]) for tag in dTag ] ) - #with open(spfSrc[:-8]+".valuesfreq.txt", 'w', encoding='utf-8') as hFreqDst: # DEBUG - # for iKey, nOcc in sorted(dValOccur.items(), key=lambda t: t[1], reverse=True): - # hFreqDst.write("{}: {}\n".format(lVal[iKey], nOcc)) - # hFreqDst.close() - self.sFileName = spfSrc + self.sFileName = src if type(src) is str else "[None]" self.sLangCode = sLangCode self.sLangName = sLangName self.sDicName = sDicName self.nEntry = len(lWord) self.aPreviousEntry = [] @@ -308,11 +307,11 @@ if not zPattern or zPattern.search(self.lArcVal[nMorphVal]): yield sEntry + "\t" + self.lArcVal[nMorphVal] # BINARY CONVERSION - def createBinary (self, sPathFile, nCompressionMethod, bDebug=False): + def _calculateBinary (self, nCompressionMethod): print(" > Write DAWG as an indexable binary dictionary [method: %d]" % nCompressionMethod) if nCompressionMethod == 1: self.nBytesArc = ( (self.nArcVal.bit_length() + 2) // 8 ) + 1 # We add 2 bits. See DawgNode.convToBytes1() self.nBytesOffset = 0 self._calcNumBytesNodeAddress() @@ -332,14 +331,10 @@ print(" # Error: unknown compression method") print(" Arc values (chars, affixes and tags): {} -> {} bytes".format( self.nArcVal, len("\t".join(self.lArcVal).encode("utf-8")) )) print(" Arc size: {} bytes, Address size: {} bytes -> {} * {} = {} bytes".format( self.nBytesArc, self.nBytesNodeAddress, \ self.nBytesArc+self.nBytesNodeAddress, self.nArc, \ (self.nBytesArc+self.nBytesNodeAddress)*self.nArc )) - self._writeBinary(sPathFile, nCompressionMethod) - self._writeAsJSObject(sPathFile, nCompressionMethod) - if bDebug: - self._writeNodes(sPathFile, nCompressionMethod) def _calcNumBytesNodeAddress (self): "how many bytes needed to store all nodes/arcs in the binary dictionary" self.nBytesNodeAddress = 1 while ((self.nBytesArc + self.nBytesNodeAddress) * self.nArc) > (2 ** (self.nBytesNodeAddress * 8)): @@ -387,13 +382,12 @@ nSize -= nDiff if self.lSortedNodes[i].size != nSize: self.lSortedNodes[i].size = nSize bEnd = False - def _writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True): - if not spfDst.endswith(".json"): - spfDst += "."+str(nCompressionMethod)+".json" + def getBinaryAsJSON (self, nCompressionMethod=1, bBinaryDictAsHexString=True): + self._calculateBinary(nCompressionMethod) byDic = b"" if nCompressionMethod == 1: byDic = self.oRoot.convToBytes1(self.nBytesArc, self.nBytesNodeAddress) for oNode in self.lMinimizedNodes: byDic += oNode.convToBytes1(self.nBytesArc, self.nBytesNodeAddress) @@ -403,44 +397,48 @@ byDic += oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress) elif nCompressionMethod == 3: byDic = self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) for oNode in self.lSortedNodes: byDic += oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) + return { + "sHeader": "/pyfsa/", + "sLangCode": self.sLangCode, + "sLangName": self.sLangName, + "sDicName": self.sDicName, + "sFileName": self.sFileName, + "sDate": self._getDate(), + "nEntry": self.nEntry, + "nChar": self.nChar, + "nAff": self.nAff, + "nTag": self.nTag, + "cStemming": self.cStemming, + "dChar": self.dChar, + "nNode": self.nNode, + "nArc": self.nArc, + "nArcVal": self.nArcVal, + "lArcVal": self.lArcVal, + "nCompressionMethod": nCompressionMethod, + "nBytesArc": self.nBytesArc, + "nBytesNodeAddress": self.nBytesNodeAddress, + "nBytesOffset": self.nBytesOffset, + # Mozilla’s JS parser don’t like file bigger than 4 Mb! + # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension. + # https://github.com/mozilla/addons-linter/issues/1361 + "sByDic": byDic.hex() if bBinaryDictAsHexString else [ e for e in byDic ] + } + def writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True): + if not spfDst.endswith(".json"): + spfDst += "."+str(nCompressionMethod)+".json" with open(spfDst, "w", encoding="utf-8", newline="\n") as hDst: if bInJSModule: hDst.write('// JavaScript\n// Generated data (do not edit)\n\n"use strict";\n\nconst dictionary = ') - hDst.write(json.dumps({ - "sHeader": "/pyfsa/", - "sLangCode": self.sLangCode, - "sLangName": self.sLangName, - "sDicName": self.sDicName, - "sFileName": self.sFileName, - "sDate": self._getDate(), - "nEntry": self.nEntry, - "nChar": self.nChar, - "nAff": self.nAff, - "nTag": self.nTag, - "cStemming": self.cStemming, - "dChar": self.dChar, - "nNode": self.nNode, - "nArc": self.nArc, - "nArcVal": self.nArcVal, - "lArcVal": self.lArcVal, - "nCompressionMethod": nCompressionMethod, - "nBytesArc": self.nBytesArc, - "nBytesNodeAddress": self.nBytesNodeAddress, - "nBytesOffset": self.nBytesOffset, - # JavaScript is a pile of shit, so Mozilla’s JS parser don’t like file bigger than 4 Mb! - # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension. - # https://github.com/mozilla/addons-linter/issues/1361 - "sByDic": byDic.hex() if bBinaryDictAsHexString else [ e for e in byDic ] - }, ensure_ascii=False)) + hDst.write( json.dumps(self.getBinaryAsJSON(nCompressionMethod, bBinaryDictAsHexString), ensure_ascii=False) ) if bInJSModule: hDst.write(";\n\nexports.dictionary = dictionary;\n") - def _writeBinary (self, sPathFile, nCompressionMethod): + def writeBinary (self, sPathFile, nCompressionMethod, bDebug=False): """ Format of the binary indexable dictionary: Each section is separated with 4 bytes of \0 - Section Header: @@ -471,10 +469,11 @@ - Section Word Graph (nodes / arcs) * A list of nodes which are a list of arcs with an address of the next node. See DawgNode.convToBytes() for details. """ + self._calculateBinary(nCompressionMethod) if not sPathFile.endswith(".bdic"): sPathFile += "."+str(nCompressionMethod)+".bdic" with open(sPathFile, 'wb') as hDst: # header hDst.write("/pyfsa/{}/".format(nCompressionMethod).encode("utf-8")) @@ -499,11 +498,12 @@ hDst.write(oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress)) elif nCompressionMethod == 3: hDst.write(self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)) for oNode in self.lSortedNodes: hDst.write(oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)) - hDst.close() + if bDebug: + self._writeNodes(sPathFile, nCompressionMethod) def _getDate (self): return time.strftime("%Y.%m.%d, %H:%M") def _writeNodes (self, sPathFile, nCompressionMethod): @@ -522,23 +522,10 @@ if nCompressionMethod == 3: hDst.write(self.oRoot.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n") #hDst.write( ''.join( [ "%02X " % z for z in self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) ] ).strip() ) for oNode in self.lSortedNodes: hDst.write(oNode.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n") - hDst.close() - - def writeResults (self, sPathFile): - bFileExits = os.path.isfile("_lexicons.res.txt") - with open("_lexicons.res.txt", "a", encoding='utf-8', newline="\n") as hDst: - sFormat1 = "{:<12} {:>12} {:>5} {:>8} {:>8} {:>6} {:>8} {:>9} {:>9} {:>15} {:>12} {:>12}\n" - sFormat2 = "{:<12} {:>12,} {:>5,} {:>8,} {:>8} {:>6,} {:>8,} {:>9,} {:>9,} {:>15,} {:>12,} {:>12,}\n" - if not bFileExits: - hDst.write(sFormat1.format("Lexicon", "Entries", "Chars", "Affixes", "Stemming", "Tags", "Values", "Nodes", "Arcs", "Lexicon (Kb)", "Dict (Kb)", "LT Dict (Kb)")) - hDst.write(sFormat2.format(self.sLangName, self.nEntry, self.nChar, self.nAff, self.cStemming + "FX", self.nTag, self.nArcVal, \ - self.nNode, self.nArc, os.path.getsize(self.sFileName), os.path.getsize(sPathFile), \ - os.path.getsize("cfsa/dict/{}.dict".format(self.sLangName)) if os.path.isfile("cfsa/dict/{}.dict".format(self.sLangName)) else 0)) - hDst.close() class DawgNode: NextId = 0 Index: graphspell/ibdawg.py ================================================================== --- graphspell/ibdawg.py +++ graphspell/ibdawg.py @@ -77,23 +77,26 @@ class IBDAWG: """INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH""" - def __init__ (self, sfDict): - self.by = pkgutil.get_data(__package__, "_dictionaries/" + sfDict) - if not self.by: - raise OSError("# Error. File not found or not loadable: "+sfDict) - - if sfDict.endswith(".bdic"): - self._initBinary() - elif sfDict.endswith(".json"): - self._initJSON() + def __init__ (self, source): + if type(source) is str: + self.by = pkgutil.get_data(__package__, "_dictionaries/" + source) + if not self.by: + raise OSError("# Error. File not found or not loadable: "+source) + + if source.endswith(".bdic"): + self._initBinary() + elif source.endswith(".json"): + self._initJSON(json.loads(self.by.decode("utf-8"))) #json.loads(self.by) # In Python 3.6, can read directly binary strings + else: + raise OSError("# Error. Unknown file type: "+source) else: - raise OSError("# Error. Unknown file type: "+sfDict) + self._initJSON(source) - self.sFileName = sfDict + self.sFileName = source if type(source) is str else "[None]" self._arcMask = (2 ** ((self.nBytesArc * 8) - 3)) - 1 self._finalNodeMask = 1 << ((self.nBytesArc * 8) - 1) self._lastArcMask = 1 << ((self.nBytesArc * 8) - 2) self._addrBitMask = 1 << ((self.nBytesArc * 8) - 3) # version 2 @@ -167,14 +170,13 @@ for i in range(1, self.nChar+1): self.dChar[self.lArcVal[i]] = i self.dCharVal = { v: k for k, v in self.dChar.items() } self.nBytesOffset = 1 # version 3 - def _initJSON (self): + def _initJSON (self, oJSON): "initialize with a JSON text file" - self.__dict__.update(json.loads(self.by.decode("utf-8"))) - #self.__dict__.update(json.loads(self.by)) # In Python 3.6, can read directly binary strings + self.__dict__.update(oJSON) self.byDic = binascii.unhexlify(self.sByDic) def getInfo (self): return " Language: {0.sLangName} Lang code: {0.sLangCode} Dictionary name: {0.sDicName}" \ " Compression method: {0.nCompressionMethod:>2} Date: {0.sDate} Stemming: {0.cStemming}FX\n" \ Index: graphspell/spellchecker.py ================================================================== --- graphspell/spellchecker.py +++ graphspell/spellchecker.py @@ -2,11 +2,12 @@ # Wrapper for the IBDAWG class. # Useful to check several dictionaries at once. # To avoid iterating over a pile of dictionaries, it is assumed that 3 are enough: # - the main dictionary, bundled with the package -# - the extended dictionary, added by an organization +# - the extended dictionary +# - the community dictionary, added by an organization # - the personal dictionary, created by the user for its own convenience import traceback @@ -20,30 +21,34 @@ } class SpellChecker (): - def __init__ (self, sLangCode, sfMainDic="", sfExtendedDic="", sfPersonalDic=""): + def __init__ (self, sLangCode, sfMainDic="", sfExtendedDic="", sfCommunityDic="", sfPersonalDic=""): "returns True if the main dictionary is loaded" self.sLangCode = sLangCode if not sfMainDic: sfMainDic = dDefaultDictionaries.get(sLangCode, "") self.oMainDic = self._loadDictionary(sfMainDic, True) self.oExtendedDic = self._loadDictionary(sfExtendedDic) + self.oCommunityDic = self._loadDictionary(sfCommunityDic) self.oPersonalDic = self._loadDictionary(sfPersonalDic) + self.bExtendedDic = bool(self.oExtendedDic) + self.bCommunityDic = bool(self.oCommunityDic) + self.bPersonalDic = bool(self.oPersonalDic) self.oTokenizer = None - def _loadDictionary (self, sfDictionary, bNecessary=False): + def _loadDictionary (self, source, bNecessary=False): "returns an IBDAWG object" - if not sfDictionary: + if not source: return None try: - return ibdawg.IBDAWG(sfDictionary) + return ibdawg.IBDAWG(source) except Exception as e: if bNecessary: - raise Exception(str(e), "Error: <" + sfDictionary + "> not loaded.") - print("Error: <" + sfDictionary + "> not loaded.") + raise Exception(str(e), "Error: <" + str(source) + "> not loaded.") + print("Error: <" + str(source) + "> not loaded.") traceback.print_exc() return None def loadTokenizer (self): self.oTokenizer = tokenizer.Tokenizer(self.sLangCode) @@ -51,24 +56,51 @@ def getTokenizer (self): if not self.oTokenizer: self.loadTokenizer() return self.oTokenizer - def setMainDictionary (self, sfDictionary): + def setMainDictionary (self, source): "returns True if the dictionary is loaded" - self.oMainDic = self._loadDictionary(sfDictionary) + self.oMainDic = self._loadDictionary(source) return bool(self.oMainDic) - def setExtendedDictionary (self, sfDictionary): - "returns True if the dictionary is loaded" - self.oExtendedDic = self._loadDictionary(sfDictionary) - return bool(self.oExtendedDic) - - def setPersonalDictionary (self, sfDictionary): - "returns True if the dictionary is loaded" - self.oPersonalDic = self._loadDictionary(sfDictionary) - return bool(self.oPersonalDic) + def setExtendedDictionary (self, source): + "returns True if the dictionary is loaded" + self.oExtendedDic = self._loadDictionary(source) + self.bExtendedDic = bool(self.oExtendedDic) + return self.bExtendedDic + + def setCommunityDictionary (self, source): + "returns True if the dictionary is loaded" + self.oCommunityDic = self._loadDictionary(source) + self.bCommunityDic = bool(self.oCommunityDic) + return self.bCommunityDic + + def setPersonalDictionary (self, source): + "returns True if the dictionary is loaded" + self.oPersonalDic = self._loadDictionary(source) + self.bPersonalDic = bool(self.oPersonalDic) + return self.bPersonalDic + + def activateExtendedDictionary (self): + self.bExtendedDic = bool(self.oExtendedDic) + + def activateCommunityDictionary (self): + self.bCommunityDic = bool(self.oCommunityDic) + + def activatePersonalDictionary (self): + self.bPersonalDic = bool(self.oPersonalDic) + + def deactivateExtendedDictionary (self): + self.bExtendedDic = False + + def deactivateCommunityDictionary (self): + self.bCommunityDic = False + + def deactivatePersonalDictionary (self): + self.bPersonalDic = False + # parse text functions def parseParagraph (self, sText, bSpellSugg=False): if not self.oTokenizer: @@ -103,67 +135,82 @@ def isValidToken (self, sToken): "checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" if self.oMainDic.isValidToken(sToken): return True - if self.oExtendedDic and self.oExtendedDic.isValidToken(sToken): + if self.bExtendedDic and self.oExtendedDic.isValidToken(sToken): + return True + if self.bCommunityDic and self.oCommunityDic.isValidToken(sToken): return True - if self.oPersonalDic and self.oPersonalDic.isValidToken(sToken): + if self.bPersonalDic and self.oPersonalDic.isValidToken(sToken): return True return False def isValid (self, sWord): "checks if sWord is valid (different casing tested if the first letter is a capital)" if self.oMainDic.isValid(sWord): return True - if self.oExtendedDic and self.oExtendedDic.isValid(sWord): + if self.bExtendedDic and self.oExtendedDic.isValid(sWord): + return True + if self.bCommunityDic and self.oCommunityDic.isValid(sToken): return True - if self.oPersonalDic and self.oPersonalDic.isValid(sWord): + if self.bPersonalDic and self.oPersonalDic.isValid(sWord): return True return False def lookup (self, sWord): "checks if sWord is in dictionary as is (strict verification)" if self.oMainDic.lookup(sWord): return True - if self.oExtendedDic and self.oExtendedDic.lookup(sWord): + if self.bExtendedDic and self.oExtendedDic.lookup(sWord): + return True + if self.bCommunityDic and self.oCommunityDic.lookup(sToken): return True - if self.oPersonalDic and self.oPersonalDic.lookup(sWord): + if self.bPersonalDic and self.oPersonalDic.lookup(sWord): return True return False def getMorph (self, sWord): "retrieves morphologies list, different casing allowed" lResult = self.oMainDic.getMorph(sWord) - if self.oExtendedDic: + if self.bExtendedDic: lResult.extend(self.oExtendedDic.getMorph(sWord)) - if self.oPersonalDic: + if self.bCommunityDic: + lResult.extend(self.oCommunityDic.getMorph(sWord)) + if self.bPersonalDic: lResult.extend(self.oPersonalDic.getMorph(sWord)) return lResult def getLemma (self, sWord): return set([ s[1:s.find(" ")] for s in self.getMorph(sWord) ]) def suggest (self, sWord, nSuggLimit=10): "generator: returns 1, 2 or 3 lists of suggestions" yield self.oMainDic.suggest(sWord, nSuggLimit) - if self.oExtendedDic: + if self.bExtendedDic: yield self.oExtendedDic.suggest(sWord, nSuggLimit) - if self.oPersonalDic: + if self.bCommunityDic: + yield self.oCommunityDic.suggest(sWord, nSuggLimit) + if self.bPersonalDic: yield self.oPersonalDic.suggest(sWord, nSuggLimit) def select (self, sPattern=""): "generator: returns all entries which morphology fits <sPattern>" yield from self.oMainDic.select(sPattern) - if self.oExtendedDic: + if self.bExtendedDic: yield from self.oExtendedDic.select(sPattern) - if self.oPersonalDic: + if self.bCommunityDic: + yield from self.oCommunityDic.select(sPattern) + if self.bPersonalDic: yield from self.oPersonalDic.select(sPattern) def drawPath (self, sWord): self.oMainDic.drawPath(sWord) - if self.oExtendedDic: + if self.bExtendedDic: print("-----") self.oExtendedDic.drawPath(sWord) - if self.oPersonalDic: + if self.bCommunityDic: + print("-----") + self.oCommunityDic.drawPath(sWord) + if self.bPersonalDic: print("-----") self.oPersonalDic.drawPath(sWord) Index: lex_build.py ================================================================== --- lex_build.py +++ lex_build.py @@ -12,11 +12,11 @@ def build (spfSrc, sLangCode, sLangName, sfDict, bJSON=False, sDicName="", cStemmingMethod="S", nCompressMethod=1): "transform a text lexicon as a binary indexable dictionary" oDAWG = fsa.DAWG(spfSrc, cStemmingMethod, sLangCode, sLangName, sDicName) dir_util.mkpath("graphspell/_dictionaries") oDAWG.writeInfo("graphspell/_dictionaries/" + sfDict + ".info.txt") - oDAWG.createBinary("graphspell/_dictionaries/" + sfDict + ".bdic", int(nCompressMethod)) + oDAWG.writeBinary("graphspell/_dictionaries/" + sfDict + ".bdic", int(nCompressMethod)) if bJSON: dir_util.mkpath("graphspell-js/_dictionaries") oDic = IBDAWG(sfDict + ".bdic") oDic.writeAsJSObject("graphspell-js/_dictionaries/" + sfDict + ".json", bBinaryDictAsHexString=True) Index: make.py ================================================================== --- make.py +++ make.py @@ -84,10 +84,11 @@ # Extension files hZip.writestr("META-INF/manifest.xml", helpers.fileFile("gc_core/py/oxt/manifest.xml", dVars)) hZip.writestr("description.xml", helpers.fileFile("gc_core/py/oxt/description.xml", dVars)) hZip.writestr("Linguistic.xcu", helpers.fileFile("gc_core/py/oxt/Linguistic.xcu", dVars)) hZip.writestr("Grammalecte.py", helpers.fileFile("gc_core/py/oxt/Grammalecte.py", dVars)) + hZip.writestr("pythonpath/helpers.py", helpers.fileFile("gc_core/py/oxt/helpers.py", dVars)) for sf in dVars["extras"].split(","): hZip.writestr(sf.strip(), helpers.fileFile(spLang + '/' + sf.strip(), dVars)) if "logo" in dVars.keys() and dVars["logo"].strip(): @@ -304,20 +305,24 @@ if not os.path.isdir("graphspell-js/"+sf): file_util.copy_file("graphspell-js/"+sf, "grammalecte-js/graphspell") helpers.copyAndFileTemplate("graphspell-js/"+sf, "grammalecte-js/graphspell/"+sf, dVars) -def copyGraphspellDictionaries (dVars, bJavaScript=False, bExtendedDict=False, bPersonalDict=False): +def copyGraphspellDictionaries (dVars, bJavaScript=False, bExtendedDict=False, bCommunityDict=False, bPersonalDict=False): dVars["dic_main_filename_py"] = "" dVars["dic_main_filename_js"] = "" dVars["dic_extended_filename_py"] = "" dVars["dic_extended_filename_js"] = "" + dVars["dic_community_filename_py"] = "" + dVars["dic_community_filename_js"] = "" dVars["dic_personal_filename_py"] = "" dVars["dic_personal_filename_js"] = "" lDict = [ ("main", dVars['dic_filename']) ] if bExtendedDict: lDict.append(("extended", dVars['dic_extended_filename'])) + if bCommunityDict: + lDict.append(("community", dVars['dic_community_filename'])) if bPersonalDict: lDict.append(("personal", dVars['dic_personal_filename'])) for sType, sFileName in lDict: spfPyDic = "graphspell/_dictionaries/" + sFileName + ".bdic" spfJSDic = "graphspell-js/_dictionaries/" + sFileName + ".json" @@ -338,10 +343,14 @@ sDicName = dVars['dic_name'] elif sType == "extended": spfLexSrc = dVars['lexicon_extended_src'] sfDictDst = dVars['dic_extended_filename'] sDicName = dVars['dic_extended_name'] + elif sType == "community": + spfLexSrc = dVars['lexicon_community_src'] + sfDictDst = dVars['dic_community_filename'] + sDicName = dVars['dic_community_name'] elif sType == "personal": spfLexSrc = dVars['lexicon_personal_src'] sfDictDst = dVars['dic_personal_filename'] sDicName = dVars['dic_personal_name'] lex_build.build(spfLexSrc, dVars['lang'], dVars['lang_name'], sfDictDst, bJavaScript, sDicName, dVars['stemming_method'], int(dVars['fsa_method'])) @@ -359,10 +368,11 @@ xParser.add_argument("-t", "--tests", help="run unit tests", action="store_true") xParser.add_argument("-p", "--perf", help="run performance tests", action="store_true") xParser.add_argument("-pm", "--perf_memo", help="run performance tests and store results in perf_memo.txt", action="store_true") xParser.add_argument("-js", "--javascript", help="JavaScript build for Firefox", action="store_true") xParser.add_argument("-aed", "--add_extended_dictionary", help="add extended dictionary to the build", action="store_true") + xParser.add_argument("-acd", "--add_community_dictionary", help="add community dictionary to the build", action="store_true") xParser.add_argument("-apd", "--add_personal_dictionary", help="add personal dictionary to the build", action="store_true") xParser.add_argument("-fx", "--firefox", help="Launch Firefox Developper for WebExtension testing", action="store_true") xParser.add_argument("-we", "--web_ext", help="Launch Firefox Nightly for WebExtension testing", action="store_true") xParser.add_argument("-tb", "--thunderbird", help="Launch Thunderbird", action="store_true") xParser.add_argument("-i", "--install", help="install the extension in Writer (path of unopkg must be set in config.ini)", action="store_true") @@ -384,10 +394,12 @@ xConfig = getConfig(sLang) dVars = xConfig._sections['args'] if not dVars["lexicon_extended_src"]: xArgs.add_extended_dictionary = False + if not dVars["lexicon_community_src"]: + xArgs.add_community_dictionary = False if not dVars["lexicon_personal_src"]: xArgs.add_personal_dictionary = False # build data build_data_module = None @@ -401,17 +413,19 @@ build_data_module.before('gc_lang/'+sLang, dVars, xArgs.javascript) if xArgs.dict: buildDictionary(dVars, "main", xArgs.javascript) if xArgs.add_extended_dictionary: buildDictionary(dVars, "extended", xArgs.javascript) + if xArgs.add_community_dictionary: + buildDictionary(dVars, "community", xArgs.javascript) if xArgs.add_personal_dictionary: buildDictionary(dVars, "personal", xArgs.javascript) if build_data_module and xArgs.build_data_after: build_data_module.after('gc_lang/'+sLang, dVars, xArgs.javascript) # copy dictionaries from Graphspell - copyGraphspellDictionaries(dVars, xArgs.javascript, xArgs.add_extended_dictionary, xArgs.add_personal_dictionary) + copyGraphspellDictionaries(dVars, xArgs.javascript, xArgs.add_extended_dictionary, xArgs.add_community_dictionary, xArgs.add_personal_dictionary) # make sVersion = create(sLang, xConfig, xArgs.install, xArgs.javascript, ) # tests