Index: gc_core/py/oxt/OptionsDialog.xcs
==================================================================
--- gc_core/py/oxt/OptionsDialog.xcs
+++ gc_core/py/oxt/OptionsDialog.xcs
@@ -14,14 +14,30 @@
The data for one leaf.
${xcs_options}
+
+
+
+ The data for one leaf.
+
+ 1
+ 1
+ 0
+ 1
+
+
+
+
+
+
+
ADDED gc_core/py/oxt/helpers.py
Index: gc_core/py/oxt/helpers.py
==================================================================
--- /dev/null
+++ gc_core/py/oxt/helpers.py
@@ -0,0 +1,74 @@
+# Helpers for LibreOffice extension
+
+import os
+import traceback
+
+import uno
+
+from com.sun.star.beans import PropertyValue
+from com.sun.star.uno import RuntimeException as _rtex
+
+
+def xray (myObject):
+ "XRay - API explorer"
+ try:
+ sm = uno.getComponentContext().ServiceManager
+ mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext())
+ scriptPro = mspf.createScriptProvider("")
+ xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application")
+ xScript.invoke((myObject,), (), ())
+ return
+ except:
+ raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext())
+
+
+def mri (ctx, xTarget):
+ "MRI - API Explorer"
+ try:
+ xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx)
+ xMri.inspect(xTarget)
+ except:
+ raise _rtex("\nPython extension MRI is not installed", uno.getComponentContext())
+
+
+def getConfigSetting (sNodeConfig, bUpdate=False):
+ "get a configuration node"
+ # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False)
+ xSvMgr = uno.getComponentContext().ServiceManager
+ xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
+ xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
+ xPropertyValue.Name = "nodepath"
+ xPropertyValue.Value = sNodeConfig
+ if bUpdate:
+ sService = "com.sun.star.configuration.ConfigurationUpdateAccess"
+ else:
+ sService = "com.sun.star.configuration.ConfigurationAccess"
+ return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode
+
+
+def printServices (o):
+ for s in o.getAvailableServiceNames():
+ print(' > '+s)
+
+
+def getWindowSize ():
+ "return main window size"
+ xCurCtx = uno.getComponentContext()
+ xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx)
+ xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow
+ xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT"))
+ #print(xContainerWindow.Size.Width, ">", xWindowSize.Width)
+ #print(xContainerWindow.Size.Height, ">", xWindowSize.Height)
+ xWindowSize.Width = xWindowSize.Width * 0.666
+ xWindowSize.Height = xWindowSize.Height * 0.666
+ return xWindowSize
+
+
+def getAbsolutePathOf (sPath=""):
+ xDefaultContext = uno.getComponentContext().ServiceManager.DefaultContext
+ xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
+ sFullPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
+ if sPath and not sPath.startswith("/"):
+ sPath = "/" + sPath
+ sFullPath = sFullPath[8:] + sPath
+ return os.path.abspath(sFullPath)
Index: gc_lang/fr/config.ini
==================================================================
--- gc_lang/fr/config.ini
+++ gc_lang/fr/config.ini
@@ -73,19 +73,24 @@
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_conj_data.py = pythonpath/lxe_conj_data.py
+oxt/DictOptions/lxe_strings.py = pythonpath/lxe_strings.py
# ContextMenu
oxt/ContextMenu/ContextMenu.py = ContextMenu.py
oxt/ContextMenu/jobs.xcu = config/jobs.xcu
# TextFormatter
oxt/TextFormatter/TextFormatter.py = pythonpath/TextFormatter.py
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,157 @@
+# 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 = 255
+ 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)
+ self._addWidget('import_personal', 'FixedText', nX, nY3+55, nWidth-60, nHeight, Label = dUI.get('import_personal', "#err"), FontDescriptor = xFDSubTitle)
+ self.xMsg = self._addWidget('msg', 'FixedText', nX, nY3+65, nWidth-50, nHeight, Label = "[néant]")
+ self._addWidget('import_button', 'Button', self.xDialog.Width-50, nY3+65, 40, 10, Label = dUI.get('import_button', "#err"), TextColor = 0x005500)
+ self._addWidget('create_dictionary', 'FixedText', nX, nY3+75, nWidth, nHeight*2, Label = dUI.get('create_dictionary', "#err"), MultiLine = True)
+
+ # Button
+ self._addWidget('apply_button', 'Button', self.xDialog.Width-120, 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('import_button').addActionListener(self)
+ self.xContainer.getControl('import_button').setActionCommand('Import')
+ 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()
+ elif xActionEvent.ActionCommand == "Import":
+ 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()
+ 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,550 @@
+# Lexicon Editor
+# by Olivier R.
+# License: GPL 3
+
+import unohelper
+import uno
+import json
+import re
+import traceback
+
+import helpers
+import lxe_strings
+import lxe_conj_data
+import grammalecte.graphspell as sc
+import grammalecte.graphspell.dawg as dawg
+import grammalecte.graphspell.ibdawg as ibdawg
+import grammalecte.fr.conj as conj
+
+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.lGeneratedFlex = []
+ # options node
+ self.xSettingNode = helpers.getConfigSetting("/org.openoffice.Lightproof_grammalecte/Other/", True)
+
+ def _addWidget (self, name, wtype, x, y, w, h, **kwargs):
+ xWidget = self.xDialog.createInstance('com.sun.star.awt.UnoControl%sModel' % wtype)
+ xWidget.Name = name
+ xWidget.PositionX = x
+ xWidget.PositionY = y
+ xWidget.Width = w
+ xWidget.Height = h
+ for k, w in kwargs.items():
+ setattr(xWidget, k, w)
+ self.xDialog.insertByName(name, xWidget)
+ return xWidget
+
+ def _addGrid (self, name, x, y, w, h, columns, **kwargs):
+ xGridModel = self.xDialog.createInstance('com.sun.star.awt.grid.UnoControlGridModel')
+ xGridModel.Name = name
+ xGridModel.PositionX = x
+ xGridModel.PositionY = y
+ xGridModel.Width = w
+ xGridModel.Height = h
+ xColumnModel = xGridModel.ColumnModel
+ for e in columns:
+ xCol = xColumnModel.createColumn()
+ for k, w in e.items():
+ setattr(xCol, k, w)
+ xColumnModel.addColumn(xCol)
+ for k, w in kwargs.items():
+ setattr(xGridModel, k, w)
+ self.xDialog.insertByName(name, xGridModel)
+ return xGridModel
+
+ def run (self, sLang):
+ # ui lang
+ self.dUI = lxe_strings.getUI(sLang)
+
+ # dialog
+ self.xDialog = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialogModel', self.ctx)
+ self.xDialog.Width = 620
+ self.xDialog.Height = 292
+ 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
+
+ nY1 = 5
+ nY2 = nY1 + 25 # nom commun
+ nY3 = nY2 + 95 # nom propre
+ nY4 = nY3 + 45 # verbe
+ nY5 = nY4 + 68 # adverbe
+ nY6 = nY5 + 13 # autre
+
+ nXB = nX1 + 195
+ nXC = nXB + 205
+
+ nHeight = 10
+
+ #### Add word
+ self._addWidget("add_section", 'FixedLine', nX1, nY1, 190, nHeight, Label = self.dUI.get("add_section", "#err"), FontDescriptor = xFDTitle)
+ self.xLemma = self._addWidget('lemma', 'Edit', nX1, nY1+10, 120, 14, FontDescriptor = xFDTitle)
+ self._addWidget('close_button', 'Button', nX1+130, nY1+10, 60, 14, Label = self.dUI.get('close_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000)
+
+ # 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, 190, 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, 180, nHeight, Label = self.dUI.get("alt_lemma", "#err"))
+ self.xAltLemma = self._addWidget('alt_lemma', 'Edit', nX1+10, nY2+52, 120, nHeight)
+ self.xNA2 = self._addWidget('nom_adj2', 'RadioButton', nX1+10, nY2+65, 60, nHeight, Label = self.dUI.get("nom_adj", "#err"), HelpText = ":N:A")
+ self.xN2 = self._addWidget('nom2', 'RadioButton', nX1+10, nY2+75, 60, nHeight, Label = self.dUI.get("nom", "#err"), HelpText = ":N")
+ self.xA2 = self._addWidget('adj2', 'RadioButton', nX1+10, nY2+85, 60, nHeight, Label = self.dUI.get("adj", "#err"), HelpText = ":A")
+ self._addWidget("fl_sep2", 'FixedLine', nX1, nY2, 1, nHeight)
+ self.xSepi2 = self._addWidget('Sepi2', 'RadioButton', nX1+75, nY2+65, 50, nHeight, Label = self.dUI.get("epi", "#err"), HelpText = ":e")
+ self.xSmas2 = self._addWidget('Smas2', 'RadioButton', nX1+75, nY2+75, 50, nHeight, Label = self.dUI.get("mas", "#err"), HelpText = ":m")
+ self.xSfem2 = self._addWidget('Sfem2', 'RadioButton', nX1+75, nY2+85, 50, nHeight, Label = self.dUI.get("fem", "#err"), HelpText = ":f")
+ self._addWidget("fl_sep3", 'FixedLine', nX1, nY2, 1, nHeight)
+ self.xSs2 = self._addWidget('Ss2', 'RadioButton', nX1+130, nY2+65, 50, nHeight, Label = self.dUI.get("-s", "#err"), HelpText = "·s")
+ self.xSx2 = self._addWidget('Sx2', 'RadioButton', nX1+130, nY2+75, 50, nHeight, Label = self.dUI.get("-x", "#err"), HelpText = "·x")
+ self.xSinv2 = self._addWidget('Sinv2', 'RadioButton', nX1+130, nY2+85, 50, nHeight, Label = self.dUI.get("inv", "#err"), HelpText = ":i")
+
+ # Nom propre
+ self._addWidget("fl_M", 'FixedLine', nX1, nY3, 190, 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, 150, 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, 150, nHeight, FontDescriptor = xFDSubTitle)
+
+ # Autre
+ self._addWidget("fl_other", 'FixedLine', nX2+30, nY6, 150, nHeight, FontDescriptor = xFDSubTitle)
+ self._addWidget('flexion_label', 'FixedText', nX2, nY6+10, 85, nHeight, Label = self.dUI.get('flexion', "#err"))
+ self.xFlexion = self._addWidget('flexion', 'Edit', nX2, nY6+20, 85, nHeight)
+ self._addWidget('tags_label', 'FixedText', nX2+90, nY6+10, 85, nHeight, Label = self.dUI.get('tags', "#err"))
+ self.xTags = self._addWidget('tags', 'Edit', nX2+90, nY6+20, 85, nHeight)
+
+ #### Generated words
+ self._addWidget("gwords_section", 'FixedLine', nXB, nY1, 200, nHeight, Label = self.dUI.get("new_section", "#err"), FontDescriptor = xFDTitle)
+ self.xGridModelNew = self._addGrid("list_grid_gwords", nXB, nY1+10, 200, 175, [
+ {"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.xAdd = self._addWidget('add_button', 'Button', nXB, nY1+190, 95, 12, Label = self.dUI.get('add_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500, Enabled = False)
+ self.xDelete = self._addWidget('delete_button', 'Button', nXB+100, nY1+190, 100, 12, Label = self.dUI.get('delete_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x550000)
+
+ nY2b = nY1 + 205
+ # lexicon info section
+ self._addWidget("lexicon_info_section", 'FixedLine', nXB, nY2b, 200, nHeight, Label = self.dUI.get("lexicon_info_section", "#err"), FontDescriptor = xFDTitle)
+ self._addWidget("added_entries_label", 'FixedText', nXB, nY2b+10, 90, nHeight, Label = self.dUI.get("added_entries_label", "#err"))
+ self._addWidget("deleted_entries_label", 'FixedText', nXB, nY2b+20, 90, nHeight, Label = self.dUI.get("deleted_entries_label", "#err"))
+ self._addWidget("num_of_entries_label1", 'FixedText', nXB, nY2b+30, 90, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"))
+ self.xNumAdded = self._addWidget("added_entries", 'FixedText', nXB+90, nY2b+10, 50, nHeight, Label = "0")
+ self.xNumDeleted = self._addWidget("deleted_entries", 'FixedText', nXB+90, nY2b+20, 50, nHeight, Label = "0")
+ self.xNumLex = self._addWidget("num_of_entries1", 'FixedText', nXB+90, nY2b+30, 50, nHeight, Label = "0")
+ self.xSave = self._addWidget('save_button', 'Button', nXB+150, nY2b+10, 50, 12, Label = self.dUI.get('save_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500)
+ # dictionary section
+ self._addWidget("dictionary_section", 'FixedLine', nXB, nY2b+45, 200, nHeight, Label = self.dUI.get("dictionary_section", "#err"), FontDescriptor = xFDTitle)
+ self._addWidget("save_date_label", 'FixedText', nXB, nY2b+55, 90, nHeight, Label = self.dUI.get("save_date_label", "#err"))
+ self._addWidget("num_of_entries_label2", 'FixedText', nXB, nY2b+65, 90, nHeight, Label = self.dUI.get("num_of_entries_label", "#err"))
+ self.xDateDic = self._addWidget("save_date", 'FixedText', nXB+90, nY2b+55, 50, nHeight, Label = "-")
+ self.xNumDic = self._addWidget("num_of_entries2", 'FixedText', nXB+90, nY2b+65, 50, nHeight, Label = "0")
+ #self.xExport = self._addWidget('export_button', 'Button', nXB+150, nY2b+55, 50, 12, Label = self.dUI.get('export_button', "#err"), FontDescriptor = xFDSubTitle, TextColor = 0x005500)
+
+ #### 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, 270, [
+ {"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.loadLexicon()
+
+ # container
+ self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx)
+ self.xContainer.setModel(self.xDialog)
+ self.xGridControlNew = self.xContainer.getControl('list_grid_gwords')
+ self.xGridControlLex = self.xContainer.getControl('list_grid_lexicon')
+ #helpers.xray(self.xContainer.getControl('lemma'))
+ self._createKeyListeners(['lemma', 'alt_lemma', "v_pattern", 'flexion', 'tags'], "Update")
+ self._createActionListeners(['nom_adj', 'nom', 'adj', 'M1', 'M2', 'MP', 'verb', 'adv', 'other', \
+ 'Sepi', 'Smas', 'Sfem', 'Ss', 'Sx', 'Sinv', 'nom_adj2', 'nom2', 'adj2', \
+ 'Sepi2', 'Smas2', 'Sfem2', 'Ss2', 'Sx2', 'Sinv2', 'Mepi', 'Mmas', 'Mfem', \
+ 'v_i', 'v_t', 'v_n', 'v_p', 'v_m', 'v_ae', 'v_aa', 'v_pp'], "Update")
+ self.xContainer.getControl('add_button').addActionListener(self)
+ self.xContainer.getControl('add_button').setActionCommand('Add')
+ self.xContainer.getControl('delete_button').addActionListener(self)
+ self.xContainer.getControl('delete_button').setActionCommand('Delete')
+ self.xContainer.getControl('save_button').addActionListener(self)
+ self.xContainer.getControl('save_button').setActionCommand('Save')
+ self.xContainer.getControl('close_button').addActionListener(self)
+ self.xContainer.getControl('close_button').setActionCommand('Close')
+ self.xContainer.setVisible(False)
+ xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx)
+ self.xContainer.createPeer(xToolkit, None)
+ self.xContainer.execute()
+
+ def _createKeyListeners (self, lNames, sAction):
+ for sName in lNames:
+ self.xContainer.getControl(sName).addKeyListener(self)
+
+ def _createActionListeners (self, lNames, sAction):
+ for sName in lNames:
+ self.xContainer.getControl(sName).addActionListener(self)
+ self.xContainer.getControl(sName).setActionCommand(sAction)
+
+ # XActionListener
+ def actionPerformed (self, xActionEvent):
+ try:
+ if xActionEvent.ActionCommand == "Update":
+ self.updateGenWords()
+ elif xActionEvent.ActionCommand == "Add":
+ self.addToLexicon()
+ elif xActionEvent.ActionCommand == "Delete":
+ self.deleteSelectedEntries()
+ elif xActionEvent.ActionCommand == "Save":
+ self.saveLexicon()
+ elif xActionEvent.ActionCommand == "Export":
+ self.exportDictionary()
+ elif xActionEvent.ActionCommand == "Close":
+ self.xContainer.endExecute()
+ except:
+ traceback.print_exc()
+
+ # XKeyListener
+ def keyPressed (self, xKeyEvent):
+ pass
+
+ def keyReleased (self, xKeyEvent):
+ self.updateGenWords()
+
+ # XJobExecutor
+ def trigger (self, args):
+ try:
+ xDialog = LexiconEditor(self.ctx)
+ xDialog.run()
+ except:
+ traceback.print_exc()
+
+ # Code
+ #@_waitPointer (don’t: strange behavior)
+ def loadLexicon (self):
+ xChild = self.xSettingNode.getByName("o_fr")
+ sJSON = xChild.getPropertyValue("personal_dic")
+ if sJSON != "":
+ oIBDAWG = ibdawg.IBDAWG(json.loads(sJSON))
+ xGridDataModel = self.xGridModelLex.GridDataModel
+ for i, sLine in enumerate(oIBDAWG.select()):
+ sFlexion, sLemma, sTag = sLine.split("\t")
+ xGridDataModel.addRow(i, (sFlexion, sLemma, sTag))
+ self.xNumAdded.Label = "0"
+ self.xNumDeleted.Label = "0"
+ self.xNumLex.Label = str(i)
+ self.xNumDic.Label = str(i)
+ self.xDateDic.Label = oIBDAWG.sDate
+
+ @_waitPointer
+ def saveLexicon (self):
+ xGridDataModel = self.xGridModelLex.GridDataModel
+ lEntry = []
+ for i in range(xGridDataModel.RowCount):
+ lEntry.append(xGridDataModel.getRowData(i))
+ oDAWG = dawg.DAWG(lEntry, "S", "fr", "Français", "Dictionnaire personnel")
+ oJSON = oDAWG.getBinaryAsJSON()
+ xChild = self.xSettingNode.getByName("o_fr")
+ xChild.setPropertyValue("personal_dic", json.dumps(oJSON, ensure_ascii=False))
+ self.xSettingNode.commitChanges()
+ self.xNumAdded.Label = "0"
+ self.xNumDeleted.Label = "0"
+ self.xNumLex.Label = str(oJSON["nEntry"])
+ self.xNumDic.Label = str(oJSON["nEntry"])
+ self.xDateDic.Label = oJSON["sDate"]
+
+ def _getRadioValue (self, *args):
+ for x in args:
+ if x.State:
+ return x.HelpText
+ return None
+
+ @_waitPointer
+ def updateGenWords (self):
+ self.lGeneratedFlex = []
+ sLemma = self.xLemma.Text.strip()
+ if 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((sLemma, sLemma, sPOS+sGenderTag+":s/*"))
+ self.lGeneratedFlex.append((sLemma+"s", sLemma, sPOS+sGenderTag+":p/*"))
+ elif self.xSx.State:
+ self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":s/*"))
+ self.lGeneratedFlex.append((sLemma+"x", sLemma, sPOS+sGenderTag+":p/*"))
+ elif self.xSinv.State:
+ self.lGeneratedFlex.append((sLemma, 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, sLemma, sTag2+":s/*"))
+ self.lGeneratedFlex.append((sLemma2+"s", sLemma, sTag2+":p/*"))
+ elif self.xSx2.State:
+ self.lGeneratedFlex.append((sLemma2, sLemma, sTag2+":s/*"))
+ self.lGeneratedFlex.append((sLemma2+"x", sLemma, sTag2+":p/*"))
+ elif self.xSinv2.State:
+ self.lGeneratedFlex.append((sLemma2, sLemma, sTag2+":i/*"))
+ elif self._getRadioValue(self.xM1, self.xM2, self.xMP):
+ # Nom propre
+ sPOS = self._getRadioValue(self.xM1, self.xM2, self.xMP)
+ sLemma = sLemma[0:1].upper() + sLemma[1:];
+ sGenderTag = self._getRadioValue(self.xMepi, self.xMmas, self.xMfem)
+ if sGenderTag:
+ self.lGeneratedFlex.append((sLemma, sLemma, sPOS+sGenderTag+":i/*"))
+ elif self.xV.State:
+ # Verbe
+ if sLemma.endswith(("er", "ir", "re")):
+ sLemma = 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:
+ if sLemma.endswith("er") or sLemma.endswith("ir"):
+ # tables de conjugaison du 1er et du 2e groupe
+ cGroup = "1" if sLemma.endswith("er") else "2"
+ for nCut, sAdd, sFlexTags, sPattern in self._getConjRules(sLemma):
+ if not sPattern or re.search(sPattern, sLemma):
+ self.lGeneratedFlex.append((sLemma[0:-nCut]+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags))
+ # participes passés
+ bPpasVar = "var" if self.xV_pp.State else "invar"
+ lPpasRules = lxe_conj_data.oConj["V1_ppas"][bPpasVar] if sLemma.endswith("er") else lxe_conj_data.oConj["V2_ppas"][bPpasVar]
+ for nCut, sAdd, sFlexTags, sPattern in lPpasRules:
+ if not sPattern or re.search(sPattern, sLemma):
+ self.lGeneratedFlex.append((sLemma[0:-nCut]+sAdd, sLemma, ":V" + cGroup + "_" + sVerbTag + sFlexTags))
+ else:
+ # copie du motif d’un autre verbe : utilisation du conjugueur
+ if conj.isVerb(sVerbPattern):
+ oVerb = conj.Verb(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, sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + sTag1 + sTag2))
+ else:
+ # participes passés
+ if dFlex[":Q3"]:
+ if dFlex[":Q2"]:
+ self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:s/*"))
+ self.lGeneratedFlex.append((dFlex[":Q2"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:p/*"))
+ else:
+ self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:m:i/*"))
+ self.lGeneratedFlex.append((dFlex[":Q3"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:s/*"))
+ self.lGeneratedFlex.append((dFlex[":Q4"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:A:f:p/*"))
+ else:
+ self.lGeneratedFlex.append((dFlex[":Q1"], sLemma, ":V" + oVerb.cGroup + "_" + sVerbTag + ":Q:e:i/*"))
+ elif self.xW.State:
+ # Adverbe
+ sLemma = sLemma.lower();
+ self.lGeneratedFlex.append((sLemma, 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, sLemma, sTags))
+ self._showGenWords()
+
+ def _getConjRules (self, sVerb):
+ if sVerb.endswith("ir"):
+ # deuxième groupe
+ return lxe_conj_data.oConj["V2"]
+ elif sVerb.endswith("er"):
+ # premier groupe, conjugaison en fonction de la terminaison du lemme
+ # 5 lettres
+ if sVerb[-5:] in lxe_conj_data.oConj["V1"]:
+ return lxe_conj_data.oConj["V1"][sVerb[-5:]]
+ # 4 lettres
+ if sVerb[-4:] in lxe_conj_data.oConj["V1"]:
+ if sVerb.endswith(("eler", "eter")):
+ return lxe_conj_data.oConj["V1"][sVerb[-4:]]["1"]
+ return lxe_conj_data.oConj["V1"][sVerb[-4:]]
+ # 3 lettres
+ if sVerb[-3:] in lxe_conj_data.oConj["V1"]:
+ return lxe_conj_data.oConj["V1"][sVerb[-3:]]
+ return lxe_conj_data.oConj["V1"]["er"]
+ else:
+ # troisième groupe
+ return [ [0, "", ":Y/*", false] ]
+
+ def _showGenWords (self):
+ xGridDataModel = self.xGridModelNew.GridDataModel
+ xGridDataModel.removeAllRows()
+ if not self.lGeneratedFlex:
+ self.xAdd.Enabled = False
+ return
+ for i, (sFlexion, sLemma, sTag) in enumerate(self.lGeneratedFlex):
+ xGridDataModel.addRow(i, (sFlexion, sLemma, 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, sLemma, sTag = xGridDataModelNew.getRowData(i)
+ xGridDataModelLex.addRow(nStart + i, (sFlexion, sLemma, sTag))
+ self.xSave.Enabled = True
+ self.xNumAdded.Label = str(int(self.xNumAdded.Label) + xGridDataModelNew.RowCount)
+ self.xNumLex.Label = str(int(self.xNumLex.Label) + xGridDataModelNew.RowCount)
+ self._resetWidgets()
+
+ @_waitPointer
+ def deleteSelectedEntries (self):
+ xGridDataModel = self.xGridModelNew.GridDataModel
+ for i in self.xGridControlNew.getSelectedRows():
+ xGridDataModel.removeRow(i)
+ xGridDataModel = self.xGridModelLex.GridDataModel
+ nSelectedEntries = len(self.xGridControlLex.getSelectedRows())
+ for i in self.xGridControlLex.getSelectedRows():
+ xGridDataModel.removeRow(i)
+ self.xNumDeleted.Label = str(int(self.xNumDeleted.Label) + nSelectedEntries)
+ self.xNumLex.Label = str(xGridDataModel.RowCount)
+
+
+#g_ImplementationHelper = unohelper.ImplementationHelper()
+#g_ImplementationHelper.addImplementation(LexiconEditor, 'net.grammalecte.LexiconEditor', ('com.sun.star.task.Job',))
ADDED gc_lang/fr/oxt/DictOptions/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,49 @@
+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).",
+
+ "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.",
+ "import_personal": "Importer un dictionnaire personnel",
+ "import_button": "Importer",
+ "create_dictionary": "Vous pouvez créer un dictionnaire personnel avec l’extension Grammalecte pour Firefox ou Chrome.",
+
+ "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.",
+
+ "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)",
+
+ "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.",
+ "import_personal": "Import a personal dictionary",
+ "import_button": "Import",
+ "create_dictionary": "You can create a personal dictionary with the Grammalecte addon for Firefox or Chrome.",
+
+ "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.",
+
+ "apply_button": "Apply",
+ "cancel_button": "Cancel",
+ },
+}
ADDED gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
Index: gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
==================================================================
--- /dev/null
+++ gc_lang/fr/oxt/DictOptions/lxe_conj_data.py
@@ -0,0 +1,1948 @@
+# Conjugation data
+
+# beta stage, unfinished, may be useless or the root for a new way to generate flexions…
+
+# Règles de conjugaison
+
+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]
+ ]
+ }
+}
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,84 @@
+def getUI (sLang):
+ if sLang in dStrings:
+ return dStrings[sLang]
+ return dStrings["fr"]
+
+dStrings = {
+ "fr": {
+ "title": "Grammalecte · Éditeur lexical",
+
+ # Ajout
+ "add_section": "Nouveau mot (lemme)",
+ "lemma": "Lemme",
+
+ # catégories
+ "common_name": "Nom commun",
+ "nom_adj": "Nom et adjectif",
+ "nom": "Nom",
+ "adj": "Adjectif",
+ "alt_lemma": "[optionnel] Autre forme (masculine, féminine, variante, etc.)",
+
+ "proper_name": "Nom propre",
+ "M1": "Prénom",
+ "M2": "Patronyme",
+ "MP": "Autre",
+
+ "gender": "Genre",
+ "epi": "épicène",
+ "mas": "masculin",
+ "fem": "féminin",
+ "plural": "Pluriel",
+ "-s": "pluriel en ·s",
+ "-x": "pluriel en ·x",
+ "inv": "invariable",
+
+ "verb": "Verbe",
+ "v_i": "intransitif",
+ "v_t": "transitif",
+ "v_n": "transitif indirect",
+ "v_p": "pronominal",
+ "v_m": "impersonnel",
+ "aux": "Auxiliaire au passé composé",
+ "v_ae": "être",
+ "v_aa": "avoir",
+ "v_pp": "Participes passés variables",
+ "v_pattern": "Verbe modèle [optionnel]",
+
+ "adverb": "Adverbe",
+
+ "other": "Autre",
+ "flexion": "Flexion",
+ "tags": "Étiquettes",
+
+ # Lexicon
+ "new_section": "Mots générés",
+ "lexicon_section": "Votre lexique",
+ "lex_#": "#",
+ "lex_flex": "Flexions",
+ "lex_lemma": "Lemmes",
+ "lex_tags": "Étiquettes",
+
+ "add_button": "Ajouter au lexique",
+ "delete_button": "Supprimer la sélection",
+
+ # Informations
+ "lexicon_info_section": "Lexique",
+ "added_entries_label": "Nombre d’entrées ajoutées",
+ "deleted_entries_label": "Nombre d’entrées effacées",
+ "num_of_entries_label": "Nombre d’entrées",
+ "save_button": "Enregistrer",
+
+ "dictionary_section": "Dictionnaire enregistré",
+ "save_date_label": "Date d’enregistrement",
+ "export_button": "Exporter",
+
+ #
+ "close_button": "Fermer",
+ },
+ # Traduction délibérément limitée
+ "en": {
+ "title": "Grammalecte · Lexical editor",
+
+ "close_button": "Close",
+ },
+}
Index: gc_lang/fr/oxt/TextFormatter/TextFormatter.py
==================================================================
--- gc_lang/fr/oxt/TextFormatter/TextFormatter.py
+++ gc_lang/fr/oxt/TextFormatter/TextFormatter.py
@@ -383,17 +383,12 @@
for key, lWidget in self.dCheckboxWidgets.items():
w = getattr(self, key)
dOpt[w.Name] = w.State
for w in lWidget:
dOpt[w.Name] = w.State
- # get extension path
- xDefaultContext = self.ctx.ServiceManager.DefaultContext
- xPackageInfoProvider = xDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
- sExtPath = xPackageInfoProvider.getPackageLocation("French.linguistic.resources.from.Dicollecte.by.OlivierR")
- sExtPath = sExtPath[8:] + "/pythonpath/tf_options.py" # remove "file:///"
- sExtPath = os.path.abspath(sExtPath)
# write file
+ sExtPath = helpers.getAbsolutePathOf("/pythonpath/tf_options.py")
if os.path.isfile(sExtPath):
hOpt = open(sExtPath, "w")
hOpt.write("dDefaultOpt = " + str(tf_options.dDefaultOpt) + "\n")
hOpt.write("dOpt = " + str(dOpt))
hOpt.close()
Index: gc_lang/fr/oxt/addons.xcu
==================================================================
--- gc_lang/fr/oxt/addons.xcu
+++ gc_lang/fr/oxt/addons.xcu
@@ -75,11 +75,11 @@
service:net.grammalecte.AppLauncher?EN
~Recenseur de mots…
- ~Enumerator of words…
+ Enumerato~r of words…
_self
@@ -134,10 +134,48 @@
org.dicollecte.images:Grammalecte
+
+ service:net.grammalecte.AppLauncher?DI
+
+
+
+ ~Options des dictionnaires…
+ Dictionaries ~options…
+
+
+ _self
+
+
+ com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
+
+
+ org.dicollecte.images:Frenchflag
+
+
+
+
+ service:net.grammalecte.AppLauncher?LE
+
+
+
+ Éditeur ~lexical…
+ ~Lexicon editor…
+
+
+ _self
+
+
+ com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
+
+
+ org.dicollecte.images:Frenchflag
+
+
+
service:net.grammalecte.AppLauncher?DS
@@ -152,19 +190,19 @@
org.dicollecte.images:Frenchflag
-
+
private:separator
com.sun.star.text.TextDocument,com.sun.star.text.GlobalDocument,com.sun.star.text.WebDocument,com.sun.star.presentation.PresentationDocument
-
+
service:net.grammalecte.AppLauncher?About
DELETED gc_lang/fr/oxt/helpers.py
Index: gc_lang/fr/oxt/helpers.py
==================================================================
--- gc_lang/fr/oxt/helpers.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# -*- coding: utf8 -*-
-
-import uno
-import traceback
-
-from com.sun.star.beans import PropertyValue
-
-
-# XRay - API explorer
-from com.sun.star.uno import RuntimeException as _rtex
-def xray (myObject):
- try:
- sm = uno.getComponentContext().ServiceManager
- mspf = sm.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", uno.getComponentContext())
- scriptPro = mspf.createScriptProvider("")
- xScript = scriptPro.getScript("vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application")
- xScript.invoke((myObject,), (), ())
- return
- except:
- raise _rtex("\nBasic library Xray is not installed", uno.getComponentContext())
-
-
-# MRI - API Explorer
-def mri (ctx, xTarget):
- try:
- xMri = ctx.ServiceManager.createInstanceWithContext("mytools.Mri", ctx)
- xMri.inspect(xTarget)
- except:
- raise _rtex("\Python extension MRI is not installed", uno.getComponentContext())
-
-
-def getConfigSetting (sNodeConfig, bUpdate):
- "get a configuration node"
- # example: xNode = getConfigSetting("/org.openoffice.Office.Common/Path/Current", False)
- xSvMgr = uno.getComponentContext().ServiceManager
- xConfigProvider = xSvMgr.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
- xPropertyValue = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
- xPropertyValue.Name = "nodepath"
- xPropertyValue.Value = sNodeConfig
- if bUpdate:
- sService = "com.sun.star.configuration.ConfigurationUpdateAccess"
- else:
- sService = "com.sun.star.configuration.ConfigurationAccess"
- return xConfigProvider.createInstanceWithArguments(sService, (xPropertyValue,)) # return xNode
-
-
-def printServices (o):
- for s in o.getAvailableServiceNames():
- print(' > '+s)
-
-
-def getWindowSize ():
- "return main window size"
- xCurCtx = uno.getComponentContext()
- xDesktop = xCurCtx.getServiceManager().createInstanceWithContext('com.sun.star.frame.Desktop', xCurCtx)
- xContainerWindow = xDesktop.getCurrentComponent().CurrentController.Frame.ContainerWindow
- xWindowSize = xContainerWindow.convertSizeToLogic(xContainerWindow.Size, uno.getConstantByName("com.sun.star.util.MeasureUnit.POINT"))
- #print(xContainerWindow.Size.Width, ">", xWindowSize.Width)
- #print(xContainerWindow.Size.Height, ">", xWindowSize.Height)
- xWindowSize.Width = xWindowSize.Width * 0.666
- xWindowSize.Height = xWindowSize.Height * 0.666
- return xWindowSize
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":
@@ -56,14 +56,17 @@
lEntry = []
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
@@ -95,16 +98,12 @@
# Dictionary of arc values occurrency, to sort arcs of each node
dValOccur = dict( [ (dChar[c], dCharOccur[c]) for c in dChar ] \
+ [ (dAff[aff]+nChar, dAffOccur[aff]) for aff in dAff ] \
+ [ (dTag[tag]+nChar+nAff, dTagOccur[tag]) for tag in dTag ] )
- #with open(spfSrc[:-8]+".valuesfreq.txt", 'w', encoding='utf-8') as hFreqDst: # DEBUG
- # for iKey, nOcc in sorted(dValOccur.items(), key=lambda t: t[1], reverse=True):
- # hFreqDst.write("{}: {}\n".format(lVal[iKey], nOcc))
- # hFreqDst.close()
- self.sFileName = spfSrc
+ self.sFileName = src if type(src) is str else "[None]"
self.sLangCode = sLangCode
self.sLangName = sLangName
self.sDicName = sDicName
self.nEntry = len(lWord)
self.aPreviousEntry = []
@@ -308,11 +307,11 @@
if not zPattern or zPattern.search(self.lArcVal[nMorphVal]):
yield sEntry + "\t" + self.lArcVal[nMorphVal]
# BINARY CONVERSION
- def createBinary (self, sPathFile, nCompressionMethod, bDebug=False):
+ def _calculateBinary (self, nCompressionMethod):
print(" > Write DAWG as an indexable binary dictionary [method: %d]" % nCompressionMethod)
if nCompressionMethod == 1:
self.nBytesArc = ( (self.nArcVal.bit_length() + 2) // 8 ) + 1 # We add 2 bits. See DawgNode.convToBytes1()
self.nBytesOffset = 0
self._calcNumBytesNodeAddress()
@@ -332,14 +331,10 @@
print(" # Error: unknown compression method")
print(" Arc values (chars, affixes and tags): {} -> {} bytes".format( self.nArcVal, len("\t".join(self.lArcVal).encode("utf-8")) ))
print(" Arc size: {} bytes, Address size: {} bytes -> {} * {} = {} bytes".format( self.nBytesArc, self.nBytesNodeAddress, \
self.nBytesArc+self.nBytesNodeAddress, self.nArc, \
(self.nBytesArc+self.nBytesNodeAddress)*self.nArc ))
- self._writeBinary(sPathFile, nCompressionMethod)
- self._writeAsJSObject(sPathFile, nCompressionMethod)
- if bDebug:
- self._writeNodes(sPathFile, nCompressionMethod)
def _calcNumBytesNodeAddress (self):
"how many bytes needed to store all nodes/arcs in the binary dictionary"
self.nBytesNodeAddress = 1
while ((self.nBytesArc + self.nBytesNodeAddress) * self.nArc) > (2 ** (self.nBytesNodeAddress * 8)):
@@ -387,13 +382,12 @@
nSize -= nDiff
if self.lSortedNodes[i].size != nSize:
self.lSortedNodes[i].size = nSize
bEnd = False
- def _writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True):
- if not spfDst.endswith(".json"):
- spfDst += "."+str(nCompressionMethod)+".json"
+ def getBinaryAsJSON (self, nCompressionMethod=1, bBinaryDictAsHexString=True):
+ self._calculateBinary(nCompressionMethod)
byDic = b""
if nCompressionMethod == 1:
byDic = self.oRoot.convToBytes1(self.nBytesArc, self.nBytesNodeAddress)
for oNode in self.lMinimizedNodes:
byDic += oNode.convToBytes1(self.nBytesArc, self.nBytesNodeAddress)
@@ -403,44 +397,48 @@
byDic += oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress)
elif nCompressionMethod == 3:
byDic = self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)
for oNode in self.lSortedNodes:
byDic += oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset)
+ return {
+ "sHeader": "/pyfsa/",
+ "sLangCode": self.sLangCode,
+ "sLangName": self.sLangName,
+ "sDicName": self.sDicName,
+ "sFileName": self.sFileName,
+ "sDate": self._getDate(),
+ "nEntry": self.nEntry,
+ "nChar": self.nChar,
+ "nAff": self.nAff,
+ "nTag": self.nTag,
+ "cStemming": self.cStemming,
+ "dChar": self.dChar,
+ "nNode": self.nNode,
+ "nArc": self.nArc,
+ "nArcVal": self.nArcVal,
+ "lArcVal": self.lArcVal,
+ "nCompressionMethod": nCompressionMethod,
+ "nBytesArc": self.nBytesArc,
+ "nBytesNodeAddress": self.nBytesNodeAddress,
+ "nBytesOffset": self.nBytesOffset,
+ # Mozilla’s JS parser don’t like file bigger than 4 Mb!
+ # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension.
+ # https://github.com/mozilla/addons-linter/issues/1361
+ "sByDic": byDic.hex() if bBinaryDictAsHexString else [ e for e in byDic ]
+ }
+ def writeAsJSObject (self, spfDst, nCompressionMethod, bInJSModule=False, bBinaryDictAsHexString=True):
+ if not spfDst.endswith(".json"):
+ spfDst += "."+str(nCompressionMethod)+".json"
with open(spfDst, "w", encoding="utf-8", newline="\n") as hDst:
if bInJSModule:
hDst.write('// JavaScript\n// Generated data (do not edit)\n\n"use strict";\n\nconst dictionary = ')
- hDst.write(json.dumps({
- "sHeader": "/pyfsa/",
- "sLangCode": self.sLangCode,
- "sLangName": self.sLangName,
- "sDicName": self.sDicName,
- "sFileName": self.sFileName,
- "sDate": self._getDate(),
- "nEntry": self.nEntry,
- "nChar": self.nChar,
- "nAff": self.nAff,
- "nTag": self.nTag,
- "cStemming": self.cStemming,
- "dChar": self.dChar,
- "nNode": self.nNode,
- "nArc": self.nArc,
- "nArcVal": self.nArcVal,
- "lArcVal": self.lArcVal,
- "nCompressionMethod": nCompressionMethod,
- "nBytesArc": self.nBytesArc,
- "nBytesNodeAddress": self.nBytesNodeAddress,
- "nBytesOffset": self.nBytesOffset,
- # JavaScript is a pile of shit, so Mozilla’s JS parser don’t like file bigger than 4 Mb!
- # So, if necessary, we use an hexadecimal string, that we will convert later in Firefox’s extension.
- # https://github.com/mozilla/addons-linter/issues/1361
- "sByDic": byDic.hex() if bBinaryDictAsHexString else [ e for e in byDic ]
- }, ensure_ascii=False))
+ hDst.write( json.dumps(self.getBinaryAsJSON(nCompressionMethod, bBinaryDictAsHexString), ensure_ascii=False) )
if bInJSModule:
hDst.write(";\n\nexports.dictionary = dictionary;\n")
- def _writeBinary (self, sPathFile, nCompressionMethod):
+ def writeBinary (self, sPathFile, nCompressionMethod, bDebug=False):
"""
Format of the binary indexable dictionary:
Each section is separated with 4 bytes of \0
- Section Header:
@@ -471,10 +469,11 @@
- Section Word Graph (nodes / arcs)
* A list of nodes which are a list of arcs with an address of the next node.
See DawgNode.convToBytes() for details.
"""
+ self._calculateBinary(nCompressionMethod)
if not sPathFile.endswith(".bdic"):
sPathFile += "."+str(nCompressionMethod)+".bdic"
with open(sPathFile, 'wb') as hDst:
# header
hDst.write("/pyfsa/{}/".format(nCompressionMethod).encode("utf-8"))
@@ -499,11 +498,12 @@
hDst.write(oNode.convToBytes2(self.nBytesArc, self.nBytesNodeAddress))
elif nCompressionMethod == 3:
hDst.write(self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
for oNode in self.lSortedNodes:
hDst.write(oNode.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset))
- hDst.close()
+ if bDebug:
+ self._writeNodes(sPathFile, nCompressionMethod)
def _getDate (self):
return time.strftime("%Y.%m.%d, %H:%M")
def _writeNodes (self, sPathFile, nCompressionMethod):
@@ -522,23 +522,10 @@
if nCompressionMethod == 3:
hDst.write(self.oRoot.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
#hDst.write( ''.join( [ "%02X " % z for z in self.oRoot.convToBytes3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset) ] ).strip() )
for oNode in self.lSortedNodes:
hDst.write(oNode.getTxtRepr3(self.nBytesArc, self.nBytesNodeAddress, self.nBytesOffset, self.lArcVal)+"\n")
- hDst.close()
-
- def writeResults (self, sPathFile):
- bFileExits = os.path.isfile("_lexicons.res.txt")
- with open("_lexicons.res.txt", "a", encoding='utf-8', newline="\n") as hDst:
- sFormat1 = "{:<12} {:>12} {:>5} {:>8} {:>8} {:>6} {:>8} {:>9} {:>9} {:>15} {:>12} {:>12}\n"
- sFormat2 = "{:<12} {:>12,} {:>5,} {:>8,} {:>8} {:>6,} {:>8,} {:>9,} {:>9,} {:>15,} {:>12,} {:>12,}\n"
- if not bFileExits:
- hDst.write(sFormat1.format("Lexicon", "Entries", "Chars", "Affixes", "Stemming", "Tags", "Values", "Nodes", "Arcs", "Lexicon (Kb)", "Dict (Kb)", "LT Dict (Kb)"))
- hDst.write(sFormat2.format(self.sLangName, self.nEntry, self.nChar, self.nAff, self.cStemming + "FX", self.nTag, self.nArcVal, \
- self.nNode, self.nArc, os.path.getsize(self.sFileName), os.path.getsize(sPathFile), \
- os.path.getsize("cfsa/dict/{}.dict".format(self.sLangName)) if os.path.isfile("cfsa/dict/{}.dict".format(self.sLangName)) else 0))
- hDst.close()
class DawgNode:
NextId = 0
Index: graphspell/ibdawg.py
==================================================================
--- graphspell/ibdawg.py
+++ graphspell/ibdawg.py
@@ -77,23 +77,26 @@
class IBDAWG:
"""INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH"""
- def __init__ (self, sfDict):
- self.by = pkgutil.get_data(__package__, "_dictionaries/" + sfDict)
- if not self.by:
- raise OSError("# Error. File not found or not loadable: "+sfDict)
-
- if sfDict.endswith(".bdic"):
- self._initBinary()
- elif sfDict.endswith(".json"):
- self._initJSON()
+ def __init__ (self, source):
+ if type(source) is str:
+ self.by = pkgutil.get_data(__package__, "_dictionaries/" + source)
+ if not self.by:
+ raise OSError("# Error. File not found or not loadable: "+source)
+
+ if source.endswith(".bdic"):
+ self._initBinary()
+ elif source.endswith(".json"):
+ self._initJSON(json.loads(self.by.decode("utf-8"))) #json.loads(self.by) # In Python 3.6, can read directly binary strings
+ else:
+ raise OSError("# Error. Unknown file type: "+source)
else:
- raise OSError("# Error. Unknown file type: "+sfDict)
+ self._initJSON(source)
- self.sFileName = sfDict
+ self.sFileName = source if type(source) is str else "[None]"
self._arcMask = (2 ** ((self.nBytesArc * 8) - 3)) - 1
self._finalNodeMask = 1 << ((self.nBytesArc * 8) - 1)
self._lastArcMask = 1 << ((self.nBytesArc * 8) - 2)
self._addrBitMask = 1 << ((self.nBytesArc * 8) - 3) # version 2
@@ -167,14 +170,13 @@
for i in range(1, self.nChar+1):
self.dChar[self.lArcVal[i]] = i
self.dCharVal = { v: k for k, v in self.dChar.items() }
self.nBytesOffset = 1 # version 3
- def _initJSON (self):
+ def _initJSON (self, oJSON):
"initialize with a JSON text file"
- self.__dict__.update(json.loads(self.by.decode("utf-8")))
- #self.__dict__.update(json.loads(self.by)) # In Python 3.6, can read directly binary strings
+ self.__dict__.update(oJSON)
self.byDic = binascii.unhexlify(self.sByDic)
def getInfo (self):
return " Language: {0.sLangName} Lang code: {0.sLangCode} Dictionary name: {0.sDicName}" \
" Compression method: {0.nCompressionMethod:>2} Date: {0.sDate} Stemming: {0.cStemming}FX\n" \
Index: 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():