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,27 @@ oxt/_img/Algoo_logo.png = img/Algoo_logo.png oxt/_img/grammalecte_16.bmp = img/grammalecte_16.bmp oxt/_img/french_flag_16.bmp = img/french_flag_16.bmp # AppLauncher oxt/AppLauncher.py = AppLauncher.py -oxt/helpers.py = pythonpath/helpers.py # About oxt/About/About.py = pythonpath/About.py oxt/About/ab_strings.py = pythonpath/ab_strings.py # Dictionaries oxt/Dictionnaires/dictionaries = dictionaries oxt/Dictionnaires/dictionaries.xcu = dictionaries.xcu oxt/Dictionnaires/DictionarySwitcher.py = pythonpath/DictionarySwitcher.py oxt/Dictionnaires/ds_strings.py = pythonpath/ds_strings.py +# Dictionary Options +oxt/DictOptions/DictOptions.py = pythonpath/DictOptions.py +oxt/DictOptions/do_strings.py = pythonpath/do_strings.py +oxt/DictOptions/LexiconEditor.py = pythonpath/LexiconEditor.py +oxt/DictOptions/lxe_strings.py = pythonpath/lxe_strings.py +oxt/DictOptions/SearchWords.py = pythonpath/SearchWords.py +oxt/DictOptions/sw_strings.py = pythonpath/sw_strings.py +oxt/DictOptions/TagsInfo.py = pythonpath/TagsInfo.py +oxt/DictOptions/ti_strings.py = pythonpath/ti_strings.py # ContextMenu oxt/ContextMenu/ContextMenu.py = ContextMenu.py oxt/ContextMenu/jobs.xcu = config/jobs.xcu # TextFormatter oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py ADDED gc_lang/fr/modules-js/conj_generator.js Index: gc_lang/fr/modules-js/conj_generator.js ================================================================== --- /dev/null +++ gc_lang/fr/modules-js/conj_generator.js @@ -0,0 +1,2023 @@ +// JavaScript + +/* + Conjugation generator + beta stage, unfinished, the root for a new way to generate flexions… +*/ + +"use strict"; + + +var conj_generator = { + + conjugate: function (sVerb, sVerbTag="i_____a", bVarPpas=true) { + let lEntry = []; + let cGroup = this.getVerbGroupChar(sVerb); + for (let [nCut, sAdd, sFlexTags, sPattern] of this.getConjRules(sVerb, bVarPpas)) { + if (!sPattern || RegExp(sPattern).test(sVerb)) { + let sFlexion = (nCut > 0) ? sVerb.slice(0, -nCut) + sAdd : sVerb + sAdd; + lEntry.push( [sFlexion, ":V" + cGroup + "_" + sVerbTag + sFlexTags] ); + } + } + return lEntry; + }, + + getVerbGroupChar: function (sVerb) { + sVerb = sVerb.toLowerCase(); + if (sVerb.endsWith("er")) { + return "1"; + } + if (sVerb.endsWith("ir")) { + return "2"; + } + if (sVerb == "être" || sVerb == "avoir") { + return "0"; + } + if (sVerb.endsWith("re")) { + return "3"; + } + return "4"; + }, + + getConjRules: function (sVerb, bVarPpas=true, nGroup=2) { + let lConj = null; + let sVarPpas = (bVarPpas) ? "true" : "false"; + if (sVerb.endsWith("er")) { + // premier groupe, conjugaison en fonction de la terminaison du lemme + // 5 lettres + if (sVerb.slice(-5) in this.oConj["V1"]) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-5)]); + } + // 4 lettres + else if (sVerb.slice(-4) in this.oConj["V1"]) { + if (sVerb.endsWith("eler") || sVerb.endsWith("eter")) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-4)]["1"]); + } else { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-4)]); + } + } + // 3 lettres + else if (sVerb.slice(-3) in this.oConj["V1"]) { + lConj = Array.from(this.oConj["V1"][sVerb.slice(-3)]); + } + // 2 lettres + else { + lConj = Array.from(this.oConj["V1"]["er"]); + } + lConj.push(...this.oConj["V1_ppas"][sVarPpas]); + } + else if (sVerb.endsWith("ir") && nGroup <= 2) { + // deuxième groupe + lConj = Array.from(this.oConj["V2"]); + lConj.push(...this.oConj["V2_ppas"][sVarPpas]); + } + else { + // TODO: troisième groupe + lConj = [ [0, "", ":Y/*", false] ]; + } + return lConj; + }, + + oConj: { + "V1_ppas": { + "true": [ + [2, "é", ":Q:A:1ŝ:m:s/*", false], + [2, "és", ":Q:A:m:p/*", false], + [2, "ée", ":Q:A:f:s/*", false], + [2, "ées", ":Q:A:f:p/*", false], + ], + "false": [ + [2, "é", ":Q:e:i/*", false], + ] + }, + + "V2_ppas": { + "true": [ + [2, "i", ":Q:A:m:s/*", false], + [2, "is", ":Q:A:m:p/*", false], + [2, "ie", ":Q:A:f:s/*", false], + [2, "ies", ":Q:A:f:p/*", false], + ], + "false": [ + [2, "i", ":Q:e:i/*", false], + ] + }, + + // deuxième groupe (le seul groupe régulier) + "V2": [ + [2, "ir", ":Y/*", false], + [2, "issant", ":P/*", false], + [2, "is", ":Ip:Is:1s:2s/*", false], + [2, "it", ":Ip:Is:3s/*", false], + [2, "issons", ":Ip:1p/*", false], + [2, "issez", ":Ip:2p/*", false], + [2, "issent", ":Ip:Sp:Sq:3p/*", false], + [2, "issais", ":Iq:1s:2s/*", false], + [2, "issait", ":Iq:3s/*", false], + [2, "issions", ":Iq:Sp:Sq:1p/*", false], + [2, "issiez", ":Iq:Sp:Sq:2p/*", false], + [2, "issaient", ":Iq:3p/*", false], + [2, "îmes", ":Is:1p/*", false], + [2, "îtes", ":Is:2p/*", false], + [2, "irent", ":Is:3p!/*", false], + [2, "irai", ":If:1s/*", false], + [2, "iras", ":If:2s/*", false], + [2, "ira", ":If:3s/*", false], + [2, "irons", ":If:1p/*", false], + [2, "irez", ":If:2p/*", false], + [2, "iront", ":If:3p!/*", false], + [2, "irais", ":K:1s:2s/*", false], + [2, "irait", ":K:3s/*", false], + [2, "irions", ":K:1p/*", false], + [2, "iriez", ":K:2p/*", false], + [2, "iraient", ":K:3p/*", false], + [2, "isse", ":Sp:Sq:1s/*", false], + [2, "isses", ":Sp:Sq:2s/*", false], + [2, "isse", ":Sp:3s/*", false], + [2, "ît", ":Sq:3s/*", false], + [2, "is", ":E:2s/*", false], + [2, "issons", ":E:1p/*", false], + [2, "issez", ":E:2p/*", false] + ], + + // premier groupe (bien plus irrégulier que prétendu) + "V1": { + // a + // verbes en -er, -ger, -yer, -cer + "er": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ger": [ + [2, "er", ":Y/*", false], + [2, "eant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [2, "eons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [2, "eais", ":Iq:1s:2s/*", false], + [2, "eait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "eaient", ":Iq:3p/*", false], + [2, "eai", ":Is:1s/*", false], + [2, "eas", ":Is:2s/*", false], + [2, "ea", ":Is:3s/*", false], + [2, "eâmes", ":Is:1p/*", false], + [2, "eâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [2, "easse", ":Sq:1s/*", false], + [2, "easses", ":Sq:2s/*", false], + [2, "eât", ":Sq:3s/*", false], + [2, "eassions", ":Sq:1p/*", false], + [2, "eassiez", ":Sq:2p/*", false], + [2, "eassent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [2, "eons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "cer": [ + [2, "er", ":Y/*", false], + [3, "çant", ":P/*", false], + [2, "e", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/*", false], + [2, "es", ":Ip:Sp:2s/*", false], + [3, "çons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [2, "ent", ":Ip:Sp:3p/*", false], + [3, "çais", ":Iq:1s:2s/*", false], + [3, "çait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [3, "çaient", ":Iq:3p/*", false], + [3, "çai", ":Is:1s/*", false], + [3, "ças", ":Is:2s/*", false], + [3, "ça", ":Is:3s/*", false], + [3, "çâmes", ":Is:1p/*", false], + [3, "çâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/*", false], + [2, "eras", ":If:2s/*", false], + [2, "era", ":If:3s/*", false], + [2, "erons", ":If:1p/*", false], + [2, "erez", ":If:2p/*", false], + [2, "eront", ":If:3p!/*", false], + [2, "erais", ":K:1s:2s/*", false], + [2, "erait", ":K:3s/*", false], + [2, "erions", ":K:1p/*", false], + [2, "eriez", ":K:2p/*", false], + [2, "eraient", ":K:3p/*", false], + [3, "çasse", ":Sq:1s/*", false], + [3, "çasses", ":Sq:2s/*", false], + [3, "çât", ":Sq:3s/*", false], + [3, "çassions", ":Sq:1p/*", false], + [3, "çassiez", ":Sq:2p/*", false], + [3, "çassent", ":Sq:3p/*", false], + [2, "e", ":E:2s/*", false], + [3, "çons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "yer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [3, "ye", ":Ip:Sp:1s:3s/*", "[^ou]yer$"], + [3, "ie", ":Ip:Sp:1s:3s/*", "[aou]yer$"], + [2, "è", ":Ip:1ś/*", false], + [3, "yes", ":Ip:Sp:2s/*", "[^ou]yer$"], + [3, "ies", ":Ip:Sp:2s/*", "[aou]yer$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [3, "yent", ":Ip:Sp:3p/*", "[^ou]yer$"], + [3, "ient", ":Ip:Sp:3p/*", "[aou]yer$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [3, "yerai", ":If:1s/*", "[^ou]yer$"], + [3, "ierai", ":If:1s/*", "[aou]yer$"], + [3, "yeras", ":If:2s/*", "[^ou]yer$"], + [3, "ieras", ":If:2s/*", "[aou]yer$"], + [3, "yera", ":If:3s/*", "[^ou]yer$"], + [3, "iera", ":If:3s/*", "[aou]yer$"], + [3, "yerons", ":If:1p/*", "[^ou]yer$"], + [3, "ierons", ":If:1p/*", "[aou]yer$"], + [3, "yerez", ":If:2p/*", "[^ou]yer$"], + [3, "ierez", ":If:2p/*", "[aou]yer$"], + [3, "yeront", ":If:3p!/*", "[^ou]yer$"], + [3, "ieront", ":If:3p!/*", "[aou]yer$"], + [3, "yerais", ":K:1s:2s/*", "[^ou]yer$"], + [3, "ierais", ":K:1s:2s/*", "[aou]yer$"], + [3, "yerait", ":K:3s/*", "[^ou]yer$"], + [3, "ierait", ":K:3s/*", "[aou]yer$"], + [3, "yerions", ":K:1p/*", "[^ou]yer$"], + [3, "ierions", ":K:1p/*", "[aou]yer$"], + [3, "yeriez", ":K:2p/*", "[^ou]yer$"], + [3, "ieriez", ":K:2p/*", "[aou]yer$"], + [3, "yeraient", ":K:3p/*", "[^ou]yer$"], + [3, "ieraient", ":K:3p/*", "[aou]yer$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [3, "ye", ":E:2s/*", "[^ou]yer$"], + [3, "ie", ":E:2s/*", "[aou]yer$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + // b + // verbes en -ecer, -emer, -ener, -eper, -erer, -eser, -ever, -evrer + // verbes en -eler, -eter (pas de doublement de la consonne: acheter, celer, déceler, receler, ciseler, démanteler, + // écarteler, encasteler, geler, dégeler, congeler, surgeler, marteler, modeler, peler, acheter, racheter, + // bégueter, corseter, crocheter, fileter, fureter, haleter) + // changement du e en è avant syllabe muette + "ecer": [ + [2, "er", ":Y/*", false], + [3, "çant", ":P/*", false], + [4, "èce", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èces", ":Ip:Sp:2s/*", false], + [3, "çons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ècent", ":Ip:Sp:3p/*", false], + [3, "çais", ":Iq:1s:2s/*", false], + [3, "çait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [3, "çaient", ":Iq:3p/*", false], + [3, "çai", ":Is:1s/*", false], + [3, "ças", ":Is:2s/*", false], + [3, "ça", ":Is:3s/*", false], + [3, "çâmes", ":Is:1p/*", false], + [3, "çâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ècerai", ":If:1s/*", false], + [4, "èceras", ":If:2s/*", false], + [4, "ècera", ":If:3s/*", false], + [4, "ècerons", ":If:1p/*", false], + [4, "ècerez", ":If:2p/*", false], + [4, "èceront", ":If:3p!/*", false], + [4, "ècerais", ":K:1s:2s/*", false], + [4, "ècerait", ":K:3s/*", false], + [4, "ècerions", ":K:1p/*", false], + [4, "èceriez", ":K:2p/*", false], + [4, "èceraient", ":K:3p/*", false], + [3, "çasse", ":Sq:1s/*", false], + [3, "çasses", ":Sq:2s/*", false], + [3, "çât", ":Sq:3s/*", false], + [3, "çassions", ":Sq:1p/*", false], + [3, "çassiez", ":Sq:2p/*", false], + [3, "çassent", ":Sq:3p/*", false], + [4, "èce", ":E:2s/*", false], + [3, "çons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eler": { + "1": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èlent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èlerai", ":If:1s/*", false], + [4, "èleras", ":If:2s/*", false], + [4, "èlera", ":If:3s/*", false], + [4, "èlerons", ":If:1p/*", false], + [4, "èlerez", ":If:2p/*", false], + [4, "èleront", ":If:3p!/*", false], + [4, "èlerais", ":K:1s:2s/*", false], + [4, "èlerait", ":K:3s/*", false], + [4, "èlerions", ":K:1p/*", false], + [4, "èleriez", ":K:2p/*", false], + [4, "èleraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + "2": [ + // d. verbes en -eler : doublement de la consonne l. + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "elle", ":Ip:Sp:1s:3s/*", "ppeler$"], + [4, "elle", ":Ip:Sp:1s:3s/M", "[^p].eler$"], + [4, "èle", ":Ip:Sp:1s:3s/R", "[^p].eler$"], + [2, "è", ":Ip:1ś/R", false], + [4, "elles", ":Ip:Sp:2s/*", "ppeler$"], + [4, "elles", ":Ip:Sp:2s/M", "[^p].eler$"], + [4, "èles", ":Ip:Sp:2s/R", "[^p].eler$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ellent", ":Ip:Sp:3p/*", "ppeler$"], + [4, "ellent", ":Ip:Sp:3p/M", "[^p].eler$"], + [4, "èlent", ":Ip:Sp:3p/R", "[^p].eler$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ellerai", ":If:1s/*", "ppeler$"], + [4, "ellerai", ":If:1s/M", "[^p].eler$"], + [4, "èlerai", ":If:1s/R", "[^p].eler$"], + [4, "elleras", ":If:2s/*", "ppeler$"], + [4, "elleras", ":If:2s/M", "[^p].eler$"], + [4, "èleras", ":If:2s/R", "[^p].eler$"], + [4, "ellera", ":If:3s/*", "ppeler$"], + [4, "ellera", ":If:3s/M", "[^p].eler$"], + [4, "èlera", ":If:3s/R", "[^p].eler$"], + [4, "ellerons", ":If:1p/*", "ppeler$"], + [4, "ellerons", ":If:1p/M", "[^p].eler$"], + [4, "èlerons", ":If:1p/R", "[^p].eler$"], + [4, "ellerez", ":If:2p/*", "ppeler$"], + [4, "ellerez", ":If:2p/M", "[^p].eler$"], + [4, "èlerez", ":If:2p/R", "[^p].eler$"], + [4, "elleront", ":If:3p!/*", "ppeler$"], + [4, "elleront", ":If:3p!/M", "[^p].eler$"], + [4, "èleront", ":If:3p!/R", "[^p].eler$"], + [4, "ellerais", ":K:1s:2s/*", "ppeler$"], + [4, "ellerais", ":K:1s:2s/M", "[^p].eler$"], + [4, "èlerais", ":K:1s:2s/R", "[^p].eler$"], + [4, "ellerait", ":K:3s/*", "ppeler$"], + [4, "ellerait", ":K:3s/M", "[^p].eler$"], + [4, "èlerait", ":K:3s/R", "[^p].eler$"], + [4, "ellerions", ":K:1p/*", "ppeler$"], + [4, "ellerions", ":K:1p/M", "[^p].eler$"], + [4, "èlerions", ":K:1p/R", "[^p].eler$"], + [4, "elleriez", ":K:2p/*", "ppeler$"], + [4, "elleriez", ":K:2p/M", "[^p].eler$"], + [4, "èleriez", ":K:2p/R", "[^p].eler$"], + [4, "elleraient", ":K:3p/*", "ppeler$"], + [4, "elleraient", ":K:3p/M", "[^p].eler$"], + [4, "èleraient", ":K:3p/R", "[^p].eler$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "elle", ":E:2s/*", "ppeler$"], + [4, "elle", ":E:2s/M", "[^p].eler$"], + [4, "èle", ":E:2s/R", "[^p].eler$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + }, + + "emer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ème", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èmes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èment", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èmerai", ":If:1s/*", false], + [4, "èmeras", ":If:2s/*", false], + [4, "èmera", ":If:3s/*", false], + [4, "èmerons", ":If:1p/*", false], + [4, "èmerez", ":If:2p/*", false], + [4, "èmeront", ":If:3p!/*", false], + [4, "èmerais", ":K:1s:2s/*", false], + [4, "èmerait", ":K:3s/*", false], + [4, "èmerions", ":K:1p/*", false], + [4, "èmeriez", ":K:2p/*", false], + [4, "èmeraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ème", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ener": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ène", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ènes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ènent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "ènerai", ":If:1s/*", false], + [4, "èneras", ":If:2s/*", false], + [4, "ènera", ":If:3s/*", false], + [4, "ènerons", ":If:1p/*", false], + [4, "ènerez", ":If:2p/*", false], + [4, "èneront", ":If:3p!/*", false], + [4, "ènerais", ":K:1s:2s/*", false], + [4, "ènerait", ":K:3s/*", false], + [4, "ènerions", ":K:1p/*", false], + [4, "èneriez", ":K:2p/*", false], + [4, "èneraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ène", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eper": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èpe", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èpes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èpent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èperai", ":If:1s/*", false], + [4, "èperas", ":If:2s/*", false], + [4, "èpera", ":If:3s/*", false], + [4, "èperons", ":If:1p/*", false], + [4, "èperez", ":If:2p/*", false], + [4, "èperont", ":If:3p!/*", false], + [4, "èperais", ":K:1s:2s/*", false], + [4, "èperait", ":K:3s/*", false], + [4, "èperions", ":K:1p/*", false], + [4, "èperiez", ":K:2p/*", false], + [4, "èperaient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èpe", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "erer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ère", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ères", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èrerai", ":If:1s/*", false], + [4, "èreras", ":If:2s/*", false], + [4, "èrera", ":If:3s/*", false], + [4, "èrerons", ":If:1p/*", false], + [4, "èrerez", ":If:2p/*", false], + [4, "èreront", ":If:3p!/*", false], + [4, "èrerais", ":K:1s:2s/*", false], + [4, "èrerait", ":K:3s/*", false], + [4, "èrerions", ":K:1p/*", false], + [4, "èreriez", ":K:2p/*", false], + [4, "èreraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ère", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eser": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èse", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èses", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èsent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èserai", ":If:1s/*", false], + [4, "èseras", ":If:2s/*", false], + [4, "èsera", ":If:3s/*", false], + [4, "èserons", ":If:1p/*", false], + [4, "èserez", ":If:2p/*", false], + [4, "èseront", ":If:3p!/*", false], + [4, "èserais", ":K:1s:2s/*", false], + [4, "èserait", ":K:3s/*", false], + [4, "èserions", ":K:1p/*", false], + [4, "èseriez", ":K:2p/*", false], + [4, "èseraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èse", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "eter": { + "1": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ète", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ètes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ètent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èterai", ":If:1s/*", false], + [4, "èteras", ":If:2s/*", false], + [4, "ètera", ":If:3s/*", false], + [4, "èterons", ":If:1p/*", false], + [4, "èterez", ":If:2p/*", false], + [4, "èteront", ":If:3p!/*", false], + [4, "èterais", ":K:1s:2s/*", false], + [4, "èterait", ":K:3s/*", false], + [4, "èterions", ":K:1p/*", false], + [4, "èteriez", ":K:2p/*", false], + [4, "èteraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ète", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + "2": [ + // d. verbes en -eter : doublement de la consonne t + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ette", ":Ip:Sp:1s:3s/*", "jeter$"], + [4, "ette", ":Ip:Sp:1s:3s/M", "[^j]eter$"], + [4, "ète", ":Ip:Sp:1s:3s/R", "[^j]eter$"], + [2, "è", ":Ip:1ś/R", false], + [4, "ettes", ":Ip:Sp:2s/*", "jeter$"], + [4, "ettes", ":Ip:Sp:2s/M", "[^j]eter$"], + [4, "ètes", ":Ip:Sp:2s/R", "[^j]eter$"], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ettent", ":Ip:Sp:3p/*", "jeter$"], + [4, "ettent", ":Ip:Sp:3p/M", "[^j]eter$"], + [4, "ètent", ":Ip:Sp:3p/R", "[^j]eter$"], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "etterai", ":If:1s/*", "jeter$"], + [4, "etterai", ":If:1s/M", "[^j]eter$"], + [4, "èterai", ":If:1s/R", "[^j]eter$"], + [4, "etteras", ":If:2s/*", "jeter$"], + [4, "etteras", ":If:2s/M", "[^j]eter$"], + [4, "èteras", ":If:2s/R", "[^j]eter$"], + [4, "ettera", ":If:3s/*", "jeter$"], + [4, "ettera", ":If:3s/M", "[^j]eter$"], + [4, "ètera", ":If:3s/R", "[^j]eter$"], + [4, "etterons", ":If:1p/*", "jeter$"], + [4, "etterons", ":If:1p/M", "[^j]eter$"], + [4, "èterons", ":If:1p/R", "[^j]eter$"], + [4, "etterez", ":If:2p/*", "jeter$"], + [4, "etterez", ":If:2p/M", "[^j]eter$"], + [4, "èterez", ":If:2p/R", "[^j]eter$"], + [4, "etteront", ":If:3p!/*", "jeter$"], + [4, "etteront", ":If:3p!/M", "[^j]eter$"], + [4, "èteront", ":If:3p!/R", "[^j]eter$"], + [4, "etterais", ":K:1s:2s/*", "jeter$"], + [4, "etterais", ":K:1s:2s/M", "[^j]eter$"], + [4, "èterais", ":K:1s:2s/R", "[^j]eter$"], + [4, "etterait", ":K:3s/*", "jeter$"], + [4, "etterait", ":K:3s/M", "[^j]eter$"], + [4, "èterait", ":K:3s/R", "[^j]eter$"], + [4, "etterions", ":K:1p/*", "jeter$"], + [4, "etterions", ":K:1p/M", "[^j]eter$"], + [4, "èterions", ":K:1p/R", "[^j]eter$"], + [4, "etteriez", ":K:2p/*", "jeter$"], + [4, "etteriez", ":K:2p/M", "[^j]eter$"], + [4, "èteriez", ":K:2p/R", "[^j]eter$"], + [4, "etteraient", ":K:3p/*", "jeter$"], + [4, "etteraient", ":K:3p/M", "[^j]eter$"], + [4, "èteraient", ":K:3p/R", "[^j]eter$"], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ette", ":E:2s/*", "jeter$"], + [4, "ette", ":E:2s/M", "[^j]eter$"], + [4, "ète", ":E:2s/R", "[^j]eter$"], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ] + }, + + "ever": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ève", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èves", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èvent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [4, "èverai", ":If:1s/*", false], + [4, "èveras", ":If:2s/*", false], + [4, "èvera", ":If:3s/*", false], + [4, "èverons", ":If:1p/*", false], + [4, "èverez", ":If:2p/*", false], + [4, "èveront", ":If:3p!/*", false], + [4, "èverais", ":K:1s:2s/*", false], + [4, "èverait", ":K:3s/*", false], + [4, "èverions", ":K:1p/*", false], + [4, "èveriez", ":K:2p/*", false], + [4, "èveraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ève", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "evrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èvre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èvres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èvrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [5, "èvrerai", ":If:1s/*", false], + [5, "èvreras", ":If:2s/*", false], + [5, "èvrera", ":If:3s/*", false], + [5, "èvrerons", ":If:1p/*", false], + [5, "èvrerez", ":If:2p/*", false], + [5, "èvreront", ":If:3p!/*", false], + [5, "èvrerais", ":K:1s:2s/*", false], + [5, "èvrerait", ":K:3s/*", false], + [5, "èvrerions", ":K:1p/*", false], + [5, "èvreriez", ":K:2p/*", false], + [5, "èvreraient", ":K:3p/*", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èvre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + // c + // verbes en -ébrer, -écer, -écher, -écrer, -éder, -éger, -égler, -égner, -égrer, -éguer, + // -éler, -émer, -éner, -éper, -équer, -érer, -éser, -éter, -étrer, -évrer, -éyer + // changement du é en è + + "écer": [ + [2, "er", ":Y/*", false], + [4, "éçant", ":P/*", false], + [4, "èce", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èces", ":Ip:Sp:2s/*", false], + [4, "éçons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ècent", ":Ip:Sp:3p/*", false], + [4, "éçais", ":Iq:1s:2s/*", false], + [4, "éçait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [4, "éçaient", ":Iq:3p/*", false], + [4, "éçai", ":Is:1s/*", false], + [4, "éças", ":Is:2s/*", false], + [4, "éça", ":Is:3s/*", false], + [4, "éçâmes", ":Is:1p/*", false], + [4, "éçâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ècerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èceras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ècera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ècerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ècerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èceront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ècerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ècerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ècerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èceriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èceraient", ":K:3p/R", false], + [4, "éçasse", ":Sq:1s/*", false], + [4, "éçasses", ":Sq:2s/*", false], + [4, "éçât", ":Sq:3s/*", false], + [4, "éçassions", ":Sq:1p/*", false], + [4, "éçassiez", ":Sq:2p/*", false], + [4, "éçassent", ":Sq:3p/*", false], + [4, "èce", ":E:2s/*", false], + [4, "éçons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éger": [ + [2, "er", ":Y/*", false], + [4, "égeant", ":P/*", false], + [4, "ège", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èges", ":Ip:Sp:2s/*", false], + [4, "égeons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ègent", ":Ip:Sp:3p/*", false], + [4, "égeais", ":Iq:1s:2s/*", false], + [4, "égeait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [4, "égeaient", ":Iq:3p/*", false], + [4, "égeai", ":Is:1s/*", false], + [4, "égeas", ":Is:2s/*", false], + [4, "égea", ":Is:3s/*", false], + [4, "égeâmes", ":Is:1p/*", false], + [4, "égeâtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ègerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "ègeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ègera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ègerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ègerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "ègeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ègerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ègerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ègerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "ègeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "ègeraient", ":K:3p/R", false], + [4, "égeasse", ":Sq:1s/*", false], + [4, "égeasses", ":Sq:2s/*", false], + [4, "égeât", ":Sq:3s/*", false], + [4, "égeassions", ":Sq:1p/*", false], + [4, "égeassiez", ":Sq:2p/*", false], + [4, "égeassent", ":Sq:3p/*", false], + [4, "ège", ":E:2s/*", false], + [4, "égeons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "ébrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èbre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èbres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èbrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èbrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èbreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èbrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èbrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èbrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èbreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èbrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èbrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èbrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èbreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èbreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èbre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "écher": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èche", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èches", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èchent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ècherai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ècheras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èchera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ècherons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ècherez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ècheront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ècherais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ècherait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ècherions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ècheriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ècheraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èche", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "écrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ècre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ècres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ècrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ècrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ècreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ècrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ècrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ècrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ècreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ècrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ècrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ècrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ècreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ècreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ècre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éder": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ède", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èdes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èdent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èderai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èderas", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èdera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èderons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èderez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èderont", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èderais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èderait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èderions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èderiez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èderaient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ède", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égler": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èglent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èglerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègleras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èglera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èglerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èglerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègleront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èglerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èglerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èglerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègleriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègleraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égner": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègne", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègnes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ègnent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ègnerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègneras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ègnera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ègnerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ègnerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègneront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ègnerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ègnerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ègnerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègneriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègneraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègne", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "égrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ègrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ègrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ègrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ègrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ègrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ègrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ègrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ègrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éguer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ègue", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ègues", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èguent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èguerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ègueras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èguera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èguerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èguerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ègueront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èguerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èguerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èguerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ègueriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ègueraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ègue", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éler": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èle", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èles", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èlent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èlerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èleras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èlera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èlerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èlerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èleront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èlerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èlerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èlerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èleriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èleraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èle", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "émer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ème", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èmes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èment", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èmerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èmeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èmera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èmerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èmerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èmeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èmerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èmerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èmerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èmeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èmeraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ème", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éner": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ène", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ènes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ènent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "ènerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èneras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ènera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "ènerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "ènerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èneront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "ènerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "ènerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "ènerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èneriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èneraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ène", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éper": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èpe", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èpes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èpent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èperai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èperas", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èpera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èperons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èperez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èperont", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èperais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èperait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èperions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èperiez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èperaient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èpe", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "équer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èque", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èques", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èquent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èquerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èqueras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èquera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èquerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èquerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èqueront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èquerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èquerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èquerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èqueriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èqueraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èque", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "érer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ère", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ères", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ère", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éser": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èse", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èses", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èsent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èserai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èseras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èsera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èserons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èserez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èseront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èserais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èserait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èserions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èseriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èseraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èse", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éter": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "ète", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "ètes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "ètent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èterai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èteras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "ètera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èterons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èterez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èteront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èterais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èterait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èterions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èteriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èteraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "ète", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "étrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "ètre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "ètres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "ètrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "ètrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "ètreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "ètrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "ètrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "ètrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "ètreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "ètrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "ètrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "ètrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "ètreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "ètreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "ètre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "évrer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [5, "èvre", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [5, "èvres", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [5, "èvrent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [5, "èvrerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [5, "èvreras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [5, "èvrera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [5, "èvrerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [5, "èvrerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [5, "èvreront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [5, "èvrerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [5, "èvrerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [5, "èvrerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [5, "èvreriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [5, "èvreraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [5, "èvre", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ], + + "éyer": [ + [2, "er", ":Y/*", false], + [2, "ant", ":P/*", false], + [4, "èye", ":Ip:Sp:1s:3s/*", false], + [2, "è", ":Ip:1ś/R", false], + [4, "èyes", ":Ip:Sp:2s/*", false], + [2, "ons", ":Ip:1p/*", false], + [2, "ez", ":Ip:2p/*", false], + [4, "èyent", ":Ip:Sp:3p/*", false], + [2, "ais", ":Iq:1s:2s/*", false], + [2, "ait", ":Iq:3s/*", false], + [2, "ions", ":Iq:Sp:1p/*", false], + [2, "iez", ":Iq:Sp:2p/*", false], + [2, "aient", ":Iq:3p/*", false], + [2, "ai", ":Is:1s/*", false], + [2, "as", ":Is:2s/*", false], + [2, "a", ":Is:3s/*", false], + [2, "âmes", ":Is:1p/*", false], + [2, "âtes", ":Is:2p/*", false], + [2, "èrent", ":Is:3p!/*", false], + [2, "erai", ":If:1s/M", false], + [4, "èyerai", ":If:1s/R", false], + [2, "eras", ":If:2s/M", false], + [4, "èyeras", ":If:2s/R", false], + [2, "era", ":If:3s/M", false], + [4, "èyera", ":If:3s/R", false], + [2, "erons", ":If:1p/M", false], + [4, "èyerons", ":If:1p/R", false], + [2, "erez", ":If:2p/M", false], + [4, "èyerez", ":If:2p/R", false], + [2, "eront", ":If:3p!/M", false], + [4, "èyeront", ":If:3p!/R", false], + [2, "erais", ":K:1s:2s/M", false], + [4, "èyerais", ":K:1s:2s/R", false], + [2, "erait", ":K:3s/M", false], + [4, "èyerait", ":K:3s/R", false], + [2, "erions", ":K:1p/M", false], + [4, "èyerions", ":K:1p/R", false], + [2, "eriez", ":K:2p/M", false], + [4, "èyeriez", ":K:2p/R", false], + [2, "eraient", ":K:3p/M", false], + [4, "èyeraient", ":K:3p/R", false], + [2, "asse", ":Sq:1s/*", false], + [2, "asses", ":Sq:2s/*", false], + [2, "ât", ":Sq:3s/*", false], + [2, "assions", ":Sq:1p/*", false], + [2, "assiez", ":Sq:2p/*", false], + [2, "assent", ":Sq:3p/*", false], + [4, "èye", ":E:2s/*", false], + [2, "ons", ":E:1p/*", false], + [2, "ez", ":E:2p/*", false] + ] + } + } +}; Index: gc_lang/fr/modules-js/lexicographe.js ================================================================== --- gc_lang/fr/modules-js/lexicographe.js +++ gc_lang/fr/modules-js/lexicographe.js @@ -12,104 +12,104 @@ if (typeof (require) !== 'undefined') { var helpers = require("resource://grammalecte/graphspell/helpers.js"); } const _dTag = new Map([ - [':G', "[mot grammatical]"], - [':N', " nom,"], - [':A', " adjectif,"], - [':M1', " prénom,"], - [':M2', " patronyme,"], - [':MP', " nom propre,"], - [':W', " adverbe,"], - [':X', " adverbe de négation,"], - [':U', " adverbe interrogatif,"], - [':J', " interjection,"], - [':B', " nombre,"], - [':T', " titre,"], - - [':R', " préposition,"], - [':Rv', " préposition verbale,"], - [':D', " déterminant,"], - [':Dd', " déterminant démonstratif,"], - [':De', " déterminant exclamatif,"], - [':Dp', " déterminant possessif,"], - [':Di', " déterminant indéfini,"], - [':Dn', " déterminant négatif,"], - [':Od', " pronom démonstratif,"], - [':Oi', " pronom indéfini,"], - [':On', " pronom indéfini négatif,"], - [':Ot', " pronom interrogatif,"], - [':Or', " pronom relatif,"], - [':Ow', " pronom adverbial,"], - [':Os', " pronom personnel sujet,"], - [':Oo', " pronom personnel objet,"], - [':C', " conjonction,"], - [':Ĉ', " conjonction (él.),"], - [':Cc', " conjonction de coordination,"], - [':Cs', " conjonction de subordination,"], - [':Ĉs', " conjonction de subordination (él.),"], - - [':Ŵ', " locution adverbiale (él.),"], - [':Ñ', " locution nominale (él.),"], - [':Â', " locution adjectivale (él.),"], - [':Ṽ', " locution verbale (él.),"], - [':Ŕ', " locution prépositive (él.),"], - [':Ĵ', " locution interjective (él.),"], - - [':Zp', " préfixe,"], - [':Zs', " suffixe,"], - - [':V1', " verbe (1ᵉʳ gr.),"], - [':V2', " verbe (2ᵉ gr.),"], - [':V3', " verbe (3ᵉ gr.),"], - [':V0e', " verbe,"], - [':V0a', " verbe,"], - - [':O1', " 1ʳᵉ pers.,"], - [':O2', " 2ᵉ pers.,"], - [':O3', " 3ᵉ pers.,"], - - [':e', " épicène"], - [':m', " masculin"], - [':f', " féminin"], - [':s', " singulier"], - [':p', " pluriel"], - [':i', " invariable"], - - [':Y', " infinitif,"], - [':P', " participe présent,"], - [':Q', " participe passé,"], - - [':Ip', " présent,"], - [':Iq', " imparfait,"], - [':Is', " passé simple,"], - [':If', " futur,"], - [':K', " conditionnel présent,"], - [':Sp', " subjonctif présent,"], - [':Sq', " subjonctif imparfait,"], - [':E', " impératif,"], - - [':1s', " 1ʳᵉ p. sg.,"], - [':1ŝ', " présent interr. 1ʳᵉ p. sg.,"], - [':1ś', " présent interr. 1ʳᵉ p. sg.,"], - [':2s', " 2ᵉ p. sg.,"], - [':3s', " 3ᵉ p. sg.,"], - [':1p', " 1ʳᵉ p. pl.,"], - [':2p', " 2ᵉ p. pl.,"], - [':3p', " 3ᵉ p. pl.,"], - [':3p!', " 3ᵉ p. pl.,"], - - [';S', " : symbole (unité de mesure)"], - - ['/*', ""], - ['/C', " {classique}"], - ['/M', ""], - ['/R', " {réforme}"], - ['/A', ""], - ['/X', ""] + [':N', [" nom,", "Nom"]], + [':A', [" adjectif,", "Adjectif"]], + [':M1', [" prénom,", "Prénom"]], + [':M2', [" patronyme,", "Patronyme, matronyme, nom de famille…"]], + [':MP', [" nom propre,", "Nom propre"]], + [':W', [" adverbe,", "Adverbe"]], + [':J', [" interjection,", "Interjection"]], + [':B', [" nombre,", "Nombre"]], + [':T', [" titre,", "Titre de civilité"]], + + [':e', [" épicène", "épicène"]], + [':m', [" masculin", "masculin"]], + [':f', [" féminin", "féminin"]], + [':s', [" singulier", "singulier"]], + [':p', [" pluriel", "pluriel"]], + [':i', [" invariable", "invariable"]], + + [':V1', [" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"]], + [':V2', [" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"]], + [':V3', [" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"]], + [':V0e', [" verbe,", "Verbe auxiliaire être"]], + [':V0a', [" verbe,", "Verbe auxiliaire avoir"]], + + [':Y', [" infinitif,", "Infinitif"]], + [':P', [" participe présent,", "Participe présent"]], + [':Q', [" participe passé,", "Participe passé"]], + + [':Ip', [" présent,", "Indicatif présent"]], + [':Iq', [" imparfait,", "Indicatif imparfait"]], + [':Is', [" passé simple,", "Indicatif passé simple"]], + [':If', [" futur,", "Indicatif futur"]], + [':K', [" conditionnel présent,", "Conditionnel présent"]], + [':Sp', [" subjonctif présent,", "Subjonctif présent"]], + [':Sq', [" subjonctif imparfait,", "Subjonctif imparfait"]], + [':E', [" impératif,", "Impératif"]], + + [':1s', [" 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier"]], + [':1ŝ', [" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':1ś', [" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"]], + [':2s', [" 2ᵉ p. sg.,", "Verbe à la 2ᵉ personne du singulier"]], + [':3s', [" 3ᵉ p. sg.,", "Verbe à la 3ᵉ personne du singulier"]], + [':1p', [" 1ʳᵉ p. pl.,", "Verbe à la 1ʳᵉ personne du pluriel"]], + [':2p', [" 2ᵉ p. pl.,", "Verbe à la 2ᵉ personne du pluriel"]], + [':3p', [" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel"]], + [':3p!', [" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel (prononciation distinctive)"]], + + [':G', ["[mot grammatical]", "Mot grammatical"]], + [':X', [" adverbe de négation,", "Adverbe de négation"]], + [':U', [" adverbe interrogatif,", "Adverbe interrogatif"]], + [':R', [" préposition,", "Préposition"]], + [':Rv', [" préposition verbale,", "Préposition verbale"]], + [':D', [" déterminant,", "Déterminant"]], + [':Dd', [" déterminant démonstratif,", "Déterminant démonstratif"]], + [':De', [" déterminant exclamatif,", "Déterminant exclamatif"]], + [':Dp', [" déterminant possessif,", "Déterminant possessif"]], + [':Di', [" déterminant indéfini,", "Déterminant indéfini"]], + [':Dn', [" déterminant négatif,", "Déterminant négatif"]], + [':Od', [" pronom démonstratif,", "Pronom démonstratif"]], + [':Oi', [" pronom indéfini,", "Pronom indéfini"]], + [':On', [" pronom indéfini négatif,", "Pronom indéfini négatif"]], + [':Ot', [" pronom interrogatif,", "Pronom interrogatif"]], + [':Or', [" pronom relatif,", "Pronom relatif"]], + [':Ow', [" pronom adverbial,", "Pronom adverbial"]], + [':Os', [" pronom personnel sujet,", "Pronom personnel sujet"]], + [':Oo', [" pronom personnel objet,", "Pronom personnel objet"]], + [':O1', [" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"]], + [':O2', [" 2ᵉ pers.,", "Pronom : 2ᵉ personne"]], + [':O3', [" 3ᵉ pers.,", "Pronom : 3ᵉ personne"]], + [':C', [" conjonction,", "Conjonction"]], + [':Ĉ', [" conjonction (él.),", "Conjonction (élément)"]], + [':Cc', [" conjonction de coordination,", "Conjonction de coordination"]], + [':Cs', [" conjonction de subordination,", "Conjonction de subordination"]], + [':Ĉs', [" conjonction de subordination (él.),", "Conjonction de subordination (élément)"]], + + [':Ñ', [" locution nominale (él.),", "Locution nominale (élément)"]], + [':Â', [" locution adjectivale (él.),", "Locution adjectivale (élément)"]], + [':Ṽ', [" locution verbale (él.),", "Locution verbale (élément)"]], + [':Ŵ', [" locution adverbiale (él.),", "Locution adverbiale (élément)"]], + [':Ŕ', [" locution prépositive (él.),", "Locution prépositive (élément)"]], + [':Ĵ', [" locution interjective (él.),", "Locution interjective (élément)"]], + + [':Zp', [" préfixe,", "Préfixe"]], + [':Zs', [" suffixe,", "Suffixe"]], + + [';S', [" : symbole (unité de mesure)", "Symbole (unité de mesure)"]], + + ['/*', ["", "sous-dictionnaire <Commun>"]], + ['/C', [" <classique>", "sous-dictionnaire <Classique>"]], + ['/M', ["", "sous-dictionnaire <Moderne>"]], + ['/R', [" <réforme>", "sous-dictionnaire <Réforme 1990>"]], + ['/A', ["", "sous-dictionnaire <Annexe>"]], + ['/X', ["", "sous-dictionnaire <Contributeurs>"]] ]); + const _dLocTag = new Map([ [':L', "locution"], [':LN', "locution nominale"], [':LA', "locution adjectivale"], @@ -376,11 +376,11 @@ _formatTags (sTags) { let sRes = ""; sTags = sTags.replace(/V([0-3][ea]?)[itpqnmr_eaxz]+/, "V$1"); let m; while ((m = this._zTag.exec(sTags)) !== null) { - sRes += _dTag.get(m[0]); + sRes += _dTag.get(m[0])[0]; } if (sRes.startsWith(" verbe") && !sRes.includes("infinitif")) { sRes += " [" + sTags.slice(1, sTags.indexOf(" ")) + "]"; } if (!sRes) { ADDED gc_lang/fr/modules/conj_generator.py Index: gc_lang/fr/modules/conj_generator.py ================================================================== --- /dev/null +++ gc_lang/fr/modules/conj_generator.py @@ -0,0 +1,2000 @@ +# Conjugation generator +# beta stage, unfinished, the root for a new way to generate flexions… + +import re + + +def conjugate (sVerb, sVerbTag="i_____a", bVarPpas=True): + lConj = [] + cGroup = getVerbGroupChar(sVerb) + for nCut, sAdd, sFlexTags, sPattern in getConjRules(sVerb, bVarPpas): + if not sPattern or re.search(sPattern, sVerb): + sFlexion = sVerb[0:-nCut] + sAdd if nCut else sVerb + sAdd + lConj.append((sFlexion, ":V" + cGroup + "_" + sVerbTag + sFlexTags)) + return lConj + + +def getVerbGroupChar (sVerb, ): + sVerb = sVerb.lower() + if sVerb.endswith("er"): + return "1" + if sVerb.endswith("ir"): + return "2" + if sVerb == "être" or sVerb == "avoir": + return "0" + if sVerb.endswith("re"): + return "3" + return "4" + + +def getConjRules (sVerb, bVarPpas=True, nGroup=2): + if sVerb.endswith("er"): + # premier groupe, conjugaison en fonction de la terminaison du lemme + # 5 lettres + if sVerb[-5:] in oConj["V1"]: + lConj = list(oConj["V1"][sVerb[-5:]]) + # 4 lettres + elif sVerb[-4:] in oConj["V1"]: + if sVerb.endswith(("eler", "eter")): + lConj = list(oConj["V1"][sVerb[-4:]]["1"]) + else: + lConj = list(oConj["V1"][sVerb[-4:]]) + # 3 lettres + elif sVerb[-3:] in oConj["V1"]: + lConj = list(oConj["V1"][sVerb[-3:]]) + # 2 lettres + else: + lConj = list(oConj["V1"]["er"]) + lConj.extend(oConj["V1_ppas"][bVarPpas]) + elif sVerb.endswith("ir") and nGroup <= 2: + # deuxième groupe + lConj = list(oConj["V2"]) + lConj.extend(oConj["V2_ppas"][bVarPpas]) + else: + # TODO: troisième groupe + lConj = [ [0, "", ":Y/*", False] ] + return lConj + + +oConj = { + "V1_ppas": { + True: [ + [2, "é", ":Q:A:1ŝ:m:s/*", False], + [2, "és", ":Q:A:m:p/*", False], + [2, "ée", ":Q:A:f:s/*", False], + [2, "ées", ":Q:A:f:p/*", False], + ], + False: [ + [2, "é", ":Q:e:i/*", False], + ] + }, + + "V2_ppas": { + True: [ + [2, "i", ":Q:A:m:s/*", False], + [2, "is", ":Q:A:m:p/*", False], + [2, "ie", ":Q:A:f:s/*", False], + [2, "ies", ":Q:A:f:p/*", False], + ], + False: [ + [2, "i", ":Q:e:i/*", False], + ] + }, + + # deuxième groupe (le seul groupe régulier) + "V2": [ + [2, "ir", ":Y/*", False], + [2, "issant", ":P/*", False], + [2, "is", ":Ip:Is:1s:2s/*", False], + [2, "it", ":Ip:Is:3s/*", False], + [2, "issons", ":Ip:1p/*", False], + [2, "issez", ":Ip:2p/*", False], + [2, "issent", ":Ip:Sp:Sq:3p/*", False], + [2, "issais", ":Iq:1s:2s/*", False], + [2, "issait", ":Iq:3s/*", False], + [2, "issions", ":Iq:Sp:Sq:1p/*", False], + [2, "issiez", ":Iq:Sp:Sq:2p/*", False], + [2, "issaient", ":Iq:3p/*", False], + [2, "îmes", ":Is:1p/*", False], + [2, "îtes", ":Is:2p/*", False], + [2, "irent", ":Is:3p!/*", False], + [2, "irai", ":If:1s/*", False], + [2, "iras", ":If:2s/*", False], + [2, "ira", ":If:3s/*", False], + [2, "irons", ":If:1p/*", False], + [2, "irez", ":If:2p/*", False], + [2, "iront", ":If:3p!/*", False], + [2, "irais", ":K:1s:2s/*", False], + [2, "irait", ":K:3s/*", False], + [2, "irions", ":K:1p/*", False], + [2, "iriez", ":K:2p/*", False], + [2, "iraient", ":K:3p/*", False], + [2, "isse", ":Sp:Sq:1s/*", False], + [2, "isses", ":Sp:Sq:2s/*", False], + [2, "isse", ":Sp:3s/*", False], + [2, "ît", ":Sq:3s/*", False], + [2, "is", ":E:2s/*", False], + [2, "issons", ":E:1p/*", False], + [2, "issez", ":E:2p/*", False] + ], + + # premier groupe (bien plus irrégulier que prétendu) + "V1": { + # a + # verbes en -er, -ger, -yer, -cer + "er": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ger": [ + [2, "er", ":Y/*", False], + [2, "eant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [2, "eons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [2, "eais", ":Iq:1s:2s/*", False], + [2, "eait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "eaient", ":Iq:3p/*", False], + [2, "eai", ":Is:1s/*", False], + [2, "eas", ":Is:2s/*", False], + [2, "ea", ":Is:3s/*", False], + [2, "eâmes", ":Is:1p/*", False], + [2, "eâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [2, "easse", ":Sq:1s/*", False], + [2, "easses", ":Sq:2s/*", False], + [2, "eât", ":Sq:3s/*", False], + [2, "eassions", ":Sq:1p/*", False], + [2, "eassiez", ":Sq:2p/*", False], + [2, "eassent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [2, "eons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "cer": [ + [2, "er", ":Y/*", False], + [3, "çant", ":P/*", False], + [2, "e", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/*", False], + [2, "es", ":Ip:Sp:2s/*", False], + [3, "çons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [2, "ent", ":Ip:Sp:3p/*", False], + [3, "çais", ":Iq:1s:2s/*", False], + [3, "çait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [3, "çaient", ":Iq:3p/*", False], + [3, "çai", ":Is:1s/*", False], + [3, "ças", ":Is:2s/*", False], + [3, "ça", ":Is:3s/*", False], + [3, "çâmes", ":Is:1p/*", False], + [3, "çâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/*", False], + [2, "eras", ":If:2s/*", False], + [2, "era", ":If:3s/*", False], + [2, "erons", ":If:1p/*", False], + [2, "erez", ":If:2p/*", False], + [2, "eront", ":If:3p!/*", False], + [2, "erais", ":K:1s:2s/*", False], + [2, "erait", ":K:3s/*", False], + [2, "erions", ":K:1p/*", False], + [2, "eriez", ":K:2p/*", False], + [2, "eraient", ":K:3p/*", False], + [3, "çasse", ":Sq:1s/*", False], + [3, "çasses", ":Sq:2s/*", False], + [3, "çât", ":Sq:3s/*", False], + [3, "çassions", ":Sq:1p/*", False], + [3, "çassiez", ":Sq:2p/*", False], + [3, "çassent", ":Sq:3p/*", False], + [2, "e", ":E:2s/*", False], + [3, "çons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "yer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [3, "ye", ":Ip:Sp:1s:3s/*", "[^ou]yer$"], + [3, "ie", ":Ip:Sp:1s:3s/*", "[aou]yer$"], + [2, "è", ":Ip:1ś/*", False], + [3, "yes", ":Ip:Sp:2s/*", "[^ou]yer$"], + [3, "ies", ":Ip:Sp:2s/*", "[aou]yer$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [3, "yent", ":Ip:Sp:3p/*", "[^ou]yer$"], + [3, "ient", ":Ip:Sp:3p/*", "[aou]yer$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [3, "yerai", ":If:1s/*", "[^ou]yer$"], + [3, "ierai", ":If:1s/*", "[aou]yer$"], + [3, "yeras", ":If:2s/*", "[^ou]yer$"], + [3, "ieras", ":If:2s/*", "[aou]yer$"], + [3, "yera", ":If:3s/*", "[^ou]yer$"], + [3, "iera", ":If:3s/*", "[aou]yer$"], + [3, "yerons", ":If:1p/*", "[^ou]yer$"], + [3, "ierons", ":If:1p/*", "[aou]yer$"], + [3, "yerez", ":If:2p/*", "[^ou]yer$"], + [3, "ierez", ":If:2p/*", "[aou]yer$"], + [3, "yeront", ":If:3p!/*", "[^ou]yer$"], + [3, "ieront", ":If:3p!/*", "[aou]yer$"], + [3, "yerais", ":K:1s:2s/*", "[^ou]yer$"], + [3, "ierais", ":K:1s:2s/*", "[aou]yer$"], + [3, "yerait", ":K:3s/*", "[^ou]yer$"], + [3, "ierait", ":K:3s/*", "[aou]yer$"], + [3, "yerions", ":K:1p/*", "[^ou]yer$"], + [3, "ierions", ":K:1p/*", "[aou]yer$"], + [3, "yeriez", ":K:2p/*", "[^ou]yer$"], + [3, "ieriez", ":K:2p/*", "[aou]yer$"], + [3, "yeraient", ":K:3p/*", "[^ou]yer$"], + [3, "ieraient", ":K:3p/*", "[aou]yer$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [3, "ye", ":E:2s/*", "[^ou]yer$"], + [3, "ie", ":E:2s/*", "[aou]yer$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + # b + # verbes en -ecer, -emer, -ener, -eper, -erer, -eser, -ever, -evrer + # verbes en -eler, -eter (pas de doublement de la consonne: acheter, celer, déceler, receler, ciseler, démanteler, + # écarteler, encasteler, geler, dégeler, congeler, surgeler, marteler, modeler, peler, acheter, racheter, + # bégueter, corseter, crocheter, fileter, fureter, haleter) + # changement du e en è avant syllabe muette + "ecer": [ + [2, "er", ":Y/*", False], + [3, "çant", ":P/*", False], + [4, "èce", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èces", ":Ip:Sp:2s/*", False], + [3, "çons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ècent", ":Ip:Sp:3p/*", False], + [3, "çais", ":Iq:1s:2s/*", False], + [3, "çait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [3, "çaient", ":Iq:3p/*", False], + [3, "çai", ":Is:1s/*", False], + [3, "ças", ":Is:2s/*", False], + [3, "ça", ":Is:3s/*", False], + [3, "çâmes", ":Is:1p/*", False], + [3, "çâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ècerai", ":If:1s/*", False], + [4, "èceras", ":If:2s/*", False], + [4, "ècera", ":If:3s/*", False], + [4, "ècerons", ":If:1p/*", False], + [4, "ècerez", ":If:2p/*", False], + [4, "èceront", ":If:3p!/*", False], + [4, "ècerais", ":K:1s:2s/*", False], + [4, "ècerait", ":K:3s/*", False], + [4, "ècerions", ":K:1p/*", False], + [4, "èceriez", ":K:2p/*", False], + [4, "èceraient", ":K:3p/*", False], + [3, "çasse", ":Sq:1s/*", False], + [3, "çasses", ":Sq:2s/*", False], + [3, "çât", ":Sq:3s/*", False], + [3, "çassions", ":Sq:1p/*", False], + [3, "çassiez", ":Sq:2p/*", False], + [3, "çassent", ":Sq:3p/*", False], + [4, "èce", ":E:2s/*", False], + [3, "çons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eler": { + "1": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èlent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èlerai", ":If:1s/*", False], + [4, "èleras", ":If:2s/*", False], + [4, "èlera", ":If:3s/*", False], + [4, "èlerons", ":If:1p/*", False], + [4, "èlerez", ":If:2p/*", False], + [4, "èleront", ":If:3p!/*", False], + [4, "èlerais", ":K:1s:2s/*", False], + [4, "èlerait", ":K:3s/*", False], + [4, "èlerions", ":K:1p/*", False], + [4, "èleriez", ":K:2p/*", False], + [4, "èleraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + "2": [ + # d. verbes en -eler : doublement de la consonne l. + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "elle", ":Ip:Sp:1s:3s/*", "ppeler$"], + [4, "elle", ":Ip:Sp:1s:3s/M", "[^p].eler$"], + [4, "èle", ":Ip:Sp:1s:3s/R", "[^p].eler$"], + [2, "è", ":Ip:1ś/R", False], + [4, "elles", ":Ip:Sp:2s/*", "ppeler$"], + [4, "elles", ":Ip:Sp:2s/M", "[^p].eler$"], + [4, "èles", ":Ip:Sp:2s/R", "[^p].eler$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ellent", ":Ip:Sp:3p/*", "ppeler$"], + [4, "ellent", ":Ip:Sp:3p/M", "[^p].eler$"], + [4, "èlent", ":Ip:Sp:3p/R", "[^p].eler$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ellerai", ":If:1s/*", "ppeler$"], + [4, "ellerai", ":If:1s/M", "[^p].eler$"], + [4, "èlerai", ":If:1s/R", "[^p].eler$"], + [4, "elleras", ":If:2s/*", "ppeler$"], + [4, "elleras", ":If:2s/M", "[^p].eler$"], + [4, "èleras", ":If:2s/R", "[^p].eler$"], + [4, "ellera", ":If:3s/*", "ppeler$"], + [4, "ellera", ":If:3s/M", "[^p].eler$"], + [4, "èlera", ":If:3s/R", "[^p].eler$"], + [4, "ellerons", ":If:1p/*", "ppeler$"], + [4, "ellerons", ":If:1p/M", "[^p].eler$"], + [4, "èlerons", ":If:1p/R", "[^p].eler$"], + [4, "ellerez", ":If:2p/*", "ppeler$"], + [4, "ellerez", ":If:2p/M", "[^p].eler$"], + [4, "èlerez", ":If:2p/R", "[^p].eler$"], + [4, "elleront", ":If:3p!/*", "ppeler$"], + [4, "elleront", ":If:3p!/M", "[^p].eler$"], + [4, "èleront", ":If:3p!/R", "[^p].eler$"], + [4, "ellerais", ":K:1s:2s/*", "ppeler$"], + [4, "ellerais", ":K:1s:2s/M", "[^p].eler$"], + [4, "èlerais", ":K:1s:2s/R", "[^p].eler$"], + [4, "ellerait", ":K:3s/*", "ppeler$"], + [4, "ellerait", ":K:3s/M", "[^p].eler$"], + [4, "èlerait", ":K:3s/R", "[^p].eler$"], + [4, "ellerions", ":K:1p/*", "ppeler$"], + [4, "ellerions", ":K:1p/M", "[^p].eler$"], + [4, "èlerions", ":K:1p/R", "[^p].eler$"], + [4, "elleriez", ":K:2p/*", "ppeler$"], + [4, "elleriez", ":K:2p/M", "[^p].eler$"], + [4, "èleriez", ":K:2p/R", "[^p].eler$"], + [4, "elleraient", ":K:3p/*", "ppeler$"], + [4, "elleraient", ":K:3p/M", "[^p].eler$"], + [4, "èleraient", ":K:3p/R", "[^p].eler$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "elle", ":E:2s/*", "ppeler$"], + [4, "elle", ":E:2s/M", "[^p].eler$"], + [4, "èle", ":E:2s/R", "[^p].eler$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + }, + + "emer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ème", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èmes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èment", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èmerai", ":If:1s/*", False], + [4, "èmeras", ":If:2s/*", False], + [4, "èmera", ":If:3s/*", False], + [4, "èmerons", ":If:1p/*", False], + [4, "èmerez", ":If:2p/*", False], + [4, "èmeront", ":If:3p!/*", False], + [4, "èmerais", ":K:1s:2s/*", False], + [4, "èmerait", ":K:3s/*", False], + [4, "èmerions", ":K:1p/*", False], + [4, "èmeriez", ":K:2p/*", False], + [4, "èmeraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ème", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ener": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ène", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ènes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ènent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "ènerai", ":If:1s/*", False], + [4, "èneras", ":If:2s/*", False], + [4, "ènera", ":If:3s/*", False], + [4, "ènerons", ":If:1p/*", False], + [4, "ènerez", ":If:2p/*", False], + [4, "èneront", ":If:3p!/*", False], + [4, "ènerais", ":K:1s:2s/*", False], + [4, "ènerait", ":K:3s/*", False], + [4, "ènerions", ":K:1p/*", False], + [4, "èneriez", ":K:2p/*", False], + [4, "èneraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ène", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eper": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èpe", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èpes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èpent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èperai", ":If:1s/*", False], + [4, "èperas", ":If:2s/*", False], + [4, "èpera", ":If:3s/*", False], + [4, "èperons", ":If:1p/*", False], + [4, "èperez", ":If:2p/*", False], + [4, "èperont", ":If:3p!/*", False], + [4, "èperais", ":K:1s:2s/*", False], + [4, "èperait", ":K:3s/*", False], + [4, "èperions", ":K:1p/*", False], + [4, "èperiez", ":K:2p/*", False], + [4, "èperaient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èpe", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "erer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ère", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ères", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èrerai", ":If:1s/*", False], + [4, "èreras", ":If:2s/*", False], + [4, "èrera", ":If:3s/*", False], + [4, "èrerons", ":If:1p/*", False], + [4, "èrerez", ":If:2p/*", False], + [4, "èreront", ":If:3p!/*", False], + [4, "èrerais", ":K:1s:2s/*", False], + [4, "èrerait", ":K:3s/*", False], + [4, "èrerions", ":K:1p/*", False], + [4, "èreriez", ":K:2p/*", False], + [4, "èreraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ère", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eser": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èse", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èses", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èsent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èserai", ":If:1s/*", False], + [4, "èseras", ":If:2s/*", False], + [4, "èsera", ":If:3s/*", False], + [4, "èserons", ":If:1p/*", False], + [4, "èserez", ":If:2p/*", False], + [4, "èseront", ":If:3p!/*", False], + [4, "èserais", ":K:1s:2s/*", False], + [4, "èserait", ":K:3s/*", False], + [4, "èserions", ":K:1p/*", False], + [4, "èseriez", ":K:2p/*", False], + [4, "èseraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èse", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "eter": { + "1": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ète", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ètes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ètent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èterai", ":If:1s/*", False], + [4, "èteras", ":If:2s/*", False], + [4, "ètera", ":If:3s/*", False], + [4, "èterons", ":If:1p/*", False], + [4, "èterez", ":If:2p/*", False], + [4, "èteront", ":If:3p!/*", False], + [4, "èterais", ":K:1s:2s/*", False], + [4, "èterait", ":K:3s/*", False], + [4, "èterions", ":K:1p/*", False], + [4, "èteriez", ":K:2p/*", False], + [4, "èteraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ète", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + "2": [ + # d. verbes en -eter : doublement de la consonne t + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ette", ":Ip:Sp:1s:3s/*", "jeter$"], + [4, "ette", ":Ip:Sp:1s:3s/M", "[^j]eter$"], + [4, "ète", ":Ip:Sp:1s:3s/R", "[^j]eter$"], + [2, "è", ":Ip:1ś/R", False], + [4, "ettes", ":Ip:Sp:2s/*", "jeter$"], + [4, "ettes", ":Ip:Sp:2s/M", "[^j]eter$"], + [4, "ètes", ":Ip:Sp:2s/R", "[^j]eter$"], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ettent", ":Ip:Sp:3p/*", "jeter$"], + [4, "ettent", ":Ip:Sp:3p/M", "[^j]eter$"], + [4, "ètent", ":Ip:Sp:3p/R", "[^j]eter$"], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "etterai", ":If:1s/*", "jeter$"], + [4, "etterai", ":If:1s/M", "[^j]eter$"], + [4, "èterai", ":If:1s/R", "[^j]eter$"], + [4, "etteras", ":If:2s/*", "jeter$"], + [4, "etteras", ":If:2s/M", "[^j]eter$"], + [4, "èteras", ":If:2s/R", "[^j]eter$"], + [4, "ettera", ":If:3s/*", "jeter$"], + [4, "ettera", ":If:3s/M", "[^j]eter$"], + [4, "ètera", ":If:3s/R", "[^j]eter$"], + [4, "etterons", ":If:1p/*", "jeter$"], + [4, "etterons", ":If:1p/M", "[^j]eter$"], + [4, "èterons", ":If:1p/R", "[^j]eter$"], + [4, "etterez", ":If:2p/*", "jeter$"], + [4, "etterez", ":If:2p/M", "[^j]eter$"], + [4, "èterez", ":If:2p/R", "[^j]eter$"], + [4, "etteront", ":If:3p!/*", "jeter$"], + [4, "etteront", ":If:3p!/M", "[^j]eter$"], + [4, "èteront", ":If:3p!/R", "[^j]eter$"], + [4, "etterais", ":K:1s:2s/*", "jeter$"], + [4, "etterais", ":K:1s:2s/M", "[^j]eter$"], + [4, "èterais", ":K:1s:2s/R", "[^j]eter$"], + [4, "etterait", ":K:3s/*", "jeter$"], + [4, "etterait", ":K:3s/M", "[^j]eter$"], + [4, "èterait", ":K:3s/R", "[^j]eter$"], + [4, "etterions", ":K:1p/*", "jeter$"], + [4, "etterions", ":K:1p/M", "[^j]eter$"], + [4, "èterions", ":K:1p/R", "[^j]eter$"], + [4, "etteriez", ":K:2p/*", "jeter$"], + [4, "etteriez", ":K:2p/M", "[^j]eter$"], + [4, "èteriez", ":K:2p/R", "[^j]eter$"], + [4, "etteraient", ":K:3p/*", "jeter$"], + [4, "etteraient", ":K:3p/M", "[^j]eter$"], + [4, "èteraient", ":K:3p/R", "[^j]eter$"], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ette", ":E:2s/*", "jeter$"], + [4, "ette", ":E:2s/M", "[^j]eter$"], + [4, "ète", ":E:2s/R", "[^j]eter$"], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ] + }, + + "ever": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ève", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èves", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èvent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [4, "èverai", ":If:1s/*", False], + [4, "èveras", ":If:2s/*", False], + [4, "èvera", ":If:3s/*", False], + [4, "èverons", ":If:1p/*", False], + [4, "èverez", ":If:2p/*", False], + [4, "èveront", ":If:3p!/*", False], + [4, "èverais", ":K:1s:2s/*", False], + [4, "èverait", ":K:3s/*", False], + [4, "èverions", ":K:1p/*", False], + [4, "èveriez", ":K:2p/*", False], + [4, "èveraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ève", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "evrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èvre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èvres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èvrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [5, "èvrerai", ":If:1s/*", False], + [5, "èvreras", ":If:2s/*", False], + [5, "èvrera", ":If:3s/*", False], + [5, "èvrerons", ":If:1p/*", False], + [5, "èvrerez", ":If:2p/*", False], + [5, "èvreront", ":If:3p!/*", False], + [5, "èvrerais", ":K:1s:2s/*", False], + [5, "èvrerait", ":K:3s/*", False], + [5, "èvrerions", ":K:1p/*", False], + [5, "èvreriez", ":K:2p/*", False], + [5, "èvreraient", ":K:3p/*", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èvre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + # c + # verbes en -ébrer, -écer, -écher, -écrer, -éder, -éger, -égler, -égner, -égrer, -éguer, + # -éler, -émer, -éner, -éper, -équer, -érer, -éser, -éter, -étrer, -évrer, -éyer + # changement du é en è + + "écer": [ + [2, "er", ":Y/*", False], + [4, "éçant", ":P/*", False], + [4, "èce", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èces", ":Ip:Sp:2s/*", False], + [4, "éçons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ècent", ":Ip:Sp:3p/*", False], + [4, "éçais", ":Iq:1s:2s/*", False], + [4, "éçait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [4, "éçaient", ":Iq:3p/*", False], + [4, "éçai", ":Is:1s/*", False], + [4, "éças", ":Is:2s/*", False], + [4, "éça", ":Is:3s/*", False], + [4, "éçâmes", ":Is:1p/*", False], + [4, "éçâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ècerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èceras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ècera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ècerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ècerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èceront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ècerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ècerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ècerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èceriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èceraient", ":K:3p/R", False], + [4, "éçasse", ":Sq:1s/*", False], + [4, "éçasses", ":Sq:2s/*", False], + [4, "éçât", ":Sq:3s/*", False], + [4, "éçassions", ":Sq:1p/*", False], + [4, "éçassiez", ":Sq:2p/*", False], + [4, "éçassent", ":Sq:3p/*", False], + [4, "èce", ":E:2s/*", False], + [4, "éçons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éger": [ + [2, "er", ":Y/*", False], + [4, "égeant", ":P/*", False], + [4, "ège", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èges", ":Ip:Sp:2s/*", False], + [4, "égeons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ègent", ":Ip:Sp:3p/*", False], + [4, "égeais", ":Iq:1s:2s/*", False], + [4, "égeait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [4, "égeaient", ":Iq:3p/*", False], + [4, "égeai", ":Is:1s/*", False], + [4, "égeas", ":Is:2s/*", False], + [4, "égea", ":Is:3s/*", False], + [4, "égeâmes", ":Is:1p/*", False], + [4, "égeâtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ègerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "ègeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ègera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ègerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ègerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "ègeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ègerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ègerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ègerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "ègeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "ègeraient", ":K:3p/R", False], + [4, "égeasse", ":Sq:1s/*", False], + [4, "égeasses", ":Sq:2s/*", False], + [4, "égeât", ":Sq:3s/*", False], + [4, "égeassions", ":Sq:1p/*", False], + [4, "égeassiez", ":Sq:2p/*", False], + [4, "égeassent", ":Sq:3p/*", False], + [4, "ège", ":E:2s/*", False], + [4, "égeons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "ébrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èbre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èbres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èbrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èbrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èbreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èbrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èbrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èbrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èbreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èbrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èbrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èbrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èbreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èbreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èbre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "écher": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èche", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èches", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èchent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ècherai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ècheras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èchera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ècherons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ècherez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ècheront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ècherais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ècherait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ècherions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ècheriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ècheraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èche", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "écrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ècre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ècres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ècrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ècrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ècreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ècrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ècrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ècrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ècreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ècrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ècrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ècrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ècreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ècreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ècre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éder": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ède", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èdes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èdent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èderai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èderas", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èdera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èderons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èderez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èderont", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èderais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èderait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èderions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èderiez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èderaient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ède", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égler": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èglent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èglerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègleras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èglera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èglerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èglerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègleront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èglerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èglerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èglerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègleriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègleraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égner": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègne", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègnes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ègnent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ègnerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègneras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ègnera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ègnerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ègnerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègneront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ègnerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ègnerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ègnerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègneriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègneraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègne", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "égrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ègrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ègrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ègrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ègrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ègrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ègrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ègrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ègrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éguer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ègue", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ègues", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èguent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èguerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ègueras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èguera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èguerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èguerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ègueront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èguerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èguerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èguerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ègueriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ègueraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ègue", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éler": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èle", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èles", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èlent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èlerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èleras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èlera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èlerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èlerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èleront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èlerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èlerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èlerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èleriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èleraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èle", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "émer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ème", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èmes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èment", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èmerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èmeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èmera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èmerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èmerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èmeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èmerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èmerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èmerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èmeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èmeraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ème", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éner": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ène", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ènes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ènent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "ènerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èneras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ènera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "ènerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "ènerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èneront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "ènerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "ènerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "ènerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èneriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èneraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ène", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éper": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èpe", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èpes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èpent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èperai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èperas", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èpera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èperons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èperez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èperont", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èperais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èperait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èperions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èperiez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èperaient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èpe", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "équer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èque", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èques", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èquent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èquerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èqueras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èquera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èquerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èquerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èqueront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èquerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èquerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èquerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èqueriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èqueraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èque", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "érer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ère", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ères", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ère", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éser": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èse", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èses", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èsent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èserai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èseras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èsera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èserons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èserez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èseront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èserais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èserait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èserions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èseriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èseraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èse", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éter": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "ète", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "ètes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "ètent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èterai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èteras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "ètera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èterons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èterez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èteront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èterais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èterait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èterions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èteriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èteraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "ète", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "étrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "ètre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "ètres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "ètrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "ètrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "ètreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "ètrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "ètrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "ètrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "ètreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "ètrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "ètrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "ètrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "ètreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "ètreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "ètre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "évrer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [5, "èvre", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [5, "èvres", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [5, "èvrent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [5, "èvrerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [5, "èvreras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [5, "èvrera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [5, "èvrerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [5, "èvrerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [5, "èvreront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [5, "èvrerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [5, "èvrerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [5, "èvrerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [5, "èvreriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [5, "èvreraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [5, "èvre", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ], + + "éyer": [ + [2, "er", ":Y/*", False], + [2, "ant", ":P/*", False], + [4, "èye", ":Ip:Sp:1s:3s/*", False], + [2, "è", ":Ip:1ś/R", False], + [4, "èyes", ":Ip:Sp:2s/*", False], + [2, "ons", ":Ip:1p/*", False], + [2, "ez", ":Ip:2p/*", False], + [4, "èyent", ":Ip:Sp:3p/*", False], + [2, "ais", ":Iq:1s:2s/*", False], + [2, "ait", ":Iq:3s/*", False], + [2, "ions", ":Iq:Sp:1p/*", False], + [2, "iez", ":Iq:Sp:2p/*", False], + [2, "aient", ":Iq:3p/*", False], + [2, "ai", ":Is:1s/*", False], + [2, "as", ":Is:2s/*", False], + [2, "a", ":Is:3s/*", False], + [2, "âmes", ":Is:1p/*", False], + [2, "âtes", ":Is:2p/*", False], + [2, "èrent", ":Is:3p!/*", False], + [2, "erai", ":If:1s/M", False], + [4, "èyerai", ":If:1s/R", False], + [2, "eras", ":If:2s/M", False], + [4, "èyeras", ":If:2s/R", False], + [2, "era", ":If:3s/M", False], + [4, "èyera", ":If:3s/R", False], + [2, "erons", ":If:1p/M", False], + [4, "èyerons", ":If:1p/R", False], + [2, "erez", ":If:2p/M", False], + [4, "èyerez", ":If:2p/R", False], + [2, "eront", ":If:3p!/M", False], + [4, "èyeront", ":If:3p!/R", False], + [2, "erais", ":K:1s:2s/M", False], + [4, "èyerais", ":K:1s:2s/R", False], + [2, "erait", ":K:3s/M", False], + [4, "èyerait", ":K:3s/R", False], + [2, "erions", ":K:1p/M", False], + [4, "èyerions", ":K:1p/R", False], + [2, "eriez", ":K:2p/M", False], + [4, "èyeriez", ":K:2p/R", False], + [2, "eraient", ":K:3p/M", False], + [4, "èyeraient", ":K:3p/R", False], + [2, "asse", ":Sq:1s/*", False], + [2, "asses", ":Sq:2s/*", False], + [2, "ât", ":Sq:3s/*", False], + [2, "assions", ":Sq:1p/*", False], + [2, "assiez", ":Sq:2p/*", False], + [2, "assent", ":Sq:3p/*", False], + [4, "èye", ":E:2s/*", False], + [2, "ons", ":E:1p/*", False], + [2, "ez", ":E:2p/*", False] + ] + } +} Index: gc_lang/fr/modules/lexicographe.py ================================================================== --- gc_lang/fr/modules/lexicographe.py +++ gc_lang/fr/modules/lexicographe.py @@ -5,103 +5,102 @@ import re import traceback _dTAGS = { - ':G': "", - ':N': " nom,", - ':A': " adjectif,", - ':M1': " prénom,", - ':M2': " patronyme,", - ':MP': " nom propre,", - ':W': " adverbe,", - ':X': " adverbe de négation,", - ':U': " adverbe interrogatif,", - ':J': " interjection,", - ':B': " nombre,", - ':T': " titre,", - - ':R': " préposition,", - ':Rv': " préposition verbale,", - ':D': " déterminant,", - ':Dd': " déterminant démonstratif,", - ':De': " déterminant exclamatif,", - ':Dp': " déterminant possessif,", - ':Di': " déterminant indéfini,", - ':Dn': " déterminant négatif,", - ':Od': " pronom démonstratif,", - ':Oi': " pronom indéfini,", - ':On': " pronom indéfini négatif,", - ':Ot': " pronom interrogatif,", - ':Or': " pronom relatif,", - ':Ow': " pronom adverbial,", - ':Os': " pronom personnel sujet,", - ':Oo': " pronom personnel objet,", - ':C': " conjonction,", - ':Ĉ': " conjonction (él.),", - ':Cc': " conjonction de coordination,", - ':Cs': " conjonction de subordination,", - ':Ĉs': " conjonction de subordination (él.),", - - ':Ŵ': " locution adverbiale (él.),", - ':Ñ': " locution nominale (él.),", - ':Â': " locution adjectivale (él.),", - ':Ṽ': " locution verbale (él.),", - ':Ŕ': " locution prépositive (él.),", - ':Ĵ': " locution interjective (él.),", - - ':Zp': " préfixe,", - ':Zs': " suffixe,", - - ':V1': " verbe (1ᵉʳ gr.),", - ':V2': " verbe (2ᵉ gr.),", - ':V3': " verbe (3ᵉ gr.),", - ':V0e': " verbe,", - ':V0a': " verbe,", - - ':O1': " 1ʳᵉ pers.,", - ':O2': " 2ᵉ pers.,", - ':O3': " 3ᵉ pers.,", - - ':e': " épicène", - ':m': " masculin", - ':f': " féminin", - ':s': " singulier", - ':p': " pluriel", - ':i': " invariable", - - ':Y': " infinitif,", - ':P': " participe présent,", - ':Q': " participe passé,", - - ':Ip': " présent,", - ':Iq': " imparfait,", - ':Is': " passé simple,", - ':If': " futur,", - ':K': " conditionnel présent,", - ':Sp': " subjonctif présent,", - ':Sq': " subjonctif imparfait,", - ':E': " impératif,", - - ':1s': " 1ʳᵉ p. sg.,", - ':1ŝ': " présent interr. 1ʳᵉ p. sg.,", - ':1ś': " présent interr. 1ʳᵉ p. sg.,", - ':2s': " 2ᵉ p. sg.,", - ':3s': " 3ᵉ p. sg.,", - ':1p': " 1ʳᵉ p. pl.,", - ':2p': " 2ᵉ p. pl.,", - ':3p': " 3ᵉ p. pl.,", - ':3p!': " 3ᵉ p. pl.,", - - ';S': " : symbole (unité de mesure)", - - '/*': "", - '/C': " {classique}", - '/M': "", - '/R': " {réforme}", - '/A': "", - '/X': "" + ':N': (" nom,", "Nom"), + ':A': (" adjectif,", "Adjectif"), + ':M1': (" prénom,", "Prénom"), + ':M2': (" patronyme,", "Patronyme, matronyme, nom de famille…"), + ':MP': (" nom propre,", "Nom propre"), + ':W': (" adverbe,", "Adverbe"), + ':J': (" interjection,", "Interjection"), + ':B': (" nombre,", "Nombre"), + ':T': (" titre,", "Titre de civilité"), + + ':e': (" épicène", "épicène"), + ':m': (" masculin", "masculin"), + ':f': (" féminin", "féminin"), + ':s': (" singulier", "singulier"), + ':p': (" pluriel", "pluriel"), + ':i': (" invariable", "invariable"), + + ':V1': (" verbe (1ᵉʳ gr.),", "Verbe du 1ᵉʳ groupe"), + ':V2': (" verbe (2ᵉ gr.),", "Verbe du 2ᵉ groupe"), + ':V3': (" verbe (3ᵉ gr.),", "Verbe du 3ᵉ groupe"), + ':V0e': (" verbe,", "Verbe auxiliaire être"), + ':V0a': (" verbe,", "Verbe auxiliaire avoir"), + + ':Y': (" infinitif,", "Infinitif"), + ':P': (" participe présent,", "Participe présent"), + ':Q': (" participe passé,", "Participe passé"), + + ':Ip': (" présent,", "Indicatif présent"), + ':Iq': (" imparfait,", "Indicatif imparfait"), + ':Is': (" passé simple,", "Indicatif passé simple"), + ':If': (" futur,", "Indicatif futur"), + ':K': (" conditionnel présent,", "Conditionnel présent"), + ':Sp': (" subjonctif présent,", "Subjonctif présent"), + ':Sq': (" subjonctif imparfait,", "Subjonctif imparfait"), + ':E': (" impératif,", "Impératif"), + + ':1s': (" 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier"), + ':1ŝ': (" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"), + ':1ś': (" présent interr. 1ʳᵉ p. sg.,", "Verbe à la 1ʳᵉ personne du singulier (présent interrogatif)"), + ':2s': (" 2ᵉ p. sg.,", "Verbe à la 2ᵉ personne du singulier"), + ':3s': (" 3ᵉ p. sg.,", "Verbe à la 3ᵉ personne du singulier"), + ':1p': (" 1ʳᵉ p. pl.,", "Verbe à la 1ʳᵉ personne du pluriel"), + ':2p': (" 2ᵉ p. pl.,", "Verbe à la 2ᵉ personne du pluriel"), + ':3p': (" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel"), + ':3p!': (" 3ᵉ p. pl.,", "Verbe à la 3ᵉ personne du pluriel (prononciation distinctive)"), + + ':G': ("", "Mot grammatical"), + ':X': (" adverbe de négation,", "Adverbe de négation"), + ':U': (" adverbe interrogatif,", "Adverbe interrogatif"), + ':R': (" préposition,", "Préposition"), + ':Rv': (" préposition verbale,", "Préposition verbale"), + ':D': (" déterminant,", "Déterminant"), + ':Dd': (" déterminant démonstratif,", "Déterminant démonstratif"), + ':De': (" déterminant exclamatif,", "Déterminant exclamatif"), + ':Dp': (" déterminant possessif,", "Déterminant possessif"), + ':Di': (" déterminant indéfini,", "Déterminant indéfini"), + ':Dn': (" déterminant négatif,", "Déterminant négatif"), + ':Od': (" pronom démonstratif,", "Pronom démonstratif"), + ':Oi': (" pronom indéfini,", "Pronom indéfini"), + ':On': (" pronom indéfini négatif,", "Pronom indéfini négatif"), + ':Ot': (" pronom interrogatif,", "Pronom interrogatif"), + ':Or': (" pronom relatif,", "Pronom relatif"), + ':Ow': (" pronom adverbial,", "Pronom adverbial"), + ':Os': (" pronom personnel sujet,", "Pronom personnel sujet"), + ':Oo': (" pronom personnel objet,", "Pronom personnel objet"), + ':O1': (" 1ʳᵉ pers.,", "Pronom : 1ʳᵉ personne"), + ':O2': (" 2ᵉ pers.,", "Pronom : 2ᵉ personne"), + ':O3': (" 3ᵉ pers.,", "Pronom : 3ᵉ personne"), + ':C': (" conjonction,", "Conjonction"), + ':Ĉ': (" conjonction (él.),", "Conjonction (élément)"), + ':Cc': (" conjonction de coordination,", "Conjonction de coordination"), + ':Cs': (" conjonction de subordination,", "Conjonction de subordination"), + ':Ĉs': (" conjonction de subordination (él.),", "Conjonction de subordination (élément)"), + + ':Ñ': (" locution nominale (él.),", "Locution nominale (élément)"), + ':Â': (" locution adjectivale (él.),", "Locution adjectivale (élément)"), + ':Ṽ': (" locution verbale (él.),", "Locution verbale (élément)"), + ':Ŵ': (" locution adverbiale (él.),", "Locution adverbiale (élément)"), + ':Ŕ': (" locution prépositive (él.),", "Locution prépositive (élément)"), + ':Ĵ': (" locution interjective (él.),", "Locution interjective (élément)"), + + ':Zp': (" préfixe,", "Préfixe"), + ':Zs': (" suffixe,", "Suffixe"), + + ';S': (" : symbole (unité de mesure)", "Symbole (unité de mesure)"), + + '/*': ("", "sous-dictionnaire <Commun>"), + '/C': (" <classique>", "sous-dictionnaire <Classique>"), + '/M': ("", "sous-dictionnaire <Moderne>"), + '/R': (" <réforme>", "sous-dictionnaire <Réforme 1990>"), + '/A': ("", "sous-dictionnaire <Annexe>"), + '/X': ("", "sous-dictionnaire <Contributeurs>") } _dPFX = { 'd': "(de), déterminant épicène invariable", 'l': "(le/la), déterminant masculin/féminin singulier", @@ -204,11 +203,11 @@ def formatTags (self, sTags): sRes = "" sTags = re.sub("(?<=V[1-3])[itpqnmr_eaxz]+", "", sTags) sTags = re.sub("(?<=V0[ea])[itpqnmr_eaxz]+", "", sTags) for m in self._zTag.finditer(sTags): - sRes += _dTAGS.get(m.group(0), " [{}]".format(m.group(0))) + sRes += _dTAGS.get(m.group(0), " [{}]".format(m.group(0)))[0] if sRes.startswith(" verbe") and not sRes.endswith("infinitif"): sRes += " [{}]".format(sTags[1:sTags.find(" ")]) return sRes.rstrip(",") def _formatSuffix (self, s): Index: gc_lang/fr/oxt/AppLauncher.py ================================================================== --- gc_lang/fr/oxt/AppLauncher.py +++ gc_lang/fr/oxt/AppLauncher.py @@ -40,10 +40,18 @@ xDialog.run() elif sCmd == "TF": import TextFormatter xDialog = TextFormatter.TextFormatter(self.ctx) xDialog.run(self.sLang) + elif sCmd == "DI": + import DictOptions + xDialog = DictOptions.DictOptions(self.ctx) + xDialog.run(self.sLang) + elif sCmd == "LE": + import LexiconEditor + xDialog = LexiconEditor.LexiconEditor(self.ctx) + xDialog.run(self.sLang) elif sCmd == "DS": import DictionarySwitcher xDialog = DictionarySwitcher.FrenchDictionarySwitcher(self.ctx) xDialog.run(self.sLang) elif sCmd == "MA": ADDED gc_lang/fr/oxt/DictOptions/DictOptions.py Index: gc_lang/fr/oxt/DictOptions/DictOptions.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/DictOptions.py @@ -0,0 +1,141 @@ +# Dictionary Options +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback +import time + +import helpers +import do_strings + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.beans import PropertyValue + + +class DictOptions (unohelper.Base, XActionListener, XJobExecutor): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xContainer = None + self.xDialog = None + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def run (self, sLang): + dUI = do_strings.getUI(sLang) + + self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 200 + self.xDialog.Height = 210 + self.xDialog.Title = dUI.get('title', "#title#") + xWindowSize = helpers.getWindowSize() + self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX = 10 + nY1 = 10 + nY2 = nY1 + 50 + nY3 = nY2 + 70 + + nWidth = self.xDialog.Width - 20 + nHeight = 10 + + # Spell checker section + self._addWidget("spelling_section", 'FixedLine', nX, nY1, nWidth, nHeight, Label = dUI.get("spelling_section", "#err"), FontDescriptor = xFDTitle) + self.xGraphspell = self._addWidget('activate_main', 'CheckBox', nX, nY1+15, nWidth, nHeight, Label = dUI.get('activate_main', "#err")) + self._addWidget('activate_main_descr', 'FixedText', nX, nY1+25, nWidth, nHeight*2, Label = dUI.get('activate_main_descr', "#err"), MultiLine = True) + + # Spell suggestion engine section + self._addWidget("suggestion_section", 'FixedLine', nX, nY2, nWidth, nHeight, Label = dUI.get("suggestion_section", "#err"), FontDescriptor = xFDTitle) + self.xGraphspellSugg = self._addWidget('activate_spell_sugg', 'CheckBox', nX, nY2+15, nWidth, nHeight, Label = dUI.get('activate_spell_sugg', "#err")) + self._addWidget('activate_spell_sugg_descr', 'FixedText', nX, nY2+25, nWidth, nHeight*4, Label = dUI.get('activate_spell_sugg_descr', "#err"), MultiLine = True) + + # Personal dictionary section + self._addWidget("personal_section", 'FixedLine', nX, nY3, nWidth, nHeight, Label = dUI.get("personal_section", "#err"), FontDescriptor = xFDTitle) + self.xPersonalDic = self._addWidget('activate_personal', 'CheckBox', nX, nY3+15, nWidth, nHeight, Label = dUI.get('activate_personal', "#err")) + self._addWidget('activate_personnal_descr', 'FixedText', nX, nY3+25, nWidth, nHeight*3, Label = dUI.get('activate_personal_descr', "#err"), MultiLine = True) + + # Button + self._addWidget('apply_button', 'Button', self.xDialog.Width-115, self.xDialog.Height-25, 50, 14, Label = dUI.get('apply_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500) + self._addWidget('cancel_button', 'Button', self.xDialog.Width-60, self.xDialog.Height-25, 50, 14, Label = dUI.get('cancel_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000) + + self._loadOptions() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xContainer.getControl('apply_button').addActionListener(self) + self.xContainer.getControl('apply_button').setActionCommand('Apply') + self.xContainer.getControl('cancel_button').addActionListener(self) + self.xContainer.getControl('cancel_button').setActionCommand('Cancel') + self.xContainer.setVisible(False) + toolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(toolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == 'Apply': + xChild = self.xSettingNode.getByName("o_fr") + xChild.setPropertyValue("use_graphspell", self.xGraphspell.State) + xChild.setPropertyValue("use_graphspell_sugg", self.xGraphspellSugg.State) + #xChild.setPropertyValue("extended_dic", self.xExtendedDic.State) + xChild.setPropertyValue("use_personal_dic", self.xPersonalDic.State) + self.xSettingNode.commitChanges() + else: + pass + self.xContainer.endExecute() + except: + traceback.print_exc() + + # XJobExecutor + def trigger (self, args): + try: + dialog = DictOptions(self.ctx) + dialog.run() + except: + traceback.print_exc() + + def _loadOptions (self): + try: + xChild = self.xSettingNode.getByName("o_fr") + self.xGraphspell.State = xChild.getPropertyValue("use_graphspell") + self.xGraphspellSugg.State = xChild.getPropertyValue("use_graphspell_sugg") + #self.xExtendedDic.State = xChild.getPropertyValue("extended_dic") + self.xPersonalDic.State = xChild.getPropertyValue("use_personal_dic") + except: + traceback.print_exc() + + +#g_ImplementationHelper = unohelper.ImplementationHelper() +#g_ImplementationHelper.addImplementation(DictOptions, 'net.grammalecte.graphspell.DictOptions', ('com.sun.star.task.Job',)) ADDED gc_lang/fr/oxt/DictOptions/LexiconEditor.py Index: gc_lang/fr/oxt/DictOptions/LexiconEditor.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/LexiconEditor.py @@ -0,0 +1,558 @@ +# Lexicon Editor +# by Olivier R. +# License: MPL 2 + +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 + +import SearchWords +import TagsInfo + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener +from com.sun.star.awt import XKeyListener + + +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.sLang = sLang + self.dUI = lxe_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 570 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + xWindowSize = helpers.getWindowSize() + self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = 20 + + nY0 = 5 + nY1 = nY0 + 13 + nY2 = nY1 + 25 # nom commun + nY3 = nY2 + 95 # nom propre + nY4 = nY3 + 45 # verbe + nY5 = nY4 + 68 # adverbe + nY6 = nY5 + 13 # autre + + nXB = nX1 + 185 + nXC = nXB + 165 + + nHeight = 10 + + #### Dictionary section + self._addWidget("dictionary_section", 'FixedLine', nX1, nY0, 180, nHeight, Label = self.dUI.get("dictionary_section", "#err"), FontDescriptor = xFDTitle, TextColor = 0x000088) + self._addWidget("save_date_label", 'FixedText', nXB, nY0+2, 80, nHeight, Label = self.dUI.get("save_date_label", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self._addWidget("num_of_entries_label2", 'FixedText', nXC, nY0+2, 65, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xDateDic = self._addWidget("save_date", 'FixedText', nXB+85, nY0+2, 75, nHeight, Label = self.dUI.get("void", "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xNumDic = self._addWidget("num_of_entries2", 'FixedText', nXC+70, nY0+2, 45, nHeight, Label = "0", FontDescriptor = xFDSubTitle, TextColor = 0x000088) + self.xExport = self._addWidget('export_button', 'Button', nXC+150, nY0, 50, 12, Label = self.dUI.get('export_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x000055) + + #### Add word + self._addWidget("add_section", 'FixedLine', nX1, nY1, 180, nHeight, Label = self.dUI.get("add_section", "#err"), FontDescriptor = xFDTitle) + self.xLemma = self._addWidget('lemma', 'Edit', nX1, nY1+10, 110, 14, FontDescriptor = xFDTitle) + self._addWidget('search_button', 'Button', nX1+115, nY1+11, 45, 12, Label = self.dUI.get('search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x555500) + self._addWidget('information_button', 'Button', nX1+165, nY1+11, 15, 12, Label = self.dUI.get('information_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x555500) + + # Radio buttons: main POS tag + # Note: the only way to group RadioButtons is to create them successively + self.xNA = self._addWidget('nom_adj', 'RadioButton', nX1, nY2+12, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A") + self.xN = self._addWidget('nom', 'RadioButton', nX1, nY2+22, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N") + self.xA = self._addWidget('adj', 'RadioButton', nX1, nY2+32, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A") + self.xM1 = self._addWidget('M1', 'RadioButton', nX1, nY3+12, 60, nHeight, Label = self.dUI.get("M1", "#err"), HelpText = ":M1") + self.xM2 = self._addWidget('M2', 'RadioButton', nX1, nY3+22, 60, nHeight, Label = self.dUI.get("M2", "#err"), HelpText = ":M2") + self.xMP = self._addWidget('MP', 'RadioButton', nX1, nY3+32, 60, nHeight, Label = self.dUI.get("MP", "#err"), HelpText = ":MP") + self.xV = self._addWidget('verb', 'RadioButton', nX1, nY4+2, 35, nHeight, Label = self.dUI.get("verb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":V") + self.xW = self._addWidget('adv', 'RadioButton', nX1, nY5+2, 35, nHeight, Label = self.dUI.get("adverb", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":W") + self.xX = self._addWidget('other', 'RadioButton', nX1, nY6+2, 35, nHeight, Label = self.dUI.get("other", "#err"), FontDescriptor = xFDSubTitle, HelpText = ":X") + + # Nom, adjectif + self._addWidget("fl_nom_adj", 'FixedLine', nX1, nY2, 180, nHeight, Label = self.dUI.get("common_name", "#err"), FontDescriptor = xFDSubTitle) + self.xSepi = self._addWidget('Sepi', 'RadioButton', nX1+65, nY2+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xSmas = self._addWidget('Smas', 'RadioButton', nX1+65, nY2+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xSfem = self._addWidget('Sfem', 'RadioButton', nX1+65, nY2+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + self._addWidget("fl_sep1", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSs = self._addWidget('Ss', 'RadioButton', nX1+120, nY2+12, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s") + self.xSx = self._addWidget('Sx', 'RadioButton', nX1+120, nY2+22, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x") + self.xSinv = self._addWidget('Sinv', 'RadioButton', nX1+120, nY2+32, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i") + + self._addWidget("alt_lemma_label", 'FixedLine', nX1+10, nY2+42, 170, nHeight, Label = self.dUI.get("alt_lemma", "#err")) + self.xAltLemma = self._addWidget('alt_lemma', 'Edit', nX1+10, nY2+52, 110, nHeight) + self.xNA2 = self._addWidget('nom_adj2', 'RadioButton', nX1+10, nY2+65, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A") + self.xN2 = self._addWidget('nom2', 'RadioButton', nX1+10, nY2+75, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N") + self.xA2 = self._addWidget('adj2', 'RadioButton', nX1+10, nY2+85, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A") + self._addWidget("fl_sep2", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSepi2 = self._addWidget('Sepi2', 'RadioButton', nX1+75, nY2+65, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xSmas2 = self._addWidget('Smas2', 'RadioButton', nX1+75, nY2+75, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xSfem2 = self._addWidget('Sfem2', 'RadioButton', nX1+75, nY2+85, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + self._addWidget("fl_sep3", 'FixedLine', nX1, nY2, 1, nHeight) + self.xSs2 = self._addWidget('Ss2', 'RadioButton', nX1+130, nY2+65, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s") + self.xSx2 = self._addWidget('Sx2', 'RadioButton', nX1+130, nY2+75, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x") + self.xSinv2 = self._addWidget('Sinv2', 'RadioButton', nX1+130, nY2+85, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i") + + # Nom propre + self._addWidget("fl_M", 'FixedLine', nX1, nY3, 180, nHeight, Label = self.dUI.get("proper_name", "#err"), FontDescriptor = xFDSubTitle) + self.xMepi = self._addWidget('Mepi', 'RadioButton', nX1+65, nY3+12, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e") + self.xMmas = self._addWidget('Mmas', 'RadioButton', nX1+65, nY3+22, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m") + self.xMfem = self._addWidget('Mfem', 'RadioButton', nX1+65, nY3+32, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f") + + # Verbe + self._addWidget("fl_verb", 'FixedLine', nX2+30, nY4, 140, nHeight, FontDescriptor = xFDSubTitle) + self.xV_i = self._addWidget('v_i', 'CheckBox', nX2, nY4+12, 60, nHeight, Label = self.dUI.get("v_i", "#err")) + self.xV_t = self._addWidget('v_t', 'CheckBox', nX2, nY4+20, 60, nHeight, Label = self.dUI.get("v_t", "#err")) + self.xV_n = self._addWidget('v_n', 'CheckBox', nX2, nY4+28, 60, nHeight, Label = self.dUI.get("v_n", "#err")) + self.xV_p = self._addWidget('v_p', 'CheckBox', nX2, nY4+36, 60, nHeight, Label = self.dUI.get("v_p", "#err")) + self.xV_m = self._addWidget('v_m', 'CheckBox', nX2, nY4+44, 60, nHeight, Label = self.dUI.get("v_m", "#err")) + + self._addWidget('aux', 'FixedText', nX2+75, nY4+10, 90, nHeight, Label = self.dUI.get("aux", "#err")) + self.xV_ae = self._addWidget('v_ae', 'CheckBox', nX2+75, nY4+20, 90, nHeight, Label = self.dUI.get("v_ae", "#err")) + self.xV_aa = self._addWidget('v_aa', 'CheckBox', nX2+75, nY4+28, 90, nHeight, Label = self.dUI.get("v_aa", "#err")) + + self.xV_pp = self._addWidget('v_pp', 'CheckBox', nX2+75, nY4+44, 90, nHeight, Label = self.dUI.get("v_pp", "#err")) + + self._addWidget('v_pattern_label', 'FixedText', nX2+10, nY4+56, 70, nHeight, Label = self.dUI.get('v_pattern', "#err"), Align = 2) + self.xVpattern = self._addWidget('v_pattern', 'Edit', nX2+85, nY4+56, 80, nHeight) + + # Adverbe + self._addWidget("fl_adv", 'FixedLine', nX2+30, nY5, 140, nHeight, FontDescriptor = xFDSubTitle) + + # Autre + self._addWidget("fl_other", 'FixedLine', nX2+30, nY6, 140, nHeight, FontDescriptor = xFDSubTitle) + self._addWidget('flexion_label', 'FixedText', nX2, nY6+11, 35, nHeight, Label = self.dUI.get('flexion', "#err")) + self.xFlexion = self._addWidget('flexion', 'Edit', nX2+40, nY6+10, 100, nHeight) + self._addWidget('tags_label', 'FixedText', nX2, nY6+23, 35, nHeight, Label = self.dUI.get('tags', "#err")) + self.xTags = self._addWidget('tags', 'Edit', nX2+40, nY6+22, 100, nHeight) + + #### Generated words + self._addWidget("gwords_section", 'FixedLine', nXB, nY1, 160, nHeight, Label = self.dUI.get("new_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModelNew = self._addGrid("list_grid_gwords", nXB, nY1+10, 160, 255, [ + {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 80}, + {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 80} + ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI")) + self.xAdd = self._addWidget('add_button', 'Button', nXB, nY1+270, 75, 12, Label = self.dUI.get('add_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500, Enabled = False) + self.xDelete = self._addWidget('delete_button', 'Button', nXB+80, nY1+270, 80, 12, Label = self.dUI.get('delete_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + #### Lexicon section + self._addWidget("lexicon_section", 'FixedLine', nXC, nY1, 200, nHeight, Label = self.dUI.get("lexicon_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModelLex = self._addGrid("list_grid_lexicon", nXC, nY1+10, 200, 255, [ + {"Title": self.dUI.get("lex_flex", "#err"), "ColumnWidth": 65}, + {"Title": self.dUI.get("lex_lemma", "#err"), "ColumnWidth": 50}, + {"Title": self.dUI.get("lex_tags", "#err"), "ColumnWidth": 65} + ], SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI")) + self._addWidget("num_of_entries_label1", 'FixedText', nXC, nY1+272, 60, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"), FontDescriptor = xFDSubTitle) + self.xNumLex = self._addWidget("num_of_entries1", 'FixedText', nXC+65, nY1+272, 40, nHeight, Label = "0", FontDescriptor = xFDSubTitle) + self.xSave = self._addWidget('save_button', 'Button', nXC+110, nY1+270, 45, 12, Label = self.dUI.get('save_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + self._addWidget('close_button', 'Button', nXC+160, nY1+270, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + self.loadLexicon() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlNew = self.xContainer.getControl('list_grid_gwords') + self.xGridControlLex = self.xContainer.getControl('list_grid_lexicon') + #helpers.xray(self.xContainer.getControl('lemma')) + self._createKeyListeners(['lemma', 'alt_lemma', "v_pattern", 'flexion', 'tags'], "Update") + self._createActionListeners(['nom_adj', 'nom', 'adj', 'M1', 'M2', 'MP', 'verb', 'adv', 'other', \ + 'Sepi', 'Smas', 'Sfem', 'Ss', 'Sx', 'Sinv', 'nom_adj2', 'nom2', 'adj2', \ + 'Sepi2', 'Smas2', 'Sfem2', 'Ss2', 'Sx2', 'Sinv2', 'Mepi', 'Mmas', 'Mfem', \ + 'v_i', 'v_t', 'v_n', 'v_p', 'v_m', 'v_ae', 'v_aa', 'v_pp'], "Update") + self.xContainer.getControl('search_button').addActionListener(self) + self.xContainer.getControl('search_button').setActionCommand('SearchWords') + self.xContainer.getControl('information_button').addActionListener(self) + self.xContainer.getControl('information_button').setActionCommand('TagsInfo') + self.xContainer.getControl('add_button').addActionListener(self) + self.xContainer.getControl('add_button').setActionCommand('Add') + self.xContainer.getControl('delete_button').addActionListener(self) + self.xContainer.getControl('delete_button').setActionCommand('Delete') + self.xContainer.getControl('save_button').addActionListener(self) + self.xContainer.getControl('save_button').setActionCommand('Save') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + def _createKeyListeners (self, lNames, sAction): + for sName in lNames: + self.xContainer.getControl(sName).addKeyListener(self) + + def _createActionListeners (self, lNames, sAction): + for sName in lNames: + self.xContainer.getControl(sName).addActionListener(self) + self.xContainer.getControl(sName).setActionCommand(sAction) + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "Update": + self.updateGenWords() + elif xActionEvent.ActionCommand == "SearchWords": + self.launchSearchWords() + elif xActionEvent.ActionCommand == "TagsInfo": + self.launchTagsInfo() + elif xActionEvent.ActionCommand == "Add": + self.addToLexicon() + elif xActionEvent.ActionCommand == "Delete": + self.deleteSelectedEntries() + elif xActionEvent.ActionCommand == "Save": + self.saveLexicon() + elif xActionEvent.ActionCommand == "Import": + self.importDictionary() + elif xActionEvent.ActionCommand == "Export": + self.exportDictionary() + elif xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + # XKeyListener + def keyPressed (self, xKeyEvent): + pass + + def keyReleased (self, xKeyEvent): + self.updateGenWords() + + # XJobExecutor + def trigger (self, args): + try: + xDialog = LexiconEditor(self.ctx) + xDialog.run() + except: + traceback.print_exc() + + # Code + def launchSearchWords (self): + xDialog = SearchWords.SearchWords(self.ctx) + xDialog.run(self.sLang) + + def launchTagsInfo (self): + xDialog = TagsInfo.TagsInfo(self.ctx) + xDialog.run(self.sLang) + + #@_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, aEntry in enumerate(oIBDAWG.select()): + xGridDataModel.addRow(i, aEntry) + 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)) + xChild = self.xSettingNode.getByName("o_fr") + if lEntry: + oDAWG = dawg.DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel") + oJSON = oDAWG.getBinaryAsJSON() + xChild.setPropertyValue("personal_dic", json.dumps(oJSON, ensure_ascii=False)) + self.xSettingNode.commitChanges() + self.xNumDic.Label = str(oJSON["nEntry"]) + self.xDateDic.Label = oJSON["sDate"] + else: + xChild.setPropertyValue("personal_dic", "") + self.xSettingNode.commitChanges() + self.xNumDic.Label = "0" + self.xDateDic.Label = self.dUI.get("void", "#err") + + 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/SearchWords.py Index: gc_lang/fr/oxt/DictOptions/SearchWords.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/SearchWords.py @@ -0,0 +1,196 @@ +# Search and informations about tags +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback + +import helpers +import sw_strings +import grammalecte.graphspell as sc +import grammalecte.graphspell.ibdawg as ibdawg + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener + + +def _waitPointer (funcDecorated): + def wrapper (*args, **kwargs): + # self is the first parameter if the decorator is applied on a object + self = args[0] + # before + xPointer = self.xSvMgr.createInstanceWithContext("com.sun.star.awt.Pointer", self.ctx) + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.WAIT")) + xWindowPeer = self.xContainer.getPeer() + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + # processing + result = funcDecorated(*args, **kwargs) + # after + xPointer.setType(uno.getConstantByName("com.sun.star.awt.SystemPointer.ARROW")) + xWindowPeer.setPointer(xPointer) + for x in xWindowPeer.Windows: + x.setPointer(xPointer) + self.xContainer.setVisible(True) # seems necessary to refresh the dialog box and text widgets (why?) + # return + return result + return wrapper + + +class SearchWords (unohelper.Base, XActionListener): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + self.oSpellChecker = None + # options node + self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True) + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang): + # ui lang + self.dUI = sw_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 350 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + #xWindowSize = helpers.getWindowSize() + #self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + #self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = nX1 + 130 + + nY0 = 5 + nY1 = nY0 + 20 + nY2 = nY1 + 60 + + nHeight = 10 + + #### Search + self._addWidget("search_section", 'FixedLine', nX1, nY0, 120, nHeight, Label = self.dUI.get("search_section", "#err"), FontDescriptor = xFDTitle) + self._addWidget("similar_search_section", 'FixedLine', nX1, nY1, 120, nHeight, Label = self.dUI.get("similar_search_section", "#err"), FontDescriptor = xFDSubTitle) + self.xWord = self._addWidget('word', 'Edit', nX1, nY1+10, 100, nHeight) + self._addWidget('similar_search_button', 'Button', nX1, nY1+22, 55, 12, Label = self.dUI.get('similar_search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + + + self._addWidget("regex_search_section", 'FixedLine', nX1, nY2, 120, nHeight, Label = self.dUI.get("regex_search_section", "#err"), FontDescriptor = xFDSubTitle) + self._addWidget('flexion_label', 'FixedText', nX1, nY2+10, 30, nHeight, Label = self.dUI.get('flexion', "#err")) + self.xFlexion = self._addWidget('flexion', 'Edit', nX1+35, nY2+10, 85, nHeight) + self._addWidget('tags_label', 'FixedText', nX1, nY2+22, 30, nHeight, Label = self.dUI.get('tags', "#err")) + self.xTags = self._addWidget('tags', 'Edit', nX1+35, nY2+22, 85, nHeight) + self._addWidget('regex_search_button', 'Button', nX1, nY2+34, 55, 12, Label = self.dUI.get('regex_search_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500) + self._addWidget('result_warning', 'FixedText', nX1, nY2+50, 120, nHeight*7, Label = self.dUI.get('result_warning', '#err'), MultiLine = True) + + #### Results + self._addWidget("result_section", 'FixedLine', nX2, nY0, 200, nHeight, Label = self.dUI.get("result_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModel = self._addGrid("list_grid_search", nX2, nY0+10, 200, 265, [ + {"Title": self.dUI.get("res_flexion", "#err"), "ColumnWidth": 70}, + {"Title": self.dUI.get("res_lemma", "#err"), "ColumnWidth": 60}, + {"Title": self.dUI.get("res_tags", "#err"), "ColumnWidth": 70} + ]) + + self._addWidget('close_button', 'Button', self.xDialog.Width-50, self.xDialog.Height-20, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlSearch = self.xContainer.getControl('list_grid_search') + self.xGridControlInfo = self.xContainer.getControl('list_grid_info') + self.xContainer.getControl('similar_search_button').addActionListener(self) + self.xContainer.getControl('similar_search_button').setActionCommand('SearchSimilar') + self.xContainer.getControl('regex_search_button').addActionListener(self) + self.xContainer.getControl('regex_search_button').setActionCommand('SearchRegex') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "SearchSimilar": + self.searchSimilar() + elif xActionEvent.ActionCommand == "SearchRegex": + self.searchRegex() + elif xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + def initSpellChecker (self): + if not self.oSpellChecker: + self.oSpellChecker = sc.SpellChecker("fr", "fr.bdic", "", "", "") + + def searchSimilar (self): + self.initSpellChecker() + sWord = self.xWord.Text.strip() + if sWord: + xGridDataModel = self.xGridModel.GridDataModel + xGridDataModel.removeAllRows() + lResult = self.oSpellChecker.getSimilarEntries(sWord, 20); + for i, aEntry in enumerate(lResult): + xGridDataModel.addRow(i, aEntry) + + def searchRegex (self): + self.initSpellChecker() + sFlexPattern = self.xFlexion.Text.strip() + sTagsPattern = self.xTags.Text.strip() + xGridDataModel = self.xGridModel.GridDataModel + xGridDataModel.removeAllRows() + for i, aEntry in enumerate(self.oSpellChecker.select(sFlexPattern, sTagsPattern)): + xGridDataModel.addRow(i, aEntry) + i += 1 + if i >= 2000: + break ADDED gc_lang/fr/oxt/DictOptions/TagsInfo.py Index: gc_lang/fr/oxt/DictOptions/TagsInfo.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/TagsInfo.py @@ -0,0 +1,146 @@ +# Lexicon editor: Information +# by Olivier R. +# License: MPL 2 + +import unohelper +import uno +import traceback + +import helpers +import ti_strings + +import grammalecte.fr.lexicographe as lxg + +from com.sun.star.task import XJobExecutor +from com.sun.star.awt import XActionListener + + + +class TagsInfo (unohelper.Base, XActionListener): + + def __init__ (self, ctx): + self.ctx = ctx + self.xSvMgr = self.ctx.ServiceManager + self.xDesktop = self.xSvMgr.createInstanceWithContext("com.sun.star.frame.Desktop", self.ctx) + self.xDocument = self.xDesktop.getCurrentComponent() + self.xContainer = None + self.xDialog = None + + def _addWidget (self, name, wtype, x, y, w, h, **kwargs): + xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype) + xWidget.Name = name + xWidget.PositionX = x + xWidget.PositionY = y + xWidget.Width = w + xWidget.Height = h + for k, w in kwargs.items(): + setattr(xWidget, k, w) + self.xDialog.insertByName(name, xWidget) + return xWidget + + def _addGrid (self, name, x, y, w, h, columns, **kwargs): + xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel') + xGridModel.Name = name + xGridModel.PositionX = x + xGridModel.PositionY = y + xGridModel.Width = w + xGridModel.Height = h + xColumnModel = xGridModel.ColumnModel + for e in columns: + xCol = xColumnModel.createColumn() + for k, w in e.items(): + setattr(xCol, k, w) + xColumnModel.addColumn(xCol) + for k, w in kwargs.items(): + setattr(xGridModel, k, w) + self.xDialog.insertByName(name, xGridModel) + return xGridModel + + def run (self, sLang): + # ui lang + self.dUI = ti_strings.getUI(sLang) + + # dialog + self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx) + self.xDialog.Width = 360 + self.xDialog.Height = 305 + self.xDialog.Title = self.dUI.get('title', "#title#") + #xWindowSize = helpers.getWindowSize() + #self.xDialog.PositionX = int((xWindowSize.Width / 2) - (self.xDialog.Width / 2)) + #self.xDialog.PositionY = int((xWindowSize.Height / 2) - (self.xDialog.Height / 2)) + + # fonts + xFDTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDTitle.Height = 9 + xFDTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDTitle.Name = "Verdana" + + xFDSubTitle = uno.createUnoStruct("com.sun.star.awt.FontDescriptor") + xFDSubTitle.Height = 8 + xFDSubTitle.Weight = uno.getConstantByName("com.sun.star.awt.FontWeight.BOLD") + xFDSubTitle.Name = "Verdana" + + # widget + nX1 = 10 + nX2 = 20 + nX3 = 120 + + nY0 = 5 + nY1 = nY0 + 13 + nY2 = nY1 + 60 + nY3 = nY2 + 60 + nY4 = nY3 + 80 + + nXB = nX1 + 110 + + nHeight = 10 + + #### Add word + self._addWidget("add_section", 'FixedLine', nX1, nY0, 100, nHeight, Label = self.dUI.get("information_section", "#err"), FontDescriptor = xFDTitle) + + self._addWidget('save_label', 'FixedText', nX1, nY1, 100, nHeight, Label = self.dUI.get('save', "#err"), FontDescriptor = xFDTitle) + self._addWidget('save_desc_label', 'FixedText', nX1, nY1+10, 100, nHeight*5, Label = self.dUI.get('save_desc', "#err"), MultiLine=True) + + self._addWidget('duplicates_label', 'FixedText', nX1, nY2, 100, nHeight, Label = self.dUI.get('duplicates', "#err"), FontDescriptor = xFDTitle) + self._addWidget('duplicates_desc_label', 'FixedText', nX1, nY2+10, 100, nHeight*5, Label = self.dUI.get('duplicates_desc', "#err"), MultiLine=True) + + self._addWidget('compilation_label', 'FixedText', nX1, nY3, 100, nHeight, Label = self.dUI.get('compilation', "#err"), FontDescriptor = xFDTitle) + self._addWidget('compilation_desc_label', 'FixedText', nX1, nY3+10, 100, nHeight*7, Label = self.dUI.get('compilation_desc', "#err"), MultiLine=True) + + self._addWidget('warning_label', 'FixedText', nX1, nY4, 100, nHeight, Label = self.dUI.get('warning', "#err"), FontDescriptor = xFDTitle) + self._addWidget('warning_desc_label', 'FixedText', nX1, nY4+10, 100, nHeight*7, Label = self.dUI.get('warning_desc', "#err"), MultiLine=True) + + #### Tags + self._addWidget("tags_section", 'FixedLine', nXB, nY0, 230, nHeight, Label = self.dUI.get("tags_section", "#err"), FontDescriptor = xFDTitle) + self.xGridModel = self._addGrid("list_grid_tags", nXB, nY0+10, 230, 265, [ + {"Title": self.dUI.get("tags", "#err"), "ColumnWidth": 40}, + {"Title": self.dUI.get("meaning", "#err"), "ColumnWidth": 190} + ]) + + self._addWidget('close_button', 'Button', self.xDialog.Width-50, self.xDialog.Height-20, 40, 12, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x550000) + + self.loadData() + + # container + self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) + self.xContainer.setModel(self.xDialog) + self.xGridControlInfo = self.xContainer.getControl('list_grid_tags') + self.xContainer.getControl('close_button').addActionListener(self) + self.xContainer.getControl('close_button').setActionCommand('Close') + self.xContainer.setVisible(False) + xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) + self.xContainer.createPeer(xToolkit, None) + self.xContainer.execute() + + # XActionListener + def actionPerformed (self, xActionEvent): + try: + if xActionEvent.ActionCommand == "Close": + self.xContainer.endExecute() + except: + traceback.print_exc() + + def loadData (self): + xGridDataModel = self.xGridModel.GridDataModel + for i, sKey in enumerate(lxg._dTAGS): + xGridDataModel.addRow(i, [sKey, lxg._dTAGS[sKey][1]]) ADDED gc_lang/fr/oxt/DictOptions/do_strings.py Index: gc_lang/fr/oxt/DictOptions/do_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/do_strings.py @@ -0,0 +1,43 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Options des dictionnaires", + + "spelling_section": "Correcteur orthographique", + "activate_main": "Activer le correcteur orthographique de Grammalecte", + "activate_main_descr": "Supplante le correcteur orthographique inclus dans LibreOffice (Hunspell).", + + "suggestion_section": "Moteur de suggestion orthographique", + "activate_spell_sugg": "Activer le moteur de suggestion de Grammalecte", + "activate_spell_sugg_descr": "Désactivée, cette option remplace la suggestion orthographique de Grammalecte par celle fournie par LibreOffice (Hunspell). Les mots inclus dans le dictionnaire personnalisé ne seront plus inclus aux suggestions.", + + "personal_section": "Dictionnaire personnel", + "activate_personal": "Utiliser", + "activate_personal_descr": "Le dictionnaire personnel est une commodité pour ajouter le vocabulaire qui vous est utile. Il ne supplante pas le dictionnaire commun ; il ne fait qu’ajouter de nouveaux mots.", + + "apply_button": "Appliquer", + "cancel_button": "Annuler", + }, + "en": { + "title": "Grammalecte · Options for dictionaries", + + "spelling_section": "Spell checker", + "activate_main": "Activate the spell checker from Grammalecte", + "activate_main_descr": "Overrides the spell checker included in LibreOffice (Hunspell)", + + "suggestion_section": "Spell suggestion engine", + "activate_spell_sugg": "Activate the suggestion engine of Grammalecte", + "activate_spell_sugg_descr": "Disactivated, this option replace the spell suggestion engine of Grammalecte by the one of LibreOffice (Hunspell). Words included in the personal dictionary won’t be included among suggestions.", + + "personal_section": "Personal dictionary", + "activate_personal": "Use", + "activate_personal_descr": "The personal dictionary is a commodity to add the vocabulary you want. It doesn’t override the common dictionary ; it only adds new words.", + + "apply_button": "Apply", + "cancel_button": "Cancel", + }, +} ADDED gc_lang/fr/oxt/DictOptions/lxe_strings.py Index: gc_lang/fr/oxt/DictOptions/lxe_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/lxe_strings.py @@ -0,0 +1,83 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Éditeur lexical", + + # Ajout + "add_section": "Nouveau mot (lemme)", + "lemma": "Lemme", + "search_button": "Recherche", + "information_button": "<i>", + + # 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", + "void": "[néant]", + + # + "close_button": "Fermer", + }, + # Traduction délibérément limitée + "en": { + "title": "Grammalecte · Lexicon editor", + + "close_button": "Close", + }, +} ADDED gc_lang/fr/oxt/DictOptions/sw_strings.py Index: gc_lang/fr/oxt/DictOptions/sw_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/sw_strings.py @@ -0,0 +1,34 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Recherche et informations", + + "search_section": "Recherche", + + "similar_search_section": "Graphies similaires", + "similar_search_button": "Chercher", + + "regex_search_section": "Expression régulières", + "flexion": "Flexion", + "tags": "Étiquettes", + "regex_search_button": "Chercher", + "result_warning": "La recherche par expressions régulières peut générer un nombre gigantesque de résultats. Seules les 2000 premières occurrences trouvées seront affichées. La recherche peut être longue, parce tout le graphe de mots, qui contient 500 000 flexions, sera parcouru si besoin.", + + "result_section": "Résultats", + "res_flexion": "Flexions", + "res_lemma": "Lemmes", + "res_tags": "Étiquettes", + + "close_button": "Fermer", + }, + + "en": { + "title": "Grammalecte · Search and informations", + + "close_button": "Close", + }, +} ADDED gc_lang/fr/oxt/DictOptions/ti_strings.py Index: gc_lang/fr/oxt/DictOptions/ti_strings.py ================================================================== --- /dev/null +++ gc_lang/fr/oxt/DictOptions/ti_strings.py @@ -0,0 +1,37 @@ +def getUI (sLang): + if sLang in dStrings: + return dStrings[sLang] + return dStrings["fr"] + +dStrings = { + "fr": { + "title": "Grammalecte · Informations", + + "information_section": "Informations", + + "save": "Enregistrement", + "save_desc": "Les modifications apportées au lexique ne sont enregistrées dans le dictionnaire qu’au moment où vous cliquez sur ‹Enregistrer› dans l’onglet ‹Lexique›.", + + "duplicates": "Doublons", + "duplicates_desc": "Il est inutile de purger votre lexique des doublons éventuels. Les doublons sont automatiquement supprimés lors de la création du dictionnaire.", + + "compilation": "Compilation du dictionnaire", + "compilation_desc": "Le dictionnaire est compilé comme un graphe de mots sous la forme d’une chaîne binaire dans un fichier JSON. Cette opération peut prendre du temps et consommer beaucoup de mémoire si votre lexique contient plusieurs dizaines de milliers d’entrées.", + + "warning": "Avertissement", + "warning_desc": "Il est déconseillé d’utiliser la catégorie ‹Autre› pour générer autre chose que des noms, des adjectifs, des noms propres, des verbes et des adverbes. Il n’y a aucune garantie que les étiquettes pour les autres catégories, notamment les mots grammaticaux, ne changeront pas.", + + "tags_section": "Signification des étiquettes", + "tags": "Étiquettes", + "meaning": "Signification", + + + "close_button": "Fermer", + }, + + "en": { + "title": "Grammalecte · Informations", + + "close_button": "Close", + }, +} Index: gc_lang/fr/oxt/TextFormatter/TextFormatter.py ================================================================== --- gc_lang/fr/oxt/TextFormatter/TextFormatter.py +++ gc_lang/fr/oxt/TextFormatter/TextFormatter.py @@ -383,17 +383,12 @@ for key, lWidget in self.dCheckboxWidgets.items(): w = getattr(self, key) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State - # get extension path - xDefaultContext = self.ctx.ServiceManager.DefaultContext - xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider") - sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR") - sExtPath = sExtPath[8:] + "/pythonpath/tf_options.py" # remove "file:///" - sExtPath = os.path.abspath(sExtPath) # write file + sExtPath = helpers.getAbsolutePathOf("/pythonpath/tf_options.py") if os.path.isfile(sExtPath): hOpt = open(sExtPath, "w") hOpt.write("dDefaultOpt = " + str(tf_options.dDefaultOpt) + "\n") hOpt.write("dOpt = " + str(dOpt)) hOpt.close() Index: gc_lang/fr/oxt/addons.xcu ================================================================== --- gc_lang/fr/oxt/addons.xcu +++ gc_lang/fr/oxt/addons.xcu @@ -75,11 +75,11 @@ <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,115 @@ +/* CSS */ + +button { + font-weight: bold; +} + +/* + Dictionary +*/ +.dictionary { + font-size: 18px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} +.dic_text { + font-size: 18px; + color: hsl(210, 50%, 50%); +} +.align_right { + text-align: right; +} + + +/* + Add new words +*/ +.section { + font-size: 16px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} + +.subsection { + font-size: 14px; + font-weight: bold; + color: hsl(210, 50%, 50%); +} + +.option { + width: 120px; + font-size: 12px; +} + +.m_left { + margin-left: 20px; +} + +.m_left2 { + margin-left: 40px; +} + +.v_usage { + width: 150px; +} +.v_textbox { + width: 200px; +} + +.other_label { + width: 80px; +} +.other_textbox { + width: 250px; +} + +#generated_words_table { + width: 400px; + height: 600px; +} + +.delete_entry { + color: hsl(0, 100%, 50%); + font-weight: bold; +} + +/* + Lexicon tab +*/ + +#lexicon_table { + width: 600px; + height: 650px; +} + +.info_label { + width: 120px; +} +.data { + width: 90px; +} + +/* + Search tab +*/ + +#search_table { + width: 600px; + height: 650px; +} + +description { + width: 200px; +} + +/* + Informations tab +*/ + +#tags_table { + width: 600px; + height: 650px; + font-family: "Courier new", "Ubuntu Mono", Courier, Consolas, monospace; +} + + ADDED gc_lang/fr/tb/content/lex_editor.js Index: gc_lang/fr/tb/content/lex_editor.js ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/lex_editor.js @@ -0,0 +1,541 @@ +// JavaScript + +"use strict"; + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; +const prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).getBranch("extensions.grammarchecker."); + + +/* + Common functions +*/ + +function showError (e) { + Cu.reportError(e); + console.error(e.fileName + "\n" + e.name + "\nline: " + e.lineNumber + "\n" + e.message); +} + +function createNode (sType, oAttr) { + try { + let xNode = document.createElement(sType); + for (let sParam in oAttr) { + xNode.setAttribute(sParam, oAttr[sParam]); + } + return xNode; + } + catch (e) { + showError(e); + } +} + +function enableElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).disabled = false; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + +function disableElement (sElemId) { + if (document.getElementById(sElemId)) { + document.getElementById(sElemId).disabled = true; + } else { + console.log("HTML node named <" + sElemId + "> not found.") + } +} + + + +class Table { + + constructor (sNodeId, lColumn, lColumnWidth, sProgressBarId, sResultId="") { + this.sNodeId = sNodeId; + this.xTable = document.getElementById(sNodeId); + this.nColumn = lColumn.length; + this.lColumn = lColumn; + this.lColumnWidth = lColumnWidth; + this.xProgressBar = document.getElementById(sProgressBarId); + this.xNumEntry = document.getElementById(sResultId); + this.iEntryIndex = 0; + this.lEntry = []; + this.nEntry = 0 + this._createHeader(); + } + + _createHeader () { + let xListheadNode = createNode("listhead"); + for (let sColumn of this.lColumn) { + xListheadNode.appendChild(createNode("listheader", { label: sColumn })); + } + this.xTable.appendChild(xListheadNode); + let xListcolsNode = createNode("listcols"); + for (let cColumn of this.lColumnWidth) { + xListcolsNode.appendChild(createNode("listcol", { flex: cColumn })); + } + this.xTable.appendChild(xListcolsNode); + } + + clear () { + while (this.xTable.firstChild) { + this.xTable.removeChild(this.xTable.firstChild); + } + this.iEntryIndex = 0; + this._createHeader(); + } + + fill (lFlex) { + this.clear(); + if (lFlex.length > 0) { + this.xProgressBar.max = lFlex.length; + this.xProgressBar.value = 1; + for (let lData of lFlex) { + this._addRow(lData); + this.xProgressBar.value += 1; + } + this.xProgressBar.value = this.xProgressBar.max; + window.setTimeout(() => { this.xProgressBar.value = 0; }, 3000); + } + this.lEntry = lFlex; + this.nEntry = lFlex.length; + this.showEntryNumber(); + } + + addEntries (lFlex) { + this.lEntry.push(...lFlex); + for (let lData of lFlex) { + this._addRow(lData); + } + this.nEntry += lFlex.length; + this.showEntryNumber(); + } + + showEntryNumber () { + if (this.xNumEntry) { + this.xNumEntry.value = this.nEntry; + } + } + + _addRow (lData) { + let xRowNode = createNode("listitem", { id: this.sNodeId + "_item_" + this.iEntryIndex, value: this.iEntryIndex }); + for (let data of lData) { + xRowNode.appendChild(createNode("listcell", { label: data })); + } + this.xTable.appendChild(xRowNode); + this.iEntryIndex += 1; + } + + deleteSelection () { + for (let xItem of this.xTable.selectedItems) { + this.lEntry[parseInt(xItem.value)] = null; + xItem.style.display = "none"; + this.nEntry -= 1; + } + this.showEntryNumber(); + } + + getEntries () { + return this.lEntry.filter((e) => e !== null); + } +} + + +const oGenerator = { + + sLemma: "", + + cMainTag: "", + + lFlexion: [], + + listen: function () { + document.getElementById("lemma").addEventListener("keyup", () => { this.update(); }, false); + // nom commun + document.getElementById("tag_N").addEventListener("click", () => { this.update("N"); }, false); + document.getElementById("nom_adj").addEventListener("click", () => { this.update(); }, false); + document.getElementById("nom").addEventListener("click", () => { this.update(); }, false); + document.getElementById("adj").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_epi").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_mas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_fem").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_s").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_x").addEventListener("click", () => { this.update(); }, false); + document.getElementById("N_inv").addEventListener("click", () => { this.update(); }, false); + document.getElementById("lemma2").addEventListener("keyup", () => { this.update(); }, false); + // nom propre + document.getElementById("tag_M").addEventListener("click", () => { this.update("M"); }, false); + document.getElementById("M1").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M2").addEventListener("click", () => { this.update(); }, false); + document.getElementById("MP").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_epi").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_mas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("M_fem").addEventListener("click", () => { this.update(); }, false); + // verbe + document.getElementById("tag_V").addEventListener("click", () => { this.update("V"); }, false); + document.getElementById("v_i").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_t").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_n").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_p").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_m").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_ae").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_aa").addEventListener("click", () => { this.update(); }, false); + document.getElementById("v_ppas").addEventListener("click", () => { this.update(); }, false); + document.getElementById("verbe_modele").addEventListener("keyup", () => { this.update(); }, false); + // adverbe + document.getElementById("tag_W").addEventListener("click", () => { this.update("W"); }, false); + // autre + document.getElementById("tag_X").addEventListener("click", () => { this.update("X"); }, false); + document.getElementById("flexion").addEventListener("keyup", () => { this.update(); }, false); + document.getElementById("tags").addEventListener("keyup", () => { this.update(); }, false); + // ajout + document.getElementById("add_to_lexicon").addEventListener("click", () => { this.addToLexicon(); }, false); + document.getElementById("delete_selection").addEventListener("click", () => { oGenWordsTable.deleteSelection(); }, false); + }, + + clear: function () { + try { + // nom commun + document.getElementById("tag_N").checked = false; + document.getElementById("nom_adj").checked = false; + document.getElementById("nom").checked = false; + document.getElementById("adj").checked = false; + document.getElementById("N_epi").checked = false; + document.getElementById("N_mas").checked = false; + document.getElementById("N_fem").checked = false; + document.getElementById("N_s").checked = false; + document.getElementById("N_x").checked = false; + document.getElementById("N_inv").checked = false; + document.getElementById("lemma2").value = ""; + // nom propre + document.getElementById("tag_M").checked = false; + document.getElementById("M1").checked = false; + document.getElementById("M2").checked = false; + document.getElementById("MP").checked = false; + document.getElementById("M_epi").checked = false; + document.getElementById("M_mas").checked = false; + document.getElementById("M_fem").checked = false; + // verbe + document.getElementById("tag_V").checked = false; + document.getElementById("v_i").checked = false; + document.getElementById("v_t").checked = false; + document.getElementById("v_n").checked = false; + document.getElementById("v_p").checked = false; + document.getElementById("v_m").checked = false; + document.getElementById("v_ae").checked = false; + document.getElementById("v_aa").checked = false; + document.getElementById("v_ppas").checked = 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 aRes of this.oIBDAWG.select()) { + lEntry.push(aRes); + } + oLexiconTable.fill(lEntry); + this.setDictData(this.oIBDAWG.nEntry, this.oIBDAWG.sDate); + enableElement("export_button"); + } else { + this.setDictData(0, "[néant]"); + disableElement("export_button"); + } + }, + + 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 oSearch = { + + oSpellChecker: null, + + load: function () { + this.oSpellChecker = new SpellChecker("fr", "", "fr.json"); + }, + + listen: function () { + document.getElementById("search_similar_button").addEventListener("click", () => { this.searchSimilar(); }, false); + document.getElementById("search_regex_button").addEventListener("click", () => { this.searchRegex() }, false); + }, + + searchSimilar: function () { + oSearchTable.clear(); + let sWord = document.getElementById("search_similar").value; + if (sWord !== "") { + let lResult = this.oSpellChecker.getSimilarEntries(sWord, 20); + oSearchTable.fill(lResult); + } + }, + + searchRegex: function () { + let sFlexPattern = document.getElementById("search_flexion_pattern").value.trim(); + let sTagsPattern = document.getElementById("search_tags_pattern").value.trim(); + let lEntry = []; + let i = 0; + for (let aRes of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { + lEntry.push(aRes); + i++; + if (i >= 2000) { + break; + } + } + oSearchTable.fill(lEntry); + } +} + + +const oTagsInfo = { + load: function () { + let lEntry = []; + for (let [sTag, [_, sLabel]] of _dTag) { + lEntry.push([sTag, sLabel.trim()]); + } + oTagsTable.fill(lEntry); + } +} + + +const oGenWordsTable = new Table("generated_words_table", ["Flexions", "Étiquettes"], [1, 1], "progress_new_words"); +const oLexiconTable = new Table("lexicon_table", ["Flexions", "Lemmes", "Étiquettes"], [10, 7, 10], "progress_lexicon", "num_entries"); +const oSearchTable = new Table("search_table", ["Flexions", "Lemmes", "Étiquettes"], [10, 7, 10], "progress_search", "search_num_entries"); +const oTagsTable = new Table("tags_table", ["Étiquette", "Signification"], [1, 10], "progress_lexicon"); + +conj.init(helpers.loadFile("resource://grammalecte/fr/conj_data.json")); + + +oTagsInfo.load(); +oSearch.load(); +oBinaryDict.load(); +oBinaryDict.listen(); +oGenerator.listen(); +oSearch.listen(); ADDED gc_lang/fr/tb/content/lex_editor.xul Index: gc_lang/fr/tb/content/lex_editor.xul ================================================================== --- /dev/null +++ gc_lang/fr/tb/content/lex_editor.xul @@ -0,0 +1,326 @@ +<?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;"/> + <tab label="&tab.search.label;"/> + <tab label="&tab.info.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> + + <tabpanel orient="vertical"> + <hbox> + <vbox> + <dialogheader title="&dialogheader.search.similar.label;" description="" /> + <hbox> + <textbox id="search_similar" value="" /> + <button id="search_similar_button" label="Chercher" /> + </hbox> + + <spacer flex="1" /> + + <dialogheader title="&dialogheader.search.regex.label;" description="" /> + <hbox> + <label value="Flexion" /> + <spacer flex="1" /> + <textbox id="search_flexion_pattern" value="" /> + </hbox> + <hbox> + <label value="Étiquettes" /> + <spacer flex="1" /> + <textbox id="search_tags_pattern" value="" /> + </hbox> + <button id="search_regex_button" label="Chercher" /> + <label value="" /> + <description>La recherche par expressions régulières peut générer un nombre gigantesque de résultats. Seules les 2000 premières occurrences trouvées seront affichées. La recherche peut être longue, parce tout le graphe de mots, qui contient 500 000 flexions, sera parcouru si besoin.</description> + + <spacer flex="1" /> + + <progressmeter id="progress_search" value="0"/> + <hbox> + <spacer flex="1" /> + <label id="search_num_entries" class="align_right" value="0" /> + <label value="entrées" /> + </hbox> + </vbox> + <vbox> + <dialogheader title="Résultat" description="" /> + <listbox id="search_table"> + <!-- + <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> + + <tabpanel orient="vertical"> + <hbox> + <vbox> + <dialogheader title="&dialogheader.info.label;" description="" /> + <description>Les modifications apportées au lexique ne sont enregistrées dans le dictionnaire qu’au moment où vous cliquez sur ‹Enregistrer› dans l’onglet ‹Lexique›.</description> + <description>Il est inutile de purger votre lexique des doublons éventuels. Les doublons sont automatiquement supprimés lors de la création du dictionnaire.</description> + <description>Le dictionnaire est compilé comme un graphe de mots sous la forme d’une chaîne binaire dans un fichier JSON. Cette opération peut prendre du temps et consommer beaucoup de mémoire si votre lexique contient plusieurs dizaines de milliers d’entrées.</description> + <spacer flex="1" /> + <label value="Avertissement :" /> + <description>Il est déconseillé d’utiliser la catégorie ‹Autre› pour générer autre chose que des noms, des adjectifs, des noms propres, des verbes et des adverbes. Il n’y a aucune garantie que les étiquettes pour les autres catégories, notamment les mots grammaticaux, ne changeront pas.</description> + </vbox> + <vbox> + <dialogheader title="Signification des étiquettes" description="" /> + <listbox id="tags_table"> + <!-- + <listhead> + <listheader label="Étiquettes"/> + <listheader label="Signification"/> + </listhead> + + <listcols> + <listcol flex="1"/> + <listcol flex="10"/> + </listcols> + + <listitem> + <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/char_player.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/graphspell/spellchecker.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="resource://grammalecte/fr/lexicographe.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,14 @@ +<!ENTITY window.title "Grammalecte · Lexical editor lexical"> + +<!ENTITY button.cancel.label "Close"> + +<!ENTITY tab.editor.label "Add"> +<!ENTITY tab.lexicon.label "Lexicon"> +<!ENTITY tab.search.label "Search"> +<!ENTITY tab.info.label "Informations"> + +<!ENTITY dialogheader.newword.label "New word"> +<!ENTITY dialogheader.lexicon.label "Your lexicon"> +<!ENTITY dialogheader.search.similar.label "Similar spellings"> +<!ENTITY dialogheader.search.regex.label "Regular expressions"> +<!ENTITY dialogheader.info.label "Informations"> 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,15 @@ +<!ENTITY window.title "Grammalecte · Éditeur lexical"> + +<!ENTITY button.cancel.label "Fermer"> + +<!ENTITY tab.editor.label "Ajout"> +<!ENTITY tab.lexicon.label "Lexique"> +<!ENTITY tab.search.label "Recherche"> +<!ENTITY tab.info.label "Informations"> + +<!ENTITY dialogheader.newword.label "Nouveau mot"> +<!ENTITY dialogheader.lexicon.label "Votre lexique"> +<!ENTITY dialogheader.search.similar.label "Graphies similaires"> +<!ENTITY dialogheader.search.regex.label "Expressions régulières"> +<!ENTITY dialogheader.info.label "Informations"> + 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); } } Index: gc_lang/fr/webext/gce_worker.js ================================================================== --- gc_lang/fr/webext/gce_worker.js +++ gc_lang/fr/webext/gce_worker.js @@ -318,10 +318,14 @@ break; case "extended": oSpellChecker.setExtendedDictionary(oDict); postMessage(createResponse("setDictionary", true, dInfo, true)); break; + case "community": + oSpellChecker.setCommunityDictionary(oDict); + postMessage(createResponse("setDictionary", true, dInfo, true)); + break; case "personal": oSpellChecker.setPersonalDictionary(oDict); postMessage(createResponse("setDictionary", true, dInfo, true)); break; default: 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 @@ -23,22 +23,21 @@ background: hsl(0, 0%, 100%) url(../img/lines.png); font: normal 16px "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif; 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 { @@ -50,180 +49,255 @@ margin: 3px 0 2px 0; color: hsl(210, 50%, 50%); font: bold 16px "Trebuchet MS", "Fira Sans", "Liberation Sans", sans-serif; } +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; +} +details.inline { + padding: 3px; + width: 260px; +} + + +/* + Main buttons +*/ #buttons { - padding: 10px; + padding: 10px 0; 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; } +#lexicon_button { + background-color: hsl(210, 80%, 90%); + color: hsl(210, 80%, 30%); + font-weight: bold; +} + +.big_block { + margin: 10px 0; + padding: 10px; + background-color: hsl(210, 20%, 96%); + border-radius: 5px; +} -#add_word_page { +#add_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; background-color: hsl(0, 10%, 96%); border-radius: 3px; } +.space_container { + display: flex; + justify-content: space-between; +} .typeline { padding: 5px 10px; } .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; } -input[type=text] { +input[type=text].large { 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; font: normal 20px Tahoma, "Ubuntu Condensed"; color: hsl(0, 0%, 20%); } + +input[type=text].medium { + display: inline-block; + width: 175px; + padding: 2px 5px; + border: 2px solid hsl(0, 0%, 80%); + border-radius: 3px; + height: 20px; + background: transparent; + font: normal 18px Tahoma, "Ubuntu Condensed"; + color: hsl(0, 0%, 20%); +} + 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%); + display: none; + width: 200px; + 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 { + +/* + Search page +*/ +#search_page { + display: none; +} + +.button_search { + margin: 5px 0; + width: 100px; + padding: 5px 10px; + font-size: 16px; + background-color: hsl(150, 50%, 50%); + color: hsl(150, 50%, 96%); + border-radius: 3px; + text-align: center; + cursor: pointer; +} +.button_search:hover { + background-color: hsl(150, 60%, 40%); + color: hsl(150, 60%, 90%); + box-shadow: 0 0 2px hsl(150, 60%, 50%); +} + +#search_table { + width: 600px; +} + +/* + Information page +*/ +#info_page { display: none; } -.button_block { - margin: 5px 0px; - background-color: hsl(210, 10%, 90%); - border-radius: 5px; - padding: 15px; +#tags_table { + width: 500px; } + + +/* + Dictionary +*/ #save_button, #export_button, #import_button { display: none; float: right; padding: 2px 10px; background-color: hsl(150, 50%, 50%); @@ -238,30 +312,34 @@ color: hsl(210, 0%, 100%); } #import_button { display: none; } - -#build_progress { - display: none; +#wait_progress { width: 100%; + height: 4px; } -#display_progress { - display: none; + +/* + Table +*/ +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; } td { padding: 0 10px; } - .delete_entry { cursor: pointer; font-weight: bold; color: hsl(0, 100%, 50%); } + + + 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,332 @@ <!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_button" class="main_button">Ajout</div> + <div id="search_button" class="main_button">Recherche</div> + <div id="info_button" class="main_button">Informations</div> + </div> + + <div id="add_page"> + <div class="columns"> + <div id="word_generator"> + <h2>Nouveau mot (lemme)</h2> + <input type="text" id="lemma" class="large" 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" class="large" 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 class="space_container"> + <div> + <input type="checkbox" id="up_v_ae" value="e" /><label for="up_v_ae"> être</label> + </div> + <details class="inline"> + <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="space_container"> + <div> + <input type="checkbox" id="up_v_aa" value="a" /><label for="up_v_aa"> avoir</label> + </div> + <details class="inline"> + <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> + + <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">Il est déconseillé d’utiliser un verbe modèle : ce n’est pas nécessaire la très grande majorité des verbes du 1ᵉʳ groupe et du 2ᵉ groupe. Ce ne peut être utile et bénéfique que pour les cas particuliers.</p> + <input type="text" id="verb_pattern" class="large" 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"></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"> + <h3>Flexion</h3> + <p><input type="text" id="flexion" name="flexion" class="large" maxlength="20" value="" pattern="^[a-zA-Zà-ö0-9À-Öø-ÿØ-ßĀ-ʯ._-]+$" placeholder="flexion" /></p> + <h3>Étiquettes</h3> + <p><input type="text" id="tags" name="tags" class="large" 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_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 id="search_page"> + <div class="columns"> + <div style="margin-right: 20px;"> + <h2>Recherche</h2> + + <h3 style="margin-top: 20px;">Graphies similaires</h3> + <p><input id="search_similar" class="medium" type="text" /></p> + <p><div id="search_similar_button" class="button_search">Chercher</div></p> + + <h3 style="margin-top: 20px;">Expressions régulières</h3> + <p><b>Flexion</b></p> + <p> <input id="search_flexion_pattern" class="medium" type="text" /></p> + + <p><b>Étiquettes</b></p> + <p><input id="search_tags_pattern" class="medium" type="text" /></p> + <p><div id="search_regex_button" class="button_search">Chercher</div></p> + + <p style="margin-top: 50px;">La recherche par expressions régulières peut générer un nombre gigantesque de résultats. Seules les 2000 premières occurrences trouvées seront affichées. La recherche peut être longue, parce tout le graphe de mots, qui contient 500 000 flexions, sera parcouru si besoin.</p> + </div> + + <div> + <h2>Résultats</h2> + <table id="search_table"> + + </table> + </div> + </div> + </div> <!-- #search_page --> + + + <div id="info_page"> + <div class="columns"> + <div style="margin-right: 20px;"> + <h2>Informations</h2> + <dialogheader title="&dialogheader.info.label;" description="" /> + <h3>Enregistrement</h3> + <p>Les modifications apportées au lexique ne sont enregistrées dans le dictionnaire qu’au moment où vous cliquez sur ‹Enregistrer› dans l’onglet ‹Lexique›.</p> + <p> </p> + + <h3>Doublons</h3> + <p>Il est inutile de purger votre lexique des doublons éventuels. Les doublons sont automatiquement supprimés lors de la création du dictionnaire.</p> + <p> </p> + + <h3>Compilation du dictionnaire</h3> + <p>Le dictionnaire est compilé comme un graphe de mots sous la forme d’une chaîne binaire dans un fichier JSON. Cette opération peut prendre du temps et consommer beaucoup de mémoire si votre lexique contient plusieurs dizaines de milliers d’entrées.</p> + <p> </p> + + <h3>Étiquettes rares</h3> + <p>Il est déconseillé d’utiliser la catégorie ‹Autre› pour générer autre chose que des noms, des adjectifs, des noms propres, des verbes et des adverbes. Il n’y a aucune garantie que les étiquettes pour les autres catégories, notamment les mots grammaticaux, ne changeront pas.</p> + </div> + + <div> + <table id="tags_table"> + + </table> + </div> + </div> + </div> <!-- #info_page --> + + </div> + + + <script src="../grammalecte/graphspell/helpers.js"></script> + <script src="../grammalecte/graphspell/char_player.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/graphspell/spellchecker.js"></script> + <script src="../grammalecte/fr/conj.js"></script> + <script src="../grammalecte/fr/conj_generator.js"></script> + <script src="../grammalecte/fr/lexicographe.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,227 @@ 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%)"; +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.") + } +} + + +const oTabulations = { + + lPage: ["lexicon_page", "add_page", "search_page", "info_page"], + + showPage: function (sRequestedPage) { + for (let sPage of this.lPage) { + if (sPage !== sRequestedPage) { + hideElement(sPage); + this.downlightButton(sPage.slice(0,-5) + "_button"); + } + } + showElement(sRequestedPage); + this.highlightButton(sRequestedPage.slice(0,-5) + "_button"); + if (sRequestedPage == "add_page") { 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.") - } - }, + highlightButton: function (sButton) { + if (document.getElementById(sButton)) { + let xButton = document.getElementById(sButton); + xButton.style.backgroundColor = "hsl(210, 80%, 90%)"; + xButton.style.color = "hsl(210, 80%, 30%)"; + xButton.style.fontWeight = "bold"; + } + }, + + downlightButton: function (sButton) { + if (document.getElementById(sButton)) { + let xButton = document.getElementById(sButton); + xButton.style.backgroundColor = "hsl(210, 10%, 95%)"; + xButton.style.color = "hsl(210, 10%, 50%)"; + xButton.style.fontWeight = "normal"; + } + }, + + listen: function () { + document.getElementById("lexicon_button").addEventListener("click", () => { this.showPage("lexicon_page"); }, false); + document.getElementById("add_button").addEventListener("click", () => { this.showPage("add_page"); }, false); + document.getElementById("search_button").addEventListener("click", () => { this.showPage("search_page"); }, false); + document.getElementById("info_button").addEventListener("click", () => { this.showPage("info_page"); }, false); + } +} + + +class Table { + + constructor (sNodeId, lColumn, sProgressBarId, sResultId="", bDeleteButtons=true) { + 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.bDeleteButtons = bDeleteButtons; + this._createHeader(); + this.listen(); + } + + _createHeader () { + let xRowNode = createNode("tr"); + if (this.bDeleteButtons) { + xRowNode.appendChild(createNode("th", { textContent: "·", width: "12px" })); + } + 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 }); + if (this.bDeleteButtons) { + xRowNode.appendChild(createNode("td", { textContent: "×", className: "delete_entry", title: "Effacer cette entrée" }, { id_entry: this.iEntryIndex })); + } + for (let data of lData) { + xRowNode.appendChild(createNode("td", { textContent: data })); + } + this.xTable.appendChild(xRowNode); + this.iEntryIndex += 1; + } + + listen () { + if (this.bDeleteButtons) { + 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 xElem of document.getElementById("sections").childNodes) { - if (xElem.id) { - xElem.style.display = "none"; - } + 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 +291,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 +306,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 +381,113 @@ 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(); + if (this.lFlexion.length > 0) { + showElement("add_to_lexicon"); + } else { + hideElement("add_to_lexicon"); + } + 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 +500,127 @@ 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 }); + for (let aRes of this.oIBDAWG.select()) { + lEntry.push(aRes); + } + 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("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); + 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"); + } else { + this.setDictData(0, "[néant]"); + browser.storage.local.set({ "oPersonalDictionary": "" }); + browser.runtime.sendMessage({ sCommand: "setDictionary", dParam: {sType: "personal", oDict: null}, dInfo: {} }); + } }, 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 oSearch = { + + oSpellChecker: null, + + load: function () { + this.oSpellChecker = new SpellChecker("fr", browser.extension.getURL("")+"grammalecte/graphspell/_dictionaries", "fr.json"); + }, + + loadOtherDictionaries: function () { + //TODO + }, + + listen: function () { + document.getElementById("search_similar_button").addEventListener("click", () => { this.searchSimilar(); }, false); + document.getElementById("search_regex_button").addEventListener("click", () => { this.searchRegex() }, false); + }, + + searchSimilar: function () { + oSearchTable.clear(); + let sWord = document.getElementById("search_similar").value; + if (sWord !== "") { + let lResult = this.oSpellChecker.getSimilarEntries(sWord, 20); + oSearchTable.fill(lResult); + } + }, + + searchRegex: function () { + let sFlexPattern = document.getElementById("search_flexion_pattern").value.trim(); + let sTagsPattern = document.getElementById("search_tags_pattern").value.trim(); + let lEntry = []; + let i = 0; + for (let aRes of this.oSpellChecker.select(sFlexPattern, sTagsPattern)) { + lEntry.push(aRes); + i++; + if (i >= 2000) { + break; + } + } + oSearchTable.fill(lEntry); + } +} + + +const oTagsInfo = { + load: function () { + let lEntry = []; + for (let [sTag, [_, sLabel]] of _dTag) { + lEntry.push([sTag, sLabel.trim()]); + } + oTagsTable.fill(lEntry); + } +} + + +const oGenWordsTable = new Table("generated_words_table", ["Flexions", "Étiquettes"], "wait_progress"); +const oLexiconTable = new Table("lexicon_table", ["Flexions", "Lemmes", "Étiquettes"], "wait_progress", "num_entries"); +const oSearchTable = new Table("search_table", ["Flexions", "Lemmes", "Étiquettes"], "wait_progress", "search_num_entries", false); +const oTagsTable = new Table("tags_table", ["Étiquette", "Signification"], "wait_progress", "", false); + + +oTagsInfo.load(); +oSearch.load(); oBinaryDict.load(); +oBinaryDict.listen(); +oGenerator.listen(); +oTabulations.listen(); +oSearch.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: grammalecte-cli.py ================================================================== --- grammalecte-cli.py +++ grammalecte-cli.py @@ -188,12 +188,20 @@ for lSugg in oSpellChecker.suggest(sWord): echo(" | ".join(lSugg)) elif sText.startswith(">"): oSpellChecker.drawPath(sText[1:].strip()) elif sText.startswith("="): - for sRes in oSpellChecker.select(sText[1:].strip()): - echo(sRes) + sSearch = sText[1:].strip() + if "=" in sSearch: + nCut = sSearch.find("=") + sFlexPattern = sSearch[0:nCut] + sTagsPattern = sSearch[nCut+1:] + else: + sFlexPattern = sSearch + sTagsPattern = "" + for aRes in oSpellChecker.select(sFlexPattern, sTagsPattern): + echo("\t".join(aRes)) elif sText.startswith("/+ "): oGrammarChecker.gce.setOptions({ opt:True for opt in sText[3:].strip().split() if opt in oGrammarChecker.gce.getOptions() }) echo("done") elif sText.startswith("/- "): oGrammarChecker.gce.setOptions({ opt:False for opt in sText[3:].strip().split() if opt in oGrammarChecker.gce.getOptions() }) 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/ibdawg.js ================================================================== --- graphspell-js/ibdawg.js +++ graphspell-js/ibdawg.js @@ -415,39 +415,55 @@ } // morph (sWord) { // is defined in constructor // } - - * select (sPattern="") { - // generator: returns all entries which morphology fits <sPattern> - let zPattern = null; - if (sPattern !== "") { - try { - zPattern = new RegExp(sPattern); - } - catch (e) { - console.log("Error in regex pattern"); - console.log(e.message); + getSimilarEntries (sWord, nSuggLimit=10) { + // return a list of tuples (similar word, stem, morphology) + if (sWord == "") { + return []; + } + let lResult = []; + for (let sSimilar of this.suggest(sWord, nSuggLimit)) { + for (let sMorph of this.getMorph(sSimilar)) { + let nCut = sMorph.indexOf(" "); + lResult.push( [sSimilar, sMorph.slice(1, nCut), sMorph.slice(nCut+1)] ); } } - yield* this._select1(zPattern, 0, ""); + return lResult; + } + + * select (sFlexPattern="", sTagsPattern="") { + // generator: returns all entries which flexion fits <sFlexPattern> and morphology fits <sTagsPattern> + let zFlexPattern = null; + let zTagsPattern = null; + try { + zFlexPattern = (sFlexPattern !== "") ? new RegExp(sFlexPattern) : null; + zTagsPattern = (sTagsPattern !== "") ? new RegExp(sTagsPattern) : null; + } + catch (e) { + console.log("Error in regex pattern"); + console.log(e.message); + } + yield* this._select1(zFlexPattern, zTagsPattern, 0, ""); } // VERSION 1 - * _select1 (zPattern, iAddr, sWord) { + * _select1 (zFlexPattern, zTagsPattern, iAddr, sWord) { // recursive generator for (let [nVal, jAddr] of this._getArcs1(iAddr)) { if (nVal <= this.nChar) { // simple character - yield* this._select1(zPattern, jAddr, sWord + this.lArcVal[nVal]); + yield* this._select1(zFlexPattern, zTagsPattern, jAddr, sWord + this.lArcVal[nVal]); } else { - let sEntry = sWord + "\t" + this.funcStemming(sWord, this.lArcVal[nVal]); - for (let [nMorphVal, _] of this._getArcs1(jAddr)) { - if (!zPattern || zPattern.test(this.lArcVal[nMorphVal])) { - yield sEntry + "\t" + this.lArcVal[nMorphVal]; + if (!zFlexPattern || zFlexPattern.test(sWord)) { + let sStem = this.funcStemming(sWord, this.lArcVal[nVal]); + for (let [nMorphVal, _] of this._getArcs1(jAddr)) { + if (!zTagsPattern || zTagsPattern.test(this.lArcVal[nMorphVal])) { + yield [sWord, sStem, this.lArcVal[nMorphVal]]; + } } } } } } 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,79 @@ 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) { - yield* this.oExtendedDic.select(sPattern); - } - if (this.oPersonalDic) { - yield* this.oPersonalDic.select(sPattern); - } + * select (sFlexPattern="", sTagsPattern="") { + // generator: returns all entries which flexion fits <sFlexPattern> and morphology fits <sTagsPattern> + yield* this.oMainDic.select(sFlexPattern, sTagsPattern) + if (this.bExtendedDic) { + yield* this.oExtendedDic.select(sFlexPattern, sTagsPattern); + } + if (this.bCommunityDic) { + yield* this.oCommunityDic.select(sFlexPattern, sTagsPattern); + } + if (this.bPersonalDic) { + yield* this.oPersonalDic.select(sFlexPattern, sTagsPattern); + } + } + + getSimilarEntries (sWord, nSuggLimit=10) { + // return a list of tuples (similar word, stem, morphology) + let lResult = this.oMainDic.getSimilarEntries(sWord, nSuggLimit); + if (this.bExtendedDic) { + lResult.push(...this.oExtendedDic.getSimilarEntries(sWord, nSuggLimit)); + } + if (this.bCommunityDic) { + lResult.push(...this.oCommunityDic.getSimilarEntries(sWord, nSuggLimit)); + } + if (this.bPersonalDic) { + lResult.push(...this.oPersonalDic.getSimilarEntries(sWord, nSuggLimit)); + } + return lResult; } } 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" \ @@ -405,36 +407,51 @@ return if iPos >= 0: print("\n "+ " " * iPos + "|") self.drawPath(sWord[1:], iNextNodeAddr) - def select (self, sPattern=""): - "generator: returns all entries which morphology fits <sPattern>" - zPattern = None - if sPattern: - try: - zPattern = re.compile(sPattern) - except: - print("# Error in regex pattern") - traceback.print_exc() - yield from self._select1(zPattern, 0, "") + def getSimilarEntries (self, sWord, nSuggLimit=10): + "return a list of tuples (similar word, stem, morphology)" + if not sWord: + return [] + lResult = [] + for sSimilar in self.suggest(sWord, nSuggLimit): + for sMorph in self.getMorph(sSimilar): + nCut = sMorph.find(" ") + lResult.append( (sSimilar, sMorph[1:nCut], sMorph[nCut+1:]) ) + return lResult + + def select (self, sFlexPattern="", sTagsPattern=""): + "generator: returns all entries which flexion fits <sFlexPattern> and morphology fits <sTagsPattern>" + zFlexPattern = None + zTagsPattern = None + try: + if sFlexPattern: + zFlexPattern = re.compile(sFlexPattern) + if sTagsPattern: + zTagsPattern = re.compile(sTagsPattern) + except: + print("# Error in regex pattern") + traceback.print_exc() + yield from self._select1(zFlexPattern, zTagsPattern, 0, "") # def morph (self, sWord): # is defined in __init__ # VERSION 1 - def _select1 (self, zPattern, iAddr, sWord): + def _select1 (self, zFlexPattern, zTagsPattern, iAddr, sWord): # recursive generator for nVal, jAddr in self._getArcs1(iAddr): if nVal <= self.nChar: # simple character - yield from self._select1(zPattern, jAddr, sWord + self.lArcVal[nVal]) + yield from self._select1(zFlexPattern, zTagsPattern, jAddr, sWord + self.lArcVal[nVal]) else: - sEntry = sWord + "\t" + self.funcStemming(sWord, self.lArcVal[nVal]) - for nMorphVal, _ in self._getArcs1(jAddr): - if not zPattern or zPattern.search(self.lArcVal[nMorphVal]): - yield sEntry + "\t" + self.lArcVal[nMorphVal] + if not zFlexPattern or zFlexPattern.search(sWord): + sStem = self.funcStemming(sWord, self.lArcVal[nVal]) + for nMorphVal, _ in self._getArcs1(jAddr): + if not zTagsPattern or zTagsPattern.search(self.lArcVal[nMorphVal]): + yield [sWord, sStem, self.lArcVal[nMorphVal]] def _morph1 (self, sWord): "returns morphologies of <sWord>" iAddr = 0 for c in sWord: 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,93 @@ 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: - yield from self.oExtendedDic.select(sPattern) - if self.oPersonalDic: - yield from self.oPersonalDic.select(sPattern) + def select (self, sFlexPattern="", sTagsPattern=""): + "generator: returns all entries which flexion fits <sFlexPattern> and morphology fits <sTagsPattern>" + yield from self.oMainDic.select(sFlexPattern, sTagsPattern) + if self.bExtendedDic: + yield from self.oExtendedDic.select(sFlexPattern, sTagsPattern) + if self.bCommunityDic: + yield from self.oCommunityDic.select(sFlexPattern, sTagsPattern) + if self.bPersonalDic: + yield from self.oPersonalDic.select(sFlexPattern, sTagsPattern) 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) + + def getSimilarEntries (self, sWord, nSuggLimit=10): + "return a list of tuples (similar word, stem, morphology)" + lResult = self.oMainDic.getSimilarEntries(sWord, nSuggLimit) + if self.bExtendedDic: + lResult.extend(self.oExtendedDic.getSimilarEntries(sWord, nSuggLimit)) + if self.bCommunityDic: + lResult.extend(self.oCommunityDic.getSimilarEntries(sWord, nSuggLimit)) + if self.bPersonalDic: + lResult.extend(self.oPersonalDic.getSimilarEntries(sWord, nSuggLimit)) + return lResult 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