Index: doc/build.md ================================================================== --- doc/build.md +++ doc/build.md @@ -2,15 +2,15 @@ # How to build Grammalecte ## Required ## * Python 3.6 +* Firefox Developper * Firefox Nightly * NodeJS * npm - * jpm : https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm - * web-ext : https://developer.mozilla.org/fr/Add-ons/WebExtensions/Getting_started_with_web-ext + * web-ext : `https://developer.mozilla.org/fr/Add-ons/WebExtensions/Getting_started_with_web-ext` * Thunderbird ## Commands ## @@ -18,11 +18,10 @@ `make.py LANG` > Generate the LibreOffice extension and the package folder. > LANG is the lang code (ISO 639). - > This script uses the file `config.ini` in the folder `gc_lang/LANG`. **First build** `make.py LANG -js` @@ -52,17 +51,17 @@ > Install the LibreOffice extension. `-fx --firefox` -> Launch Firefox Developper (before Firefox 57). -> Unit tests can be lanched from Firefox, with CTRL+SHIFT+F12. +> Launch Firefox Developper. +> Unit tests can be launched from the menu (Tests section). `-we --webext` -> Launch Firefox Nightly (Firefox 57+). -> Unit tests can be lanched from the menu. +> Launch Firefox Nightly. +> Unit tests can be launched from the menu (Tests section). `-tb --thunderbird` > Launch Thunderbird. Index: doc/syntax.txt ================================================================== --- doc/syntax.txt +++ doc/syntax.txt @@ -1,48 +1,85 @@ WRITING RULES FOR GRAMMALECTE -Note: This documentation is obsolete right now. +Note: This documentation is a draft. Information may be obsolete or incomplete. # Principles # Grammalecte is a bi-passes grammar checker engine. On the first pass, the -engine checks the text paragraph by paragraph. On the second passe, the engine +engine checks the text paragraph by paragraph. On the second pass, the engine check the text sentence by sentence. The command to switch to the second pass is `[++]`. In each pass, you can write as many rules as you need. -A rule is defined by: +There are two kinds of rules: + +* regex rules (triggered by a regular expression) +* token rules (triggered by a succession of tokens) + +A regex rule is defined by: * [optional] flags “LCR” for the regex word boundaries and case sensitiveness * a regex pattern trigger -* a list of actions (can’t be empty) -* [optional] user option name for activating/disactivating the rule -* [optional] rule name +* a list of actions +* [optional] option name (the rule is active only if the option defined by user or config is active) +* [optional] rule name (named rules can be disabled by user or by config) + +A token rules is defined by: + +* rule name +* one or several lists of tokens (triggers) +* a list of actions (the action is active only if the option defined by user or config is active) + +Token rules must be defined within a graph. + +Each graph is defined within the second pass with the command: + + @@@@GRAPH: graph_name + +A graph ends when another graph is defined or when is found the command: + + @@@@END_GRAPH There is no limit to the number of actions and the type of actions a rule can launch. Each action has its own condition to be triggered. -There are three kind of actions: +There are several kinds of actions: * Error warning, with a message, and optionally suggestions, and optionally an URL * Text transformation, modifying internally the checked text * Disambiguation action, setting tags on a position +* Tagging -The rules file for your language must be named “rules.grx”. -The settings file must be named “config.ini”. +The rules file for your language must be named `rules.grx`. +The settings file must be named `config.ini`. All these files are simple utf-8 text file. UTF-8 is mandatory. +# Comments # -# Rule syntax # +Lines beginning with `#` are comments. - __LCR/option(rulename)__ pattern + +# End of file # + +With the command: + + #END + +at the beginning of a line, the parser won’t go further. +Whatever is written after will be considered as comments. + + +# Regex rule syntax # + + __LCR/option(rulename)__ + pattern <<- condition ->> error_suggestions # message_error|http://awebsite.net... <<- condition ~>> text_rewriting <<- condition =>> commands_for_disambiguation ... @@ -139,39 +176,23 @@ ____ pattern <<- condition ->> replacement # message <<- condition ->> suggestion # message - <<- condition - ~>> text_rewriting + <<- condition ~>> text_rewriting <<- =>> disambiguation ____ pattern <<- condition ->> replacement # message - -## Comments ## - -Lines beginning with # are comments. - - -## End of file ## - -With the command: - - #END - -at the beginning of a line, the compiler won’t go further. -Whatever is written after will be considered as comments. - ## Whitespaces at the border of patterns or suggestions ## Example: Recognize double or more spaces and suggests a single space: ____ " +" <<- ->> " " # Extra space(s). -ASCII " characters protect spaces in the pattern and in the replacement text. +Characters `"` protect spaces in the pattern and in the replacement text. ## Pattern groups and back references ## It is usually useful to retrieve parts of the matched pattern. We simply use @@ -187,10 +208,22 @@ Example. Back reference in messages. (fooo) bar <<- ->> foo # “\1” should be: + +## Pattern matching ## + +Repeating pattern matching of a single rule continues after the previous matching, so +instead of general multiword patterns, like + + (\w+) (\w+) <<- some_check(\1, \2) ->> \1, \2 # foo + +use + + (\w+) <<- some_check(\1, word(1)) ->> \1, # foo + ## Name definitions ## Grammalecte supports name definitions to simplify the description of the complex rules. @@ -300,14 +333,74 @@ You can also call Python expressions. __[s]__ Mr. ([a-z]\w+) <<- ~1>> =\1.upper() +# Text preprocessing and multi-passes checking # + +On each pass, Lightproof uses rules written in the text preprocessor to modify +internally the text before checking the text. + +The text preprocessor is useful to simplify texts and write simplier checking +rules. + +For example, sentences with the same grammar mistake: + + These “cats” are black. + These cats are “black”. + These cats are absolutely black. + These stupid “cats” are all black. + These unknown cats are as per usual black. + +Instead of writting complex rules or several rules to find mistakes for all possible +cases, you can use the text preprocessor to simplify the text. + +To remove the chars “”, write: + + [“”] ->> * + +The * means: replace text by whitespaces. + +Similarly to grammar rules, you can add conditions: + + \w+ly <<- morph(\0, "adverb") ->> * + +You can also remove a group reference: + + these (\w+) (\w+) <<- morph(\1, "adjective") and morph(\2, "noun") -1>> * + (am|are|is|were|was) (all) <<- -2>> * + +With these rules, you get the following sentences: + + These cats are black. + These cats are black . + These cats are black. + These cats are black. + These cats are black. + +These grammar mistakes can be detected with one simple rule: + + these +(\w+) +are +(\w+s) + <<- morph(\1, "noun") and morph(\2, "plural") + -2>> _ # Adjectives are invariable. + +Instead of replacing text with whitespaces, you can replace text with @. + + https?://\S+ ->> @ + +This is useful if at first pass you write rules to check successive whitespaces. +@ are automatically removed at the second pass. + +You can also replace any text as you wish. + + Mister <<- ->> Mr + (Mrs?)[.] <<- ->> \1 + # Disambiguation # -When Grammalecte analyses a word with morph or morphex, before requesting the +When Grammalecte analyses a word with morph, before requesting the POS tags to the dictionary, it checks if there is a stored marker for the position where the word is. If there is a marker, Grammalecte uses the stored data and don’t make request to the dictionary. The disambiguation commands store POS tags at the position of a word. @@ -321,33 +414,28 @@ `exclude(n, pattern)` > stores at position n the POS tags of the word, except those matching the pattern. -`define(n, definition)` +`define(n, [definitions])` -> stores at position n the POS tags in definition. +> stores at position n the POS tags in definitions (a list of strings). Examples: =>> select(\1, "po:noun is:pl") =>> exclude(\1, "po:verb") - =>> define(\1, "po:adv") - =>> exclude(\1, "po:verb") and define(\2, "po:adv") and select(\3, "po:adv") + =>> define(\1, ["po:adv"]) + =>> exclude(\1, "po:verb") and define(\2, ["po:adv"]) and select(\3, "po:adv") Note: select, exclude and define ALWAYS return True. If select and exclude generate an empty list, no marker is set. -With define, you can set a list of POS tags. Example: - - define(\1, "po:nom is:plur|po:adj is:sing|po:adv") - -This will store a list of tags at the position of the first group: - - ["po:nom is:plur", "po:adj is:sing", "po:adv"] - +With define, you must set a list of POS tags. Example: + + define(\1, ["po:nom is:plur", "po:adj is:sing", "po:adv"]) # Conditions # Conditions are Python expressions, they must return a value, which will be @@ -389,30 +477,31 @@ `textarea(regex[, neg_regex])` > checks if the full text of the checked area (paragraph or sentence) matches the regex. -`morph(n, regex[, strict=True][, noword=False])` +`morph(n, regex[, neg_regex][, no_word=False])` + +> checks if all tags of the word in group n match the regex. +> if neg_regex = "*", returns True only if all morphologies match the regex. +> if there is no word at position n, returns the value of no_word. + +`analyse(n, regex[, neg_regex][, no_word=False])` > checks if all tags of the word in group n match the regex. -> if strict = False, returns True only if one of tags matches the regex. -> if there is no word at position n, returns the value of noword. - -`morphex(n, regex, neg_regex[, noword=False])` - -> checks if one of the tags of the word in group n match the regex and -> if no tags matches the neg_regex. -> if there is no word at position n, returns the value of noword. +> if neg_regex = "*", returns True only if all morphologies match the regex. +> if there is no word at position n, returns the value of no_word. + `option(option_name)` > returns True if option_name is activated else False Note: the analysis is done on the preprocessed text. -## Default variables ## +# Default variables # `sCountry` > It contains the current country locale of the checked paragraph. @@ -420,98 +509,57 @@ # Expressions in the suggestions # -Suggestions (and warning messages) started by an equal sign are Python string expressions +Suggestions started by an equal sign are Python string expressions extended with possible back references and named definitions: Example: - foo\w+ ->> = '"' + \0.upper() + '"' # With uppercase letters and quoation marks - -All words beginning with "foo" will be recognized, and the suggestion is -the uppercase form of the string with ASCII quoation marks: eg. foom ->> "FOOM". - - - - -//////////////////////////////// OLD /////////////////////////////////////// - -= Text preprocessing and multi-passes checking = - -On each pass, Lightproof uses rules written in the text preprocessor to modify -internally the text before checking the text. - -The text preprocessor is useful to simplify texts and write simplier checking -rules. - -For example, sentences with the same grammar mistake: - - These “cats” are blacks. - These cats are “blacks”. - These cats are absolutely blacks. - These stupid “cats” are all blacks. - These unknown cats are as per usual blacks. - -Instead of writting complex rules or several rules to find mistakes for all possible -cases, you can use the text preprocessor to simplify the text. - -To remove the chars “”, write: - - [“”] ->> * - -The * means: replace text by whitespaces. - -Similarly to grammar rules, you can add conditions: - - \w+ly <<- morph(\0, "adverb") ->> * - -You can also remove a group reference: - - these (\w+) (\w+) <<- morph(\1, "adjective") and morph(\2, "noun") -1>> * - (am|are|is|were|was) (all) <<- -2>> * - -With these rules, you get the following sentences: - - These cats are blacks. - These cats are blacks . - These cats are blacks. - These cats are blacks. - These cats are blacks. - -These grammar mistakes can be detected with one simple rule: - - these +(\w+) +are +(\w+s) - <<- morph(\1, "noun") and morph(\2, "plural") - -2>> _ # Adjectives are invariable. - -Instead of replacing text with whitespaces, you can replace text with @. - - https?://\S+ ->> @ - -This is useful if at first pass you write rules to check successive whitespaces. -@ are automatically removed at the second pass. - -You can also replace any text as you wish. - - Mister <<- ->> Mr - (Mrs?)[.] <<- ->> \1 - - - -With the multi-passes checking and the text preprocessor, it is advised to -remove or simplify the text which has been checked on the previous pass. - - - -== Pattern matching == - -Repeating pattern matching of a single rule continues after the previous matching, so -instead of general multiword patterns, like - -(\w+) (\w+) <<- some_check(\1, \2) ->> \1, \2 # foo - -use - -(\w+) <<- some_check(\1, word(1)) ->> \1, # foo + <<- ->> = '"' + \1.upper() + '"' # With uppercase letters and quotation marks + + +# Token rules + +Token rules must be defined within a graph. + +## Tokens + +Tokens can be defined in several ways: + +* Value (meaning the text of the token). Examples: `word`, ``, ``, `,`. +* Lemma: `>lemma`. +* Regex: `~pattern`, `~pattern¬antipattern`. +* Regex on morphologies: `@pattern`, `@pattern¬antipattern`. +* Tags: `/tag`. +* Metatags: *NAME. Examples: `*WORD`, `*NUM`, `*SIGN`, etc. + +Selection of tokens: `[token1|token2|>lemma1|>lemma2|~pattern1|@pattern1|…]` + +Conditional token: `?token¿` + +Conditional selection of token: `?[token1|token2|…]¿` + +## Token references + +Positive references are defined by a positive integer `>= 1`. Examples: \1, \2, \3, etc. +If there is at least one token set between parenthesis, these numbers refer to tokens between parenthesis, ignoring all others. +If there is no token between parenthesis, these numbers refer to tokens found in order defined by the rule triggered. + +Negative references are defined by a negative integer `<= -1`. Examples: \-1, \-2, \-3, etc. +These numbers refer to the tokens beginning by the last one found by the rule triggered. + +Examples: + + tokens: alpha beta gamma delta epsilon + positive refs: 1 2 3 4 5 + negative refs: -5 -4 -3 -2 -1 + + tokens: alpha (beta) gamma (delta) epsilon + positive refs: 1 2 + negative refs: -5 -4 -3 -2 -1 + + tokens: alpha (beta) ?gamma¿ (delta) epsilon + positive refs: 1 2 + negative refs: (-4/-5) (-3/-4) (-3/none) -2 -1 Index: gc_lang/fr/data/phonet_simil.txt ================================================================== --- gc_lang/fr/data/phonet_simil.txt +++ gc_lang/fr/data/phonet_simil.txt @@ -198,10 +198,11 @@ convergeant convergent convergents convoi convois convoie convoies convoient cool cools coule coules coulent coq coqs coque coques coke cokes cor cors corps +cornée cornées corner cornet cornets coron corons corromps corrompt corset corsets corser corsé cote cotes cotent côte côtes cotte cottes côté côtés coter cou cous coût coûts cout couts coup coups coud couds @@ -515,10 +516,11 @@ navigant navigants naviguant nécessité nécessités nécessiter négligeant négligent négligents ni nid nids nie nies nient niais niait niaient +nichée nichées nicher nichet nichets nô nos noix noie noies noient noua nouas nom noms non nome nomes nomme nommes nomment notre nôtre nôtres 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 @@ -41,15 +41,15 @@ if (tTags) { // we get the tense let aTense = new Set(); for (let sMorph of _oSpellChecker.getMorph(sFlex)) { let m; - let zVerb = new RegExp (">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K))", "g"); + let zVerb = new RegExp (">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P|Q))", "g"); while ((m = zVerb.exec(sMorph)) !== null) { // stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer) if (m) { - if (m[1] === ":Y") { + if (m[1] === ":Y" || m[1] == ":Q") { aTense.add(":Ip"); aTense.add(":Iq"); aTense.add(":Is"); } else if (m[1] === ":P") { aTense.add(":Ip"); Index: gc_lang/fr/modules/gce_suggestions.py ================================================================== --- gc_lang/fr/modules/gce_suggestions.py +++ gc_lang/fr/modules/gce_suggestions.py @@ -28,14 +28,14 @@ tTags = conj._getTags(sStem) if tTags: # we get the tense aTense = set() for sMorph in _oSpellChecker.getMorph(sFlex): - for m in re.finditer(">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P))", sMorph): + for m in re.finditer(">"+sStem+"/.*?(:(?:Y|I[pqsf]|S[pq]|K|P|Q))", sMorph): # stem must be used in regex to prevent confusion between different verbs (e.g. sauras has 2 stems: savoir and saurer) if m: - if m.group(1) == ":Y": + if m.group(1) == ":Y" or m.group(1) == ":Q": aTense.add(":Ip") aTense.add(":Iq") aTense.add(":Is") elif m.group(1) == ":P": aTense.add(":Ip") Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -739,11 +739,11 @@ !! !!!! Ponctuation de fin de paragraphe !! !! !! -__[i>/poncfin__ +__[i>/poncfin(poncfin_règle1)__ ({w_1}) *$ @@0 <<- before("\\w+(?:\\.|[   ][!?]) +(?:[A-ZÉÈÎ]\\w+|[ÀÔ])") -1>> \1.|\1 !|\1 ? # Il semble manquer une ponctuation finale (s’il s’agit d’un titre, le point final n’est pas requis). TEST: __poncfin__ Vraiment. Quel {{ennui}} TEST: Internet : le nouvel eldorado @@ -766,18 +766,19 @@ ({w_1})( mais)(?= (?:j[e’]|tu|ils?|nous|vous|elles?|on)\b) @@0,$ <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais # Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445 __[i>/virg(virgule_manquante_avant_donc)__ ({w_1})( donc)(?= (?:j[e’]|tu|ils?|elles?|on)\b) @@0,$ - <<- not morph(\1, ":V") -2>> , donc + <<- not morph(\1, ":[VG]") -2>> , donc # Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448 TEST: Un chien, un chat{{ etc.}} ->> , etc. TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit. ->> , car TEST: Je suis fatigué{{ mais}} il a joué toute la nuit. ->> , mais TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire. ->> , donc TEST: il s’est donc tu +TEST: Chacun peut l’entendre d’une manière différente et donc on se demande bien ce qui est mesuré dans les réponses. __/virg(virgule_point_fin_dialogue)__ ([.] » )[a-zéà] @@0 <<- -1>> " », | » " # Ou il faut une virgule (exemple : « Je viens », dit-il). Ou le point est superflu. Ou il faut une majuscule sur le mot suivant. __/virg(virgule_fin_dialogue)__ @@ -1839,11 +1840,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’|") and not value(\2, "|a|fut|fût|") =>> exclude(\2, ":V") + <<- not value(<1, "|l’|") and not value(\2, "|a|fut|fût|") 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 @@ -1860,24 +1861,30 @@ en peine <<- =>> exclude(\2, ":V") par *WORD - <<- =>> exclude(\2, ":V[123]") + <<- =>> exclude(\2, ":[123][sp]") plein [de|d’] @:[AN] <<- not morph(<1, ":V0e") =>> =define(\1, [":G"]) + tout feu ?,¿ tout >flamme + <<- ~>> ␣ + <<- =>> define(\1, [":A:e:i"]) + très *WORD <<- =>> exclude(\2, ":[123][sp]") TEST: il s’agit d’{{un}} {{anagramme}} TEST: nul ne sait qui arriva à ce pauvre Paul surpris par la pluie. TEST: elle finit par être très fière de son fils. TEST: en tant que président du conseil TEST: les bac +2 sont trop nombreux. TEST: c’est à n’y plus rien comprendre. +TEST: Elle était tout feu, tout flamme. +TEST: Ses rencards finissent par devenir lassants !!! !!! @@ -2017,11 +2024,11 @@ __inte_verbes_composés_interrogatifs_impératifs__ ~\w-[nN]ous$ <<- /inte/ morphVC(\1, ":V", ":(?:1p|E:2[sp])") ->> =suggVerb(\1, ":1p", None, True) # Forme interrogative ou impérative incorrecte. - <<- /inte/ __else__ and morphVC(\1, ":", ":V|>chez/") ->> =suggSimil(\1, ":1p", False, True) # Forme interrogative ou impérative incorrecte. + <<- /inte/ __else__ and morphVC(\1, ":", ":V|>(?:chez|malgré)/") ->> =suggSimil(\1, ":1p", False, True) # Forme interrogative ou impérative incorrecte. <<- />> -nous|VCint ~\w-[vV]ous$ <<- /inte/ morphVC(\1, ":V", ":2p") ->> =suggVerb(\1, ":2p", None, True) # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel. <<- /inte/ __else__ and morphVC(\1, ":", ":V|>chez/") ->> =suggSimil(\1, ":2p", False, True) # Forme interrogative ou impérative. Désaccord avec “vous”. Le verbe n’est pas à la 2ᵉ personne du pluriel. @@ -2032,10 +2039,11 @@ TEST: {{Attaquait-vous}} ->> Attaquiez-vous TEST: Elle a de nombreux rendez-vous ce matin. TEST: êtes-vous là ? TEST: C’est notre chez-nous. TEST: Dans votre chez-vous, faites comme bon vous semble. +TEST: Libérée en grande majorité durant l’automne 1945, une partie des « Malgré-nous » passe pourtant plusieurs années supplémentaires en captivité. __inte_rendez_vous__ ne [le|la|les] [lui|leur] rendez-vous ne me [le|la|les] rendez-vous @@ -2153,10 +2161,14 @@ <<- morph(<1, ":D.*:[mp]") ~>> ␣ <<- __also__ =>> define(\1, [":N:m:i"]) __immunités__ + il y a + il n’ y a + <<- %-1>> + à l’ arrache <<- %3>> à ce point en tout point @@ -3209,14 +3221,18 @@ TEST: {{franco américaine}} ->> franco-américaine TEST: l’{{israélo belge}} __tu_préfixe_xxxo__ - [électro|ferro|hydro|labio|macro|magnéto|médico|micro|nano|néo|neuro|paléo|physico|politico|rétro|rhino|sino|socio|stéréo] *WORD + [macro|magnéto|micro|paléo|rétro|rhino|stéréo] *WORD <<- /tu/ analyse_with_next(\1, "-", ":") ->> \1-\2 # S’il s’agit d’un seul mot, il manque un trait d’union. + [électro|ferro|hydro|labio|médico|nano|néo|neuro|physico|politico|sino|socio] *WORD + <<- /tu/ space_after(\1, 1, 1) and (morph(\2, ":N") or analyse_with_next(\1, "-", ":")) + ->> \1-\2 # S’il s’agit d’un seul mot, il manque un trait d’union. + TEST: {{ferro électrique}} ->> ferro-électrique TEST: {{rétro ingénierie}}. ->> rétro-ingénierie __tu_préfixe_divers__ @@ -3406,10 +3422,17 @@ <<- /tu/ ->> quelques-\2 # Il manque un trait d’union. [plus|moins] [value|values] <<- /tu/ ->> \1-\2 # Il manque un trait d’union. + ras le bol + <<- /tu/ morph(<1, ":D") ->> ras-le-bol # Il manque des traits d’union. + + ras-le bol + ras le-bol + <<- /tu/ ->> ras-le-bol # Il manque un trait d’union. + rez de >chaussée <<- /tu/ ->> rez-de-chaussée # Il manque un trait d’union. science fiction <<- /tu/ ->> science-fiction # Il manque un trait d’union. @@ -3902,12 +3925,12 @@ [quels|quelles] [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on] <<- /conf/ not \1.isupper() and not \2.isupper() and not value(<1, "|tels|telles|") -2>> =suggSimil(\2, ":[NA].*:[pi]", True) # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder. - des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on] - <<- /conf/ not \1.isupper() -2>> =suggSimil(\2, ":[NA].*:[pi]", True) # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder. + des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|elle|elles|nous|vous|on|ceux|celles|celui|celle] + <<- /conf/ not \1.isupper() and not \2.isupper() -2>> =suggSimil(\2, ":[NA].*:[pi]", True) # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder. <<- /conf/ __also__ -1>> de # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder. TEST: {{Ces}} {{cette}} canaille qui nous a donné tant de fil à retordre. TEST: Mon {{il}} est une merveille. TEST: je ne sais {{des}} {{ses}} choses. @@ -4602,17 +4625,17 @@ on ?[ne|n’]¿ [le|la|l’|les] [lui|leur|en|y] @:¬:(?:V|Ov) on ?[ne|n’]¿ [lui|leur] en @:¬:(?:V|Ov) <<- /conf/ not morph(<1, ":3s") and not value(<1, "|n’|m’|t’|s’|") --1>> =suggSimil(\-1, ":(?:3s|Ov)", False) # Incohérence avec “\1” : “\-1” devrait être un verbe, un pronom objet, un adverbe de négation, etc. -TEST: il {{et}} parti. -TEST: il nous {{et}} indispensable. -TEST: Il ne {{travail}} pas le week-end. -TEST: il m’{{arête}} encore une fois avec une impudence insupportable. -TEST: il n’y {{pas}} beaucoup d’entente entre eux. -TEST: il est normal de ne presque pas payer des gens qui effectuent un travail -TEST: il s’en va. +TEST: on {{et}} parti. +TEST: on nous {{et}} indispensable. +TEST: on ne {{travail}} pas le week-end. +TEST: on m’{{arête}} encore une fois avec une impudence insupportable. +TEST: on n’y {{pas}} beaucoup d’entente entre eux. +TEST: on est normal de ne presque pas payer des gens qui effectuent un travail +TEST: on s’en va. __conj_ce__ [ce|c’] @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:N|A|3s|P|Q|Ov) [ce|c’] [ne|n’] @>(?:devoir|devenir|pouvoir|vouloir|savoir)/:V¬:(?:3s|P|Ov) @@ -4676,17 +4699,31 @@ TEST: il {{c’}}accoutumait à sa nouvelle fonction. TEST: elle {{c’}}anime dès qu’on fait du bruit. TEST: {{s’}}{{avait}} fonctionné TEST: c’était merveilleux. + +__conf_ce_qui_verbe__ + ce qui ?[lui|leur|leurs|nous|vous]¿ (et) ?@:[WX]¿ ?@:[WX]¿ @:(?:[AQD]|V1.*:Y) + <<- -1>> est # Confusion probable : “et” est une conjonction de coordination. Pour le verbe “être”, écrivez “est”. + + ce qui ?[lui|leur|leurs|nous|vous]¿ (étai) ?@:[WX]¿ ?@:[WX]¿ @:(?:[AQD]|V1.*:Y) + <<- -1>> était # Confusion probable : “étai” est un nom commun. Pour le verbe “être”, écrivez “était”. + +TEST: ce qui {{et}} beau. +TEST: ce qui {{étai}} notre lot. +TEST: ce qui lui {{étai}} propre +TEST: ce qui nous {{et}} pas vraiment utile + __conj_mieux_vaut__ mieux ?[ne|n’]¿ [vaux|valais|valus|vaudras|vaudrais] <<- /conj/ --1>> =\-1[:-1]+"t" # Conjugaison erronée. Accord avec “mieux” : utilisez la 3ᵉ personne du singulier. TEST: avec toi qui ne sais rien de rien, mieux {{vaux}} ne rien dire. TEST: Mais là-bas mieux {{valais}} ouvrir sa gueule que se taire. + ## 1pl __conj_nous__ nous @:V¬:(?:G|Y|P|1p|3[sp]) @@ -4979,10 +5016,27 @@ TEST: mes supérieurs et moi-même avons pris la décision de ne pas vendre TEST: Ni lui ni moi n’avions mangé TEST: Mon épouse et moi-même avons toujours dit TEST: que vous ou moi ignorions à peu près tout du boson de Higgs n’a pas du tout le même sens + +# Confusion futur / conditionnel +__vmode_je_futur__ + ([demain|oui|non]) ?,¿ [je|j’] ?[ne|n’]¿ ?y¿ (*WORD) ?@:[WX]¿ ?@:[WX]¿ + ([demain|oui|non]) ?,¿ [je|j’] ?[ne|n’]¿ ?y¿ (*WORD) ?@:[WX]¿ ?@:[WX]¿ + || [le|la|l’|les|un|une|des|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leur|leurs|quelques|plusieurs|certains|certaines] *WORD + <<- /vmode/ morph(\2, ":K:1s", ">(?:aimer|vouloir)/") -2>> =\2[:-1] + # Confusion possible. Le mot “\1” semble indiquer une certitude. Dans ce cas, “\2” devrait être conjugué au futur, non au conditionnel. + +TEST: demain, je {{viendrais}} ->> viendrai +TEST: non, je n’{{irais}} pas là-bas ! ->> irai +TEST: oui, j’y {{penserais}}… ->> penserai +TEST: oui, je le voudrais. +TEST: oui, je l’aimerais. +TEST: oui, je la prendrais pour femme si ça ne tenait qu’à moi. + + !! !! !!!! Confusions générales !! !! @@ -5213,20 +5267,21 @@ #### Divers __ppas_lui_verbe__ lui ~é(?:es?|s)$ - <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":V0a") + <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":(?:V0a|R)") -2>> =suggVerbInfi(\2)+"|"+suggVerbPpas(\2, ":m:s") # Incohérence probable. Soit il faut un participe passé masculin singulier, soit un verbe à l’infinitif. lui aussi ~é(?:es?|s)$ - <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":V0a") -2>> =suggVerbPpas(\2, ":m:s") # Incohérence probable. Il faut vraisemblement un participe passé masculin singulier. + <<- /ppas/ morph(\2, ":Q") and not morph(<1, ":(?:V0a|R)") -2>> =suggVerbPpas(\2, ":m:s") # Incohérence probable. Il faut vraisemblement un participe passé masculin singulier. TEST: lui {{mangée}} beaucoup. TEST: L’homme qui s’approchait de lui voulait le surprendre. TEST: avec Paul, lui aussi éliminé. TEST: les études qu’il a lui terminées avec bien du mal. +TEST: cette déclaration fut selon lui rédigée par des imbéciles. __conf_presque_vconj__ presque @:[123][sp]¬:[GNAQWM] <<- /conf/ not tag_before(\1, "ce_que") and not value(<1, "|ou|") -2>> _ # Incohérence probable avec “presque” : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe. @@ -5345,13 +5400,15 @@ <<- /conf/ -1>> a # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. qui à @:Q¬:M <<- /conf/ \3.islower() -2>> a # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. - qui [lui|leur|nous|vous|y] à + qui [lui|nous|vous|y] à <<- /conf/ -3>> a # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. + [leur|leurs] à + <<- /conf/ not morph(<1, ":D") --1>> a # Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. à le @:[NAQ].*:[me]¬:(?:Y|Oo) <<- /conf/ -1:2>> a le|au # Confusion. Ou vous confondez “à” (préposition) avec “a” (avoir), ou vous devez employer “au”. Exemple : _à_ midi, il _a_ pris son déjeuner _au_ restaurant. @@ -5401,10 +5458,11 @@ TEST: Il ne nous reste plus qu’{{à}} {{vérifié}} si votre maquette. TEST: Je veux {{à}} {{mangé}}. TEST: Ne pas hésiter {{à}} {{demandé}} des conseils. TEST: cette femme, dans son délire, {{à}} {{jetez}} son argent à la poubelle. TEST: Ce que cet homme à {{devient}} aujourd’hui notre problème +TEST: le peuple leur {{à}} donner tort TEST: il en a. TEST: elle en a. TEST: celle qui à contrario nous a foutu dans la merde. TEST: ceux qui à Somewhere se sont si mal illustrés. TEST: en à peine vingt ans @@ -5664,11 +5722,11 @@ a huis clos a intervalles [réguliers|irréguliers] a juste [raison|titre] a l’ heure actuelle a l’ heure qu’ il est - a l’ [accoutumée|amiable|arrache|avance|avenir|avenant|aveuglette|emporte-pièce|évidence|improviste|inverse] + a l’ [accoutumée|amiable|arrache|avance|avenir|avenant|aveuglette|emporte-pièce|évidence|extérieur|improviste|intérieur|inverse] a l’ air libre a l’ exclusion de toute autre chose a l’ ordre du jour a l’ œil nu a l’ en croire @@ -5817,10 +5875,11 @@ >arme a >feu >bombe a [eau|fragmentation|retardement] [>canne|>cane] a [>pêche|>sucre] >caisse a >outil >chair a [pâté|>canon] + >couteau a cran d’ arrêt >crayon a [lèvres|sourcils] >cuillère a [café|soupe] >fard a paupières [>fille|fils] a [papa|maman] >gaz a effet de serre @@ -6059,11 +6118,11 @@ # ça / çà / sa __conf_ça_çà_sa__ ça @:[NAQ].*:f¬:(?:G|P|[123][sp])|>seule?s?/ - <<- /conf/ -1>> sa # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte). + <<- /conf/ not morph(<1, ">appeler/") -1>> sa # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte). sa @:G¬>(?:tr(?:ès|op)|peu|bien|plus|moins|toute|presque)/|:[NAQ].*:f <<- /conf/ not (\2 == "ou" and value(>1, "|son|ses|")) -1>> ça # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte). sa [n’|m’|t’|s’|j’|l’|d’|qu’|lorsqu’|puisqu’|quoiqu’] @@ -6086,10 +6145,11 @@ TEST: Elle parle comme {{ça}} mère. ->> sa TEST: C’est comme {{sa}}. TEST: {{sa}} l’ennuierait, ce fils de pute, de dire bonjour ? TEST: il faut s’y prendre comme {{sa}} TEST: on fait {{sa}} lorsqu’on a tout perdu +TEST: Eux, ils appellent ça routine. TEST: avec sa presque belle-mère TEST: sa toute nouvelle application de synchronisation de fichiers TEST: communiquer avec sa ou son partenaire. @@ -6596,10 +6656,20 @@ TEST: J’en veux un différent. TEST: Il en veut des différents. TEST: dans ses différents ouvrages TEST: dans ses différents postes gouvernementaux + +# dites / dîtes +__conf_dites_dîtes__ + *WORD dîtes @:A¬:G + <<- /conf/ morph(\1, ":[NA].*:[fe]:[pi]", ":G") -2>> dites # Confusion probable : “dîtes” est une forme verbale de dire au subjonctif. Pour l’ajectif, écrivez “dites”. + +TEST: Des armes {{dîtes}} létales. ->> dites +TEST: usage débridé des armes dites létales +TEST: Vous dîtes “idiotes”, je dis “originales”. + # dû / du __ppas_dû_du__ du [à|a|au|aux] <<- /ppas/ \2.islower() -1>> dû # Confusion. Ce qui est dû. @@ -6641,10 +6711,19 @@ [>être|>rester|>demeurer] an [contradiction|désaccord|accord] <<- /conf/ -2>> en # Confusion. Un an = une année. Pour la préposition, écrivez “en”. TEST: Je suis {{an}} désaccord avec lui. + +# en dessous +__conf_dessus_dessous__ + en dessus + en-dessus + <<- ->> en dessous|au-dessus # Confusion.|https://fr.wiktionary.org/wiki/en_dessous + +TEST: Il est {{en dessus}} de tout. + # en général __conf_en_général__ 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 @@ -7247,11 +7326,11 @@ ~-ont$ <<- /conf/ ->> =\1[:-1] # Incohérence : “ont” est une forme conjuguée du verbe “avoir” (par exemple: “ils ont”). Pour le pronom personnel, écrivez “on”. [|,] *WORD ont - <<- /conf/ space_after(\2, 1, 1) and morph(\2, ":3s") -2:3>> \2-on + <<- /conf/ space_after(\2, 1, 1) and not value(\2, "|soit|") and morph(\2, ":3s") -2:3>> \2-on # Confusion probable : “ont” est une forme conjuguée du verbe “avoir”. Pour le pronom personnel, écrivez “on” et mettez un trait d’union puisqu’il s’agit d’une question. TEST: {{ont}} m’assure qu’il n’y en a pas. TEST: {{Ont}} n’arrive pas à s’en sortir. TEST: {{Ont}} ne sait jamais quoi faire @@ -7271,10 +7350,11 @@ TEST: les politiques de l’offre ont échoué. TEST: qui on blâme, ce soir ? TEST: qui n’ont somme toute que le désir de vivre paisiblement TEST: ces textes, quoi qu’on en pense, ont force de loi. TEST: s’ils n’ont ne serait-ce qu’un peu de jugeotte, on ne les reverra plus. +TEST: En français, la plupart des noms de métier traditionnellement masculins soit ne disposent pas d’une forme féminine, soit ont des formes féminines anciennes tombées en désuétude. # ou / où __conf_où_ou__ Ou @:3[sp]¬:Y @@ -7558,17 +7638,22 @@ <<- /conf/ -3>> près # Confusion probable. Locution “à la \2 près”. au >mètre [>prêt|>pré] <<- /conf/ -3>> près # Confusion probable. Locution “au \2 près”. + à [ceci|cela] ([prêt|prêts]) [que|qu’] + , à [ceci|cela] ([prêt|prêts]) , + <<- /conf/ -1>> près # Confusion probable. Locution “à \2 près”.|https://fr.wiktionary.org/wiki/%C3%A0_cela_pr%C3%A8s + TEST: depuis {{prêt}} de 15 ans TEST: ils se sont approchés très {{prêts}}. TEST: Je suis si {{prêt}} d’y arriver. TEST: Elle est si {{prêt}} de la trouver. TEST: Il est {{près}} à les aider TEST: Elle va regarder ça de plus {{prêt}}. TEST: Il était rasé de {{prés}} +TEST: Il est un peu fantasque ; mais, à cela {{prêt}}, c’est un aimable homme. TEST: Il a obtenu un prêt de Patrick TEST: Il a obtenu un prêt de Le Drian TEST: collait au millimètre près à la réalité @@ -8233,16 +8318,17 @@ TEST: ce {{vert}} quoi nous allons, c’est une catastrophe à l’échelle planétaire. # voix / voie / vois / voit __conf_voie_voix_vois_voit__ - à haute [voie|vois|voit] - de vive [voie|vois|voit] - <<- /conf/ -3>> voix # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie + à haute [>voie|vois|voit] + de vive [>voie|vois|voit] + à portée de [>voie|vois|voit] + <<- /conf/ --1>> voix # Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|http://fr.wiktionary.org/wiki/voix - à [voie|vois|voit] [basse|haute] - <<- /conf/ -2>> voix # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie + à [>voie|vois|voit] [basse|haute|basses|hautes] + <<- /conf/ -2>> voix # Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|http://fr.wiktionary.org/wiki/voix sur la bonne voix <<- /conf/ -4>> voie # Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|http://fr.wiktionary.org/wiki/voie >ouvrir la voix [à|au|aux] @@ -8272,11 +8358,11 @@ __conf_voir_voire__ voir [grand|petit|rouge] <<- %2>> voir @:A¬:[NGM] - <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|vouloir|préférer|de|à)/") + <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|vouloir|préférer|faire|de|à)/") and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$") -1>> voire # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez “voire”.|https://fr.wiktionary.org/wiki/voire [comme|lorque|puisque|quand|que|quoique|si] (voire) [ni|et|par|pour|sans] (voire) @@ -8302,23 +8388,26 @@ TEST: il y en a peu, voire très peu. TEST: car elles pénètrent dans les poumons voire le système sanguin. TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants. TEST: les membres de l’équipage commencent à voir flou TEST: un travail qu’il préfère voir effectué par un spécialiste plutôt que par lui-même +TEST: médicaments qui me donnent envie de vomir, qui m’abrutissent, qui me font voir flou # vieil / vieux __conf_vieil_vieux_euphonie__ vieux homme <<- /conf/ -1>> vieil # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie vieux ~^[aeéiîou] - <<- /conf/ morph(\2, ":[NA].*:[me]:s") -1>> vieil # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie + <<- /conf/ morph(\2, ":[NA].*:[me]:s", ":[123][sp]") + -1>> vieil # Euphonie. Utilisez “vieil” pour un nom masculin singulier commençant par une voyelle ou un h.|https://fr.wikipedia.org/wiki/Euphonie TEST: ce {{vieux}} homme TEST: c’est un {{vieux}} imbécile. TEST: Le {{vieux}} homme était parti. ->> vieil +TEST: Diviser les jeunes et les vieux est un peu son fonds de commerce # ayants droit @@ -8327,10 +8416,18 @@ <<- /sgpl/ -2:3>> ayants droit # Au singulier : “un ayant droit”. Au pluriel : “des ayants droit”. TEST: Comment lutter contre la cupidité des {{ayant droits}} # Note: À supprimer? Graphie qui tend vers la soudure et le pluriel régulier (ayant-droit(s)) + +# bien +__sgpl_très_bien__ + très biens + <<- /sgpl/ -2>> bien # Adverbe ou adjectif, “bien” est invariable.|https://fr.wiktionary.org/wiki/bien + +TEST: Très {{biens}} connus des services de police, il leur fut difficile de passer entre les mailles du filet. + # termes __sgpl_en_termes_de__ en terme [de|d’] <<- /sgpl/ -2>> termes # Dans la locution “en termes de”, mettez “terme” au pluriel. @@ -9265,11 +9362,11 @@ à plein [régime|temps|nez] à pleins poumons à plus forte raison à plus d’un titre à point nommé - à portée de [main|tir] + à portée de [main|tir|voix] à première vue à prix [cassé|modique|cassés|modiques] à proprement parler à qui de droit à qui mieux mieux @@ -9583,10 +9680,11 @@ de part et d’autre de ?presque¿ partout d’ un peu partout de petite taille de pied ferme + de place en place de plein [droit|fouet] de plus [belle|près] de premier [choix|ordre|plan] de première [catégorie|main|nécessité] de prime abord @@ -9961,10 +10059,11 @@ par-ci ?,¿ par-là par-derrière par-dessus le marché par-dessus tout par-devant + par instants par là parfois partant de là partout pas du tout @@ -10569,10 +10668,14 @@ pour autant [que|qu’] [ils|elles] sachent @¬:Y <<- ~1:5>> * pour cette raison [que|qu’] <<- ~1:3>> * + + pour les uns @:¬:[AQ].*:[me]:[pi] + pour les autres @:¬:[AQ].*:[pi] + <<- ~1:3>> * [le|un|ce|mon|ton|son] putain [de|d’] @:[NA].*:[me] <<- ~2:3>> * tambour battant @@ -10615,10 +10718,12 @@ >argent de poche >article de presse >attestation sur l’ honneur >attendre de pied ferme ayants droit + bas résille + >benne à >ordure >billet de *NUM [>euro|>dollar|>centime|>cent|>livre|>shilling] [>bisphénol|>bisphenol] A >blanche comme neige >blanche comme de la craie [>boîte|>boite] aux lettres @@ -10633,11 +10738,13 @@ >chemin de [traverse|fer] >chili con carne >claire comme de l’ eau de [boudin|roche|source] >claire comme du cristal >claire comme jus de [boudin|chaussette|chaussettes|chique] + [>clé|>clef] à molette >commise d’ office + >condamnée à mort >convention [récepteur|générateur] >conne comme la lune >conne comme un balai >conne comme une valise sans >poignée >coup [de|d’] [balai|bol|cœur|couteau|foudre|fil|grâce|jarnac|théâtre|coude|genou|main|patte|pied|poing|poker|pouce|tête|avance|éclat|État|œil|épaule] @@ -10645,10 +10752,11 @@ >course contre la montre [cousu|cousue|cousus|cousues] [main] [cousu|cousue|cousus|cousues] de fil blanc >crayon à [lèvres|sourcils] [>coût|>cout] de revient + >couteau à cran d’ arrêt >cuillère à [café|soupe] >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] @@ -10776,10 +10884,11 @@ bon chic ?,¿ bon genre [>clé|>clef] en >main dernier cri fleur bleue grand [public|luxe|maximum] + grande taille grandeur nature haut de gamme hautee [résolution|fidélité|tension] longue [distance|portée|durée] meilleur marché @@ -10789,19 +10898,20 @@ top secret vieux jeu open source Créative Commons pair à pair + petite taille plein les yeux pur [sucre|jus] terre à terre vieille école <<- morph(<1, ":(?:N|A|Q|W|V0e)", ":D") ~>> * __purge_couleurs__ - [beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet] [brillant|clair|fluo|foncé|irisé|mat|pâle|pastel|sombre|tendre|terne|vif] + [beige|blanc|bleu|brun|châtain|cyan|gris|jaune|magenta|marron|orange|pourpre|rose|rouge|vert|violet] [brillant|clair|fluo|foncé|irisé|mat|pâle|pastel|sale|sombre|tendre|terne|vif] <<- morph(<1, ":[NAQ]") ~>> * bleu [ciel|indigo|marine|roi|saphir|turquoise] blond platine gris [acier|anthracite|perle|souris] @@ -11210,14 +11320,16 @@ en [certaines|quelques|plusieurs] occasions @¬:A.*:[fe]:[pi] <<- ~1:3>> * en de multiples occasions @¬:A.*:[fe]:[pi] <<- ~1:4>> * + + en un sens @¬:A.*:[me]:[si] + <<- ~1:3>> * entre autres choses @¬:A.*:[fe]:[pi] <<- ~1:3>> * - [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies] @¬:A.*:[fe]:[pi] <<- ~1:2>> * de [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies] @¬:A.*:[fe]:[pi] @@ -11278,14 +11390,15 @@ >arriver à point nommé >arriver à bon port >battre en [brèche|retraite] >chauffer à blanc >compter à rebours + >condamner à mort >couler à ?grands¿ flots >demander [assistance|audience|conseil|pardon] [>donner|>redonner] sens - >faire [allusion|assaut|attention|chaud|confiance|compliqué|copain-copain|débat|défaut|demi-tour|envie|erreur|figure|froid|halte|honte|illusion|mouche|office|part|peur|plaisir|preuve|rage|scandale|sens|signe|volte-face] + >faire [allusion|assaut|attention|chaud|confiance|compliqué|copain-copain|débat|défaut|demi-tour|envie|erreur|figure|froid|halte|honte|illusion|mouche|office|part|peur|polémique|plaisir|preuve|rage|scandale|sens|signe|volte-face] >faire amende honorable >faire bande à part >faire bonne figure >faire chou blanc >faire copain copain @@ -11303,19 +11416,21 @@ >faire profil bas >faire salle comble >faire table rase >faire ce que bon [me|te|lui|nous|vous|leur] semble >foutre en l’ air + [>gonfler|>regonfler] à bloc >jouer franc jeu >lâcher prise >laisser pour compte >marcher à rebours - >mettre à [bas|jour|niveau|nu|plat|terre] - >mettre l’ [écart|épreuve] - >mettre au [point|pas] - >mettre en [avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre] + [>mettre|>remettre] à [bas|flot|jour|niveau|nu|plat|terre] + [>mettre|>remettre] l’ [écart|épreuve] + [>mettre|>remettre] au [point|pas] + [>mettre|>remettre] en [avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre] >mourir jeune + [>naître|>naitre] sous x >percer à jour >perdre [connaissance|conscience|raison] >perdre d’ avance >porter [atteinte|bonheur|caution|chance|malheur|plainte|préjudice|secours] >poser problème @@ -11339,28 +11454,28 @@ >tenir au courant >trier sur le volet >trouver refuge >tirer [avantage|profit] >tourner court - >venir je ne sais ?pas¿ ?trop¿ d’ où - >venir on ne sait ?pas¿ ?trop¿ d’ où + [>venir|>revenir] je ne sais ?pas¿ ?trop¿ d’ où + [>venir|>revenir] on ne sait ?pas¿ ?trop¿ d’ où <<- ~2:0>> * __conf_locutions_verbales__ >arriver a échéance >arriver a point nommé >arriver a bon port >chauffer a blanc - >gonfler a bloc - >mettre a [bas|>jour|>niveau|>nu|>nue|>plat|>terre] - >mettre a l’ [écart|épreuve] + [>gonfler|>regonfler] a bloc + [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>nue|>plat|>terre] + [>mettre|>remettre] a l’ [écart|épreuve] >percer a jour >prendre a la légère >saigner a blanc >tenir a distance - >venir a point + [>venir|>revenir] a point <<- /conf/ -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. >faire plaisirs <<- /sgpl/ -2>> plaisir # Faire plaisir : dans cette locution, “plaisir” doit être au singulier. <<- ~2>> * @@ -11503,10 +11618,14 @@ TEST: Défigurée, travestie, dans tous les cas contestée. TEST: Une file d’attente de plusieurs heures s’étire au rez-de-chaussée TEST: à une hausse des coûts de l’emprunt à court et moyen terme. TEST: Elle n’avait que rarement pris connaissance de ses droits. TEST: On ajoutera que si elle n’a que rarement pris la connerie pour objet +TEST: Les bas résille, le détail qui fait mouche. +TEST: un vice pour les uns diabolique et pour les autres patriarcal +TEST: Les gains sont en un sens maigres. +TEST: Des vêtements grande taille @@@@ @@@@ @@ -11645,20 +11764,21 @@ <<- /gn/ morph(\2, ":[NA].*:[si]", ":G") and morph(\3, ":[NA].*:p", ":[GWsi]") and not apposition(\2, \3) -3>> =suggMasSing(\3) # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au singulier. [et|ou] le *WORD *WORD <<- /gn/ morph(\2, ":D") and not morph(<1, ":[NA]") and not \4.startswith("seul") >>> - <<- /gn/ morph(\3, ":[NA].*:[me]", ":(?:B|G|V0|f)") and morph(\4, ":[NA].*:f", ":[GWme]") and not apposition(\3, \4) + <<- /gn/ morph(\3, ":[NA].*:[me]", ":(?:B|G|V0|f)") and morph(\4, ":[NA].*:f", "*") and not apposition(\3, \4) -4>> =suggMasSing(\4, True) # Accord de genre erroné : « \2 \3 » est masculin, « \4 » est féminin. <<- /gn/ morph(\3, ":[NA].*:[si]", ":G") and morph(\4, ":[NA].*:p", ":[GWsi]") and not apposition(\4, \4) -4>> =suggMasSing(\4) # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au singulier. TEST: le test très {{cons}} qu’on a passé hier. TEST: c’était le chien {{perdue}} des voisins. TEST: viens vite ou le pari {{imperdables}} sera moins facile… TEST: Le bruit {{perçus}} par les voisins. TEST: si le premier film est un triomphe, le deuxième est un demi-succès, et le troisième une déception. +TEST: Cela aboutira sur une contractualisation coûteuse pour organiser cette divergence d’intérêts, et le gestionnaire aura le dernier mot. __gn_la_1m__ , la *WORD <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -2>> le # Accord de genre erroné : « \3 » est masculin. @@ -11791,18 +11911,41 @@ <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> aucune # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. TEST: aucun {{accords}} n’y changera rien. +TEST: {{aucun}} femme ne réagirait si bêtement + __gn_aucune_1m__ aucune *WORD <<- /gn/ morph(\2, ":[NA].*:m", ":[efGW]") -1>> aucun # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. TEST: aucune {{passions}} n’est digne qu’on meurt pour elle. +TEST: {{aucune}} homme ne comprendrait ça + + +__gn_nul_1m__ + nul *WORD + <<- /gn/ morph(\2, ":[NA].*:f", ":[GWme]") -1>> nulle # Accord de genre erroné : « \2 » est féminin. + <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. + <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. + +TEST: nul {{accords}} n’y changera rien. +TEST: {{nul}} femme ne réagirait si bêtement + + +__gn_nulle_1m__ + nulle *WORD + <<- /gn/ morph(\2, ":[NA].*:m", ":[efGW]") -1>> nul # Accord de genre erroné : « \2 » est masculin. + <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. + <<- /gn/ morph(\2, ":[NA].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. + +TEST: nulle {{passions}} n’est digne qu’on meurt pour elle. +TEST: {{nulle}} homme ne comprendrait ça __gn_un_1m__ un *WORD <<- /gn/ morph(\2, ":[NA].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une # Accord de genre erroné : « \2 » est féminin. @@ -11837,10 +11980,11 @@ TEST: Une {{cinglées}} ->> cinglée TEST: {{une}} des {{chats}} TEST: {{une}} kyste ->> un TEST: {{une}} des {{joueurs}} TEST: mille et une merveilles +TEST: Quatorze heures découpées en quatre parties, une sortant en salles chaque semaine ## un / une __gn_un_2m__ un *WORD *WORD @@ -12134,10 +12278,11 @@ TEST: les pitres {{imbécile}} TEST: il faut en convenir et les femmes {{oubliés}} seront satisfaites. TEST: et les femmes {{retrouvés}} seront emmenées à l’hôpital. TEST: les moins éloignées possible +TEST: Les besoins minimums en matière de sommeil sont-ils les mêmes d’un individu à l’autre ? __gn_leurs_1m__ leurs *WORD <<- /gn/ (morph(\2, ":[NA].*:s", ":(?:[ipGW]|[123][sp])") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]"))) @@ -12495,11 +12640,11 @@ __gn_det_groupe_de_1m__ [un|une|le|la|ce|cette|mon|ton|son|ma|ta|sa|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques] [>centaine|>millier|>million|>milliard|>dizaine|>douzaine|>multitude|>horde] [de|d’] *WORD <<- /gn/ morph(\4, ":[NA].*:s", ":[ip]|>fraude/") or \4 in aREGULARPLURAL - -4>> =suggPlur(\4) # Avec \1 « \2 \3 \4 », mettre au pluriel “\4” s’il y en a bien plusieurs. + -4>> =suggPlur(\4) # Avec \1 « \2 \3… », mettre au pluriel “\4” s’il y en a bien plusieurs. TEST: des centaines de {{bête}} à cornes passèrent devant nous. ->> bêtes TEST: une multitude d’{{homme}} ->> hommes TEST: les 80 milliards de fraude fiscale @@ -12534,24 +12679,26 @@ mille *WORD <<- /gn/ (morph(\2, ":[NA].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|") -2>> =suggPlur(\2) # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. -TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS. -TEST: Il a abandonné neuf {{enfant}}. -TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts. +TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS. ->> idiots +TEST: Il a abandonné neuf {{enfant}}. ->> enfants +TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts. ->> travailleurs +TEST: Il y a quatre cents {{mot}} dans la phrase. ->> mots TEST: un logement neuf bâti par des professionnels. TEST: un mille marin. TEST: L’article VII mentionné dans la revue __gn_nombre_chiffres_1m__ [0|1|01] @:[NAQ].*:p¬* - <<- /gn/ not value(\2, "|Rois|Corinthiens|Thessaloniciens|") -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » devrait être au singulier. + <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|") + -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » devrait être au singulier. *NUM *WORD - <<- /gn/ not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N") + <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N") and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")) or \1 in aREGULARPLURAL ) -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. TEST: 00 heure, 01 heure @@ -12558,10 +12705,12 @@ TEST: il a adopté 1 {{chiens}}. TEST: 22 {{heure}} TEST: 3 {{heure}} TEST: les élèves sont inquiets après une année 2018 compliquée et riche en réformes. TEST: ils gagneront 300 € maximum. +TEST: il revint en 2005 complètement dévoré par la culpabilité. +TEST: un jeu de 1980 absolument démodé. ## trouver ça/ceci/cela + adj __gn_trouver_ça_adj__ >trouver [ça|cela|ceci] @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M) @@ -14300,10 +14449,29 @@ TEST: où {{et}} cet ennemi ? TEST: où {{et}} l’homme qui est passé ce matin ? TEST: Je veux savoir où et quand, où et pouquoi. TEST: où et avec qui ? + +__conf_été_était__ + [le|ce|cet|mon|ton|son|notre|votre|leur|du|quel] *WORD >été + <<- /conf/ morph(\2, ":N.*:m:[si]", ":[AWG]") and morph(<1, ":Cs||>,") --1>> était + # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “était”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord. + + [la|cette|mon|ton|son|ma|ta|sa|notre|votre|leur|quelle] *WORD >été + <<- /conf/ morph(\2, ":N.*:f:[si]", ":[AWG]") and morph(<1, ":Cs||>,") --1>> était + # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “était”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord. + + [les|des|ces|mes|tes|ces|nos|vos|leurs|quelques|plusieurs|certains|certaines|quels|quelles] *WORD >été + <<- /conf/ morph(\2, ":N.*:[pi]", ":[AWG]") and morph(<1, ":Cs||>,") --1>> étaient + # Confusion possible. Si “\1 \2” est le sujet d’“\3”, écrivez “étaient”. L’été est la saison estivale allant de juin à septembre dans l’hémisphère Nord. + +TEST: Ce mec {{été}} un connard fini. ->> était +TEST: Quelle solution {{été}} à notre portée ? ->> était +TEST: Les questions {{étés}} incompréhensibles. ->> étaient +TEST: Le bel été indien que nous avons cette année. + # faim / fin __conf_faim_fin__ >avoir (>fin) [>rester|>demeurer] sur [ma|ta|sa|notre|votre|leur|leurs] (>fin) @@ -15244,23 +15412,26 @@ TEST: la pression entre les membres à un moment devient trop importante __infi_de_verbe__ [de|d’] [le|la|l’|leur|les] @:V¬:[YNAM]|>(?:lui|plus)/ - [|,] [de|d’] [nous|vous|lui] @:V¬[YE]|>(?:lui|plus)/ + [|,] [de|d’] [nous|vous|lui] @:V¬:[YE]|>(?:lui|plus)/ <<- /infi/ \-1.islower() --1>> =suggVerbInfi(\-1) # Erreur probable. Après “de”, le verbe devrait être à l’infinitif. [de|d’] [ne|n’|en|me|m’|te|t’|se|s’|y] @:V¬:Y|>(?:lui|plus)/ [de|d’] [ne|n’] [le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y] @:V¬:Y|>(?:lui|plus)/ [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] [de|d’] ?[nous|vous|le|la|l’|les|leur]¿ @:V1.*:Q + <<- /infi/ --1>> =suggVerbInfi(\-1) # 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?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)") + and not before("(?i)\\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|points? +$|rien(?: +[a-zéèêâîûù]+|) +$)") -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. @@ -15273,18 +15444,20 @@ 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: 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 TEST: un libéralisme trop « individualiste » s’est transformé en de supposées demandes de droits spécifiques TEST: soit 40 % de plus comparé au quinquennat précédent TEST: On passe de sophistiqué à classique. TEST: Les « événements » d’il y a cinquante ans n’ont sans doute « rien à voir » avec le mouvement des « gilets jaunes » +TEST: Quelques points de gagnés avec cette astuce, ne faisons pas la fine bouche. __infi_y_verbe!3__ y ~ée?s?$ <<- /infi/ morph(\2, ":V", ":[123][sp]") -2>> _ # Le verbe ne devrait pas être un participe passé. @@ -15326,11 +15499,11 @@ <<- /infi/ morph(\2, ":Q") and not morph(<1, "V0.*[12]p") -2>> _ # Après “\1”, le verbe ne devrait pas être un participe passé. TEST: Nous {{intéressé}} à la question ne suffit pas à faire de nous des experts. TEST: nous {{ridiculisé}} TEST: vous {{mangé}} -TEST: Sommes nous désespérés à ce point ? +TEST: Sommes-nous désespérés à ce point ? __infi_devoir_savoir_pouvoir_interrogatif__ /VCint ?[pas|jamais]¿ ?[en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿ *WORD <<- /infi/ morphVC(\1, ">(?:devoir|savoir|pouvoir|vouloir)/") and morph(\-1, ":(?:Q|A|[123][sp])", ":[GYW]") @@ -16168,10 +16341,13 @@ <<- %4>> [ce|ça|ceci|cela|c’|ç’] >être >seule [que|qu’] [ce|ça|ceci|cela|c’|ç’] >être @:[AQ].*:f¬:[GWYme] @:N.*:f <<- %3>> + + tout en étant @:A + <<- %4>> ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]) [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]] ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru] [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]] ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler]) [devenu|redevenu|resté|demeuré] [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:f¬:[GWYme]] ([il|ce|c’|ç’|quiconque]) ?[ne|n’]¿ ?[en|y]¿ @@ -16296,10 +16472,12 @@ TEST: C’eût été pure imagination. TEST: Je n’arrêtais pas de me répéter que tout cela était peut-être pure imagination TEST: La femme qui faisait ça est partie. TEST: De cela a toujours été faite notre vie TEST: Ce sont différents types de violences +TEST: La littérature africaine s’ouvre au monde, parle au monde, tout en étant ancrée dans le continent. +TEST: pour « faire de la politique avec leur député » sans « faire de travail pour l’Union européenne », mais tout en étant payés par elle. __ppas_3sg_fem_verbe_état__ ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]) [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]] ([elle|celle-ci|celle-là]) ?[ne|n’]¿ ?[en|y]¿ (>avoir) [été|semblé|paru] [@:[NA].*:p¬:[GWYsi]|@:[AQ].*:m¬:[GWYfe]] @@ -16536,12 +16714,12 @@ __ppas_avoir_été__ >avoir été *WORD <<- /ppas/ morph(\3, ":[123]s", ":[GNAQWY]") -3>> =suggVerbPpas(\3) # Après “avoir été”, il faut un participe passé. <<- /ppas/ not before("[çcCÇ]’$|[cC]e n’$|[çÇ]a (?:n’|)$") and not before("(?i)^ *ne pas ") and not morph(<1, ":Y") >>> - <<- /ppas/ morph(\3, ":Y", ":A") -1:2>> _ # Tournure familière. Utilisez “être allé” plutôt que “avoir été”. - <<- /ppas/ morph(\3, ":V1..t.*:Y", ":A") -3>> =suggVerbPpas(\3) # Incohérence. Après “avoir été”, il faut un participe passé (à moins que “avoir été” signifie ici “être allé”). + <<- /ppas/ morph(\3, ":Y", ":[AN]") -1:2>> _ # Tournure familière. Utilisez “être allé” plutôt que “avoir été”. + <<- /ppas/ morph(\3, ":V1..t.*:Y", ":[AN]") -3>> =suggVerbPpas(\3) # Incohérence. Après “avoir été”, il faut un participe passé (à moins que “avoir été” signifie ici “être allé”). TEST: j’ai été {{instruis}} par elle TEST: avoir été {{prit}} par surprise TEST: Ils {{ont été}} {{réaliser}} à partir d’éléments naturels. TEST: J’{{ai été}} camper dans les Alpes. @@ -16551,10 +16729,11 @@ TEST: Ç’eût été prendre des vessies pour des lanternes. TEST: C’eût été foncer tête baissée dans la gueule du loup. TEST: Leur passe-temps, ça a été faire n’importe quoi. TEST: Ne pas ressortir le livre le plus remarqué de la collaboration aurait été faire acte de censure. TEST: Partir aurait été assurer sa survie. +TEST: J’ai été conseiller régional !!!! Participes passés: accord en nombre avec la conjugaison de « être » (et équivalent) !! @@ -16654,11 +16833,11 @@ || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir]) || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD [|,|@:Cs] [un|le|ce|cet] (*WORD) ?qui¿ ?[ne|n’]¿ || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir]) || avoir [été|semblé|paru] *WORD - <<- /ppas/ morph(\1, ":[NA].*:m", ":[GWfe]") and morph(\-1, ":A.*:f", ":[GWme]") and morph(\2, ":[123]s") + <<- /ppas/ morph(\1, ":[NA].*:[me]", ":[GWf]") and morph(\-1, ":A.*:f", ":[GWme]") and morph(\2, ":[123]s") --1>> =switchGender(\-1) # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre. [|,|@:Cs] [une|la|ma|ta|sa|cette] (*WORD) ?qui¿ ?[ne|n’]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]) *WORD [|,|@:Cs] [une|la|ma|ta|sa|cette] (*WORD) ?qui¿ ?[ne|n’]¿ (>avoir) [été|semblé|paru] *WORD [|,|@:Cs] [une|la|ma|ta|sa|cette] (*WORD) ?qui¿ ?[ne|n’]¿ ([>être|>sembler]) [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD @@ -16669,11 +16848,11 @@ || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir]) || être [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD [|,|@:Cs] [une|la|ma|ta|sa|cette] (*WORD) ?qui¿ ?[ne|n’]¿ || ([>adorer|>affirmer|>aimer|>croire|>déclarer|>désirer|>détester|>devoir|>dire|>estimer|>imaginer|>paraître|>paraitre|>penser|>pouvoir|>préférer|>risquer|>savoir|>sembler|>souhaiter|>vouloir]) || avoir [été|semblé|paru] *WORD - <<- /ppas/ morph(\1, ":[NA].*:f", ":[GWme]") and morph(\-1, ":A.*:m", ":[GWfe]") and morph(\2, ":[123]s") + <<- /ppas/ morph(\1, ":[NA].*:[fe]", ":[GWm]") and morph(\-1, ":A.*:m", ":[GWfe]") and morph(\2, ":[123]s") --1>> =switchGender(\-1) # Accord erroné : “\1” et “\-1” ne sont pas accordés en genre. [|,|@:Cs] [l’|mon|ton|son|notre|votre|leur] (*WORD) ?qui¿ ?[ne|n’]¿ ([>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre]) *WORD [|,|@:Cs] [l’|mon|ton|son|notre|votre|leur] (*WORD) ?qui¿ ?[ne|n’]¿ (>avoir) [été|semblé|paru] *WORD [|,|@:Cs] [l’|mon|ton|son|notre|votre|leur] (*WORD) ?qui¿ ?[ne|n’]¿ ([>être|>sembler]) [devenu|redevenu|resté|demeuré|devenue|redevenue|restée|demeurée] *WORD @@ -16712,10 +16891,11 @@ TEST: les hommes ne sont pas tout à fait {{fâché}} ->> fâchés TEST: les enfants ne sont pas {{content}} TEST: les réunions sans cesse reportées sont {{annulés}} TEST: l’avenir de la région était {{suspendue}} TEST: il prétendait que les banques universelles « à la française » s’{{était}} très honorablement comportées +TEST: Ma mémoire a aussi été {{effacé}}. __ppas_nom_propre_être_accord_genre__ [|,|@:Cs] (@M) ?qui¿ ?[ne|n’]¿ [>être|>sembler|>devenir|>rester|>demeurer|>redevenir|>paraître|>paraitre] *WORD [|,|@:Cs] (@M) ?qui¿ ?[ne|n’]¿ (>avoir) [été|semblé|paru] *WORD @@ -17185,15 +17365,22 @@ <<- %3>> __ppas_pronom_avoir__ [je|j’|tu|il|elle|on|ils|elles|et|qui] ?[ne|n’]¿ ?[lui|leur]¿ >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|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 \-1.islower() 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 + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + and value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") + and \-1.islower() 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 + + [je|j’|tu|il|elle|on|ils|elles|et|qui] ?[ne|n’]¿ en >avoir *WORD + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + and value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") + and \-1.islower() and morph(\-1, ":(?:[123][sp])", ":[GWQ]") + --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 TEST: ils leur avaient {{donnés}} du fil à retordre. ->> donné TEST: il a {{affronte}} une bande de voleurs de bétail ->> affronté TEST: J’ai {{mettrai}} du sel. ->> mis TEST: J’ai {{lut}} son journal. ->> lu @@ -17204,10 +17391,11 @@ TEST: ils avaient, en ce temps-là, déjà {{perdus}} leurs illusions ->> perdu TEST: Ils ont à plusieurs reprises {{perdus}} leur sang-froid. ->> perdu TEST: Elle avait {{pose}} son tricot ->> posé TEST: qui ont {{refuse}} de se soumettre ->> refusé TEST: il a {{suffit}} de le pousser un peu ->> suffi +TEST: il en a toujours {{était}} ainsi ->> été TEST: Ils avaient barre sur lui. __ppas_nous_vous_avoir__ [nous|vous] ?[ne|n’]¿ ?[lui|leur]¿ >avoir *WORD @@ -17282,10 +17470,11 @@ TEST: ils l’avaient {{retrouvés}}. TEST: Vous l’avez {{trouvez}}. ->> trouvé TEST: Nous l’avons {{mangés}}. TEST: Nous l’avons {{mangées}}. TEST: Ils ne me l’ont pas {{donnés}} +TEST: il faillit agir, mais l’ayant {{remarqués}}, il passa son chemin. __ppas_m_t_avoir__ [m’|t’] >avoir @:V[0-3]..t_.*:Q.*:p¬:[GWsi] <<- /ppas/ not before("(?i)\\bqu(?:e |’)") -3>> =suggSing(\3) @@ -18611,20 +18800,25 @@ TEST: {{vient elle}} souvent ? 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__ +__inte_union_nous!6__ [|,] ~ons$ nous <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GW]") and morph(>1, ":||,", ":1p") -2:3>> \2-nous # Forme interrogative ? Mettez un trait d’union. + [|,] sommes nous + <<- /inte/ space_after(\2, 1, 1) + -2:3>> \2-nous # Forme interrogative ? Mettez un trait d’union. + *WORD ~ons$ nous <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:1p", ":[GNW]") and not morph(\1, ":Os") and morph(>1, ":||,", ":(?:Y|1p)") -2:3>> \2-nous # Forme interrogative ? Mettez un trait d’union. TEST: {{retrouverons nous}} enfin la tranquilité ? +TEST: Ne {{sommes nous}} pas des dieux ? __inte_union_vous__ [|,] ~..e[zs]$ vous <<- /inte/ space_after(\2, 1, 1) and morph(\2, ":V.*:2p", ":[GW]") and morph(>1, ":||,", ":2p") @@ -18810,10 +19004,13 @@ __ppas_être__ ne [pas|jamais] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p) <<- /ppas/ --1>> =suggVerbPpas(\-1) # Après “ne \2 être”, il faut un participe passé. + avoir [pu|cru|pensé|imaginé] être @:(?:V(?:1.*:Y|2.*:Ip.*:3s|3.*:Is.*:3s)|2p) + <<- /ppas/ not value(<1, "|l’|") and not tag_before("que") --1>> =suggVerbPpas(\-1) # Après le verbe “être”, il faut un participe passé. + >être ~..er$ <<- /ppas/ not tag(\2, "upron") and morph(\1, ":V", ":Q|>(?:soit)/") and (morph(\2, ":Y", ":[NAQ]") or \2 in aSHOULDBEVERB) and not morph(<1, ":Y|>ce") and not value(<1, "|c’|") and not tag_before(\1, "ce_que") and not tag_before(\1, "suj_vinfi") -2>> =suggVerbPpas(\2) # Après “être”, le verbe ne devrait pas être à l’infinitif. @@ -18911,25 +19108,37 @@ TEST: Il voulut punir quiconque s’y {{adonnaient}}. TEST: quiconque issu de la gauche n’a aucune chance. __conj_ce_celui_celle_qui__ - [ce|celui|celle] qui @:V¬:(?:3s|P|Q|G) + [ce|celui] qui @:V¬:(?:3s|P|Q|G) + <<- /conj/ -3>> =suggVerb(\3, ":3s") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier. + + celle qui @:V¬:(?:3s|P|Q|G) <<- /conj/ -3>> =suggVerb(\3, ":3s") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier. + <<- /conj/ morph(\3, ":[123]p") -1>> celles # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au pluriel. TEST: Ce qui, la plupart du temps, {{donnes}} des maux de tête. TEST: Ce qui {{fâchent}} mes amis. TEST: celui qui {{pensent}} mal de toute chose +TEST: {{celle}} qui y {{parviendront}} seront récompensées. __conj_3sg_misc__ - [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|celle-ci|celle-là|quelqu’un|quelqu’une] @:V¬:(?:3s|P|Q|G|M|3p!) - <<- /conj/ not morph(<1, ":[VR]") - -2>> =suggVerb(\2, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|quelqu’un|quelqu’une] @:V¬:(?:3s|P|Q|G|M|3p!) + <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. - [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|celle-ci|celle-là|quelqu’un|quelqu’une] qui @:V¬:(?:3s|P|Q|G|M|3p!) - <<- /conj/ -3>> =suggVerb(\3, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + [celle-ci|celle-là] @:V¬:(?:3s|P|Q|G|M|3p!) + <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + <<- /conj/ __also__ and morph(\2, ":[123]p") -1>> =\1.replace("e-", "es-").replace("E-", "ES-") # Conjugaison erronée. Accord avec “\2”. Le sujet devrait être au pluriel. + + [ça|chacun|chacune|ceci|cela|celui-ci|celui-là|quelqu’un|quelqu’une] qui @:V¬:(?:3s|P|Q|G|M|3p!) + <<- /conj/ -3>> =suggVerb(\3, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + + [celle-ci|celle-là] qui @:V¬:(?:3s|P|Q|G|M|3p!) + <<- /conj/ -3>> =suggVerb(\3, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + <<- /conj/ morph(\3, ":[123]p") -1>> =\1.replace("e-", "es-").replace("E-", "ES-") # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au pluriel. l’ [un|une] @:V¬:(?:3s|P|Q|G|M|3p!) quelque chose @:V¬:(?:3s|P|Q|G|M|3p!) n’importe [qui|quoi] @:V¬:(?:3s|P|Q|G|M|3p!) <<- /conj/ not morph(<1, ":[VR]") @@ -18941,10 +19150,11 @@ <<- /conj/ --1>> =suggVerb(\-1, ":3s") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du singulier. TEST: chacun {{fais}} comme il peut TEST: quelqu’un {{sauras}} TEST: quelqu’une se {{montrent}} désagréable +TEST: {{celle-ci}} {{deviennent}} plus fortes avec le temps. TEST: n’importe quoi {{peux}} réussir TEST: n’importe qui {{peux}} y arriver. TEST: quelque chose {{sens}} mauvais ici TEST: l’un d’eux {{viendras}} TEST: ce {{dois}} être ennuyeux @@ -19016,19 +19226,31 @@ TEST: qui n’ont rien appris et rien oublié TEST: comme si son pays n’avait rien appris du fascisme ni rien reçu de l’Europe __conj_nul_nulle__ - [nul|nulle] ?qui¿ @:V¬:(?:3s|P|G|N.*:[si]) - <<- /conj/ morph(<1, ":C", ":(?:Y|P|Q|[123][sp]|R)") + [nul|nulle] ?@:[NA]¿ ?qui¿ @:V¬:(?:3s|P|G|N.*:[si]) + <<- /conj/ morph(<1, ":Cs||>,", ":(?:Y|P|Q|[123][sp]|R)") + --1>> =suggVerb(\-1, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. + +TEST: nul ne {{savaient}} que faire +TEST: nulle n’{{iront}} là-bas +TEST: nulle femme ne {{sauraient}} le faire +TEST: nul homme ne {{sauraient}} s’y prendre +TEST: nulle partie du corps ne peut être considérée comme le siège de l’âme. + + +__conj_aucun_aucune__ + [aucun|aucune] ?@:[NA]¿ ?qui¿ @:V¬:(?:3s|P|G|N.*:[si]) + <<- /conj/ morph(<1, ":Cs||>,", ":(?:Y|P|Q|[123][sp]|R)") --1>> =suggVerb(\-1, ":3s") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. -TEST: nul ne {{sais}} que faire -TEST: nulle n’{{iras}} là-bas -TEST: nulle femme ne {{saurais}} le faire -TEST: nul homme ne {{sauras}} s’y prendre -TEST: nulle partie du corps ne peut être considérée comme le siège de l’âme. +TEST: aucun ne {{savaient}} que faire +TEST: aucune n’{{iront}} là-bas +TEST: aucune femme ne {{sauraient}} le faire +TEST: aucun homme ne {{sauraient}} s’y prendre +TEST: aucune partie du corps ne peut être considérée comme le siège de l’âme. __conj_vinfi_suj__ [|,] @:Y @:V¬:(?:3s|P|Q.*:[me]:[si]|Y|G|3p!|M) <<- /conj/ not (value(\2, "|croire|être|devenir|redevenir|voir|sembler|paraître|paraitre|sentir|rester|retrouver|") and morph(\3, ":A")) @@ -19193,26 +19415,38 @@ TEST: L’expérience sensible qu’il nous restera bientôt d’elles est à peu près TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes. __conj_ceux_celles_qui__ - [ceux|celles] qui @:V¬:(?:3p|P|G) + ceux qui @:V¬:(?:3p|P|G) + <<- /conj/ -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel. + + celles qui @:V¬:(?:3p|P|G) <<- /conj/ -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel. + <<- /conj/ morph(\3, ":[123]s") -1>> celle # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au singulier. TEST: Ceux qui {{chante}} toute la journée… -TEST: Celles qui {{pense}}. +TEST: {{Celles}} qui {{pense}}. __conj_ceux_là_celles_ci__ - [ceux-ci|ceux-là|celles-ci|celles-là] @:V¬:(?:3p|P|Q|G|M) + [ceux-ci|ceux-là] @:V¬:(?:3p|P|Q|G|M) + <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. + + [celles-ci|celles-là] @:V¬:(?:3p|P|Q|G|M) <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. + <<- /conj/ __also__ and morph(\2, ":[123]s") -1>> =\1.replace("s", "").replace("S", "") # Conjugaison erronée. Accord avec “\2”. Le sujet devrait être au singulier. - [ceux-ci|ceux-là|celles-ci|celles-là] qui @:V¬:(?:3p|P|Q|G|M) + [ceux-ci|ceux-là] qui @:V¬:(?:3p|P|Q|G|M) + <<- /conj/ -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel. + + [celles-ci|celles-là] qui @:V¬:(?:3p|P|Q|G|M) <<- /conj/ -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2”. Le verbe devrait être à la 3ᵉ personne du pluriel. + <<- /conj/ morph(\3, ":[123]s") -1>> =\1.replace("s", "").replace("S", "") # Conjugaison erronée. Accord avec “\3”. Le sujet devrait être au singulier. TEST: ceux-là {{devienne}} des ratés -TEST: celles-ci qui {{semble}} avoir tout pour réussir. +TEST: {{celles-ci}} qui {{semble}} avoir tout pour réussir. __conj_lesquels_lesquelles__ [lesquels|lesquelles] @:V¬:(?:3p|P|Y|Q|G|M) <<- /conj/ not morph(<1, ":[VR]") -2>> =suggVerb(\2, ":3p") # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. @@ -19430,15 +19664,17 @@ # 3pl __conj_nom_propre_et_nom_propre__ ~^[A-ZÉÈ] et ~^[A-ZÉÈ] @:[123][sp]¬:(?:G|3p|P|Q.*:[pi]) - <<- /conj/ morph(\1, ":M") and morph(\3, ":M") and not morph(<1, ":R|>(?:des?|du|et|ou|ni)/") - -4>> =suggVerb(\4, ":3p") # Conjugaison erronée. Accord avec “\1 et \2”. Le verbe devrait être à la 3ᵉ personne du pluriel. + <<- /conj/ morph(\1, ":M") and morph(\3, ":M") and not morph(<1, ":[RV]|>(?:des?|du|et|ou|ni)/") + -4>> =suggVerb(\4, ":3p") # Conjugaison erronée. Accord avec “\1 et \3”. Le verbe devrait être à la 3ᵉ personne du pluriel. TEST: Samantha et Eva {{viennes}} demain. TEST: Samantha et Eva leur {{décrive}} une leçon. +TEST: La relation spéciale qu’entretiennent Donald et Kim met paradoxalement en péril les discussions entre les deux pays. +TEST: La menace d’une guerre nucléaire entre Delhi et Islamabad plane toujours # on / ont __conf_ont!6__ ils on @@ -19600,10 +19836,11 @@ TEST: {{Ait-il}} arrivé à ses fins ? TEST: je n’{{avais}} pas parti avec eux. TEST: il {{avait}} parti. TEST: Avais-je partie liée avec lui ? +TEST: il n’y a pas mort d’homme, mais il y a mort de meuf. !! !! !!!! Modes verbaux !! @@ -19924,35 +20161,29 @@ !! !!! À trier !! TODO: Il faut au préalable avoir {{définit}} un protocole. -TODO: Il y a quatre cents {{mot}} dans la phrase. -TODO: Ma mémoire a aussi été {{effacé}}. TODO: Vous la {{voulait}} TODO: un délire systématisé de persécution basé sur des interprétations TODO: Soudain, surgit l’un des ouvriers… TODO: Ainsi périt l’inconstant. TODO: puis repartit. TODO: Les créatures de l’enfer que nous avions rencontrées… TODO: Étaient-ils vraiment frère et sœur TODO: Cela fait des années qu’elle n’a pas donné signe de vie. -TODO: Et si je te donne son nom, cela t’aiderait, Dworkin ? -TODO: cet être que personne n’a vu ni senti à part elle TODO: Ce qu’ils sont influence leur regard sur moi. TODO: Ils sont âgés de 4 et 1 ans. TODO: Mille neuf cent quatre-vingt. (dépend du contexte) -TODO: Le CAPES de mathématiques. TODO: La Mustang est une voiture. TODO: Il faut se bien connaître soi-même. TODO: C’est lui ou moi qui a gagné. TODO: Des copains plus vieux que moi qui fumaient. TODO: Des copains plus vieux que toi qui fumaient. TODO: André Juin était un sculpteur français. TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin. TODO: Les côtes sont dans leur ensemble extrêmement découpées. - !!! Indécidable !! TEST: Du sable fin grippe les rouages (accord avec ce qui précède). TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit). @@ -20030,10 +20261,18 @@ TEST: Celles de l’Institut sont plus perfectionnées TEST: Judith A. Allan a aussi constaté que les études sur les crises de la masculinité ne proposent pas ou que très rarement d’indicateurs pour déterminer si une société est (trop) féminisée et si les hommes sont (réellement) en crise. TEST: une procédure abusive pour fermer la porte qu’elles ont essayé d’ouvrir TEST: En France, les hauts fonctionnaires gagnent en moyenne 7850 euros net TEST: Il faut avoir du pouvoir et des ressources +TEST: Le con de jadis ne dérangeait personne, maintenant il répand sa haine et son inculture sur les réseaux sociaux. +TEST: Les hommes qui se servaient de lui espéraient l’amadouer… +TEST: Celui qui se servait de lui voulait lui donner une bonne leçon. +TEST: Le CAPES de mathématiques. +TEST: cet être que personne n’a vu ni senti à part elle +TEST: un délire systématisé de persécution basé sur des interprétations +TEST: Et si je te donne son nom, cela t’aiderait, Dworkin ? + !!! Tests historiques !! ## Version 0.5.14 @@ -23030,11 +23269,11 @@ TEST: Puis il la réveilla. Je tirai de ma poche un portefeuille : TEST: — Voici, ma chère cousine, ce que vous m’avez demandé ce matin. TEST: Elle fut tellement surprise que je n’osai pas insister. J’essayai cependant de ranimer sa mémoire, mais elle nia avec force, crut que je me moquais d’elle, et faillit, à la fin, se fâcher. TEST: Voilà ! je viens de rentrer ; et je n’ai pu déjeuner, tant cette expérience m’a bouleversé. TEST: 19 juillet. — Beaucoup de personnes à qui j’ai raconté cette aventure se sont moquées de moi. Je ne sais plus que penser. Le sage dit : Peut-être ? -TEST: 21 juillet. — J’{{ai été}} dîner à Bougival, puis j’ai passé la soirée au bal des canotiers. Décidément, tout dépend des lieux et des milieux. +TEST: 21 juillet. — J’ai été dîner à Bougival, puis j’ai passé la soirée au bal des canotiers. Décidément, tout dépend des lieux et des milieux. TEST: Croire au surnaturel dans l’île de la Grenouillère, serait le comble de la folie… mais au sommet du mont Saint-Michel ?… mais dans les Indes ? TEST: Nous subissons effroyablement l’influence de ce qui nous entoure. Je rentrerai chez moi la semaine prochaine. TEST: 30 juillet. — Je suis revenu dans ma maison depuis hier. Tout va bien. TEST: 2 août. — Rien de nouveau ; il fait un temps superbe. Je passe mes journées à regarder couler la Seine. TEST: 4 août. — Querelles parmi mes domestiques. Ils prétendent qu’on casse les verres, la nuit, dans les armoires. Index: gc_lang/fr/webext/content_scripts/init.js ================================================================== --- gc_lang/fr/webext/content_scripts/init.js +++ gc_lang/fr/webext/content_scripts/init.js @@ -102,10 +102,11 @@ } }, observePage: function () { // When a textarea is added via jascript we add the menu + let that = this; let that = this; this.xObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { for (let i = 0; i < mutation.addedNodes.length; i++){ if (mutation.addedNodes[i].tagName == "TEXTAREA") { Index: graphspell-js/char_player.js ================================================================== --- graphspell-js/char_player.js +++ graphspell-js/char_player.js @@ -27,11 +27,12 @@ ['ä', 'a'], ['ê', 'e'], ['í', 'i'], ['ó', 'o'], ['ü', 'u'], ['ý', 'i'], ['á', 'a'], ['ë', 'e'], ['ì', 'i'], ['ò', 'o'], ['ú', 'u'], ['ỳ', 'i'], ['ā', 'a'], ['ē', 'e'], ['ī', 'i'], ['ō', 'o'], ['ū', 'u'], ['ȳ', 'i'], ['ç', 'c'], ['ñ', 'n'], ['k', 'q'], ['w', 'v'], ['œ', 'oe'], ['æ', 'ae'], - ['ſ', 's'], ['ffi', 'ffi'], ['ffl', 'ffl'], ['ff', 'ff'], ['ſt', 'ft'], ['fi', 'fi'], ['fl', 'fl'], ['st', 'st'] + ['ſ', 's'], ['ffi', 'ffi'], ['ffl', 'ffl'], ['ff', 'ff'], ['ſt', 'ft'], ['fi', 'fi'], ['fl', 'fl'], ['st', 'st'], + ["⁰", "0"], ["¹", "1"], ["²", "2"], ["³", "3"], ["⁴", "4"], ["⁵", "5"], ["⁶", "6"], ["⁷", "7"], ["⁸", "8"], ["⁹", "9"] ]), simplifyWord: function (sWord) { // word simplication before calculating distance between words sWord = sWord.toLowerCase(); @@ -44,10 +45,22 @@ } i++; } return sNewWord.replace(/eau/g, "o").replace(/au/g, "o").replace(/ai/g, "ẽ").replace(/ei/g, "ẽ").replace(/ph/g, "f"); }, + + _xTransNumbersToExponent: new Map([ + ["0", "⁰"], ["1", "¹"], ["2", "²"], ["3", "³"], ["4", "⁴"], ["5", "⁵"], ["6", "⁶"], ["7", "⁷"], ["8", "⁸"], ["9", "⁹"] + ]), + + numbersToExponent: function (sWord) { + let sNewWord = ""; + for (let c of sWord) { + sNewWord += this._xTransNumbersToExponent.gl_get(c, c); + } + return sNewWord; + }, aVowel: new Set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ"), aConsonant: new Set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ"), aDouble: new Set("bcdfjklmnprstzBCDFJKLMNPRSTZ"), // letters that may be used twice successively Index: graphspell-js/ibdawg.js ================================================================== --- graphspell-js/ibdawg.js +++ graphspell-js/ibdawg.js @@ -343,10 +343,16 @@ //console.timeEnd("Suggestions for " + sWord); return aSugg; } _splitSuggest (oSuggResult, sWord) { + // split trailing numbers + let m = /^([a-zA-Zà-öÀ-Ö_ø-ÿØ-ßĀ-ʯfi-st][a-zA-Zà-öÀ-Ö_ø-ÿØ-ßĀ-ʯfi-st-]+)([0-9]+)$/.exec(sWord); + if (m) { + oSuggResult.addSugg(m[1] + " " + char_player.numbersToExponent(m[2])); + } + // split at apostrophes for (let cSplitter of "'’") { if (sWord.includes(cSplitter)) { let [sWord1, sWord2] = sWord.split(cSplitter, 2); if (this.isValid(sWord1) && this.isValid(sWord2)) { oSuggResult.addSugg(sWord1+" "+sWord2); @@ -364,11 +370,11 @@ for (let sTail of this._getTails(iAddr)) { oSuggResult.addSugg(sNewWord+sTail); } return; } - else if (this.isValid(sRemain) && oSuggResult.sWord.toLowerCase().startsWith(sNewWord.toLowerCase())) { + else if ( (sNewWord.length + sRemain.length == oSuggResult.sWord.length) && oSuggResult.sWord.toLowerCase().startsWith(sNewWord.toLowerCase()) && this.isValid(sRemain) ) { oSuggResult.addSugg(sNewWord+" "+sRemain); } } if (nDist > oSuggResult.nDistLimit) { return; Index: graphspell/char_player.py ================================================================== --- graphspell/char_player.py +++ graphspell/char_player.py @@ -23,10 +23,11 @@ 'á': 'a', 'ë': 'e', 'ì': 'i', 'ò': 'o', 'ú': 'u', 'ỳ': 'i', 'ā': 'a', 'ē': 'e', 'ī': 'i', 'ō': 'o', 'ū': 'u', 'ȳ': 'i', 'ç': 'c', 'ñ': 'n', 'k': 'q', 'w': 'v', 'œ': 'oe', 'æ': 'ae', 'ſ': 's', 'ffi': 'ffi', 'ffl': 'ffl', 'ff': 'ff', 'ſt': 'ft', 'fi': 'fi', 'fl': 'fl', 'st': 'st', + "⁰": "0", "¹": "1", "²": "2", "³": "3", "⁴": "4", "⁵": "5", "⁶": "6", "⁷": "7", "⁸": "8", "⁹": "9" }) def simplifyWord (sWord): "word simplication before calculating distance between words" sWord = sWord.lower().translate(_xTransCharsForSimplification) @@ -34,10 +35,18 @@ for i, c in enumerate(sWord, 1): if c == 'e' or c != sWord[i:i+1]: # exception for to avoid confusion between crée / créai sNewWord += c return sNewWord.replace("eau", "o").replace("au", "o").replace("ai", "ẽ").replace("ei", "ẽ").replace("ph", "f") + +_xTransNumbersToExponent = str.maketrans({ + "0": "⁰", "1": "¹", "2": "²", "3": "³", "4": "⁴", "5": "⁵", "6": "⁶", "7": "⁷", "8": "⁸", "9": "⁹" +}) + +def numbersToExponent (sWord): + return sWord.translate(_xTransNumbersToExponent) + aVowel = set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ") aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ") aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ") # letters that may be used twice successively Index: graphspell/ibdawg.py ================================================================== --- graphspell/ibdawg.py +++ graphspell/ibdawg.py @@ -312,10 +312,16 @@ # we add what we removed return list(map(lambda sSug: sPfx + sSug + sSfx, aSugg)) return aSugg def _splitSuggest (self, oSuggResult, sWord): + # split trailing numbers + m = re.match(r"(\D+)([0-9]+)$", sWord) + if m: + print("ok") + oSuggResult.addSugg(m.group(1) + " " + cp.numbersToExponent(m.group(2))) + # split at apostrophes for cSplitter in "'’": if cSplitter in sWord: sWord1, sWord2 = sWord.split(cSplitter, 1) if self.isValid(sWord1) and self.isValid(sWord2): oSuggResult.addSugg(sWord1+" "+sWord2) @@ -327,11 +333,11 @@ if not sRemain: oSuggResult.addSugg(sNewWord, nDeep) for sTail in self._getTails(iAddr): oSuggResult.addSugg(sNewWord+sTail, nDeep) return - elif self.isValid(sRemain) and oSuggResult.sWord.lower().startswith(sNewWord.lower()): + elif (len(sNewWord) + len(sRemain) == len(oSuggResult.sWord)) and oSuggResult.sWord.lower().startswith(sNewWord.lower()) and self.isValid(sRemain): oSuggResult.addSugg(sNewWord+" "+sRemain) if nDist > oSuggResult.nDistLimit: return cCurrent = sRemain[0:1] for cChar, jAddr in self._getCharArcs(iAddr): Index: misc/grammalecte.sublime-syntax ================================================================== --- misc/grammalecte.sublime-syntax +++ misc/grammalecte.sublime-syntax @@ -48,11 +48,11 @@ scope: keyword.python - match: '\b(?:True|False|None)\b' scope: constant.language - - match: '\b(?:spell|morph|morphex|morphVC|stem|value|space_after|textarea0?\w*|before0?\w*|after0?\w*|word|option|define|define_from|select|exclude|analyse\w+|tag_\w+|apposition|is[A-Z]\w+|rewriteSubject|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b' + - match: '\b(?:spell|morph|morphVC|stem|tag|value|space_after|textarea0?\w*|before0?\w*|after0?\w*|word|option|define|define_from|select|exclude|analyse\w*|tag_\w+|apposition|is[A-Z]\w+|rewriteSubject|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b' scope: entity.name.function - match: '\b(?:replace|endswith|startswith|search|upper|lower|capitalize|strip|rstrip|is(?:upper|lower|digit|title))\b' scope: support.function @@ -82,14 +82,14 @@ scope: rule.actionoption captures: 1: rule.optionname # Definitions and options - - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPTSOFTWARE:' + - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPT(?:SOFTWARE|COLORTHEME):|^COLOR/' scope: options.command - - match: '^OPT(?:LABEL|)/' + - match: '^OPT(?:LABEL|COLOR|)/' scope: options.parameter - match: '^DEF: ' scope: definition @@ -109,31 +109,31 @@ scope: keyword.action - match: '__also__' scope: keyword.condition.green - match: '__else__' scope: keyword.condition.red - - match: '-(\d*\.?(?::\.?\d+|))>>' + - match: '-(-?\d*\.?(?::\.?-?\d+|))(?::|)>>' scope: keyword.error captures: 1: keyword.error.group - - match: '~(\d*(?::\d+|))>>' + - match: '~(-?\d*(?::-?\d+|))>>' scope: keyword.textprocessor captures: 1: keyword.textprocessor.group - match: '=>>' scope: keyword.disambiguator - - match: '/(\d*(?::\d+|))>>' + - match: '/(-?\d*(?::-?\d+|))>>' scope: keyword.tag captures: 1: keyword.tag.group - - match: '%(\d*)>>' + - match: '%(-?\d*(?::-?\d+|))>>' scope: keyword.tag captures: 1: keyword.tag.group # Tokens - - match: '(>)\w+' + - match: '(>)[\w-]+' scope: string.lemma captures: 1: keyword.valid - match: '(~)(?!(?:\d+(?::\d+|)|)>>)[^\s¬]*' @@ -150,11 +150,11 @@ - match: '(/)[\w-]+' scope: string.tag captures: 1: keyword.valid - - match: '(?<=[\[ |])([*])([^\s¬]+)' + - match: '(?<=[^\w])([*][a-zA-Z0-9_]+)' scope: string.morph captures: 1: keyword.valid 2: string.meta @@ -169,11 +169,11 @@ - match: '<>' scope: string.jumptoken # Escaped chars - - match: '\\(?:\d+|w|d|b|n|s|t)' + - match: '\\(?:-?\d+|w|d|b|n|s|t)' scope: constant.character.escape # URL - match: '\| ?https?://[\w./%?&=#+-]+' scope: string.other @@ -200,11 +200,11 @@ # scope: punctuation.definition.string.end # pop: true line_comment: - meta_scope: comment.line - - match: '\\[0-9]+' + - match: '\\-?[0-9]+' scope: constant.character.escape - match: '\| ?https?://[\w./%?&=#+-]+' scope: string.other - match: $ pop: true