Index: compile_rules_graph.py ================================================================== --- compile_rules_graph.py +++ compile_rules_graph.py @@ -431,16 +431,18 @@ print("Unknown line:") print(sLine) # processing rules print(" preparing rules...") + nRule = 0 for sGraphName, lRuleLine in dAllGraph.items(): print("{:>8,} rules in {:<24} ".format(len(lRuleLine), "<"+sGraphName+">"), end="") lPreparedRule = [] for i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority in lRuleLine: for aRule in createRule(i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef, dDecl): lPreparedRule.append(aRule) + nRule += len(lRuleLine) # Graph creation oDARG = darg.DARG(lPreparedRule, sLang) dAllGraph[sGraphName] = oDARG.createGraph() # Debugging if False: @@ -450,10 +452,11 @@ print(e) if False: print("\nGRAPH:", sGraphName) for k, v in dAllGraph[sGraphName].items(): print(k, "\t", v) + print(" Total: ", nRule, "rules") # creating file with all functions callable by rules print(" creating callables for graph rules...") sPyCallables = "" sJSCallables = "" Index: gc_core/py/oxt/OptionsDialog.xcs ================================================================== --- gc_core/py/oxt/OptionsDialog.xcs +++ gc_core/py/oxt/OptionsDialog.xcs @@ -32,10 +32,11 @@ 1 BOLDWAVE 0 + Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -4,11 +4,11 @@ locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_BF fr_BJ fr_CD fr_CI fr_CM fr_MA fr_ML fr_MU fr_NE fr_RE fr_SN fr_TG country_default = FR name = Grammalecte implname = grammalecte # always use 3 numbers for version: x.y.z -version = 1.4.0 +version = 1.5.0 author = Olivier R. provider = Grammalecte.net link = https://grammalecte.net description = Correcteur grammatical, orthographique et typographique pour le français. extras = README_fr.txt Index: gc_lang/fr/modules-js/gce_suggestions.js ================================================================== --- gc_lang/fr/modules-js/gce_suggestions.js +++ gc_lang/fr/modules-js/gce_suggestions.js @@ -224,11 +224,11 @@ return ""; } //// Nouns and adjectives -function suggPlur (sFlex, sWordToAgree=null) { +function suggPlur (sFlex, sWordToAgree=null, bSelfSugg=false) { // returns plural forms assuming sFlex is singular if (sWordToAgree) { let lMorph = _oSpellChecker.getMorph(sWordToAgree); if (lMorph.length === 0) { return ""; @@ -246,10 +246,18 @@ aSugg.add(sFlex.slice(0,-1)+"ux"); } if (sFlex.endsWith("ail") && sFlex.length > 3 && _oSpellChecker.isValid(sFlex.slice(0,-2)+"ux")) { aSugg.add(sFlex.slice(0,-2)+"ux"); } + } + if (sFlex.endsWith("L")) { + if (sFlex.endsWith("AL") && sFlex.length > 2 && _oSpellChecker.isValid(sFlex.slice(0,-1)+"UX")) { + aSugg.add(sFlex.slice(0,-1)+"UX"); + } + if (sFlex.endsWith("AIL") && sFlex.length > 3 && _oSpellChecker.isValid(sFlex.slice(0,-2)+"UX")) { + aSugg.add(sFlex.slice(0,-2)+"UX"); + } } if (_oSpellChecker.isValid(sFlex+"s")) { aSugg.add(sFlex+"s"); } if (_oSpellChecker.isValid(sFlex+"x")) { @@ -256,17 +264,20 @@ aSugg.add(sFlex+"x"); } if (mfsp.hasMiscPlural(sFlex)) { mfsp.getMiscPlural(sFlex).forEach(function(x) { aSugg.add(x); }); } + if (aSugg.size == 0 && bSelfSugg && (sFlex.endsWith("s") || sFlex.endsWith("x") || sFlex.endsWith("S") || sFlex.endsWith("X"))) { + aSugg.add(sFlex); + } if (aSugg.size > 0) { return Array.from(aSugg).join("|"); } return ""; } -function suggSing (sFlex) { +function suggSing (sFlex, bSelfSugg=false) { // returns singular forms assuming sFlex is plural let aSugg = new Set(); if (sFlex.endsWith("ux")) { if (_oSpellChecker.isValid(sFlex.slice(0,-2)+"l")) { aSugg.add(sFlex.slice(0,-2)+"l"); @@ -273,12 +284,23 @@ } if (_oSpellChecker.isValid(sFlex.slice(0,-2)+"il")) { aSugg.add(sFlex.slice(0,-2)+"il"); } } - if (_oSpellChecker.isValid(sFlex.slice(0,-1))) { + if (sFlex.endsWith("UX")) { + if (_oSpellChecker.isValid(sFlex.slice(0,-2)+"L")) { + aSugg.add(sFlex.slice(0,-2)+"L"); + } + if (_oSpellChecker.isValid(sFlex.slice(0,-2)+"IL")) { + aSugg.add(sFlex.slice(0,-2)+"IL"); + } + } + if ((sFlex.endsWith("s") || sFlex.endsWith("x") || sFlex.endsWith("S") || sFlex.endsWith("X")) && _oSpellChecker.isValid(sFlex.slice(0,-1))) { aSugg.add(sFlex.slice(0,-1)); + } + if (bSelfSugg && aSugg.size == 0) { + aSugg.add(sFlex); } if (aSugg.size > 0) { return Array.from(aSugg).join("|"); } return ""; Index: gc_lang/fr/modules/gce_suggestions.py ================================================================== --- gc_lang/fr/modules/gce_suggestions.py +++ gc_lang/fr/modules/gce_suggestions.py @@ -170,11 +170,11 @@ return "" ## Nouns and adjectives -def suggPlur (sFlex, sWordToAgree=None): +def suggPlur (sFlex, sWordToAgree=None, bSelfSugg=False): "returns plural forms assuming sFlex is singular" if sWordToAgree: lMorph = _oSpellChecker.getMorph(sFlex) if not lMorph: return "" @@ -187,31 +187,45 @@ if sFlex.endswith("l"): if sFlex.endswith("al") and len(sFlex) > 2 and _oSpellChecker.isValid(sFlex[:-1]+"ux"): aSugg.add(sFlex[:-1]+"ux") if sFlex.endswith("ail") and len(sFlex) > 3 and _oSpellChecker.isValid(sFlex[:-2]+"ux"): aSugg.add(sFlex[:-2]+"ux") + if sFlex.endswith("L"): + if sFlex.endswith("AL") and len(sFlex) > 2 and _oSpellChecker.isValid(sFlex[:-1]+"UX"): + aSugg.add(sFlex[:-1]+"UX") + if sFlex.endswith("AIL") and len(sFlex) > 3 and _oSpellChecker.isValid(sFlex[:-2]+"UX"): + aSugg.add(sFlex[:-2]+"UX") if _oSpellChecker.isValid(sFlex+"s"): aSugg.add(sFlex+"s") if _oSpellChecker.isValid(sFlex+"x"): aSugg.add(sFlex+"x") if mfsp.hasMiscPlural(sFlex): aSugg.update(mfsp.getMiscPlural(sFlex)) + if not aSugg and bSelfSugg and sFlex.endswith(("s", "x", "S", "X")): + aSugg.add(sFlex) if aSugg: return "|".join(aSugg) return "" -def suggSing (sFlex): +def suggSing (sFlex, bSelfSugg=True): "returns singular forms assuming sFlex is plural" aSugg = set() if sFlex.endswith("ux"): if _oSpellChecker.isValid(sFlex[:-2]+"l"): aSugg.add(sFlex[:-2]+"l") if _oSpellChecker.isValid(sFlex[:-2]+"il"): aSugg.add(sFlex[:-2]+"il") - if _oSpellChecker.isValid(sFlex[:-1]): + if sFlex.endswith("UX"): + if _oSpellChecker.isValid(sFlex[:-2]+"L"): + aSugg.add(sFlex[:-2]+"L") + if _oSpellChecker.isValid(sFlex[:-2]+"IL"): + aSugg.add(sFlex[:-2]+"IL") + if sFlex.endswith(("s", "x", "S", "X")) and _oSpellChecker.isValid(sFlex[:-1]): aSugg.add(sFlex[:-1]) + if bSelfSugg and not aSugg: + aSugg.add(sFlex) if aSugg: return "|".join(aSugg) return "" Index: gc_lang/fr/oxt/About/About.py ================================================================== --- gc_lang/fr/oxt/About/About.py +++ gc_lang/fr/oxt/About/About.py @@ -1,6 +1,5 @@ -# -*- coding: utf8 -*- # About dialog # by Olivier R. # License: MPL 2 import unohelper Index: gc_lang/fr/oxt/About/ab_strings.py ================================================================== --- gc_lang/fr/oxt/About/ab_strings.py +++ gc_lang/fr/oxt/About/ab_strings.py @@ -1,6 +1,6 @@ -# -*- encoding: UTF-8 -*- +# About strings def getUI (sLang): if sLang in dStrings: return dStrings[sLang] return dStrings["fr"] Index: gc_lang/fr/oxt/DictOptions/LexiconEditor.py ================================================================== --- gc_lang/fr/oxt/DictOptions/LexiconEditor.py +++ gc_lang/fr/oxt/DictOptions/LexiconEditor.py @@ -371,26 +371,28 @@ self.xNumDic.Label = 0 self.xDateDic.Label = self.dUI.get("void", "#err") @_waitPointer def importDictionary (self): - # FilePicker doesn’t work at all… - #xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.FilePicker', self.ctx) # other possibility: com.sun.star.ui.dialogs.SystemFilePicker - #xFilePicker.initialize([uno.getConstantByName("com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE")]) # seems useless - #xFilePicker.appendFilter("Supported files", "*.json; *.bdic") - #xFilePicker.setDefaultName("fr.personal.json") # useless, doesn’t work - #xFilePicker.setDisplayDirectory("") - #xFilePicker.setMultiSelectionMode(False) - #nResult = xFilePicker.execute() - #if nResult == 1: - # lFile = xFilePicker.getSelectedFiles() - # lFile = xFilePicker.getFiles() - # print(lFile) - # MessageBox(self.xDocument, "File(s): " + str(lFile), "DEBUG", INFOBOX) - # workaround - spfImported = os.path.join(os.path.expanduser("~"), "fr.personal.json") - if os.path.isfile(spfImported): + spfImported = "" + try: + xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.FilePicker', self.ctx) # other possibility: com.sun.star.ui.dialogs.SystemFilePicker + xFilePicker.initialize([uno.getConstantByName("com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE")]) # seems useless + xFilePicker.appendFilter("Supported files", "*.json; *.bdic") + xFilePicker.setDefaultName("fr.__personal__.json") # useless, doesn’t work + xFilePicker.setDisplayDirectory("") + xFilePicker.setMultiSelectionMode(False) + nResult = xFilePicker.execute() + if nResult == 1: + # lFile = xFilePicker.getSelectedFiles() + lFile = xFilePicker.getFiles() + #print(lFile) + #MessageBox(self.xDocument, "File(s): " + str(lFile), "DEBUG", INFOBOX) + spfImported = lFile[0][8:] # remove file:/// + except: + spfImported = os.path.join(os.path.expanduser("~"), "fr.personal.json") # workaround + if spfImported and os.path.isfile(spfImported): with open(spfImported, "r", encoding="utf-8") as hDst: sJSON = hDst.read() try: sTest = json.loads(sJSON) except: @@ -424,19 +426,30 @@ self.xDateDic.Label = self.dUI.get("void", "#err") MessageBox(self.xDocument, self.dUI.get('save_message', "#err"), self.dUI.get('save_title', "#err")) def exportDictionary (self): try: - spfExported = os.path.join(os.path.expanduser("~"), "fr.personal.json") - sJSON = self.xOptionNode.getPropertyValue("personal_dic") - if sJSON: - with open(spfExported, "w", encoding="utf-8") as hDst: - hDst.write(sJSON) - sMessage = self.dUI.get('export_message', "#err_msg: %s") % spfExported - else: - sMessage = self.dUI.get('empty_dictionary', "#err") - MessageBox(self.xDocument, sMessage, self.dUI.get('export_title', "#err")) + xFilePicker = self.xSvMgr.createInstanceWithContext('com.sun.star.ui.dialogs.FilePicker', self.ctx) # other possibility: com.sun.star.ui.dialogs.SystemFilePicker + xFilePicker.initialize([uno.getConstantByName("com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE")]) # seems useless + xFilePicker.appendFilter("Supported files", "*.json; *.bdic") + xFilePicker.setDefaultName("fr.__personal__.json") # useless, doesn’t work + xFilePicker.setDisplayDirectory("") + xFilePicker.setMultiSelectionMode(False) + nResult = xFilePicker.execute() + if nResult == 1: + # lFile = xFilePicker.getSelectedFiles() + lFile = xFilePicker.getFiles() + spfExported = lFile[0][8:] # remove file:/// + #spfExported = os.path.join(os.path.expanduser("~"), "fr.personal.json") + sJSON = self.xOptionNode.getPropertyValue("personal_dic") + if sJSON: + with open(spfExported, "w", encoding="utf-8") as hDst: + hDst.write(sJSON) + sMessage = self.dUI.get('export_message', "#err_msg: %s") % spfExported + else: + sMessage = self.dUI.get('empty_dictionary', "#err") + MessageBox(self.xDocument, sMessage, self.dUI.get('export_title', "#err")) except: sMessage = traceback.format_exc() MessageBox(self.xDocument, sMessage, self.dUI.get('export_title', "#err"), ERRORBOX) def _getRadioValue (self, *args): Index: gc_lang/fr/oxt/Lexicographer/Enumerator.py ================================================================== --- gc_lang/fr/oxt/Lexicographer/Enumerator.py +++ gc_lang/fr/oxt/Lexicographer/Enumerator.py @@ -102,11 +102,11 @@ # 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" @@ -126,25 +126,24 @@ self.xGridModel = self._addGrid("list_grid", nX, nY1+25, nWidth, 181, \ [ {"Title": self.dUI.get("words", "#err"), "ColumnWidth": 175}, {"Title": "Occurrences", "ColumnWidth": 45} ], \ SelectionModel = uno.Enum("com.sun.star.view.SelectionType", "MULTI") \ ) self._addWidget('num_of_entries', 'FixedText', nX, nY1+210, 60, nHeight, Label = self.dUI.get('num_of_entries', "#err"), Align = 2) - self.xNumWord = self._addWidget('num_of_entries_res', 'FixedText', nX+65, nY1+210, 30, nHeight, Label = "—") - self._addWidget('tot_of_entries', 'FixedText', nX+100, nY1+210, 60, nHeight, Label = self.dUI.get('tot_of_entries', "#err"), Align = 2) - self.xTotWord = self._addWidget('tot_of_entries_res', 'FixedText', nX+165, nY1+210, 30, nHeight, Label = "—") - + self.xNumWord = self._addWidget('num_of_entries_res', 'FixedText', nX+65, nY1+210, 25, nHeight, Label = "—") + self._addWidget('tot_of_entries', 'FixedText', nX+90, nY1+210, 60, nHeight, Label = self.dUI.get('tot_of_entries', "#err"), Align = 2) + self.xTotWord = self._addWidget('tot_of_entries_res', 'FixedText', nX+155, nY1+210, 30, nHeight, Label = "—") + self.xSearch = self._addWidget('search_button', 'Button', nX+190, nY1+210, 30, nHeight, Label = ">>>", Enabled = False) + # Tag # Note: the only way to group RadioButtons is to create them successively - self._addWidget("dformat_section", 'FixedLine', nX, nY2, 90, nHeight, Label = self.dUI.get("dformat_section", "#err"), FontDescriptor = xFDTitle) - self._addWidget("charstyle_section", 'FixedLine', nX+100, nY2, 90, nHeight, Label = self.dUI.get("charstyle_section", "#err"), FontDescriptor = xFDTitle) - self.xUnderline = self._addWidget('underline', 'RadioButton', nX, nY2+12, 40, nHeight, Label = self.dUI.get('underline', "#err")) - self.xNoUnderline = self._addWidget('nounderline', 'RadioButton', nX+50, nY2+12, 40, nHeight, Label = self.dUI.get('nounderline', "#err")) - self.xAccent = self._addWidget('accentuation', 'RadioButton', nX+100, nY2+12, 50, nHeight, Label = self.dUI.get('accentuation', "#err")) - self.xNoAccent = self._addWidget('noaccentuation', 'RadioButton', nX+155, nY2+12, 40, nHeight, Label = self.dUI.get('noaccentuation', "#err")) - - self.xTag = self._addWidget('tag_button', 'Button', self.xDialog.Width-40, nY2+10, 30, 11, Label = self.dUI.get('tag_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500) - + self._addWidget("charstyle_section", 'FixedLine', nX, nY2, 200, nHeight, Label = self.dUI.get("charstyle_section", "#err"), FontDescriptor = xFDTitle) + self.xAccent = self._addWidget('emphasis', 'RadioButton', nX, nY2+12, 55, nHeight, Label = self.dUI.get('emphasis', "#err")) + self.xStrongAccent = self._addWidget('strong_emphasis', 'RadioButton', nX+60, nY2+12, 70, nHeight, Label = self.dUI.get('strong_emphasis', "#err")) + self.xNoAccent = self._addWidget('nostyle', 'RadioButton', nX+140, nY2+12, 45, nHeight, Label = self.dUI.get('nostyle', "#err")) + + self.xTag = self._addWidget('tag_button', 'Button', self.xDialog.Width-40, nY2+10, 30, 11, Label = self.dUI.get('tag_button', "#err"), FontDescriptor = xFDTitle, TextColor = 0x005500, Enabled=False) + # Progress bar self.xProgressBar = self._addWidget('progress_bar', 'ProgressBar', nX, self.xDialog.Height-25, 160, 14) self.xProgressBar.ProgressValueMin = 0 self.xProgressBar.ProgressValueMax = 1 # to calculate later @@ -159,51 +158,61 @@ self.xContainer.getControl('count_button').setActionCommand('Count') self.xContainer.getControl('count2_button').addActionListener(self) self.xContainer.getControl('count2_button').setActionCommand('CountByLemma') self.xContainer.getControl('unknown_button').addActionListener(self) self.xContainer.getControl('unknown_button').setActionCommand('UnknownWords') + self.xContainer.getControl('search_button').addActionListener(self) + self.xContainer.getControl('search_button').setActionCommand('Search') self.xContainer.getControl('tag_button').addActionListener(self) self.xContainer.getControl('tag_button').setActionCommand('Tag') self.xContainer.getControl('close_button').addActionListener(self) self.xContainer.getControl('close_button').setActionCommand('Close') - self.xContainer.setVisible(False) + self.xContainer.setVisible(True) # True for non modal dialog xToolkit = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.ExtToolkit', self.ctx) self.xContainer.createPeer(xToolkit, None) - self.xContainer.execute() + #self.xContainer.execute() # Don’t excute for non modal dialog # XActionListener def actionPerformed (self, xActionEvent): try: if xActionEvent.ActionCommand == "Count": self.count(self.dUI.get("words", "#err")) self.xTag.Enabled = True + self.xSearch.Enabled = True elif xActionEvent.ActionCommand == "CountByLemma": self.count(self.dUI.get("lemmas", "#err"), bByLemma=True) self.xTag.Enabled = False + self.xSearch.Enabled = False elif xActionEvent.ActionCommand == "UnknownWords": self.count(self.dUI.get("unknown_words", "#err"), bOnlyUnknownWords=True) self.xTag.Enabled = True + self.xSearch.Enabled = True + elif xActionEvent.ActionCommand == "Search": + if not self.xGridControl.hasSelectedRows(): + return + lRow = self.xGridControl.getSelectedRows() + aWord = set([ self.xGridModel.GridDataModel.getCellData(0, n) for n in lRow ]) + self.gotoWord(aWord) elif xActionEvent.ActionCommand == "Tag": if not self.xGridControl.hasSelectedRows(): return lRow = self.xGridControl.getSelectedRows() aWord = set([ self.xGridModel.GridDataModel.getCellData(0, n) for n in lRow ]) sAction = "" - if self.xUnderline.State: - sAction = "underline" - elif self.xNoUnderline.State: - sAction = "nounderline" - elif self.xAccent.State: - sAction = "accentuation" + if self.xAccent.State: + sAction = "emphasis" + elif self.xStrongAccent.State: + sAction = "strong_emphasis" elif self.xNoAccent.State: - sAction = "noaccentuation" + sAction = "nostyle" self.tagText(aWord, sAction) elif xActionEvent.ActionCommand == "Close": - self.xContainer.endExecute() + self.xContainer.dispose() # Non modal dialog + #self.xContainer.endExecute() # Modal dialog except: traceback.print_exc() - + # XJobExecutor def trigger (self, args): try: xDialog = Enumerator(self.ctx) xDialog.run() @@ -282,19 +291,73 @@ for dToken in self.oTokenizer.genTokens(sParagraph): if dToken["sValue"] in aWord: xCursor.goRight(dToken["nStart"]-nPos, False) # start of token nPos = dToken["nEnd"] xCursor.goRight(nPos-dToken["nStart"], True) # end of token - if sAction == "underline": - xCursor.CharBackColor = hexToRBG("AA0000") - elif sAction == "nounderline": - xCursor.CharBackColor = hexToRBG("FFFFFF") - elif sAction == "accentuation": + # if sAction == "underline": + # xCursor.CharBackColor = hexToRBG("AA0000") + # elif sAction == "nounderline": + # xCursor.CharBackColor = hexToRBG("FFFFFF") + if sAction == "emphasis": xCursor.CharStyleName = "Emphasis" - elif sAction == "noaccentuation": + elif sAction == "strong_emphasis": + xCursor.CharStyleName = "Strong Emphasis" + elif sAction == "nostyle": #xCursor.CharStyleName = "Default Style" # doesn’t work xCursor.setPropertyToDefault("CharStyleName") self.xProgressBar.ProgressValue += 1 + @_waitPointer + def gotoWord (self, aWord): + try: + if not aWord: + return + if not self.oTokenizer: + self.oTokenizer = self.oSpellChecker.getTokenizer() + xViewCursor = self.xDocument.CurrentController.ViewCursor + if not xViewCursor.isCollapsed(): + xViewCursor.collapseToEnd() + xRange = xViewCursor.getStart() + xCursor = self.xDocument.Text.createTextCursor() + xCursor.gotoRange(xRange, False) + #xCursor.gotoEndOfWord(False) + xCursor.gotoEndOfParagraph(True) + sParagraph = xCursor.getString() + xCursor.gotoRange(xRange, False) + tPos = self._searchWordsInText(aWord, sParagraph) + if not tPos: + while xCursor.gotoNextParagraph(False): + xCursor.gotoEndOfParagraph(True) + sParagraph = xCursor.getString() + xCursor.gotoStartOfParagraph(False) + tPos = self._searchWordsInText(aWord, sParagraph) + if tPos: + break + if not tPos: + xCursor.gotoStart(False) + xCursor.gotoEndOfParagraph(True) + sParagraph = xCursor.getString() + xCursor.gotoStartOfParagraph(True) + tPos = self._searchWordsInText(aWord, sParagraph) + while xCursor.gotoNextParagraph(False): + xCursor.gotoEndOfParagraph(True) + sParagraph = xCursor.getString() + xCursor.gotoStartOfParagraph(False) + tPos = self._searchWordsInText(aWord, sParagraph) + if tPos: + break + if tPos: + xCursor.goRight(tPos[0], False) + xRange = xCursor.getStart() + xViewCursor.gotoRange(xRange, False) + xViewCursor.goRight(tPos[1], True) + except: + traceback.print_exc() + + def _searchWordsInText (self, aWord, sText): + for dToken in self.oTokenizer.genTokens(sText): + if dToken["sValue"] in aWord: + return (dToken["nStart"], dToken["nEnd"]-dToken["nStart"]) + return None #g_ImplementationHelper = unohelper.ImplementationHelper() #g_ImplementationHelper.addImplementation(Enumerator, 'net.grammalecte.enumerator', ('com.sun.star.task.Job',)) Index: gc_lang/fr/oxt/Lexicographer/enum_strings.py ================================================================== --- gc_lang/fr/oxt/Lexicographer/enum_strings.py +++ gc_lang/fr/oxt/Lexicographer/enum_strings.py @@ -4,11 +4,11 @@ return dStrings["fr"] dStrings = { "fr": { "title": "Grammalecte · Recenseur de mots", - + "list_section": "Énumération des occurrences", "count_button": "Compter tout", "count2_button": "Compter par lemme", "unknown_button": "Mots inconnus", "num_of_entries": "Nombre d’entrées :", @@ -20,12 +20,13 @@ "dformat_section": "Formatage direct", "charstyle_section": "Style de caractères", "underline": "Surligner", "nounderline": "Effacer", - "accentuation": "Accentuation", - "noaccentuation": "Aucun", + "emphasis": "Accentuation", + "strong_emphasis": "Accentuation forte", + "nostyle": "Aucun", "tag_button": "Taguer", "close_button": "Fermer", }, "en": { @@ -44,12 +45,13 @@ "dformat_section": "Direct format", "charstyle_section": "Character style", "underline": "Underline", "nounderline": "Erase", - "accentuation": "Accentuation", - "noaccentuation": "None", + "emphasis": "Emphasis", + "strong_emphasis": "Strong emphasis", + "nostyle": "None", "tag_button": "Tag", "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 @@ -1,19 +1,15 @@ -# -*- coding: utf8 -*- # Text Formatter # by Olivier R. # License: MPL 2 import unohelper import uno -import sys -import os + import traceback import time - -if sys.version_info.major == 3: - import imp +import json import tf_strings import tf_options import tf_tabrep import helpers @@ -266,11 +262,12 @@ FontDescriptor = xFD2, TextColor = 0x004400) self.binfo = self._addWidget('info', 'Button', self.xDialog.Width-15, 0, 10, 9, Label = self.dUI.get('info', "#err"), \ HelpText = self.dUI.get('infotitle', "#err"), FontDescriptor = xFDsmall, TextColor = 0x444444) # load configuration - self._loadConfig() + self.xGLOptionNode = helpers.getConfigSetting("/org.openoffice.Lightproof_${implname}/Other/", True) + self._loadConfig("${lang}") ## container self.xContainer = self.xSvMgr.createInstanceWithContext('com.sun.star.awt.UnoControlDialog', self.ctx) self.xContainer.setModel(self.xDialog) self.xContainer.setVisible(False) @@ -309,11 +306,11 @@ xElem = xDesktop.getCurrentComponent() # Writer if True: # no selection - self._saveConfig() + self._saveConfig("${lang}") self._replaceAll(xElem) else: # modify selected text only pass #xSelecList = xDoc.getCurrentSelection() @@ -360,46 +357,48 @@ else: print("Wrong command: " + xActionEvent.ActionCommand) except: traceback.print_exc() - def _loadConfig (self): + def _loadConfig (self, sLang): try: - if sys.version_info.major == 3: - imp.reload(tf_options) - else: - reload(tf_options) - self._setConfig(tf_options.dOpt) + dOpt = tf_options.dDefaultOpt.copy() + xChild = self.xGLOptionNode.getByName("o_"+sLang) + sTFOptionsJSON = xChild.getPropertyValue("tf_options") + if sTFOptionsJSON: + dOpt.update(json.loads(sTFOptionsJSON)) + self._setConfig(dOpt) except: traceback.print_exc() - - def _setConfig (self, d): - try: - for key, val in d.items(): - w = getattr(self, key) - w.State = val - if key in self.dCheckboxWidgets: - self._switchCheckBox(w) - except: - raise - - def _saveConfig (self): + self._setConfig(tf_options.dDefaultOpt) + + def _setConfig (self, dOpt): + for sKey, val in dOpt.items(): + try: + w = getattr(self, sKey) + if w: + w.State = val + if sKey in self.dCheckboxWidgets: + self._switchCheckBox(w) + except: + traceback.print_exc() + print("option", sKey, "not set.") + + def _saveConfig (self, sLang): + "save options in LibreOffice profile" try: # create options dictionary dOpt = {} - for key, lWidget in self.dCheckboxWidgets.items(): - w = getattr(self, key) + for sKey, lWidget in self.dCheckboxWidgets.items(): + w = getattr(self, sKey) dOpt[w.Name] = w.State for w in lWidget: dOpt[w.Name] = w.State - # 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() + # save option to LO profile as JSON string + xChild = self.xGLOptionNode.getByName("o_"+sLang) + xChild.setPropertyValue("tf_options", json.dumps(dOpt)) + self.xGLOptionNode.commitChanges() except: traceback.print_exc() def _switchCheckBox (self, wGroupCheckbox): for w in self.dCheckboxWidgets.get(wGroupCheckbox.Name, []): @@ -686,11 +685,10 @@ n += self._replaceText(xElem, sPattern, sRepl, bRegex, bCaseSensitive) except: print("# Error with "+sList) traceback.print_exc() return n - def _replaceText (self, xElem, sPattern, sRepl, bRegex, bCaseSensitive=False): try: xRD = xElem.createReplaceDescriptor() xRD.SearchString = sPattern Index: gc_lang/fr/oxt/TextFormatter/tf_options.py ================================================================== --- gc_lang/fr/oxt/TextFormatter/tf_options.py +++ gc_lang/fr/oxt/TextFormatter/tf_options.py @@ -1,18 +1,11 @@ +# text formatter options + dDefaultOpt = { - 'ssp': 1, 'ssp1': 1, 'ssp2': 1, 'ssp3': 1, 'ssp4': 1, 'ssp5': 1, 'ssp6': 1, 'ssp7': 1, - 'nbsp': 1, 'nbsp1': 1, 'nbsp2': 1, 'nbsp3': 1, 'nbsp4': 1, 'nbsp5': 1, 'nbsp6': 1, 'nnbsp1': 0, 'nnbsp2': 0, 'nnbsp4': 0, - 'space': 1, 'space1': 1, 'space2': 1, - 'delete': 0, 'delete1': 1, 'delete2': 1, 'delete2a': 0, 'delete2b': 1, 'delete2c': 0, - 'typo': 1, 'typo1': 1, 'typo2': 1, 'typo3': 1, 'typo4': 1, 'typo5': 1, 'typo6': 1, 'typo7': 1, 'typo8': 0, 'typo3a': 0, 'typo3b': 1, 'typo4a': 1, 'typo4b': 0, 'typo8a': 0, 'typo8b': 1, 'typo_ff': 1, 'typo_fi':1, 'typo_ffi':1, 'typo_fl':1, 'typo_ffl':1, 'typo_ft':1, 'typo_st': 1, - 'misc': 1, 'misc1': 1, 'misc2': 1, 'misc3': 1, 'misc5': 1, 'misc1a': 0, 'misc5b': 0, 'misc5c': 0, - 'struct': 0, 'struct1': 1, 'struct2': 1, 'struct3': 0, -} -dOpt = { - 'ssp': 1, 'ssp1': 1, 'ssp2': 1, 'ssp3': 1, 'ssp4': 1, 'ssp5': 1, 'ssp6': 1, 'ssp7': 1, + 'ssp': 1, 'ssp1': 1, 'ssp2': 1, 'ssp3': 1, 'ssp4': 1, 'ssp5': 1, 'ssp6': 1, 'ssp7': 1, 'nbsp': 1, 'nbsp1': 1, 'nbsp2': 1, 'nbsp3': 1, 'nbsp4': 1, 'nbsp5': 1, 'nbsp6': 1, 'nnbsp1': 0, 'nnbsp2': 0, 'nnbsp4': 0, 'space': 1, 'space1': 1, 'space2': 1, 'delete': 0, 'delete1': 1, 'delete2': 1, 'delete2a': 0, 'delete2b': 1, 'delete2c': 0, 'typo': 1, 'typo1': 1, 'typo2': 1, 'typo3': 1, 'typo4': 1, 'typo5': 1, 'typo6': 1, 'typo7': 1, 'typo8': 0, 'typo3a': 0, 'typo3b': 1, 'typo4a': 1, 'typo4b': 0, 'typo8a': 0, 'typo8b': 1, 'typo_ff': 1, 'typo_fi':1, 'typo_ffi':1, 'typo_fl':1, 'typo_ffl':1, 'typo_ft':1, 'typo_st': 1, 'misc': 1, 'misc1': 1, 'misc2': 1, 'misc3': 1, 'misc5': 1, 'misc1a': 0, 'misc5b': 0, 'misc5c': 0, 'struct': 0, 'struct1': 1, 'struct2': 1, 'struct3': 0, } Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -1951,11 +1951,11 @@ [des|chaque|quelque|quelques|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs|aucun|aucune] *WORD <<- =>> exclude(\2, ":V") [un|une] *WORD - <<- not value(<1, "|l’|quelqu’|quelqu|") and not value(\2, "|a|fut|fût|est|") and not morph(\2, ":P") =>> exclude(\2, ":V") + <<- not value(<1, "|l’|quelqu’|quelqu|") and not value(\2, "|a|fut|fût|est|fait|") and not morph(\2, ":P") =>> exclude(\2, ":V") [une|le|la|les|des|chaque|quelque|quelques|cet|cette|ces|ma|ta|sa|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs] personne <<- =>> select(\-1, ":N") de [la|l’] $:¬:Y @@ -2005,10 +2005,11 @@ TEST: c’est à n’y plus rien comprendre. TEST: Elle était tout feu, tout flamme. TEST: Ses rencards finissent par devenir lassants TEST: trois espèces de chauve-souris dont une est éteinte TEST: Ils sont source de conflits +TEST: Votre question fait référence à un fait divers déroutant !!! !!! @@ -4460,10 +4461,47 @@ <<- ~>> =\1.replace("’", "-") TEST: je suis allé dans la {{grand’rue}}. ->> grand-rue +!!!! Trait d’union : formes interrogative (nous/vous) !! +__inte_union_nous1!7__ + [ne|n’] ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿ ~ons$ nous + [ne|n’] [me|m’|te|t’|se|s’|nous|vous] [le|la|l’|les|en|y] ~ons$ nous + [ne|n’] [le|la|l’|les] [lui|leur|en|y] ~ons$ nous + [ne|n’] [lui|leur|y] en ~ons$ nous + <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:1p", ":[GW]") --2:-1>> \-2-\-1 # Forme interrogative ? Mettez un trait d’union. + + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ons$ nous [|,] + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ons$ nous @:¬:(?:1p|Y) + <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and not value(\2, "|veuillons|sachons|") + -2:3>> \2-\3 # Forme interrogative ? Mettez un trait d’union. + +TEST: n’y {{retrouverons nous}} jamais la tranquilité ? +TEST: pourquoi n’en {{entendons nous}} jamais parler ? +TEST: que {{pouvons nous}} dans cette vie +TEST: Sachons nous conformer à ces restrictions et faisons notre travail. + + +__inte_union_vous1!7__ + [ne|n’] ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿ ~ez$ vous + [ne|n’] [me|m’|te|t’|se|s’|nous|vous] [le|la|l’|les|en|y] ~ez$ vous + [ne|n’] [le|la|l’|les] [lui|leur|en|y] ~ez$ vous + [ne|n’] [lui|leur|y] en ~ez$ vous + <<- /inte/ space_after(\-2, 1, 1) and morph(\-2, ":V.*:2p", ":[GW]") --2:-1>> \-2-\-1 # Forme interrogative ? Mettez un trait d’union. + + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ez$ vous [|,] + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ez$ vous @:¬:(?:2p|Y) + <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and not value(\2, "|veuillez|sachez|") + -2:3>> \2-\3 # Forme interrogative ? Mettez un trait d’union. + +TEST: ne {{soutiendrez vous}} pas cette proposition ? +TEST: n’en {{voulez vous}} jamais à ces gens ? +TEST: comment {{pensez vous}} y parvenir +TEST: veuillez vous adresser à notre secretaire pour prendre rendez-vous. + + !!!! Virgules !! __virg_dialogue_après_nom_propre__ [|,] $:M¬:G [/-je|/-tu|/-on|/-nous|/-vous|/-ils|/-elles|/VCimp] @@ -4755,10 +4793,19 @@ <<- /bs/ ->> _ # Tournure familière. Par exemple, écrivez “pour qu’il ne vienne pas” plutôt que “pour ne pas qu’il vienne.”|http://www.academie-francaise.fr/pour-pas-que-au-lieu-de-pour-que-ne-pas TEST: Nous y sommes allés {{pour ne pas qu’}}elle se sente seule. + +# silence assourdissant +__bs_silence_assourdissant__ + silence assourdissant + silences assourdissants + <<- /bs/ ->> _ # Cliché. Locution oxymorique employée à tort et à travers. + +TEST: dans un {{silence assourdissant}} + # très / trop __bs_très_trop_superflu__ [très|trop] [beaucoup|assez|mieux|pire|meilleur|délicieux|plus|moins] <<- /bs/ ->> \2 # Avec “\2”, “\1” est superflu. @@ -5095,11 +5142,10 @@ <<- /pleo/ ->> \1 # Pléonasme. TEST: {{Ajourner à une date ultérieure}} ->> Ajourner TEST: {{différer à une date ultérieure}} ->> différer TEST: {{reporter à plus tard}} ->> reporter - !! !! @@ -5837,11 +5883,11 @@ [|,] [ton|son|audit] @:(?:Y|[123][sp])¬:[NAQ] <<- /conf/ \3.islower() -3>> =suggSimil(\3, ":[NA]:[me]:[si]", True) # Incohérence avec “\2” : “\3” est un verbe. - [un|une] @:(?:Y|[123][sp])¬:[GNA] ?@:W¿ @:A¬:[GM] + [un|une] @:(?:Y|[123][sp])¬:[GNA] ?$:W¿ @:A¬:[GM] <<- /conf/ not value(<1, "|dont|l’|d’|sauf|excepté|") and not before("(?i)\\bun à +$") -2>> =suggSimil(\2, ":[NAQ]:[me]:[si]", True) # Incohérence avec “\1” : “\2” est une forme verbale conjuguée. TEST: un {{maintient}} difficile. TEST: quelqu’un arrive. @@ -6305,11 +6351,11 @@ TEST: Celui qui y croit {{à les}} moyens d’y parvenir. à *WORD - <<- /conf/ \2.islower() and not value(\2, "|coté|") >>> + <<- /conf/ \2.islower() and not value(\2, "|coté|sont|") >>> <<- /conf/ morph(\2, ":(?:V.......[_z][az].*:Q|V1.*:Ip:2p)", ":[MGWNY]") -1>> a # Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez “a”. <<- /conf/ __also__ and morph(\2, "V1.*:(?:Ip:2p|Q)", "*") and not value(<1, "|il|elle|on|n’|les|l’|m’|t’|s’|d’|en|y|lui|nous|vous|leur|") -2>> =suggVerbInfi(\2) # Le verbe devrait être à l’infinitif. <<- /conf/ __else__ and morph(\2, ":[123][sp]", "*") and not value(\2, "|tord|tords|") >>> <<- /conf/ morph(\2, ":V2.*:I[ps]:3s", "*") -2>> =suggVerbPpas(\2, ":m:s") # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué. @@ -6342,10 +6388,18 @@ TEST: scrupuleux {{a}} n’en toucher qu’une part infime. TEST: Ne pas hésiter {{a}} {{demander}} des conseils. TEST: Sébastien {{a}} {{demander}} des conseils. TEST: {{A}} vous lire, on ne sait plus que penser de toutes ces histoires + +__conf_à_qui_infinitif__ + *WORD a qui @:(?:Y|Os) + <<- /conf/ morph(\1, ":N", ":Ov") -2>> à # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0 + +TEST: il n’y avait personne {{a}} qui parler de nos problèmes ->> à +TEST: des gens {{a}} qui offrir ça ->> à + __conf_à_a__ [|,] a moins [que|qu’] <<- /conf/ -2>> à # Confusion probable : « à moins que » pour dire « sauf si ». @@ -6542,11 +6596,12 @@ TEST: une dérive à vau-l’eau. __conf_à_a_locutions__ a ?seulement¿ [*NUM|$:B|quelques|plusieurs] [millimètres|centimètres|décamètres|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] de distance - a [califourchon|contrecœur|contre-cœur|contrejour|contre-jour|contretemps|contre-temps|demi-mot|gogo|distance|nouveau|peine|présent|rebrousse-poil|regret|travers|tout-va|confesse|midi|minuit|rallonge|reculons|risque|sec|tâtons|vélo|vif] + a [califourchon|contrecœur|contre-cœur|contrejour|contre-jour|contretemps|contre-temps|demi-mot|gogo|distance|nouveau|présent|rebrousse-poil|regret|travers|tout-va|confesse|midi|minuit|rallonge|reculons|risque|sec|tâtons|vélo|vif] + a [mi-chemin|mi-mandat|mi-mot+s|mi-parcours|mi-temps|mi-voix] a air comprimé a armes égales a aucun prix a autrui a autre chose @@ -6765,26 +6820,29 @@ TEST: il va falloir songer à les leur donner TEST: le coût est estimé à au moins 1000 milliards de dollars TEST: elle à qui nous avons donné notre cœur et pour laquelle nous avons tout tenté pour la faire aimer de nos concitoyens. TEST: jusqu’à parfois se mettre en danger TEST: les méthodes de l’à-peu-près ne suffisent pas. +TEST: Celui qui a peine à paraître ne doit pas être mis subitement en lumière ## substantifs __conf_substantif_à_substantif!3__ *WORD a @:N¬* - <<- /conf/ \2.islower() and not value(\3, "|beau|besoin|confiance|connaissance|conscience|crainte|envie|été|faim|hâte|honte|lieu|peur|raison|rapport|recours|soif|tendance|tort|vent|") and morph(\1, ":N", "*") + <<- /conf/ \2.islower() and not value(\3, "|beau|besoin|charge|confiance|connaissance|conscience|crainte|envie|été|faim|hâte|honte|lieu|peine|peur|raison|rapport|recours|soif|tendance|tort|vent|") + and morph(\1, ":N", "*") -2>> à # Confusion probable : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0 TEST: les bobos {{a}} trottinette TEST: la lettre A est la première lettre de l’alphabet TEST: la lettre a est la première lettre de l’alphabet TEST: cette femme a raison TEST: l’homme a beau se démener, rien n’y fait. TEST: elle a tendance à n’en faire qu’à sa tête. TEST: Ce travail a lieu dans le désert. +TEST: cette injonction a force de loi __conf_a_à_substantifs__ >arc a >poulie >arme a >feu @@ -6916,15 +6974,15 @@ TEST: Je peux mener {{a}} bien cette opération. TEST: Cette coalition que tu penses mener a bien l’intention de te trahir. __conf_à_a_après_verbes__ - @:V¬:[YGNAWM] ?@:W¿ a + @:V¬:[YGNAWM] ?$:W¿ a <<- /conf/ \-1 != "A" and not tag_before(\1, "que") and not tag_before(\1, "dont") and not tag_before(\1, "qui") and not morph(>1, ":Q") --1>> à # Confusion probable : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0 - [/VCint|/VCimp] ?@:W¿ a + [/VCint|/VCimp] ?$:W¿ a <<- /conf/ not value(\1, "|rendez-vous|") --1>> à # Confusion : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0 TEST: Vient-on {{a}} la maison demain ? TEST: Arrivait-elle {{a}} le manger ? TEST: Dis-moi {{a}} quelle heure on mange. @@ -6935,10 +6993,19 @@ TEST: Ce que je mange a un goût de surgelé. TEST: celui qui conduisait a décidé de faire un tour du quartier avec la voiture. TEST: Un rendez-vous a bousculé ses plans TEST: Maria Butina a également rencontré des républicains tels que Donald Trump + +__conf_à_en_juger_par__ + !! à en juger par ¡¡ + [à|a] [en|>an] [juger|jugé+ses|jugeait|jugeais] [par|pare+s|>part] + <<- /conf/ ->> à en juger par # Confusion : “à en juger par” c’est-à-dire “selon le jugement qu’on se faire avec”. + +TEST: {{a en jugé part}} cet article, c’est bientôt la fin. +TEST: ils sont à en juger par leurs résultats les prochains champions. + __conf_celui_celle_à_qui__ [celui|celle|ceux|celles] a qui <<- /conf/ -2>> à # Confusion. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0 @@ -7303,17 +7370,22 @@ <<- /conf/ -1:2>> ces|ses # Confusion. Exemples : c’est facile ; ces chats (désignation) ; ses chats (possession)… ses /-là <<- /conf/ -1>> ces # Confusion : “ses” est un déterminant possessif ; si vous voulez désigner des éléments en particulier, vous devriez utiliser le déterminant démonstratif “ces”. + c’ est n’ [est|était] + c’ est ne [serait|sera] + <<- /conf/ not value(<1, "|que|qu’|") -1:2>> ce # Confusion probable. + TEST: {{ses}} au-dessus de ses forces. TEST: {{ces}} comme la peste TEST: car {{ses}} d’autre part TEST: {{ces}} qu’il y a tant de pertes TEST: {{ces}} jamais une bonne idée. TEST: {{c’est}} {{délires}} nous ennuient TEST: {{ses}} gens-là sont des salopards +TEST: {{c’est}} n’est pas ça. ->> ce TEST: En 2015, c’est Paris et son agglomération qui… TEST: Ses pas de danse. TEST: Avec ces quelques mots, que veux-tu dire ? TEST: Avec ces quelque 70 millions d’euros de cash disponible TEST: négocier séparément avec ces divers sous-groupes @@ -7871,10 +7943,26 @@ en générale <<- /conf/ ->> en général # Dans cette locution, “général” est toujours au masculin singulier.|https://fr.wiktionary.org/wiki/en_g%C3%A9n%C3%A9ral TEST: On n’en sait {{en générale}} pas assez. + +# emballé, c’est pesé +__conf_emballé_c_est_pesé__ + >emballer [c|sais|sait] >peser + <<- /conf/ ->> emballé, c’est pesé # Confusion. Locution “emballé, c’est pesé”.|https://fr.wiktionary.org/wiki/emball%C3%A9,_c%E2%80%99est_pes%C3%A9 + + >emballer ?,¿ c’ est >peser + <<- /conf/ not (value(\1, "|emballé|") and value(\-1, "|pesé|")) and morph(<1, ":C||>,") + ->> emballé, c’est pesé # Confusion. Locution “emballé, c’est pesé”.|https://fr.wiktionary.org/wiki/emball%C3%A9,_c%E2%80%99est_pes%C3%A9 + +TEST: {{emballait c pesé}} +TEST: {{emballer c’est peser}} +TEST: Tu peux emballer, c’est pesé. +TEST: il faut emballer, c’est pesé +TEST: c’est emballé, c’est pesé. + # évidement / évidemment __conf_évidemment_évidement__ [/VCint|/VCimp] ?[pas|plus|jamais|guère]¿ évidement [pas|plus] évidement @@ -8164,10 +8252,11 @@ <<- /conf/ -1>> or, # Confusion probable. Écrivez “or” pour dire “néanmoins”. La préposition “hors” sert à dire “en dehors de” ou “excepté”.|https://fr.wiktionary.org/wiki/hors >or du commun >or de ?[ma|ta|sa|notre|votre|leur]¿ [compréhension|perception|portée|vue] + >or de question [que|qu’] <<- not morph(<1, ":D.*:[me]") -1>> hors # Confusion probable. Si vous voulez dire “en dehors de”, écrivez “hors”.|https://fr.wiktionary.org/wiki/hors TEST: {{hors}}, nous y coryons malgré tout ce qu’on peut en dire. TEST: {{Hors}} il y a tant à faire depuis que nous sommes arrivés en ces lieux. @@ -8541,11 +8630,11 @@ __conf_on_ont__ [|,|$:Cs] ?l’¿ (ont) [ne|n’|me|m’|te|se|s’] [|,|$:Cs] ?l’¿ (ont) [lui|nous|vous] @:[123][sp]¬:G [|,|$:Cs] ?l’¿ (ont) [leur|le|la|l’] @:[123][sp]¬:(?:G|[NA].*:[si]) - [|,|$:Cs] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|peine|affaire|hâte|force|recours|somme)/ + [|,|$:Cs] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|charge|peine|affaire|hâte|force|recours|somme)/ <<- /conf/ -1>> on # Confusion probable : “ont” est une conjugaison du verbe avoir. [|,|$:Cs] ?l’¿ ont t’ <<- /conf/ not value(>1, "|il|ils|elle|elles|") --2>> on # Confusion probable : “ont” est une conjugaison du verbe avoir. @@ -8713,10 +8802,29 @@ TEST: Il ne le deviendra {{par}}. ->> pas TEST: ne viens {{par}}, c’est dangereux. TEST: il ne tient par contre que grâce à nous TEST: elle ne savait par qui passer pour arriver à ses fins. + +# par le bout du nez +__conf_par_le_bout_du_nez__ + !! par le bout du nez ¡¡ + [par|>part|pare+s] [le|l’] [bout|bous] du [né|nez] + <<- /conf/ ->> par le bout du nez # Confusion. Locution “par le bout du nez”. + +TEST: se faire mener {{par le bout du né}}. + + +# par les temps qui courent +__conf_par_les_temps_qui_courent__ + !! par les temps qui courent ¡¡ + [par|>part|pare+s] les [>tan|tant|temps] qui [courent|court+s|>cour|coure+s|courre] + <<- /conf/ ->> par les temps qui courent # Confusion: Locution “par les temps qui courent”. + +TEST: {{part les tan qui court}} +TEST: par les temps qui courent, impossible de passer inaperçu. + # pause /pose __conf_pause_pose__ >pose [gourmande|café|carrière|crédit|déjeuner|détente|dîner|pipi|repas|thé] >pose du [matin|soir] @@ -9184,11 +9292,11 @@ # Confusion. Utilisez “quelquefois” si vous voulez dire “parfois”. Utilisez “quelques fois” pour évoquer ce qui est advenu ou adviendra plusieurs fois.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4334 les quelquefois [ou|où|que|qu’] <<- /conf/ -2>> quelques fois # Confusion : “quelquefois” signifie “parfois”.|https://fr.wiktionary.org/wiki/quelquefois - >être quelques fois ?@:W¿ @:A [de|d’] + >être quelques fois ?$:W¿ @:A [de|d’] <<- /conf/ -2:3>> quelquefois # Confusion possible. Si vous voulez dire “parfois”, écrivez “quelquefois”. TEST: {{Quelles que fois}}, on y comprend plus rien. TEST: {{Qu’elle que fois}}, on y comprend plus rien. TEST: Il y va {{quelque fois}} par an. @@ -9282,11 +9390,11 @@ TEST: Quelle peut bien être l’influence de cet artiste de nos jours ? # quoi que / quoique __conf_quoique_quoi_que__ - quoiqu’ il se soit ?@:W¿ passé + quoiqu’ il se soit ?$:W¿ passé [quoique|quoiqu’] [je|j’|tu|il|elle|on|nous|vous|ils|elles] en >penser [quoique|quoiqu’] [je|j’|tu|il|elle|on|nous|vous|ils|elles] >avoir pu faire <<- /conf/ -1>> quoi que|quoi qu’ # Confusion probable.|https://fr.wiktionary.org/wiki/quoi_que TEST: mais {{quoique}} tu en penses, c’est comme ça que ça fonctionne. @@ -9540,11 +9648,12 @@ TEST: {{sont}} {{pain}} TEST: en {{sont}} {{absence}} TEST: qui {{son}} ces gens ? TEST: chez {{sont}} amis TEST: il a perdu {{sont}} {{ami}} -TEST: ces gens {{son}} ceux qui nous mettent constamment dans la merde +TEST: ces gens {{son}} ceux qui nous mettent constamment dans la merde ->> sont +TEST: à {{sont}} précis de mathématiques ->> son TEST: elles s’en sont mal portées TEST: ils en sont reconnaissants TEST: sont loin, ces gens… TEST: Il ne sait pas vraiment ce que sont la peur et la souffrance. TEST: avec le mur du son ceux qui l’entendent. @@ -9630,10 +9739,13 @@ <<- /conf/ -2>> temps # Confusion. Écrivez « en temps de » si vous évoquez une période de temps. de [tant|>tan] en [tant|>tan] <<- /conf/ ->> de temps en temps # Confusion. Écrivez « de temps en temps ». + depuis la [nui|nuit] des [>tan|tant] + <<- /conf/ --1>> temps # Confusion. Locution “depuis la nuit des temps”.| + [après|avec] [temps|>tan] [de|d’] <<- /conf/ -2>> tant # Confusion. Écrivez “tant” pour évoquer une quantité de quelque chose.|http://fr.wiktionary.org/wiki/tant [à|a] [>tan|tant] [partiel|partiels|plein|pleins] <<- /conf/ -2>> temps # Confusion. Pour ce qui est temporel, écrivez “temps”. @@ -9651,10 +9763,11 @@ TEST: ils vont {{de tan en tan}} au restaurant TEST: après {{temps}} de souffrance, il faut savoir lâcher prise. TEST: il travaille à {{tant}} partiel TEST: {{en même tant}}, on s’en moque, de toutes ces histoires ennuyeuses. TEST: en {{tan}} que telle, cette méthode n’est pas parfaite, mais avec de l’intuition +TEST: depuis la nuit des {{tans}} TEST: ce sera fait en {{tant}} et en heure TEST: ce qui a commencé en 2011 en tant d’endroits du pourtour méditerranéen TEST: elle est allée en tant de lieux qu’il est difficile de suivre son trajet. @@ -9667,10 +9780,17 @@ <<- /conf/ -3>> teint # Confusion.|https://fr.wiktionary.org/wiki/fond_de_teint TEST: Elle l’a observé par un miroir sans {{teint}}. TEST: Elle a acheté un nouveau fond de {{tain}}. + +__conf_taule_tôle1__ + [>taule] [de|d’|en] [>acier|>alu|>aluminium|>bardage|>cuivre|>étanchéité|>fer|>festonnage|inox|>laiton|>métal|>trapèze|>zinc|>éverite|>fibrociment|>fibro-ciment|>plastique|>polycarbonate|PVC] + <<- /conf/ -1>> =\1.replace("au", "ô").replace("AU", "Ô") # Confusion. La taule est la forme argotique pour évoquer la prison, le bordel ou toute forme d’habitation. + +TEST: une {{taule}} en acier + # tête / tète __conf_tête_tète!6__ [tète|tètes] [baissée|baissées|baissé|baissés] [tète|tètes] [haute|hautes|basse|basses] @@ -10783,10 +10903,11 @@ , [oui|non] , , entre autres ?choses¿ , à *NUM % à ?seulement¿ [*NUM|$:B|quelques|plusieurs] [millimètres|centimètres|décamètres|mètres|kilomètres|verstes|lieues|UA|parsecs|années-lumière] de distance à [autrui|bâbord|califourchon|chacun|confesse|contrecœur|contre-cœur|contretemps|>demi-mot|foison|grand-peine|jamais|gogo|loisir|merveille|moitié|nouveau|outrance|peine|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|sec|tâtons|tire-d’aile|tire-larigot|tort|tribord|tout-va|vif] + à [mi-chemin|mi-mandat|mi-mot+s|mi-parcours|mi-temps|mi-voix] à air comprimé à angle droit à armes égales à aucun prix à autre chose @@ -10887,10 +11008,11 @@ à l’ unanimité à l’ unisson à l’ une d’ entre elles à l’ échelle [nationale|mondiale|régionale|départementale|cantonale|locale|galactique|universelle] à l’ étouffée + à l’ exclusion de toute autre chose à l’ évidence à l’ œil nu à l’ [un|une] des leurs à la [bourre|con|coule|dérobée|diable|fois|leur|manque|mords-moi-le-nœud|papa|ramasse|renverse|redresse|rescousse|sauvette|volée] à la bonne franquette @@ -10933,11 +11055,12 @@ à [mon|ton|son|notre|votre|leur] [cœur|corps] défendant à [mon|ton|son|notre|votre|leur] grand [désarroi|soulagement] à n’ en [pas|point] douter à n’ en plus finir à n’ importe quel prix - à parler franc + à n’ importe quelle heure du jour et de la nuit + à parler [franc|franchement|strictement] à part [entière|ça|cela|ceci] à parts égales à partir [de|d’] {pronom_obj} à partir [de|d’] [aujourd’hui|ici|là|maintenant|rien] à partir [de|d’] [demain|hier] ?[matin|midi|soir]¿ @@ -10976,10 +11099,11 @@ à ras [le|du] sol à rude épreuve à s’ y méprendre à somme nulle à spectre ?[très|si]¿ large + à strictement parler à tarif réduit à tarifs réduits à tel point à temps [plein|partiel|complet] à tête reposée @@ -11113,11 +11237,11 @@ avant d’ aller plus loin avant J.-C. avant Jésus-Christ avant d’ en arriver là avant de faire quoi que ce soit - avant de faire quoi que ce soit [de|d’] ?@:W¿ [absurde|stupide|crétin|con|idiot|inconsidéré] + avant de faire quoi que ce soit [de|d’] ?$:W¿ [absurde|stupide|crétin|con|idiot|inconsidéré] avant qu’ il ne soit trop tard avant un bon bout de temps avec [brio|constance|joie|légèreté|insistance|peine] avec autre chose avec le plus grand soin @@ -11142,25 +11266,27 @@ çà et là ce faisant cependant [cela|ça|ceci] mis à part [cela|ça|ceci] va sans dire + [cela|ceci] étant dit certes ces derniers temps cette [fois|fois-là|fois-ci] chaque fois ci-dessous ci-dessus + chose promise ?,¿ chose due comme avant comme autrefois comme d’ habitude comme toujours comme de juste comme bon [me|te|lui|leur|nous|vous] semble comme au bon vieux temps comme cul et chemise - comme [frappé|frappée|frappés|frappées] par la foudre + comme [frappé+ses] par la foudre comme n’ importe où ?ailleurs¿ comme par [enchantement|magie] comme par un fait exprès comme pas deux comme peau de chagrin @@ -11187,10 +11313,11 @@ dans leur grande majorité dans les années ~^\d{2,5}$ dans les [secondes|minutes|heures|jours|semaines|mois|trimestres|semestres|années|décennies|siècles|millénaires] à venir dans peu de temps dans tout [cela|ça|ceci] + dans [ma|ta|sa|notre|votre|leur] prime jeunesse dans très peu de temps dans un cas comme dans l’autre dans une [certaine|large|moindre] mesure début {mois} ~^\d{2,5}$ au début {mois} ~^\d{2,5}$ @@ -11382,10 +11509,11 @@ depuis *NUM [ans|années|mois|semaines|jours|heures|minutes|secondes] depuis belle lurette depuis bien longtemps depuis [de|d’] ?[assez|très]¿ longues années depuis des lustres + depuis la nuit des temps depuis la [première|dernière|~ième$] fois depuis les années ~^\d{2,5}$ depuis ?[assez|très]¿ longtemps depuis lors depuis ?[assez|très]¿ peu de temps @@ -11402,10 +11530,11 @@ dès à présent dès que possible dès [demain|hier] ?[soir|matin|après-midi]¿ Dieu [m’|t’|l’|nous|vous|les] en [garde|préserve] Dieu [m’|t’|lui|nous|vous|leur] en soit témoin + Dieu seul le sait du ~^[xXvViI]+[eᵉ]$ siècle du [Ier|Iᵉʳ|1er|1ᵉʳ] siècle du bout des lèvres du début à la fin du fond du cœur @@ -11492,10 +11621,11 @@ en point [de|d’] [mire|orgue] en porte-à-faux en position [de|d’] [force|faiblesse] en premier lieu en première [instance|ligne] + en [première|seconde|~ième$] position en pure perte en quantité suffisante en quantité plus que suffisante en quelque sorte en queue [de|d’] peloton @@ -11525,18 +11655,19 @@ en tout et pour tout en tout état [de|d’] cause en tout premier lieu en toute bonne foi en toute connaissance [de|d’] cause - en toute [circonstance|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité] + en toute [circonstance|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|modestie|sécurité|simplicité] en toutes circonstances en travers de la gorge en un claquement de doigts en un clin d’ œil en un rien [de|d’] temps en une autre occasion en vase clos + en vigueur en vitesse ?[subsonique|supersonique|subluminique|superluminique]¿ en voie [de|d’] développement en y réfléchissant bien en [janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre] dernier en [mon|ton|son|leur|notre|votre] âme et conscience @@ -11574,10 +11705,11 @@ ?d’¿ ici ?d’¿ ici [comme|ou] ailleurs ?d’¿ ici et [là|maintenant] ?d’¿ ici même ?d’¿ ici-bas + ?d’¿ il y a belle lurette ?d’¿ il y a ?très¿ longtemps ?d’¿ il y a ?très¿ peu [de|d’] temps ?d’¿ il y a quelques [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires] ?d’¿ il y a moins [de|d’] [*NUM|$:B] [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires] ?d’¿ il y a [*NUM|$:B] [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires] @@ -11679,10 +11811,11 @@ par [beau|mauvais] temps par bien des [aspects|côtés] par bonté [de|d’] [âme|cœur] par ce biais par certains [aspects|côtés] + par grand froid par gros temps par la même occasion par la suite par le passé par les temps qui courent @@ -11794,10 +11927,11 @@ sans coup férir sans crier gare sans difficulté ?[apparente|aucune|financière|majeure|particulière]¿ sans dire mot sans en avoir conscience + sans états d’ âme sans [m’|t’|s’|nous|vous] en apercevoir sans [m’|t’|s’|nous|vous] en rendre compte sans [m’|t’|s’|nous|vous] faire [avoir|comprendre|désirer|prier|remarquer] sans faire [de|d’] vagues sans foi ?,¿ ni loi @@ -11808,30 +11942,32 @@ sans mot dire sans nul doute sans pour autant y [parvenir|réussir|réfléchir|songer|penser] sans pour autant y faire attention sans pour autant y prendre [garde|goût|gout] + sans [me|te|lui|nous|vous|leur|y] prêter attention sans [que|qu’] je le [sache|susse] sans [que|qu’] tu le [saches|susses] sans [que|qu’] [il|elle|on|$:M] le [sache|sût] sans [que|qu’] nous le [sachions|sussions] sans [que|qu’] vous le [sachiez|sussiez] sans [que|qu’] [ils|elles] le [sachent|sussent] sans queue ni tête sans raison apparente sans répit + sans tarder sans vouloir [me|m’|te|t’|lui|nous|vous|leur] manquer de respect sans y [parvenir|réussir|réfléchir|songer|penser] sans y [réfléchir|songer|penser] à [deux|2] fois sans y faire attention sans y prendre [garde|goût|gout|ombrage] - sans états d’ âme sauf >erreur [de|d’] [ma|ta|sa|notre|votre|leur] part secondo selon toute vraisemblance sens dessus dessous >seule à >seule + s’ il le [faut|fallait|faudra|faudrait] si [bas|haut|longtemps|nécessaire|possible|soudain] si [cela|ça|ceci] ne tenait qu’ à [moi|toi|lui|eux|elle|elles|nous|vous] si besoin est si le besoin s’en [fait|faisait] sentir si le besoin [doit|devait] s’en faire sentir @@ -11913,12 +12049,12 @@ une fois pour toutes urbi et orbi vaille que vaille ventre à terre vers nulle part - vite vite fait ?,¿ bien fait + [voici|voilà] belle lurette volontiers <<- ~>> * __purge_x_par_après_x__ @@ -11988,11 +12124,10 @@ à [quelques|plusieurs] [mètres|kilomètres|lieues|pas|minutes|heures] [de|du|d’|des] à [quelques|plusieurs] [dizaines|centaines|milliers] de [mètres|kilomètres] [de|du|d’|des] à [base|force|raison] [de|d’] à grand renfort [de|d’] à grands coups [de|d’] - à seule fin [de|d’] au [bout|courant|cours|détriment|fond|gré|lieu|long|large|milieu|nord|profit|ras|sein|sommet|sortir|sud|sujet|vu] [de|du|d’|des] au beau milieu [de|du|d’|des] au fin fond [de|du|d’|des] au grand dam [de|du|d’|des] au plus profond [de|du|d’|des] @@ -12084,15 +12219,15 @@ <<- not morph(<1, ">ne") ~>> * la une [de|des|du] <<- ~2>> _ - l’ impression que + l’ impression [que|qu’] <<- ~1>> _ - l’ étrange impression que - la [nette|bizarre] impression que + l’ étrange impression [que|qu’] + la [nette|bizarre] impression [que|qu’] <<- ~2:3>> _ le pour et le contre <<- ~>> ␣ <<- =>> define(\1, [":LN:m:p"]) @@ -12112,11 +12247,11 @@ pour ou contre <<- ~2:0>> * qui ce [jour-là|matin-là|après-midi-là|soir-là|mois-là|siècle-là|millénaire-là] qui cette [nanoseconde-là|milliseconde-là|seconde-là|minute-là|heure-là|nuit-là|matinée-là|soirée-là|journée-là|semaine-là|année-là|décennie-là] - qui à part [moi|toi|lui|elle|nous|vous|eux|elles + qui à part [moi|toi|lui|elle|nous|vous|eux|elles] qui d’ autre à part [moi|toi|lui|elle|nous|vous|eux|elles] <<- ~2:0>> * plus avant ~¬^(?:de|d’|que|qu’)$ <<- ~1:2>> * @@ -12134,13 +12269,17 @@ <<- ~>> _ vent debout contre <<- ~1:2>> * - je [t’|vous] en [prie|supplie] - nous [t’|vous] en [prions|supplions] + je [t’|vous] en [prie|supplie] + nous [t’|vous] en [prions|supplions] <<- ~>> * + + , je [t’|vous] en [prie|supplie] , + , nous [t’|vous] en [prions|supplions] , + <<- not morph(>1, ":E") ~>> * # Déterminant + nombre __p_dét_plur_nombre_nom__ [les|des|mes|tes|ses|nos|vos|leurs] ~^\d+$ @:[NA].*:[pi]¬:(?:V0|3p|Oo|X)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor) @@ -12211,14 +12350,14 @@ <<- ~1:2>> * au hasard @:¬:[AQ].*:[me]:[si] <<- ~1:2>> * - aussi @:W que [nécessaire|possible] + aussi $:W que [nécessaire|possible] <<- ~>> * - aussi @:W que ce soit [|,] + aussi $:W que ce soit [|,] <<- ~1:5>> * au sens le [plus|moins] @:A.*:[me]:[si] du terme au sens @:A.*:[me]:[si] du terme <<- ~>> * @@ -12289,11 +12428,11 @@ <<- not morph(<1, ":(?:X|Oo)") and not tag_before(\1, "2s") ~>> * la lettre [a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z] @:(?:3s|Ov) <<- ~3>> * - le [plus|moins] @:W possible + le [plus|moins] $:W possible <<- ~>> * les [moins|plus] @:A.*:[pi] possible <<- ~-1>> * @@ -12307,11 +12446,11 @@ <<- morph(<1, ":(?:R|C[sc])") ~1>> * non @:A <<- not morph(<1, ":D.*:m:[si]") ~1>> * - par trop @:A + par trop $:A <<- ~1:2>> * pas mal <<- not morph(<1, ":D") ~>> * @@ -12322,11 +12461,11 @@ <<- not morph(<1, ":D.*:[me]") ~>> * plein est <<- not morph(<1, ":D.*:m:[si]") ~>> * - [plus|moins|aussi] @:W que prévu + [plus|moins|aussi] $:W que prévu <<- ~>> * plus que tout autre @¬:[AQ].*:m:[si] <<- ~1:4>> * @@ -12391,10 +12530,11 @@ #, @¬:[NA] #[ne|n’|me|m’|te|t’|se|s’|le|la|l’|les|leur|leur|mon|ma|ta|sa|notre|votre|mes|tes|ses|ce|cet|cette|ces|je|j’|tu|il|on|nous|vous|ils|ça|ceci|cela|c’|ç’|chaque] __simplication_substantifs__ + >accusé de reception >acte [de|d’] [baptême|caution|cautionnement|cession|contrition|licitation|mariage|naissance|notoriété|propriété|quittance|reconnaissance|répudiation|vente] >acte d’ [achat|engagement] >acte de gestion ?courante¿ >acte de procédure ?pénale¿ >acte d’ état ?civil¿ @@ -12401,10 +12541,11 @@ >administratrice >système >agence de >voyage >aire d’ atterrissage >animal [de|d’] compagnie >appel au secours + >appel à l’ aide >arc à poulies >arme à feu >armée [de|d’] l’ air >armée [de|d’] terre >armer jusqu’ aux dents @@ -12412,10 +12553,11 @@ >arme [de|d’] destruction massive >armoire à [>glace|>pharmacie] >argent [de|d’] poche >arnaque à l’ assurance >article [de|d’] presse + >assignation à résidence >attaque à main armée >attestation sur l’ honneur >atteinte aux bonnes mœurs >attendre [de|d’] pied ferme >avion à [>hélice|réaction] @@ -12442,10 +12584,11 @@ >brave ?d’¿ entre les braves >brosse à [>dent|reluire] >cabinet [de|d’] [toilette|travail] >camp [de|d’] [concentration|internement|rééducation|vacances] >canne à [pêche|sucre] + >canon à eau >caisse à >outil >carton d’ emballage >centre d’ éducation [populaire|surveillée] >chair à [pâté|>canon] >chair [de|d’] poule @@ -12464,16 +12607,18 @@ >claire comme [de|d’] l’ eau [de|d’] [boudin|roche|source] >claire comme du cristal >claire comme jus [de|d’] [boudin|>chaussette|chique] [>clé|>clef] à molette >clin d’ œil + >clause de confidentialité >code [de|d’] bonne conduite >commise d’ office >compagne [de|d’] route >compagnon [de|d’] route >complémentaire santé >compte à rebours + concours de beauté >condamnée à mort >conférence [de|d’] presse >convention [récepteur|générateur] >conne comme la lune >conne comme un balai @@ -12490,10 +12635,11 @@ >crayon à [lèvres|sourcils] >cour d’ assises [>coût|>cout] [de|d’] revient >couteau à cran d’ arrêt >cuillère à [café|soupe] + >cure de [désintoxication|désintox] >déclaration sur l’ honneur >délai [de|d’] [attente|carence|connexion|prescription|préavis|rétraction|rigueur] >demande d’ asile >descente aux [enfers|flambeaux] [>dîner|>diner] aux chandelles @@ -12536,19 +12682,21 @@ >fille au pair fils à [papa|maman] fils [de|d’] pute >flocon [de|d’] neige ?électronique¿ >folle à lier + >fontaine à eau >fosse à >ordure >fosse aux lions [>fourgon|>fourgonette] de location >frayeur [de|d’] tous les diables >frousse [de|d’] tous les diables >fusil à pompe >gilet de sauvetage >hall d’ entrée >haute comme [trois|3] pommes + >heure sup >histoire avec un [grand|petit] h >homme [de|d’] [affaires|armes|confiance|exception|État|Église|honneur|lettres|loi|main|paille] >homme d’ âge mûr >homme à tout faire >hôtel [de|d’] ville @@ -12570,13 +12718,16 @@ >lampe [de|d’] chevet >lavage de cerveau >liaison sans lendemain >lime à >ongle >liste d’ attente + >lit à baldaquin >lit [de|d’] camp >livraison à domicile >livre [de|d’] poche + >livret d’ épargne ?[bancaire|populaire|salariale]¿ + >longueur d’ avance >lune [de|d’] miel >machine à [café|coudre|écrire|laver|sous|voter] >machine à remonter le temps >machine [de|d’] guerre >maillot [de|d’] bain @@ -12594,11 +12745,11 @@ >mère au foyer >metteuse en scène >mineure [de|d’] moins [de|d’] *NUM ans >mineure [de|d’] moins [de|d’] $:B ans >miroir aux alouettes - >mode [de|d’] [paiement|scrutin|vie] + >mode [de|d’] [emploi|paiement|scrutin|vie] >monnaie [de|d’] [échange|réserve|singe] >montre à gousset >mot [de|d’] passe >motrice [>essence|>diésel|>diesel] >motion [de|d’] [blâme|censure|défiance] @@ -12633,11 +12784,11 @@ >pleine aux as >police [de|d’] [caractères|écriture] >politique spectacle >pomme [de|d’] [discorde|terre|reinette|pin|Adam|api|amour|ambre|eau|or] >pompe à [chaleur|essence|fric] - >porte [de|d’] [service|garage|sortie] + >porte [de|d’] [entrée|service|garage|sortie] >porte d’ entrée >pot [de|d’] [chambre|colle] >poudre aux yeux >presse à >scandale preuve ?suffisante¿ du contraire @@ -12687,15 +12838,17 @@ tas [de|d’] >ferraille ?rouillée¿ >talon >aiguille taux [de|d’] [abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure|change|cholestérol|cholesterol|glycémie|fécondité|participation|testostérone|TVA] >témoin à charge >ténor du barreau + >tête à claques >tête [de|d’] [linotte|déterré|déterrée|déterrés|déterrées|mule] >têtue comme une [bourrique|mule] >têtue comme un [âne|bourriquot|mulet] >terrain à découvert >tigre à dents [de|d’] sabre + >tiret d’ incise >titre [de|d’] [noblesse|propriété|séjour] >tondeuse à gazon >tour [de|d’] passe-passe >train à grande vitesse >traitement [de|d’] faveur @@ -12734,12 +12887,27 @@ >calibre *NUM ?[mm|in]¿ >calibre *NUM [*|×] *NUM ?[mm|in]¿ <<- ~2:0>> * <<- =>> =select(\1, ":N") + +__purge_syntagmes_nominaux_matière__ + *WORD en acier ?[galvanisé|inoxydable|trempé]¿ + *WORD en [alu|aluminium|bois|contreplaqué|coton|cuir|cuivre|émail|étain|fer|fibrociment|fibro-ciment|inox|laiton|lin|coton|métal|nacre|plastique|plâtre|plomb|polycarbonate|polymère|verre|zinc] + <<- morph(\1, ":N") and not morph(>1, ":A.*:[me]:[si]") ~2:0>> * + + *WORD en pierre + *WORD en pierre de taille + *WORD en soie + *WORD en terre ?cuite¿ + <<- morph(\1, ":N") and not morph(>1, ":A.*:[fe]:[si]") ~2:0>> * + +TEST: deux câbles en acier situés de part et d’autre du chariot + __purge_locutions_adjectivales__ + ancienne formule bas de gamme basse consommation bon [enfant|marché|teint] bon chic ?,¿ bon genre [>clé|>clef] en >main @@ -12751,11 +12919,11 @@ haut de gamme haute [résolution|fidélité|tension] hors service longue [conservation|distance|portée|durée] meilleur marché - nouvelle génération + nouvelle [formule|génération] numéro un numéro $:B plein cadre top secret vieux jeu @@ -12772,11 +12940,11 @@ __purge_couleurs__ [beige|blanc|bleu|brun|châtain|cyan|gris|incarnat|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet|or|argent] [brillant|clair|criard|fluo|foncé|irisé|mat|pâle|pastel|sale|sombre|tendre|terne|vif] [beige|blanc|bleu|brun|châtain|cyan|gris|incarnat|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet|or|argent] et [beige|blanc|bleu|brun|châtain|cyan|gris|incarnat|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet|or|argent] blanc [argenté|cassé|lunaire] - bleu [acier|argenté|azur|céleste|ciel|électrique|givré|indigo|marine|nuit|outremer|outre-mer|persan|pétrole|roi|saphir|turquin|turquoise] + bleu [acier|argenté|azur|céleste|ciel|électrique|givré|indigo|marine|nuit|outremer|outre-mer|persan|pétrole|roi|saphir|turquin|turquoise|vert] blond [argenté|platine] gris [acier|anthracite|argenté|fer|perle|souris] jaune [canari|citron|doré|maïs|paille|sable] noir [de|d’] [encre|jais] noir et blanc @@ -12838,10 +13006,33 @@ ~^[A-ZÉÈÊ] et [moi|toi|lui|elle|nous|vous|eux|elles] <<- morph(\2, ":M") ~2:0>> =rewriteSubject(\2,\4) + "||" + +__purge_pronom_aussi__ + [j’|je] *WORD moi aussi + <<- morph(\2, ":1s") ~3:0>> * + + tu *WORD toi aussi + <<- morph(\2, ":2s") ~3:0>> * + + il *WORD lui aussi + elle *WORD elle aussi + on *WORD nous aussi + <<- morph(\2, ":3s") ~3:0>> * + + nous *WORD nous aussi + <<- morph(\2, ":1p") ~3:0>> * + + vous *WORD vous aussi + <<- morph(\2, ":2p") ~3:0>> * + + ils *WORD eux aussi + elles *WORD elles aussi + <<- morph(\2, ":3p") ~3:0>> * + __purge_après_être__ [>être|>devenir|>rester] [bon|meilleur] marché [>être|>devenir|>rester] cousin et cousine [>être|>devenir|>rester] de passage @@ -12878,11 +13069,11 @@ [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ avant tout [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ du moins [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ en partie [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ somme toute [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ sous peu - [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ tous [deux|trois] + [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ [tous|toutes] [deux|trois] [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ un jour [>être|>devenir|>rester] ?[pas|jamais|plus|guère|point]¿ à jamais [>être|>devenir|>rester] [pas|jamais|plus|guère|point] <<- ~2:0>> * @@ -12922,11 +13113,11 @@ /VCint ?[pas|jamais|plus|guère|point]¿ avant tout /VCint ?[pas|jamais|plus|guère|point]¿ du moins /VCint ?[pas|jamais|plus|guère|point]¿ en partie /VCint ?[pas|jamais|plus|guère|point]¿ somme toute /VCint ?[pas|jamais|plus|guère|point]¿ sous peu - /VCint ?[pas|jamais|plus|guère|point]¿ tous [deux|trois] + /VCint ?[pas|jamais|plus|guère|point]¿ [tous|toutes] [deux|trois] /VCint ?[pas|jamais|plus|guère|point]¿ un jour /VCint ?[pas|jamais|plus|guère|point]¿ à jamais /VCint [pas|jamais|plus|guère|point] <<- morphVC(\1, ">(?:être|devenir|rester)") ~2:0>> * @@ -12959,11 +13150,11 @@ __purge_après_avoir__ >avoir [pas|jamais|plus|guère|point] >avoir ?[pas|jamais|plus|guère|point]¿ en partie - >avoir ?[pas|jamais|plus|guère|point]¿ tous [deux|trois] + >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] [deux|trois] >avoir ?[pas|jamais|plus|guère|point]¿ somme toute <<- ~2:0>> * >avoir ?[pas|jamais|plus|guère|point]¿ beaucoup >avoir ?[pas|jamais|plus|guère|point]¿ bien [entendu|sûr] @@ -12976,21 +13167,21 @@ >avoir ?[pas|jamais|plus|guère|point]¿ un peu >avoir ?[pas|jamais|plus|guère|point]¿ un petit peu >avoir ?[pas|jamais|plus|guère|point]¿ un tout petit peu <<- morph(>1, ":[QY]") ~2:0>> * - >avoir [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + >avoir [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] >avoir bon dos >avoir bon pied ?,¿ bon œil >avoir carte blanche >avoir forme [humaine|animale] >avoir partie [gagnée|liée] >avoir voix au chapitre <<- ~2:0>> ␣ <<- =>> define(\2, [":LV"]) - >avoir [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + >avoir [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] >avoir [pas|jamais|plus|guère|point] bon dos >avoir [pas|jamais|plus|guère|point] bon pied ?,¿ bon œil >avoir [pas|jamais|plus|guère|point] carte blanche >avoir [pas|jamais|plus|guère|point] forme [humaine|animale] >avoir [pas|jamais|plus|guère|point] partie [gagnée|liée] @@ -12997,11 +13188,11 @@ >avoir [pas|jamais|plus|guère|point] quartier libre >avoir [pas|jamais|plus|guère|point] voix au chapitre <<- ~3:0>> ␣ <<- =>> define(\3, [":LV"]) - >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B @:(?:Q|V1.*:Y) <<- ~2:-2>> * n’ >avoir que $:Q <<- ~3>> * @@ -13012,11 +13203,11 @@ n’ >avoir que [peu|très|trop] $:W $:Q <<- ~3:5>> * /VCint [pas|jamais|plus|guère|point] /VCint ?[pas|jamais|plus|guère|point]¿ en partie - /VCint ?[pas|jamais|plus|guère|point]¿ tous [deux|trois] + /VCint ?[pas|jamais|plus|guère|point]¿ [tous|toutes] [deux|trois] /VCint ?[pas|jamais|plus|guère|point]¿ somme toute <<- morphVC(\1, ":V0a") ~2:0>> * /VCint ?[pas|jamais|plus|guère|point]¿ beaucoup /VCint ?[pas|jamais|plus|guère|point]¿ bien [entendu|sûr] @@ -13029,21 +13220,21 @@ /VCint ?[pas|jamais|plus|guère|point]¿ un peu /VCint ?[pas|jamais|plus|guère|point]¿ un petit peu /VCint ?[pas|jamais|plus|guère|point]¿ un tout petit peu <<- morphVC(\1, ":V0a") and morph(>1, ":[QY]") ~2:0>> * - /VCint [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + /VCint [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] /VCint bon dos /VCint bon pied ?,¿ bon œil /VCint carte blanche /VCint forme [humaine|animale] /VCint partie [gagnée|liée] /VCint voix au chapitre <<- morphVC(\1, ":V0a") ~2:0>> ␣ <<- __also__ =>> define(\2, [":LV"]) - /VCint [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + /VCint [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] /VCint [pas|jamais|plus|guère|point] bon dos /VCint [pas|jamais|plus|guère|point] bon pied ?,¿ bon œil /VCint [pas|jamais|plus|guère|point] carte blanche /VCint [pas|jamais|plus|guère|point] forme [humaine|animale] /VCint [pas|jamais|plus|guère|point] partie [gagnée|liée] @@ -13050,11 +13241,11 @@ /VCint [pas|jamais|plus|guère|point] quartier libre /VCint [pas|jamais|plus|guère|point] voix au chapitre <<- morphVC(\1, ":V0a") ~3:0>> ␣ <<- __also__ =>> define(\3, [":LV"]) - /VCint ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|soif|vent] + /VCint ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|soif|vent] /VCint ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les $:B @:(?:Q|V1.*:Y) <<- morphVC(\1, ":V0a") ~2:-2>> * __purge_après_verbe__ @@ -13375,11 +13566,11 @@ vu les circonstances @¬:A:[fe]:[pi] <<- ~1:3>> * __purge_tous_deux_trois__ - >faire tous [deux|trois] + >faire [tous|toutes] [deux|trois] <<- ~2:0>> * >faire tous <<- morph(\1, ":[123]p") or (\1 == "fait" and value(<1, "|on|")) ~2>> * @@ -13433,11 +13624,11 @@ [|,] $:D *WORD *WORD [le|la|l’|les|leur] @:(?:[123][sp]|P)¬:[NA] [|,] $:D *WORD *WORD [nous|vous] [le|la|l’|les|en|y] @:(?:[123][sp]|P) [|,] $:D *WORD *WORD [le|la|l’|les] [lui|leur|en|y] @:(?:[123][sp]|P) [|,] $:D *WORD *WORD [lui|leur|y] en @:(?:[123][sp]|P) [|,] $:D *WORD *WORD @:(?:3[sp]|P)¬:[GW] - <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":(?:[PG]|V0)") =>> exclude(\4, ":V") + <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":(?:[PG]|V[023])") =>> exclude(\4, ":V") [des|ces|mes|tes|ses|nos|vos|quelques|lesdits] @:A.*:[pi] @:N.*:[pi]¬(?:3[sp]|G) <<- =>> exclude(\3, ":V") les @:A.*:[pi]¬:V @:N.*:[pi]¬(?:3[sp]|G) @@ -13447,29 +13638,35 @@ <<- not before(":O[vs]") =>> exclude(\3, ":V") [plusieurs|certains|certaines] @:A.*:[pi]¬:3[sp] @:N.*:p¬:(?:3[sp]|G) <<- =>> exclude(\2, ":V") and exclude(\3, ":V") + +__purge_vite__ + vite + <<- not (morph(<1, ":V0a") and value(>1, "|fait|")) ~>> * + __purge_locutions_verbales__ >aller bon train >arriver à [destination|échéance] >arriver à point nommé >arriver à bon port >battre à plate couture >battre en [brèche|retraite] [>brûler|>bruler] à vif + >charger à blanc >chauffer à blanc >compter à rebours >condamner à mort >couler à ?grands¿ flots >demander [assistance|audience|conseil|pardon] [>donner|>redonner] [naissance|sens|suite|vie] [>donner|>redonner] quartier libre >élire domicile >étouffer dans l’ œuf - >faire [allusion|assaut|attention|chaud|confiance|connaissance|compliqué|copain-copain|date|débat|défaut|demi-tour|écran|envie|erreur|état|exception|figure|foi|fortune|froid|front|grève|halte|honte|illusion|mention|mouche|office|part|peur|polémique|plaisir|preuve|rage|rempart|scandale|sens|signe|usage|volte-face] + >faire [allusion|assaut|attention|chaud|confiance|connaissance|compliqué|copain-copain|date|débat|défaut|demi-tour|écran|envie|erreur|état|exception|figure|foi|fortune|froid|front|grève|halte|honte|illusion|mention|mouche|office|part|peur|polémique|plaisir|preuve|rage|rempart|scandale|sens|signe|surface|usage|volte-face] >faire amende honorable >faire bande à part >faire bon accueil >faire bonne figure >faire chou blanc @@ -13534,10 +13731,11 @@ >prêter main forte >prêter main-forte >réduire en miettes >remettre en cause >rendre [hommage|service|visite] + >reprendre haleine >rester lettre morte >rester lettres mortes >revenir à la case départ >saigner à blanc >suivre ?[ça|cela|ceci]¿ de près @@ -13548,10 +13746,11 @@ >tenir en haute estime >tirer à blanc >tomber à [pic|point] >trier sur le volet >trouver refuge + >tirer à blanc >tirer [avantage|profit] >tourner à l’ aigre >tourner court >venir à bout [>venir|>revenir] je [ne|n’] sais ?pas¿ ?trop¿ d’ où @@ -13563,10 +13762,11 @@ >arriver a [destination|échéance] >arriver a point nommé >arriver a bon port >battre a plate couture [>brûler|>bruler] a vif + >charger a blanc >chauffer a blanc >fermer a [>clé|>clef] [>gonfler|>regonfler] a bloc >jeter a terre [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>nue|>plat|>terre] @@ -13576,23 +13776,29 @@ >prêter a >confusion >saigner a blanc >tenir a [carreau|cœur|distance] >tirer a blanc >tomber a [pic|point] + >tirer a blanc >tourner a l’ aigre >venir a bout [>venir|>revenir] a point <<- /conf/ -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. + >avoir du mal a + >avoir vocation a + >laisser libre cours a + <<- /conf/ --1>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. + >faire plaisirs <<- /sgpl/ --1>> plaisir # Faire plaisir : dans cette locution, “plaisir” doit être au singulier. <<- ~-1>> * >laisser pour [comte+s|>conte] <<- /conf/ --1>> compte # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte - [>mourir|>paraître|>paraitre|>rester|>sembler] >jeûne + [>être|>mourir|>paraître|>paraitre|>rester|>sembler] >jeûne <<- /conf/ -2>> jeune # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune >partir en >couille <<- /conf/ -3>> quenouille|vrille # Confusion. La locution “partir en couille” est un barbarisme. Locution authentique : “partir/tomber en quenouille”. Peut-être voulez-vous dire “partir en vrille” ?|https://fr.wiktionary.org/wiki/partir_en_quenouille @@ -13620,10 +13826,11 @@ TEST: ce contrat arrive {{a}} échéance. TEST: il faut tenir {{contes}} des faits au lieu de nos impressions. TEST: prendre {{a}} la légère ce test serait une erreur. TEST: on va suivre ça de {{prêt}}. TEST: il faut se tenir {{a}} distance de ces gens-là. +TEST: J’avais du mal {{a}} l’écouté (double erreur utile pour tester le faux positif) TEST: cette expérience ne va pas tarder à tourner {{cours}}. TEST: il faut rendre {{comte}} de la sitation désastreuse dans laquelle nous sommes tombés. TEST: il faut tenir {{comtes}} des aléas de la météo. TEST: faudra rendre bon {{conte}} de vos actes TEST: Elle est restée {{jeûne}}. @@ -13782,10 +13989,13 @@ TEST: La première est la critique dite artiste TEST: la critique conduit nombre de protestataires à se replier sur des modalités de défense efficaces dans le passé mais désormais largement inadaptées TEST: Tu crois que Microsoft peut contraindre les projets libres à quoi que ce soit ? TEST: « L’école produit la norme en matière de langage » TEST: Parler affaires. +TEST: Mon Dieu, je vous en prie, faites qu’il ne m’arrive rien +TEST: Anne, je t’en prie, viens de bonne heure +TEST: elles ont toutes deux épluché le contenu de la boîte @@@@ @@@@ @@ -13796,14 +14006,10 @@ @@@@ @@@@ @@@@ -# -# //////////////////////////////////////// RÈGLES DE CONTRÔLE //////////////////////////////////////// -# - !!!! Redondances dans la phrase !! __[i]/redon2(redondances_phrase)__ ({w_4})[ ,].* (\1) @@0,$ @@ -13882,36 +14088,37 @@ TEST: du chien et de l’étonnant {{colliers}} qu’il avait autour du cou. __gn_le_1m__ , le *WORD - <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -2>> =suggLesLa(\2) # Accord de genre erroné : « \3 » est féminin. + <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -2>> =suggLesLa(\3) # Accord de genre erroné : « \3 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True) # Accord de genre erroné : « \2 » est un déterminant masculin. <<- /gn/ __else__ and morph(\3, ":[NA].*:p", ":[siGW]") -3>> =suggMasSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. <<- /gn/ __also__ -2>> les # Accord de nombre erroné : « \3 » est au pluriel. *WORD le *WORD <<- /gn/ morph(\2, ":D") >>> <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") or ( morph(\3, ":[NA].*:f", ":[me]") and morph(\1, ":R", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) ) - -2>> =suggLesLa(\2) # Accord de genre erroné : « \3 » est féminin. + -2>> =suggLesLa(\3) # Accord de genre erroné : « \3 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True) # Accord de genre erroné : « \2 » est un déterminant masculin. <<- /gn/ __else__ and morph(\3, ":[NA].*:p", "*") or ( morph(\3, ":[NA].*:p", ":[si]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) ) -3>> =suggMasSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. <<- /gn/ __also__ -2>> les # Accord de nombre erroné : « \3 » est au pluriel. le *WORD - <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|Y)") -2>> =suggLesLa(\2) # Accord de genre erroné : « \3 » est féminin. + <<- /gn/ morph(\3, ":[NA].*:f", ":(?:e|m|P|G|W|Y)") -2>> =suggLesLa(\3) # Accord de genre erroné : « \3 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True) # Accord de genre erroné : « \2 » est un déterminant masculin. <<- /gn/ __else__ and morph(\3, ":[NA].*:p", ":[siGW]") -3>> =suggMasSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. <<- /gn/ __also__ -2>> les # Accord de nombre erroné : « \3 » est au pluriel. TEST: c’est une catastrophe, {{le}} {{profits}} a baissé ces deux derniers trimestres TEST: j’en ai marre, {{le}} {{passée}} est trop dans les esprits TEST: {{Le}} démoralisation. ->> La TEST: {{Le}} Guyane française. ->> La +TEST: sur {{le}} {{tables}} ->> les|la||| TEST: avec {{le}} {{pile}} TEST: contre {{le}} {{rois}} TEST: {{le}} {{publique}} TEST: {{Le}} {{pendue}} TEST: {{Le}} personne répond. @@ -14574,11 +14781,11 @@ <<- /gn/ ( (morph(\2, ":[NA].*:m", ":[fe]") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":[me]") and morph(\3, ":[NA].*:m", "*")) ) and not apposition(\2, \3) -3>> =switchGender(\3, True) # Accord de genre erroné avec « \2 ». <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». <<- /gn/ morph(\2, ":[NA].*:[pi]") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A")) -3>> =suggPlur(\3) # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel. - <<- checkAgreement(\2, \3) =>> =exclude(\3, ":V") + <<- not morph(\3, ":G|>a/") and checkAgreement(\2, \3) =>> =exclude(\3, ":V") TEST: faire table rase des passions {{inutile}} ->> inutiles TEST: à bonne distance des {{chiens}} {{méchante}} TEST: des hommes {{attaquée}} TEST: des femmes {{agressé}} @@ -15360,28 +15567,26 @@ TEST: Des yeux {{marrons}}. TEST: Des créatures marines. TEST: Un cageot des premières cerises. -__sgpl_couleurs_composées__ - [>beige|>châtain|>cyan|>écarlate|>jaune|>magenta|>marron|>mauve|>orange|>pourpre|>rouge|>vermeille] [>brillante|>claire|>fluo|>mat|>pâle|>pastel|>sombre|>tendre|>terne|>vive] - [>beige|>châtain|>cyan|>écarlate|>jaune|>magenta|>marron|>mauve|>orange|>pourpre|>rouge|>vermeille] [foncé+ses|irisé+ses] +__sgpl_couleurs_composées!5__ + [>beige|>châtain|>cyan|>écarlate|>jaune|>magenta|>marron|>mauve|>orange|>pourpre|>rouge|>rose|>vermeille] [>fluo|>mat|>pâle|>pastel|>sombre|>tendre|>terne|>brillante|>claire|>vive|foncé+ses|irisé+ses] + <<- /sgpl/ morph(<1, ":N", ":D") and (not morph(\1, ":[me]:[si]") or morph(\2, ":[pf]")) + ->> =suggSing(\1) + " " + suggMasSing(\2) + # Les couleurs composées de plusieurs termes sont invariables.|https://fr.wikipedia.org/wiki/Accord_des_adjectifs_et_des_noms_de_couleur_en_fran%C3%A7ais + + [>blanche|>bleue|>brune|>grise|>noire|>verte|>violette] [>fluo|>mat|>pâle|>pastel|>sombre|>tendre|>terne|>brillante|>claire|>vive|foncé+ses|irisé+ses] <<- /sgpl/ morph(<1, ":N", ":D") and (not morph(\1, ":[me]:[si]") or morph(\2, ":[pf]")) - ->> =suggSing(\1) + " " + suggSing(\2) + ->> =suggMasSing(\1) + " " + suggMasSing(\2) # Les couleurs composées de plusieurs termes sont invariables.|https://fr.wikipedia.org/wiki/Accord_des_adjectifs_et_des_noms_de_couleur_en_fran%C3%A7ais >jaune [>paille|>sable] >rose [>bonbon|>chair|>corail] >rouge [>brique|>carmine|>cerise|>écarlate|rubis|>sang|>tomate|>vermillon] <<- /sgpl/ morph(<1, ":N", ":D") and (not morph(\1, ":[me]:[si]") or morph(\2, ":p")) ->> =suggSing(\1) + " " + suggSing(\2) - # Les couleurs composées de plusieurs termes sont invariables.|https://fr.wikipedia.org/wiki/Accord_des_adjectifs_et_des_noms_de_couleur_en_fran%C3%A7ais - - [>blanche|>bleue|>brune|>grise|>noire|>verte|>violette] [>brillante|>claire|>fluo|>mat|>pâle|>pastel|>sombre|>tendre|>terne|>vive] - [>blanche|>bleue|>brune|>grise|>noire|>verte|>violette] [foncé+ses|irisé+ses] - <<- /sgpl/ morph(<1, ":N", ":D") and (not morph(\1, ":[me]:[si]") or morph(\2, ":[pf]")) - ->> =suggMasSing(\1) + " " + suggSing(\2) # Les couleurs composées de plusieurs termes sont invariables.|https://fr.wikipedia.org/wiki/Accord_des_adjectifs_et_des_noms_de_couleur_en_fran%C3%A7ais >bleue [>ciel|>indigo|>marine|>roi|>saphir|>turquoise|>verte] >blonde >platine >grise [>acier|>anthracite|>perle|souris] @@ -15392,20 +15597,27 @@ >noire [de|d’] [encre|jais] <<- /sgpl/ not morph(<1, ":D") -1>> noir # Les couleurs composées de plusieurs termes sont invariables.|https://fr.wikipedia.org/wiki/Accord_des_adjectifs_et_des_noms_de_couleur_en_fran%C3%A7ais -TEST: les chapeaux {{rouges clairs}} -TEST: des chaussures {{jaunes sables}} -TEST: des pantalons {{verts clairs}} -TEST: des robes {{bleues indigo}} -TEST: Une jupe {{bleue foncée}}. -TEST: Des cheveux {{noirs}} de jais. +TEST: les chapeaux {{rouges clairs}} ->> rouge clair +TEST: des chaussures {{jaunes sables}} ->> jaune sable|||sablent +TEST: des pantalons {{verts clairs}} ->> vert clair +TEST: des robes {{bleues indigo}} ->> bleu indigo +TEST: des voitures {{jaunes fluo}} ->> jaune fluo +TEST: Une jupe {{bleue foncée}}. ->> bleu foncé +TEST: boutons {{roses pâles}} ->> rose pâle +TEST: Il a une queue {{bleue vert}}. ->> bleu vert +TEST: Il a une queue {{marron claire}}. ->> marron clair +TEST: Il a une queue {{verte clair}} ->> vert clair +TEST: Des cheveux {{noirs}} de jais. ->> noir TEST: Une jupe bleu foncé. TEST: Des yeux vert clair. TEST: Des yeux vert olive. TEST: Ses cheveux étaient noir de jais. +TEST: Il a une queue vert émeraude +TEST: Il a une queue bleu vert !! !! @@ -15798,11 +16010,11 @@ # juste __sgpl_juste__ justes <<- /sgpl/ \1.islower() and morph(<1, ":V", ":[DA]") and not morph(>1, ":[NA].*:[pi]") - and not (morph(<1, ">(?:être|sembler|devenir|rester|demeurer|redevenir|para[îi]tre)/.*:[123]p") and morph(>1, ":G||>,/")) + and not (morph(<1, ">(?:être|sembler|devenir|rester|demeurer|redevenir|para[îi]tre|trouver)/.*:[123]p") and morph(>1, ":G||>,/")) ->> juste # Si “juste” est un adverbe, il est invariable. TEST: Viser {{justes}} TEST: Voir {{justes}}. TEST: Penser juste. @@ -15810,10 +16022,11 @@ TEST: J’ai retrouvé tout mon ressenti, tous les mots sont justes. TEST: Nos chiffres sont justes, et nous vous le prouverons. TEST: Ces observations sont tellement justes que, dans les années à venir, elles serviront de référence. TEST: Les motivations sont justes et évidentes TEST: ces théories incomplètes sont suffisamment justes pour prédire la réalité +TEST: À vous de trouver les compromis que vous trouvez justes. # pied __sgpl_pied__ [>avoir|>perdre] pieds @@ -15966,10 +16179,49 @@ TEST: On peut {{rires}}, non ? TEST: Faire {{rires}}, c’est compliqué. + +!!!! Adverbes après verbe !! + +# fort +__sgpl_verbe_fort__ + forts + <<- /sgpl/ morph(<1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre)/.*:(?:[123]p|P|Q|Y)|>(?:affirmer|trouver|croire|désirer|estimer|préférer|penser|imaginer|voir|vouloir|aimer|adorer|rendre|souhaiter)/") + and not morph(>1, ":A.*:[me]:[pi]") + ->> fort # Confusion probable. S’il s’agit ici de l’adverbe “fort” (équivalent de “fortement”), écrivez-le au singulier. + + hauts [et|&] forts + <<- /sgpl/ morph(<1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre)/.*:(?:[123]p|P|Q|Y)") + ->> haut et fort # Confusion probable. S’il s’agit ici de la locution adverbiale “haut et fort”, elle est invariable. + +TEST: ces emmerdeurs crient bien trop {{forts}} +TEST: Ils déclamèrent {{hauts et forts}} leur amour de leur patrie. +TEST: parler {{hauts & forts}} +TEST: ces animaux paraissent forts, mais ils sont faibles. +TEST: ils sont forts, ces gars-là. +TEST: ils se croient forts. +TEST: je les imagine forts et intelligents. +TEST: elles les veulent forts et astucieux. +TEST: les écarts ont été plus forts en une génération +TEST: Avec le même nombre de bulletins, les xénophobes apparaîtront plus forts. +TEST: Pour leur permettre d’être plus forts face aux maîtres de tous bords, patrons, maris ou bureaucrates. +TEST: Il nous rend forts. + + +# bien +__sgpl_verbe_bien__ + biens + <<- /sgpl/ morph(<1, ":V", ":[DA].*:p") ->> bien # Confusion probable. Ici, “bien” est un adverbe, donc invariable. + +TEST: Ils vont {{biens}}. +TEST: Elles travaillaient vraiment {{biens}}. +TEST: Il ne comprenait vraiment pas très {{biens}} ces principes de base. +TEST: Il a de grands biens. +TEST: Ce sont des biens de peu de valeur. + !! !! !!!! Confusions !! @@ -16679,11 +16931,11 @@ TEST: Une histoire {{dénudée}} d’intérêt. TEST: Des hommes {{dénudés}} de compassion. # desceller / déceler / desseller -__erreur_déceler_desseller_desceller__ +__conf_erreur_déceler_desseller_desceller__ [>erreur|>faute|>incohérence|>problème|>bug|>bogue|>faille|>maladie|>défaut|>défaillance|>perturbation|>irrégularité] <> [>desseller|>desceller] <<- /conf/ --1>> =\-1.replace("escell", "écel").replace("essell", "écel") # Confusion probable si ce verbe se rapporte à “\1”. Desceller signifie briser un sceau, un cachet… Desseller signifie ôter une selle. Si vous voulez dire “remarquer”, “dévoiler”, “découvrir”, écrivez “déceler”.|http://fr.wiktionary.org/wiki/déceler [>desseller|>desceller] [l’|@:[BD]] [>petite|>grande|>énorme|>dangeureuse|>formidable|>forte|>légère|>merveilleuse|>nouvelle|>vrai|>réelle|>sévère|>véritable] [>acidité|>activité|>allergie|>anévrisme|>anomalie|>arnaque|>appendicite|>atrophie|>baisse|>bébé|>blessure|>bug|>bogue|>carie|>cancer|>cause|>changement|>complot|>comète|>concentration|>corrélation|>croissance|>défaut|>défaillance|>demande|>dépression|>diabète|>différence|>diminution|>effluve|>épilepsie|>erreur|>essai|>existence|>grossesse|>grosseur|>faille|>faute|>fuite|>fraude|>grippe|>handicap|>hausse|>hémorragie|>hostilité|>hypertrophie|>incompatibilité|>incohérence|>infection|>infraction|>indice|>infidélité|>insuffisance|>intrigue|>irrégularité|>leucémie|>lésion|>lueur|>lumière|>maladie|>malformation|>manœuvre|>manipulation|>molécule|>mensonge|>mutation|>once|>perturbation|>personnalité|>piste|>perte|>planète|>exoplanète|>présence|>qualité|>odeur|>opportunité|>otite|>problème|>surdité|>talent|>tendance|>tentative|>tumeur|>utilisation|hoax|>variation|>vie|virus] @@ -16733,11 +16985,11 @@ >imminente [>actrice|>confrère|>collègue|>dirigeante|>dissidente|>entrepreneuse|>experte|>défenseuse|>intellectuelle|>mathématicienne|>musicienne|>pédiatre|>personalité|>personnage|>professeur|>physicienne|>rabbin|>représantante|>savante|>chirurgienne|>neurochirurgienne|>scientifique|>service|>spécialiste|~logues?$|~istes?$] <<- /conf/ -1>> =\1.replace("imm", "ém").replace("Imm", "Ém") # Confusion probable. Si “\1” se rapporte à “\2”, alors vous voulez probablement dire “éminent” ; “imminent” signifie “qui va survenir prochainement”.|https://fr.wiktionary.org/wiki/%C3%A9minent [>actrice|>confrère|>collègue|>dirigeante|>dissidente|>entrepreneuse|>experte|>défenseuse|>intellectuelle|>mathématicienne|>musicienne|>pédiatre|>personalité|>personnage|>professeur|>physicienne|>rabbin|>représantante|>savante|>chirurgienne|>neurochirurgienne|>scientifique|>service|>spécialiste|~logues?$|~istes?$] >imminente - <<- /conf/ -2>> =\2.replace("imm", "ém").replace("Imm", "Ém") + <<- /conf/ morph(<1, ":D") -2>> =\2.replace("imm", "ém").replace("Imm", "Ém") # Confusion probable. Si “\2” se rapporte à “\1”, alors vous voulez probablement dire “éminent” ; “imminent” signifie “qui va survenir prochainement”.|https://fr.wiktionary.org/wiki/%C3%A9minent [>accouchement|>accord|>arrivée|>assaut|>attaque|>atterrissage|>cataclysme|>catastrophe|>changement|>conflit|>crash|>danger|>décollage|>départ|>désarmement|>déclenchement|>effondrement|>éruption|>fin|>guerre|>lancement|>orage|>ouragan|>péril|>remaniement|>réponse|>résultat|>retour|>séisme|>tempête|>tsunami|>verdict] ?>être¿ >éminente <<- /conf/ --1>> =\-1.replace("émi", "immi").replace("Émi", "Immi") # Confusion probable. Si “\-1” se rapporte à “\1”, alors vous voulez probablement dire “imminent” ; “éminent” signifie “notable”.|https://fr.wiktionary.org/wiki/%C3%A9minent @@ -16747,10 +16999,11 @@ TEST: l’accouchement est {{éminent}}. TEST: Mon {{imminent}} collègue. TEST: Un paléontologue {{imminent}}. TEST: L’arrivée est imminente. TEST: Des paléontologues éminents. +TEST: aucune menace terroriste imminente # enduire / induire __conf_enduire_induire__ >enduire en [>erreur|>tentation] @@ -17847,26 +18100,22 @@ TEST: une tâche dévalorisante. TEST: peiner à la tâche. # taule / tôle -__conf_taule_tôle__ +__conf_taule_tôle2__ >aller en [>tôle|>tole] >quitter cette [tôle|tole] >faire de la [tôle|tole] <<- /conf/ --1>> taule # Confusion. La tôle est une plaque de métal laminé. Pour la prison, écrivez “taule”. [>taule] [>boulonner|>cintrer|>émailler|>emboutir|>galvaniser|>gaufrer|>nervurer|>onduler|>perforer|>souder|>translucide] <<- /conf/ -1>> =\1.replace("au", "ô").replace("AU", "Ô") # Confusion. La taule est la forme argotique pour évoquer la prison, le bordel ou toute forme d’habitation. - [>taule] [de|d’|en] [>acier|>alu|>aluminium|>bardage|>cuivre|>étanchéité|>fer|>festonnage|inox|>laiton|>métal|>trapèze|>zinc|>éverite|>fibrociment|>fibro-ciment|>plastique|>polycarbonate|PVC] - <<- /conf/ -1>> =\1.replace("au", "ô").replace("AU", "Ô") # Confusion. La taule est la forme argotique pour évoquer la prison, le bordel ou toute forme d’habitation. - TEST: Demain, il va aller en {{tôle}}. TEST: Tu as fait de la {{tôle}} ? TEST: C’est la {{taule}} galvanisée. -TEST: une {{taule}} en acier # tant / temps (2e partie) __conf_tant_temps_tan__ en [temps|>tan] [que|qu’] @@ -17920,14 +18169,14 @@ # venimeux / vénéneux __conf_venimeux_vénéreux__ [>serpent|>araignée|>scorpion|>vipère|>cobra|>crapaud|>grenouille|>dendrobate|>poulpe|>guêpe|>abeille|>frelon|>méduse|>morsure|>piqûre|>dard|>dent|>croc|>crochet] >vénéneuse - <<- /conf/ -2>> =\1.replace("énén", "enim") # Confusion : “vénéneux” se dit des plantes, employez “venimeux”. + <<- /conf/ -2>> =\1.replace("énén", "enim").replace("ÉNÉN", "ENIM") # Confusion : “vénéneux” se dit des plantes, employez “venimeux”. [>plante|>champignon|>lépiote|>baie|>fruit|>herbe|>fleur|>chair|>moule|humus|>substance|>végétal] >venimeuse - <<- /conf/ -2>> =\1.replace("enim", "énén") # Confusion : pas de venin ici. + <<- /conf/ -2>> =\1.replace("enim", "énén").replace("ENIM", "ÉNÉN") # Confusion : pas de venin ici. TEST: ces araignées {{vénéneuses}}. TEST: ce champignon {{venimeux}}. @@ -17995,68 +18244,115 @@ TEST: Je vous renvoie pour cela à l’excellent documentaire TEST: cuisiner à l’étouffée __infi_loc_à_verbe__ - de manière à ~..(?:ée?s?|ez)$ - du mal à ~..(?:ée?s?|ez)$ - intérêt à ~..(?:ée?s?|ez)$ + de manière à ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..(?:ée?s?|ez)$ + du mal à ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..(?:ée?s?|ez)$ + intérêt à ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..(?:ée?s?|ez)$ + enclin à ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..(?:ée?s?|ez)$ <<- /infi/ morph(\-1, ":V", ":M") and not (\-1.endswith("ez") and value(>1, "|vous|")) --1>> =suggVerbInfi(\-1) # S’il s’agit d’une action à accomplir, le verbe devrait être à l’infinitif. TEST: de manière à {{obligé}} ces gens TEST: ils ont intérêt à {{obligés}} ces gens TEST: Tous ceux qui ont du mal à {{obligé}} ces gens __infi_verbe_de_verbe__ - [>cesser|>décider|>défendre|>suggérer|>commander|>essayer|>tenter|>choisir|>permettre|>interdire] [de|d’] *WORD - <<- /infi/ not morph(\1, ":N") and analyse(\-1, ":V1.*:Q", ":(?:M|Oo)") or analyse(\-1, ":[123][sp]", ":[MNG]") + [>arrêter|>cesser|>choisir|>commander|>continuer|>décider|>défendre|>envisager|>essayer|>éviter|>interdire|>omettre|>permettre|>prévoir|>refuser|>suggérer|>tenter] + || [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ *WORD + <<- /infi/ not morph(\1, ":N") and (analyse(\-1, ":V1.*:Q", ":(?:M|Oo)") or analyse(\-1, ":[123][sp]", ":[MNG]")) --1>> =suggVerbInfi(\-1) # Après “\1 de”, le verbe devrait être à l’infinitif. TEST: cessez d’{{anesthésié}} ces gens ! +TEST: arrête d’y {{consacré}} autant de temps. +TEST: Il tentait de {{raisonné}} en homme libre TEST: Le menu Format contient de nombreuses commandes de mise en forme. TEST: Le commandant de zone… TEST: À quoi rime de décider de mesures écologiques d’en haut TEST: L’accès au cannabis thérapeutique où à ses dérivés permettrait de plus aux autorités de santé d’apporter aux malades les garanties nécessaires quant à la qualité, aux concentrations, ainsi qu’aux modalités d’obtention et d’utilisation optimale. TEST: l’industrie est également touchée, avec « des pertes de commandes de véhicules chez Renault et chez Peugeot » __infi_qqch_de__ - [afin|avant] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + afin [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ avant ?même¿ [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ marre [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “\1 de”, le verbe devrait être à l’infinitif. - à même [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ - en train [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ - en vue [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + à [condition|défaut|même] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “à \2 de”, le verbe devrait être à l’infinitif. + + à >seule >fin [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “à seule fin de”, le verbe devrait être à l’infinitif. + + en [droit|état|mesure|train|vue] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “\1 \2 de”, le verbe devrait être à l’infinitif. + >avoir l’ air [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “avoir l’air de”, le verbe devrait être à l’infinitif. + + >avoir la chance [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “avoir la chance de”, le verbe devrait être à l’infinitif. + + >avoir le droit [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “avoir le droit de”, le verbe devrait être à l’infinitif. + + >avoir [besoin|raison] [de|d’] ?[le|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “avoir \2 de”, le verbe devrait être à l’infinitif. + + >avoir [besoin|raison] [de|d’] [l’|la] ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":[MN]") --1>> =suggVerbInfi(\-1) # Après “avoir \2 de”, le verbe devrait être à l’infinitif. + + >avoir vite fait [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “avoir vite fait de”, le verbe devrait être à l’infinitif. + + >faire semblant [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “faire semblant de”, le verbe devrait être à l’infinitif. + [>façon|>manière] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ [>intention|>volonté] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “\1 de”, le verbe devrait être à l’infinitif s’il s’agit bien de décrire une action. - il >être [temps|impossible|indispensable|nécessaire|utile] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + il >être [temps|admissible|inadmissible|absurde|contraignant|libérateur|difficile|facile|impossible|indispensable|nécessaire|possible|utile|inutile] + || [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “il est \3 de”, le verbe devrait être à l’infinitif. - [|,] impossible [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ - <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “impossible de”, le verbe devrait être à l’infinitif. + il >être hors de question [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “il est hors de question de”, le verbe devrait être à l’infinitif. - force [est|était] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + [|,] [>capable|>incapable|impossible|inutile] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “\2 de”, le verbe devrait être à l’infinitif. + + force [est|était] [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ <<- /infi/ not value(<1, "|une|la|cette|ma|ta|sa|notre|votre|leur|quelle|de|d’|") and analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “force est de”, le verbe devrait être à l’infinitif. + sous peine [de|d’] ?[le|l’|la|leur|les|nous|vous|lui]¿ ~..ée?s?$ + <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1) # Après “sous peine de”, le verbe devrait être à l’infinitif. + TEST: afin de leur {{percée}} une ouverture TEST: en train de {{percées}} +TEST: elle tricha à seule fin d’{{allée}} à l’université TEST: ils sont à même de {{trouvé}} la bonne réponse TEST: Nous étions en train de {{trouvé}} une solution à ces soucis récurrents. +TEST: il a l’air de {{pensée}} qu’on est des crétins +TEST: tu avais raison de {{pensée}} ça +TEST: nous eûmes la chance de la {{trouvée}} facilement +TEST: avoir raison de la {{considérée}} ainsi +TEST: vous avez le droit de lui {{craché}} à la gueule +TEST: ils ont vite fait de nous {{poussée}} à bout TEST: elle est en train de {{mangée}} TEST: je déteste sa manière de la {{rabaissée}} en permanence. +TEST: il est hors de question de {{menée}} cette attaque ainsi TEST: il serait temps de {{poussée}} la logique jusqu’au bout TEST: impossible d’{{échappée}} à cette horreur. TEST: Force est d’{{pensée}} que nous allons y arriver avec seulement nos bonnes intentions. +TEST: sous peine de nous {{pesée}} lourd sun l’estomac +TEST: Sont-ils en mesure de nous {{fabriqué}} ces armes ? +TEST: Ne fais pas semblant de l’{{oubliée}}. __infi_de_verbe__ [de|d’] [le|l’|leur|les] @:V¬:[YNAM]|>(?:lui|plus)/ [|,] [de|d’] [nous|vous|lui] @:V¬:[YE]|>(?:lui|plus)/ @@ -18070,39 +18366,29 @@ [de|d’] ?[ne|n’]¿ [me|m’|te|t’|se|s’|nous|vous] [le|la|l’|les|en|y] @:V¬:Y [de|d’] ?[ne|n’]¿ [le|la|l’|les] [lui|leur|en|y] @:V¬:Y [de|d’] ?[ne|n’]¿ [lui|leur] en @:V¬:Y <<- /infi/ --1>> =suggVerbInfi(\-1) # Après “de”, le verbe devrait être à l’infinitif. - en [droit|état|mesure|train] [de|d’] ?[nous|vous|le|la|l’|les|leur]¿ @:V1.*:Q - <<- /infi/ --1>> =suggVerbInfi(\-1) # Après “\1 \2 \3”, le verbe devrait être à l’infinitif. - - >faire ?[pas|jamais|guère]¿ semblant [de|d’] ?[nous|vous|le|la|l’|les|leur]¿ @:V1.*:Q - <<- /infi/ --1>> =suggVerbInfi(\-1) # Après “faire semblant de”, le verbe devrait être à l’infinitif. - [de|d’] @:V1.*:Q¬:N <<- /infi/ not \2[0:1].isupper() and not morph(<1, ">(?:en|passer)/") - and not before("(?i)\\b(?:quelqu(?:e chose|’une?)|qu’y a-t-il |(?:l(es?|a)|nous|vous|me|te|se) trait|personne|points? +$|autant +$|ça +|rien d(?:e |’)|rien(?: +[a-zéèêâîûù]+|) +$)") + and not before("(?i)(?:quelqu(?:e chose|’une?)|qu’y a-t-il |\\b(?:l(?:es?|a)|nous|vous|me|te|se) trait|personne|points? +$|autant +$|ça +|rien d(?:e |’)|rien(?: +[a-zéèêâîûù]+|) +$)") and not tag_before(\1, "ce_que") -2>> =suggVerbInfi(\2) # Le verbe devrait être à l’infinitif. TEST: d’en {{parlé}} sans cesse TEST: cela suffit de les {{aimait}} TEST: de ne leur en {{avancé}} que le nécessaire. TEST: de l’y {{poussé}} -TEST: arrête d’y {{consacré}} autant de temps. TEST: je suis certain d’en {{choque}} plusieurs. TEST: elle était capable de la {{trouvait}} où qu’elle soit. TEST: de me le {{facturez}} TEST: suffit de {{la}} {{finit}} TEST: Il s’agit de me {{donnait}} tout ça. TEST: j’étais incapable de m’{{orientait}} dans la bonne direction. TEST: ils étaient susceptibles de m’y {{trouvaient}} -TEST: Il tentait de {{raisonné}} en homme libre TEST: sa façon de {{nettoyez}} était inefficace. TEST: elle a délibérément omis de les {{inclurent}}. -TEST: Sont-ils en mesure de nous {{fabriqué}} ces armes ? -TEST: Ne fais pas semblant de l’{{oubliée}}. TEST: d’{{mangé}} je ne suis pas capable TEST: elle s’engage de ne les lui donner qu’en dernier recours. TEST: l’idée consiste de la lui donner sans contrepartie et voir ce qu’il en fera. TEST: de leur plus grand fils, ils attendent beaucoup. TEST: de n’importe quelle manière @@ -18223,11 +18509,11 @@ TEST: Ils ont beau {{consacré}} le plus clair de leur temps à ce projet, ça n’avance guère. __infi_est_ce_que__ - est-ce que @:(?:V1.*:Q|[13]s|2[sp])¬:[GYWMN] + est-ce [que|qu’] @:(?:V1.*:Q|[13]s|2[sp])¬:[GYWMN] <<- /infi/ not value(<1, "|que|qu’|") -3>> =suggVerbInfi(\3) # Après “est-ce que”, le verbe devrait être à l’infinitif. TEST: est-ce que {{rapporté}} ces données nous aidera ? TEST: est-ce que {{priait}} est la solution ? TEST: Est-ce que Pierre Xazzz va bien ? @@ -18276,10 +18562,11 @@ TEST: faut-il {{pensé}} à ces choses-là encore et encore ? TEST: il faut n’{{estimait}} que la valeur de nos actes TEST: il fallait bien cela pour nous épargner TEST: une faille s’est ouverte sous nos pieds TEST: il faut en moyenne 1000 litres d’eau pour produire un kilo de céréales +TEST: Xi Jinping a réaffirmé en janvier dernier qu’il utiliserait s’il le faut la force militaire __infi_faire__ >faire ~(?:ée?s?|ez)$ <<- /infi/ not morph(<1, ">(?:en|de|être)/") and morph(\2, ":V", ":[MG]") and not (morph(\1, ":N") and morph(\2, ":Q.*:m:[sp]")) @@ -18363,28 +18650,32 @@ TEST: Mieux ne vaut pas {{arrivé}} en retard. TEST: il eût mieux valu {{oublié}} cette affaire plutôt que réveiller ce dragon endormi. __infi_verbes__ - [>aimer|>désirer|>espérer|>oser|>préférer|>souhaiter] ?[pas|plus|point|guère|jamais]¿ ~..(?:ée?s?|ez)$ +# regarder, écouter, ouïr + [>aimer|>désirer|>entendre|>espérer|>oser|>préférer|>souhaiter] ?[pas|plus|point|guère|jamais]¿ ~..(?:ée?s?|ez)$ <<- /infi/ morph(\1, ":", ":[GN]") and morph(\2, ":V", ":M") -2>> =suggVerbInfi(\2) # S’il s’agit d’une action à accomplir, le verbe devrait être à l’infinitif. [>aller|>venir|>partir] ?[pas|plus|point|guère|jamais|rien]¿ ~..(?:ée?s?|ez)$ <<- /infi/ morph(\1, ":", ":[GN]") and morph(\-1, ":V", ":M|>(?:accompagner|armer|armurer|casquer|déguiser)/") --1>> =suggVerbInfi(\2) # S’il s’agit d’une action à accomplir, le verbe devrait être à l’infinitif. -TEST: elle préférait {{mangée}} seule. -TEST: Il venait, comme d’habitude, {{discuté}} avec son ami. -TEST: Ces types-là venaient {{mangé}} chez moi tous les dimanches. -TEST: ils viennent bien entendu {{attaqué}} le parlement -TEST: ils vont par voie de conséquence vraiment {{attaqué}} la banque -TEST: elles ont pu {{mangé}} -TEST: Cette affaire ne va rien {{arrangé}}. -TEST: ils vont de manière non conventionnelle {{fêtée}} leur réussite. -TEST: ils vont de manière absurde {{arrivé}} au résultat inverse à leurs espérances -TEST: croyez-vous qu’ils oseront {{proposé}} des amendements aussi audacieux ? +TEST: elle préférait {{mangée}} seule. ->> manger +TEST: Il venait, comme d’habitude, {{discuté}} avec son ami. ->> discuter +TEST: Ces types-là venaient {{mangé}} chez moi tous les dimanches. ->> manger +TEST: ils viennent bien entendu {{attaqué}} le parlement ->> attaquer +TEST: ils vont par voie de conséquence vraiment {{attaqué}} la banque ->> attaquer +TEST: elles ont pu {{mangé}} ->> manger +TEST: Cette affaire ne va rien {{arrangé}}. ->> arranger +TEST: ils vont de manière non conventionnelle {{fêtée}} leur réussite. ->> fêter +TEST: ils vont de manière absurde {{arrivé}} au résultat inverse à leurs espérances ->> arriver +TEST: croyez-vous qu’ils oseront {{proposé}} des amendements aussi audacieux ? ->> proposer +TEST: Quelle est cette femme que j’ai entendue {{chanté}} ? ->> chanter +TEST: elles partaient {{prié}} chaque matin ->> prier +TEST: jamais entendu {{parlé}} de ces choses ->> parler TEST: Elles étaient venues armées. TEST: Il vint déguisé en mousquetaire. TEST: D’ailleurs j’irai armé. TEST: J’irai armé de mon épée. TEST: Si possible, venez accompagné. @@ -18844,44 +19135,10 @@ <<- /ppas/ morph(\2, ":V", ":(?:N|A|Q|W|G|3p)") and not tag_before(\1, "ce_que") -2>> =suggVerbPpas(\2, ":m:p") # Incohérence : “\2” n’est pas un participe passé. TEST: après avoir mis à jour sont {{profile}}. - - -!!!! Adverbes après verbe !! - -# fort -__sgpl_verbe_fort__ - forts - <<- /sgpl/ morph(<1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre)/.*:(?:[123]p|P|Q|Y)|>(?:affirmer|trouver|croire|désirer|estimer|préférer|penser|imaginer|voir|vouloir|aimer|adorer|rendre|souhaiter)/") - and not morph(>1, ":A.*:[me]:[pi]") - ->> fort # Confusion probable. S’il s’agit ici de l’adverbe “fort” (équivalent de “fortement”), écrivez-le au singulier. - -TEST: ces emmerdeurs crient bien trop {{forts}} -TEST: ces animaux paraissent forts, mais ils sont faibles. -TEST: ils sont forts, ces gars-là. -TEST: ils se croient forts. -TEST: je les imagine forts et intelligents. -TEST: elles les veulent forts et astucieux. -TEST: les écarts ont été plus forts en une génération -TEST: Avec le même nombre de bulletins, les xénophobes apparaîtront plus forts. -TEST: Pour leur permettre d’être plus forts face aux maîtres de tous bords, patrons, maris ou bureaucrates. -TEST: Il nous rend forts. - - -# bien -__sgpl_verbe_bien__ - biens - <<- /sgpl/ morph(<1, ":V", ":[DA].*:p") ->> bien # Confusion probable. Ici, “bien” est un adverbe, donc invariable. - -TEST: Ils vont {{biens}}. -TEST: Elles travaillaient vraiment {{biens}}. -TEST: Il ne comprenait vraiment pas très {{biens}} ces principes de base. -TEST: Il a de grands biens. -TEST: Ce sont des biens de peu de valeur. - !! !! !!!! Conjugaisons nous / vous (2ᵉ partie) !! @@ -20120,10 +20377,42 @@ TEST: Sont-elles tout à fait {{arriver}} ? TEST: Ne sont-elles pas {{aveugle}} TEST: demeurent-elles {{présente}} +__ppas_ayant_été_pronom_ppas__ + ayant été lui-même @:[QA].*:[fp]¬:[me][si] + <<- /ppas/ --1>> =suggMasSing(\-1) # Accord avec “\3” : “\-1” devrait être au masculin singulier. + + ayant été elle-même @:[QA].*:[mp]¬:[fe][si] + <<- /ppas/ --1>> =suggFemSing(\-1) # Accord avec “\3” : “\-1” devrait être au féminin singulier. + + ayant été [nous-même|vous-même] @:[QA].*:p¬:[si] + <<- /ppas/ -3>> \3s # Accord avec “\-1” : “\3” devrait être au pluriel. + <<- /ppas/ __also__ --1>> =suggSing(\-1) # Accord avec “\3” : “\-1” devrait être au singulier. + + ayant été [nous-mêmes|vous-mêmes] @:[QA].*:s¬:[pi] + <<- /ppas/ -3>> =\3[:-1] # Accord avec “\-1” : “\3” devrait être au singulier. + <<- /ppas/ __also__ --1>> =suggPlur(\-1) # Accord avec “\3” : “\-1” devrait être au pluriel. + + ayant été eux-mêmes @:[QA].*:[fs]¬:[me][pi] + <<- /ppas/ --1>> =suggMasPlur(\-1) # Accord avec “\3” : “\-1” devrait être au masculin pluriel. + + ayant été elles-mêmes @:[QA].*:[ms]¬:[fe][pi] + <<- /ppas/ --1>> =suggFemPlur(\-1) # Accord avec “\3” : “\-1” devrait être au féminin pluriel. + + ayant été [lui-même|elle-même|nous-même|vous-même|nous-mêmes|vous-mêmes|eux-mêmes|elles-mêmes] + <<- ~3>> * + +TEST: ayant été lui-même {{attaquée}} ->> attaqué +TEST: ayant été elle-même {{pris}} dans la tourmente ->> prise +TEST: ayant été {{vous-même}} {{blâmés}} ->> vous-mêmes|||blâmé +TEST: ayant été {{nous-mêmes}} {{blâmé}} ->> nous-même|||blâmés +TEST: ayant été eux-mêmes {{chapitré}} ->> chapitrés +TEST: ayant été elles-mêmes {{ignorés}} par leur hiérarchie ->> ignorées + + !! !! !!!! Se croire/considérer/montrer/penser/révéler/savoir/sentir/voir/vouloir + participe passé/adj !! !! @@ -20344,11 +20633,11 @@ __ppas_nous_vous_avoir__ [nous|vous] ?[ne|n’]¿ ?[lui|leur]¿ >avoir *WORD <<- /ppas/ morph(\1, ":Os") - and not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + and not value(\-1, "|barre|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") and value(<1, "||,|comme|comment|et|lorsque|mais|où|ou|quand|qui|pourquoi|puisque|quoique|si|sinon|") and not \-1.isupper() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])") --1>> =suggVerbPpas(\-1, ":m:s") # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais @@ -20360,11 +20649,11 @@ TEST: D’un côté, le modèle occidental, […], nous a libérés de […] __ppas_det_nom_avoir__ [un|une|des|le|la|l’|les|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leur|leurs|certains|certaines|quelques|plusieurs] *WORD ?[ne|n’]¿ ?[lui|leur]¿ >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|barre|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") and value(<1, "||,|comme|comment|et|lorsque|mais|où|ou|quand|qui|pourquoi|puisque|quoique|si|sinon|") and morph(\2, ":[NA]", ":G") and not \-1.isupper() and morph(\-1, ":(?:[123][sp]|Y|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])") and not (\-2 == "avions" and morph(\-1, ":3[sp]")) --1>> =suggVerbPpas(\-1, ":m:s") # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais @@ -20377,10 +20666,11 @@ TEST: Les élèves leur ont {{donnée}} ça. TEST: Le maire a {{créée}} un risque. TEST: le général n’a pas encore {{finit}} sa sieste. TEST: Certains les ont d’abord jugés trop lents. TEST: les timides ou les personnes n’ayant pas confiance en elles vont avoir tendance à éviter de regarder dans les yeux. +TEST: Le théâtre, en l’occurrence, a charge de sensibiliser __ppas_les_avoir__ les >avoir @:V[0-3]..t.*:Q.*:s¬:[GWpi] <<- /ppas/ morph(\2, ":V0a") -3>> =suggPlur(\3) @@ -20444,11 +20734,11 @@ __ppas_avoir_ppas_mas_sing__ [|,|après|pour|pourquoi|quand|que|qu’|sans|d’|de|qui] ?[ne|n’]¿ ?[lui|leur]¿ avoir @:Q.*:[pf]¬:m:[si] [|,|après|pour|pourquoi|quand|que|qu’|sans|d’|de|qui] ?[ne|n’]¿ [m’|t’] avoir @:Q.*:p¬:[si] - <<- /ppas/ not value(\-1, "|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") --1>> =suggVerbPpas(\-1, ":m:s") # Le participe passé devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais TEST: Avoir {{instruite}} notre mère TEST: Après avoir {{baissés}} nos tarifs TEST: Je viendrai, après avoir vraiment {{écoutée}} le prof. @@ -20461,11 +20751,11 @@ __ppas_m_t_l_avoir__ [l’|m’] ?[en|y]¿ >avoir @:(?:Y|[123][sp])¬:[QGWMX] <<- /ppas/ --1>> =suggVerbPpas(\-1, ":m:s") # Confusion : employez un participe passé. t’ ?[en|y]¿ >avoir @:(?:Y|[123][sp])¬:[QGWMX] - <<- /ppas/ not value(\-1, "|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") --1>> =suggVerbPpas(\-1, ":m:s") # Confusion : employez un participe passé. TEST: m’avoir {{terminer}}. TEST: il m’a {{souffler}} la bonne réponse. TEST: elle t’en a {{parle}}. @@ -20482,22 +20772,23 @@ -2>> =suggVerbPpas(\2, ":m:s") # Incohérence probable avec “\1” : “\2” n’est pas un participe passé. <<- /ppas/ __also__ and \1 == "a" and \2.endswith("r") and not value(<1, "|n’|m’|t’|l’|il|on|elle|") -1>> à # Confusion probable : “a” est une conjugaison du verbe avoir. Pour la préposition, écrivez “à”. >avoir ~..it$ - <<- /ppas/ not value(\1, "|A|avoirs|") and morph(\2, ":V(?:2.*:Ip.*:3s|3.*:Is.*:3s)", ":[NAQ]") + <<- /ppas/ not value(\1, "|A|avions|avoirs|") and morph(\2, ":V(?:2.*:Ip.*:3s|3.*:Is.*:3s)", ":[NAQ]") -2>> =suggVerbPpas(\2, ":m:s") # Incohérence probable avec “\1” : “\2” n’est pas un participe passé. >avoir ~.ut$ - <<- /ppas/ not value(\1, "|A|avoirs|") and morph(\2, ":V3.*:Is.*:3s", ":[NAQ]") + <<- /ppas/ not value(\1, "|A|avions|avoirs|") and morph(\2, ":V3.*:Is.*:3s", ":[NAQ]") -2>> =suggVerbPpas(\2, ":m:s") # Incohérence probable avec “\1” : “\2” n’est pas un participe passé. TEST: Avoir {{marcher}} toute la journée m’a épuisée. TEST: L’homme, voyez-vous, {{a}} réellement {{marcher}} sur la Lune. TEST: Je ne lui ai rien {{demander}}, mais il est venu à notre secours au nom de la justice. TEST: Avoir {{finit}} son œuvre dans les temps, ce n’est pas toujours suffisant. TEST: ces hommes, n’en doutez pas, auraient {{put}} trouver la solution. +TEST: à celui qui aurait {{déclarer}} une telle horreur TEST: nous avons vu des avions voler haut dans le ciel. !! @@ -20587,20 +20878,20 @@ !!!! Participes passés avec “avoir” (formes interrogatives) !! __ppas_avoir_interrogatif__ *WORD /VCint *WORD - <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> - <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":[QM]") + <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> + <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":[QMG]") -3>> =suggVerbPpas(\3, ":m:s") # Incohérence probable avec “\2”. Après “avoir”, ce verbe devrait être un participe passé. <<- /ppas/ __else__ and not value(\1, "|les|l’|m’|t’|nous|vous|en|") and morph(\3, ":Q.*:[fp]", ":m:[si]") and not morph(\1, ":[NA].*:[fp]") and not before("(?i)\\b(?:quel(?:le|)s?|combien) ") -3>> =suggVerbPpas(\3, ":m:s") # Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède). [|,] ?n’¿ /VCint *WORD - <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> - <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QM]") + <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> + <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QMG]") --1>> =suggVerbPpas(\-1, ":m:s") # Incohérence probable avec “\-2”. Après “avoir”, ce verbe devrait être un participe passé. <<- /ppas/ __else__ and morph(\-1, ":Q.*:[fp]", ":m:[si]") --1>> =suggVerbPpas(\-1, ":m:s") # Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède). TEST: cet été ont-ils {{mentionnés}} la sécheresse ->> mentionné @@ -20619,10 +20910,11 @@ TEST: Ai-je déjà {{reconnut}} mes torts ? TEST: N’avais-tu pas crainte de tout perdre ? TEST: Combien de bêtes n’as-tu pas déjà massacrées TEST: Combien de bêtes as-tu déjà massacrées TEST: A-t-il Pierre pour ami ? +TEST: Quel lien y a-t-il entre donner et recevoir ? __ppas_l_m_t_avoir_interrogatif__ [l’|m’|t’] /VCint *WORD <<- /ppas/ morphVC(\2, ":V0a") and morph(\3, ":(?:Y|2p|Q.*:p|3[sp])", ":[GWsi]") @@ -22076,11 +22368,11 @@ TEST: quel travail {{avait elle}} accompli ? TEST: je ne comprenais pas pourquoi c’était elle qui était punie et que personne ne parlait de celui qui avait fait ça. TEST: C’était elle qui avait pris le contrôle. -__inte_union_nous!7__ +__inte_union_nous2!7__ [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ons$ nous [|,] [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~ons$ nous @:¬:1p <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") -2:3>> \2-nous # Forme interrogative ? Mettez un trait d’union. @@ -22093,21 +22385,22 @@ <<- /inte/ space_after(\2, 1, 1) and ( (value(\2, "|avions|") and not morph(\1, ":A.*:[me]:[sp]") and not morph(\-1, ":(:?3[sp]|Ov)")) or (morph(\2, ":V.*:1p", ":[GNW]") and not morph(\1, ":Os")) ) -2:3>> \2-nous # Forme interrogative ? Mettez un trait d’union. -TEST: {{retrouverons nous}} enfin la tranquilité ? -TEST: Ne {{sommes nous}} pas des dieux ? -TEST: À quelle autorité {{prétendons nous}} si… +TEST: y {{retrouverons nous}} enfin la tranquilité ? +TEST: pourquoi {{sommes nous}} réellement des dieux ? +TEST: À quelle autorité {{prétendons nous}} sur ces gens… TEST: quel exercice {{avions nous}} revu ? -TEST: pourquoi n’en entendons nous jamais parler ? +TEST: À quelle autorité {{prétendons nous}} si… +TEST: pourquoi {{entendons nous}} souvent ces injonctions idiotes ? TEST: les avions nous font rêver. -__inte_union_vous!7__ - [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~..e[zs]$ vous [|,] - [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~..e[zs]$ vous @:¬:2p +__inte_union_vous2!7__ + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~..ez$ vous [|,] + [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~..ez$ vous @:¬:2p <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") -2:3>> \2-vous # Forme interrogative ? Mettez un trait d’union. [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] [êtes|étiez|fûtes|fussiez|serez|seriez|avez|aviez|eûtes|eussiez|aurez|auriez] vous <<- /inte/ space_after(\2, 1, 1) @@ -22118,11 +22411,13 @@ <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GNW]") and not value(\2, "|veuillez|") and not morph(\1, ":Os") -2:3>> \2-vous # Forme interrogative ? Mettez un trait d’union. TEST: Mais {{soutiendrez vous}} cette proposition ? TEST: comment {{êtes vous}} arrivées là ? -TEST: quelle tarte {{voulez vous}} ? +TEST: quel genre de femme {{voulez vous}} réellement ? +TEST: quel exercice {{avions nous}} réellement ? +TEST: quel homme {{voulez vous}} qu’il devienne TEST: Veuillez vous instruire avant de contester ces mesures. __inte_union_ils!7__ [|,|comment|pourquoi|combien|que|qu’|quoique|quoiqu’|où|puis|quand|qui] ~[eo]nt$ ils [|,] @@ -23039,20 +23334,63 @@ TEST: Quand j’aurai fini ce boulot, je ne sais pas ce que je ferai. TEST: Quand j’aurai soif et faim, je m’arrêterai. # Si suivi du conditionnel ou du subjonctif -__vmode_si_sujet__ +__vmode_si_sujet_conditionnel_subjonctif__ [|,] si [j’|J’|t’|T’] @:[SK]¬:(?:G|V0|I) [|,] si @:(?:Os|M) @:[SK]¬:(?:G|V0|I) [|,] s’ [il|ils] @:[SK]¬:(?:G|V0|I) <<- /vmode/ -4>> _ # Ce verbe ne devrait être ni au conditionnel, ni au subjonctif. TEST: Si Pierre {{avancerait}} sa voiture de quelques mètres, ça nous permettrait de passer. TEST: s’ils ne {{mangeraient}} pas tous les jours, ils seraient moins gros. TEST: Si j’{{irais}} le faire + +__vmode_si_sujet_conditionnel__ + si [je|j’] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si [je|j’] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":1s") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si j’avais perdu, j’aurais recommencé. » + + si [tu|t’] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si [tu|t’] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":2s") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si tu avais perdu, tu aurais recommencé. » + + [si|s’] [il|on|elle] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + [si|s’] [il|on|elle] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":3s") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « S’il avait perdu, il aurait recommencé. » + + si nous >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si nous >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":1p") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si nous avions perdu, nous aurions recommencé. » + + si vous >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si vous >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":2p") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si vous aviez perdu, vous auriez recommencé. » + + [si|s’] [ils|elles] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + [si|s’] [ils|elles] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":3p") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si elles avaient perdu, elles auraient recommencé. » + + si [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur] @:[NA].*:[si] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur] @:[NA].*:[si] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\5, ":K") -5>> =suggVerbTense(\5, ":Iq", ":3s") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « S’il avait perdu, il aurait recommencé. » + + si [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines] @:[NA].*:[pi] >avoir $:Q ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + si [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines] @:[NA].*:[pi] >avoir $:Q $:D $:N ?,¿ [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles] $:K + <<- /vmode/ morph(\5, ":K") -5>> =suggVerbTense(\5, ":Iq", ":3p") # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si elles avaient perdu, elles auraient recommencé. » + +TEST: si j’{{aurais}} perdu, j’aurais recommencé. ->> avais +TEST: si t’{{aurais}} vu le match, tu aurais compris ->> avais +TEST: si elle {{aurait}} mangé ce truc, elle serait malade ->> avait +TEST: si nous {{aurions}} connu cet homme, on se serait pas trompé ->> avions +TEST: si vous {{auriez}} avancé, ce serait différent ->> aviez +TEST: s’ils {{auraient}} deviné la solution, ils auraient pas demandé ->> avaient +TEST: si le patron {{aurait}} pensé la chose, on l’aurait su. ->> avait +TEST: si les femmes {{auraient}} parlé, je l’aurais su. ->> avaient + # Dès que + indicatif __vmode_dès_que__ dès [que|qu’] @:(?:Os|M) @:S¬:[IG] <<- /vmode/ -4>> =suggVerbMode(\4, ":I", \3) # Après “dès que”, le verbe ne devrait pas être au subjonctif. @@ -23085,11 +23423,10 @@ de [façon|manière] [que|qu’] @:(?:Os|M) @:I¬:(?:[GYS]|Iq) en sorte [que|qu’] @:(?:Os|M) @:I¬:[GYS] pour peu [que|qu’] @:(?:Os|M) @:I¬:[GYS] pour autant [que|qu’] @:(?:Os|M) @:I¬:[GYS] <<- /vmode/ -5>> =suggVerbMode(\5, ":S", \4) # Après “\1 \2 que”, ce verbe devrait être au subjonctif. - [|,] non [que|qu’] @:(?:Os|M) @:I¬:[GYS] <<- /vmode/ -5>> =suggVerbMode(\5, ":S", \4) # Après “non que”, ce verbe devrait probablement être au subjonctif. [|,] en admettant [que|qu’] @:(?:Os|M) @:I¬:[GYS] @@ -26828,11 +27165,11 @@ TEST: Elle a souvent déposé chez lui de petites sommes d’argent. Il ne lui a rien délivré jusqu’au troisième jour avant sa mort, où elle est venue lui demander en personne une somme de quatre mille francs. Cette somme lui a été payée en or, et un commis a été chargé de la lui porter chez elle. TEST: » Adolphe Lebon, commis chez Mignaud et fils, dépose que, le jour en question, vers midi, il a accompagné madame l’Espanaye à son logis, avec les quatre mille francs, en deux sacs. TEST: Quand la porte s’ouvrit, mademoiselle l’Espanaye parut, et lui prit des mains l’un des deux sacs, pendant que la vieille dame le déchargeait de l’autre. TEST: Il les salua et partit. Il n’a vu personne dans la rue en ce moment. C’est une rue borgne, très-solitaire. TEST: » William Bird, tailleur, dépose qu’il est un de ceux qui se sont introduits dans la maison. Il est Anglais. Il a vécu deux ans à Paris. Il est un des premiers qui ont monté l’escalier. -TEST: Il a entendu les voix qui se disputaient. La voix rude était celle d’un Français. Il a pu distinguer quelques mots, mais il ne se les rappelle pas. Il a entendu distinctement sacré et mon Dieu. +TODO: Il a entendu les voix qui se disputaient. La voix rude était celle d’un Français. Il a pu distinguer quelques mots, mais il ne se les rappelle pas. Il a entendu distinctement sacré et mon Dieu. TEST: C’était en ce moment un bruit comme de plusieurs personnes qui se battent, – le tapage d’une lutte et d’objets qu’on brise. La voix aiguë était très-forte, plus forte que la voix rude. TEST: Il est sûr que ce n’était pas une voix d’Anglais. Elle lui sembla une voix d’Allemand ; peut-être bien une voix de femme. Le témoin ne sait pas l’allemand. TEST: » Quatre des témoins ci-dessus mentionnés ont été assignés de nouveau, et ont déposé que la porte de la chambre où fut trouvé le corps de mademoiselle l’Espanaye était fermée en dedans quand ils y arrivèrent. TEST: Tout était parfaitement silencieux ; ni gémissements, ni bruits d’aucune espèce. Après avoir forcé la porte, ils ne virent personne. TEST: » Les fenêtres, dans la chambre de derrière et dans celle de face, étaient fermées et solidement assujetties en dedans. Une porte de communication était fermée, mais pas à clef. Index: graphspell-js/ibdawg.js ================================================================== --- graphspell-js/ibdawg.js +++ graphspell-js/ibdawg.js @@ -266,14 +266,11 @@ if (sWord.length > 1) { if (sWord.gl_isTitle()) { return !!this.lookup(sWord.toLowerCase()); } if (sWord.gl_isUpperCase()) { - if (this.bAcronymValid) { - return true; - } - return !!(this.lookup(sWord.toLowerCase()) || this.lookup(sWord.gl_toCapitalize())); + return !!(this.bAcronymValid || this.lookup(sWord.toLowerCase()) || this.lookup(sWord.gl_toCapitalize())); } return !!this.lookup(sWord.slice(0, 1).toLowerCase() + sWord.slice(1)); } return !!this.lookup(sWord.toLowerCase()); } @@ -381,11 +378,13 @@ else if ( (sNewWord.length + sRemain.length == oSuggResult.sWord.length) && oSuggResult.sWord.toLowerCase().startsWith(sNewWord.toLowerCase()) && this.isValid(sRemain) ) { if (this.sLangCode == "fr" && ["l", "d", "n", "m", "t", "s", "c", "j", "qu", "lorsqu", "puisqu", "quoiqu", "jusqu", "quelqu"].includes(sNewWord.toLowerCase()) && char_player.aVowel.has(sRemain.slice(0,1))) { oSuggResult.addSugg(sNewWord+"’"+sRemain); } - oSuggResult.addSugg(sNewWord+" "+sRemain); + if ((sNewWord.length > 1 && sRemain.length > 1) || ["a", "à", "y"].includes(sNewWord) || ["a", "à", "y"].includes(sRemain)) { + oSuggResult.addSugg(sNewWord+" "+sRemain); + } } } if (nDist > oSuggResult.nDistLimit) { return; } Index: graphspell/ibdawg.py ================================================================== --- graphspell/ibdawg.py +++ graphspell/ibdawg.py @@ -1,11 +1,11 @@ #!python3 """ INDEXABLE BINARY DIRECT ACYCLIC WORD GRAPH Implementation of a spellchecker as a transducer (storing transformation code to get lemma and morphologies) -and a spell suggestion mechanim +and a spell suggestion mechanism """ import traceback import pkgutil import re @@ -264,13 +264,11 @@ if sWord[0:1].isupper(): if len(sWord) > 1: if sWord.istitle(): return self.lookup(sWord.lower()) if sWord.isupper(): - if self.bAcronymValid: - return True - return self.lookup(sWord.lower()) or self.lookup(sWord.capitalize()) + return self.bAcronymValid or self.lookup(sWord.lower()) or self.lookup(sWord.capitalize()) return self.lookup(sWord[:1].lower() + sWord[1:]) return self.lookup(sWord.lower()) if sWord[0:1].isdigit(): return True return False @@ -340,11 +338,12 @@ oSuggResult.addSugg(sNewWord+sTail, nDeep) return if (len(sNewWord) + len(sRemain) == len(oSuggResult.sWord)) and oSuggResult.sWord.lower().startswith(sNewWord.lower()) and self.isValid(sRemain): if self.sLangCode == "fr" and sNewWord.lower() in ("l", "d", "n", "m", "t", "s", "c", "j", "qu", "lorsqu", "puisqu", "quoiqu", "jusqu", "quelqu") and sRemain[0:1] in cp.aVowel: oSuggResult.addSugg(sNewWord+"’"+sRemain) - oSuggResult.addSugg(sNewWord+" "+sRemain) + if (len(sNewWord) > 1 and len(sRemain) > 1) or sNewWord in ("a", "à", "y") or sRemain in ("a", "à", "y"): + oSuggResult.addSugg(sNewWord+" "+sRemain) if nDist > oSuggResult.nDistLimit: return cCurrent = sRemain[0:1] for cChar, jAddr in self._getCharArcs(iAddr): if cChar in cp.d1to1.get(cCurrent, cCurrent): Index: make.py ================================================================== --- make.py +++ make.py @@ -1,6 +1,6 @@ - #!/usr/bin/env python3 +#!/usr/bin/env python3 # coding: UTF-8 """ Grammalecte builder """ @@ -124,11 +124,14 @@ print("+ OXT: ", end="") for spfSrc, spfDst in dOxt.items(): print(spfSrc, end=", ") if os.path.isdir(spLang+'/'+spfSrc): for sf in os.listdir(spLang+'/'+spfSrc): - hZip.write(spLang+'/'+spfSrc+"/"+sf, spfDst+"/"+sf) + if sf.endswith(('.txt', '.py')): + hZip.writestr(spfDst+"/"+sf, helpers.fileFile(spLang+'/'+spfSrc+"/"+sf, dVars)) + else: + hZip.write(spLang+'/'+spfSrc+"/"+sf, spfDst+"/"+sf) else: if spfSrc.endswith(('.txt', '.py')): hZip.writestr(spfDst, helpers.fileFile(spLang+'/'+spfSrc, dVars)) else: hZip.write(spLang+'/'+spfSrc, spfDst)