Overview
Comment: | [build][core] stricter building process, store URLs in a separate dictionary [fr] ajustements (rebuild necessary to avoid bug) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | fr | core | build |
Files: | files | file ages | folders |
SHA3-256: |
b543565245e6856413285320f3361df3 |
User & Date: | olr on 2020-04-22 04:33:29 |
Other Links: | manifest | tags |
Context
2020-04-22
| ||
06:20 | [build] new option: force rebuild + code clarification (Python f-strings) check-in: a3f82d3151 user: olr tags: trunk, build | |
04:33 | [build][core] stricter building process, store URLs in a separate dictionary [fr] ajustements (rebuild necessary to avoid bug) check-in: b543565245 user: olr tags: trunk, fr, core, build | |
2020-04-21
| ||
08:11 | [fr] ajustements check-in: 014e846ccc user: olr tags: trunk, fr, v1.9.0 | |
Changes
Modified compile_rules_graph.py from [53e75517b3] to [86b9b97d23].
︙ | ︙ | |||
97 98 99 100 101 102 103 104 105 106 107 108 109 110 | self.dDef = dDef self.dDecl = dDecl self.dOptPriority = dOptPriority self.dAntiPatterns = {} self.dActions = {} self.dFuncName = {} self.dFunctions = {} def _genTokenLines (self, sTokenLine): "tokenize a string and return a list of lines of tokens" lTokenLines = [] for sTokBlock in sTokenLine.split(): # replace merger characters by spaces if "␣" in sTokBlock: | > | 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | self.dDef = dDef self.dDecl = dDecl self.dOptPriority = dOptPriority self.dAntiPatterns = {} self.dActions = {} self.dFuncName = {} self.dFunctions = {} self.dURL = {} def _genTokenLines (self, sTokenLine): "tokenize a string and return a list of lines of tokens" lTokenLines = [] for sTokBlock in sTokenLine.split(): # replace merger characters by spaces if "␣" in sTokBlock: |
︙ | ︙ | |||
178 179 180 181 182 183 184 | else: lToken.append(sToken) return lToken def createGraphAndActions (self, lRuleLine): "create a graph as a dictionary with <lRuleLine>" fStartTimer = time.time() | | | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | else: lToken.append(sToken) return lToken def createGraphAndActions (self, lRuleLine): "create a graph as a dictionary with <lRuleLine>" fStartTimer = time.time() print("{:>8,} rules in {:<30} ".format(len(lRuleLine), f"<{self.sGraphName}|{self.sGraphCode}>"), end="") lPreparedRule = [] for i, sRuleName, sTokenLine, iActionBlock, lActions, nPriority in lRuleLine: for aRule in self.createRule(i, sRuleName, sTokenLine, iActionBlock, lActions, nPriority): lPreparedRule.append(aRule) # Debugging if False: print("\nRULES:") |
︙ | ︙ | |||
233 234 235 236 237 238 239 | iGroup += 1 dPos[iGroup] = i + 1 # we add 1, for we count tokens from 1 to n (not from 0) # Parse actions for iAction, (iActionLine, sAction) in enumerate(lActions, 1): sAction = sAction.strip() if sAction: | | | > > > > | | | 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 | iGroup += 1 dPos[iGroup] = i + 1 # we add 1, for we count tokens from 1 to n (not from 0) # Parse actions for iAction, (iActionLine, sAction) in enumerate(lActions, 1): sAction = sAction.strip() if sAction: sActionId = f"{self.sGraphCode}__{sRuleName}__b{iActionBlock}_a{iAction}" aAction = self.createAction(sActionId, sAction, nPriority, len(lToken), dPos, iActionLine) if aAction: sActionName = self.storeAction(sActionId, aAction) lResult = list(lToken) lResult.extend(["##"+str(iLine), sActionName]) #if iLine == 13341: # print(" ".join(lToken)) # print(sActionId, aAction) yield lResult else: print("# Error on action at line:", iLine) print(sTokenLine, "\n", lActions) exit() else: print("No action found for ", iActionLine) exit() def createAction (self, sActionId, sAction, nPriority, nToken, dPos, iActionLine): "create action rule as a list" sLineId = "#" + str(iActionLine) # Option sOption = False m = re.match("/(\\w+)/", sAction) if m: sOption = m.group(1) sAction = sAction[m.end():].strip() if nPriority == -1: nPriority = self.dOptPriority.get(sOption, 4) # valid action? m = re.search(r"(?P<action>[-=~/!>])(?P<start>-?\d+\.?|)(?P<end>:\.?-?\d+|)(?P<casing>:|)>>", sAction) if not m: print("\n# Error. No action found at: ", sLineId, sActionId) exit() # Condition sCondition = sAction[:m.start()].strip() if sCondition: sCondition = changeReferenceToken(sCondition, dPos) sCondition = self.createFunction("cond", sCondition) else: |
︙ | ︙ | |||
289 290 291 292 293 294 295 | cStartLimit = "<" cEndLimit = ">" if not m.group("start"): iStartAction = 1 iEndAction = 0 else: if cAction != "-" and (m.group("start").endswith(".") or m.group("end").startswith(":.")): | | | 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 | cStartLimit = "<" cEndLimit = ">" if not m.group("start"): iStartAction = 1 iEndAction = 0 else: if cAction != "-" and (m.group("start").endswith(".") or m.group("end").startswith(":.")): print("\n# Error. Wrong selection on tokens at: ", sLineId ,sActionId) return None if m.group("start").endswith("."): cStartLimit = ">" iStartAction = int(m.group("start").rstrip(".")) if not m.group("end"): iEndAction = iStartAction else: |
︙ | ︙ | |||
315 316 317 318 319 320 321 | if cAction == "-": ## error iMsg = sAction.find(" # ") if iMsg == -1: sMsg = "# Error. Error message not found." sURL = "" | | < < | > | > | | | > | | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 | if cAction == "-": ## error iMsg = sAction.find(" # ") if iMsg == -1: sMsg = "# Error. Error message not found." sURL = "" print("\n" + sMsg + " at: ", sLineId, sActionId) else: sMsg = sAction[iMsg+3:].strip() sAction = sAction[:iMsg].strip() sURL = "" mURL = re.search("[|] *(https?://.*)", sMsg) if mURL: sURL = mURL.group(1).strip() sMsg = sMsg[:mURL.start(0)].strip() checkTokenNumbers(sMsg, sActionId, nToken) if sMsg[0:1] == "=": sMsg = self.createFunction("msg", sMsg, True) else: checkIfThereIsCode(sMsg, sActionId) # checking consistancy checkTokenNumbers(sAction, sActionId, nToken) if cAction == ">": ## no action, break loop if condition is False return [sLineId, sOption, sCondition, cAction, ""] if not sAction and cAction != "!": print(f"\n# Error in action at line <{sLineId}/{sActionId}>: This action is empty.") exit() if sAction[0:1] != "=" and cAction != "=": checkIfThereIsCode(sAction, sActionId) if cAction == "-": ## error detected --> suggestion if sAction[0:1] == "=": sAction = self.createFunction("sugg", sAction, True) elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] if not sMsg: print(f"\n# Error in action at line <{sLineId}/{sActionId}>: The message is empty.") exit() return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction, cStartLimit, cEndLimit, bCaseSensitivity, nPriority, sMsg, sURL] if cAction == "~": ## text processor if sAction[0:1] == "=": sAction = self.createFunction("tp", sAction, True) elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] elif sAction not in "␣*_": nToken = sAction.count("|") + 1 if iStartAction > 0 and iEndAction > 0: if (iEndAction - iStartAction + 1) != nToken: print(f"\n# Error in action at line <{sLineId}/{sActionId}>: numbers of modified tokens modified.") elif iStartAction < 0 or iEndAction < 0 and iStartAction != iEndAction: print(f"\n# Warning in action at line <{sLineId}/{sActionId}>: rewriting with possible token position modified.") return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction, bCaseSensitivity] if cAction in "!/": ## tags return [sLineId, sOption, sCondition, cAction, sAction, iStartAction, iEndAction] if cAction == "=": ## disambiguator if "define(" in sAction and not re.search(r"define\(\\-?\d+ *, *\[.*\] *\)", sAction): print(f"\n# Error in action at line <{sLineId}/{sActionId}>: second argument for <define> must be a list of strings") exit() sAction = self.createFunction("da", sAction) return [sLineId, sOption, sCondition, cAction, sAction] print("\n# Unknown action at ", sLineId, sActionId) return None def storeAction (self, sActionId, aAction): "store <aAction> in <self.dActions> avoiding duplicates and return action name" nVar = 1 while True: sActionName = sActionId + "_" + str(nVar) |
︙ | ︙ | |||
432 433 434 435 436 437 438 | sParams = "lToken, nTokenOffset, nLastToken" elif sFuncName.startswith("_g_da_"): # disambiguator sParams = "lToken, nTokenOffset, nLastToken" else: print("# Unknown function type in [" + sFuncName + "]") continue # Python | | | | | 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 | sParams = "lToken, nTokenOffset, nLastToken" elif sFuncName.startswith("_g_da_"): # disambiguator sParams = "lToken, nTokenOffset, nLastToken" else: print("# Unknown function type in [" + sFuncName + "]") continue # Python sPyCallables += f"def {sFuncName} ({sParams}):\n" sPyCallables += f" return {sReturn}\n" # JavaScript sJSCallables += f" {sFuncName}: function ({sParams}) {{\n" sJSCallables += " return " + jsconv.py2js(sReturn) + ";\n" sJSCallables += " },\n" return sPyCallables, sJSCallables def processing (sGraphName, sGraphCode, sLang, lRuleLine, dDef, dDecl, dOptPriority): "to be run in a separate process" |
︙ | ︙ | |||
477 478 479 480 481 482 483 | elif sLine.startswith("@@@@GRAPH: "): # rules graph call m = re.match(r"@@@@GRAPH: *(\w+) *[|] *(\w+)", sLine.strip()) if m: sGraphName = m.group(1) sGraphCode = m.group(2) if sGraphName in dAllGraph or sGraphCode in dGraphCode: | | | | 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 | elif sLine.startswith("@@@@GRAPH: "): # rules graph call m = re.match(r"@@@@GRAPH: *(\w+) *[|] *(\w+)", sLine.strip()) if m: sGraphName = m.group(1) sGraphCode = m.group(2) if sGraphName in dAllGraph or sGraphCode in dGraphCode: print(f"Error at line {iLine}. Graph name <{sGraphName}> or graph code <{sGraphCode}> already exists.") exit() dAllGraph[sGraphName] = [] dGraphCode[sGraphName] = sGraphCode else: print("Error. Graph name not found at line", iLine) exit() elif sLine.startswith("__") and sLine.endswith("__"): # new rule group m = re.match("__(\\w+)(!\\d|)__", sLine) if m: sRuleName = m.group(1) if sRuleName in aRuleName: print(f"Error at line {iLine}. Rule name <{sRuleName}> already exists.") exit() aRuleName.add(sRuleName) iActionBlock = 1 nPriority = int(m.group(2)[1:]) if m.group(2) else -1 else: print("Syntax error in rule group: ", sLine, " -- line:", iLine) exit() |
︙ | ︙ | |||
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 | sJSCallables = "" for xFuture in lResult: sGraphName, dGraph, dActions, sPy, sJS = xFuture.result() dAllGraph[sGraphName] = dGraph dAllActions.update(dActions) sPyCallables += sPy sJSCallables += sJS print(" Total: ", nRule, "rules, ", len(dAllActions), "actions") print(" Build time: {:.2f} s".format(time.time() - fStartTimer)) return { # the graphs describe paths of tokens to actions which eventually execute callables "rules_graphs": str(dAllGraph), "rules_graphsJS": str(dAllGraph), "rules_actions": str(dAllActions), "rules_actionsJS": jsconv.pyActionsToString(dAllActions), "graph_callables": sPyCallables, "graph_callablesJS": sJSCallables } | > > > > > > > > > > > > > > > > | 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 | sJSCallables = "" for xFuture in lResult: sGraphName, dGraph, dActions, sPy, sJS = xFuture.result() dAllGraph[sGraphName] = dGraph dAllActions.update(dActions) sPyCallables += sPy sJSCallables += sJS # create a dictionary of URL dTempURL = {} i = 1 for sKey, lValue in dAllActions.items(): if lValue[3] == "-": if lValue[-1]: if lValue[-1] not in dTempURL: dTempURL[lValue[-1]] = i i += 1 lValue[-1] = i else: lValue[-1] = 0 dURL = { v: k for k, v in dTempURL.items() } # reversing key and values dURL[0] = "" # end print(" Total: ", nRule, "rules, ", len(dAllActions), "actions") print(" Build time: {:.2f} s".format(time.time() - fStartTimer)) return { # the graphs describe paths of tokens to actions which eventually execute callables "rules_graphs": str(dAllGraph), "rules_graphsJS": str(dAllGraph), "rules_actions": str(dAllActions), "rules_actionsJS": jsconv.pyActionsToString(dAllActions), "rules_graph_URL": str(dURL), "graph_callables": sPyCallables, "graph_callablesJS": sJSCallables } |
Modified gc_core/js/lang_core/gc_engine.js from [b841335424] to [11eac45a78].
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Grammar checker engine /* jshint esversion:6, -W097 */ /* jslint esversion:6 */ /* global require, exports, console */ "use strict"; ${string} ${regex} ${map} | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Grammar checker engine /* jshint esversion:6, -W097 */ /* jslint esversion:6 */ /* global require, exports, console */ "use strict"; ${string} ${regex} ${map} if (typeof(process) !== 'undefined') { var gc_options = require("./gc_options.js"); var gc_rules = require("./gc_rules.js"); var gc_rules_graph = require("./gc_rules_graph.js"); var cregex = require("./cregex.js"); var text = require("../text.js"); } else if (typeof(require) !== 'undefined') { var gc_options = require("resource://grammalecte/${lang}/gc_options.js"); |
︙ | ︙ | |||
667 668 669 670 671 672 673 | let bCondMemo = null; for (let sRuleId of oGraph[nextNodeKey]) { try { if (bDebug) { console.log(" >TRY: " + sRuleId + " " + sLineId); } let [_, sOption, sFuncCond, cActionType, sWhat, ...eAct] = gc_rules_graph.dRule[sRuleId]; | | | | > | 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 | let bCondMemo = null; for (let sRuleId of oGraph[nextNodeKey]) { try { if (bDebug) { console.log(" >TRY: " + sRuleId + " " + sLineId); } let [_, sOption, sFuncCond, cActionType, sWhat, ...eAct] = gc_rules_graph.dRule[sRuleId]; // Suggestion [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ] // TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ] // Disambiguator [ option, condition, "=", replacement/suggestion/action ] // Tag [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ] // Immunity [ option, condition, "!", "", iTokenStart, iTokenEnd ] // Test [ option, condition, ">", "" ] if (!sOption || dOptions.gl_get(sOption, false)) { bCondMemo = !sFuncCond || oEvalFunc[sFuncCond](this.lToken, nTokenOffset, nLastToken, sCountry, bCondMemo, this.dTags, this.sSentence, this.sSentence0); if (bCondMemo) { if (cActionType == "-") { // grammar error let [iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL] = eAct; let nTokenErrorStart = (iTokenStart > 0) ? nTokenOffset + iTokenStart : nLastToken + iTokenStart; if (!this.lToken[nTokenErrorStart].hasOwnProperty("bImmune")) { let nTokenErrorEnd = (iTokenEnd > 0) ? nTokenOffset + iTokenEnd : nLastToken + iTokenEnd; let nErrorStart = this.nOffsetWithinParagraph + ((cStartLimit == "<") ? this.lToken[nTokenErrorStart]["nStart"] : this.lToken[nTokenErrorStart]["nEnd"]); let nErrorEnd = this.nOffsetWithinParagraph + ((cEndLimit == ">") ? this.lToken[nTokenErrorEnd]["nEnd"] : this.lToken[nTokenErrorEnd]["nStart"]); if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.gl_get(nErrorStart, -1)) { this.dError.set(nErrorStart, this._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, sMessage, gc_rules_graph.dURL[iURL], bShowRuleId, sOption, bContext)); this.dErrorPriority.set(nErrorStart, nPriority); this.dSentenceError.set(nErrorStart, this.dError.get(nErrorStart)); if (bDebug) { console.log(" NEW_ERROR: ", this.dError.get(nErrorStart)); } } } |
︙ | ︙ |
Modified gc_core/js/lang_core/gc_rules_graph.js from [3efb8afd5c] to [8c47453ba6].
︙ | ︙ | |||
8 9 10 11 12 13 14 | ${string} var gc_rules_graph = { dAllGraph: ${rules_graphsJS}, | | > > > | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ${string} var gc_rules_graph = { dAllGraph: ${rules_graphsJS}, dRule: ${rules_actionsJS}, dURL: ${rules_graph_URL} }; if (typeof(exports) !== 'undefined') { exports.dAllGraph = gc_rules_graph.dAllGraph; exports.dRule = gc_rules_graph.dRule; exports.dURL = gc_rules_graph.dURL; } |
Modified gc_core/py/lang_core/gc_engine.py from [612611c197] to [f2bfc30897].
︙ | ︙ | |||
584 585 586 587 588 589 590 | for sLineId, nextNodeKey in dNode.items(): bCondMemo = None for sRuleId in dGraph[nextNodeKey]: try: if bDebug: echo(" >TRY: " + sRuleId + " " + sLineId) _, sOption, sFuncCond, cActionType, sWhat, *eAct = _rules_graph.dRule[sRuleId] | | | | > | 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 | for sLineId, nextNodeKey in dNode.items(): bCondMemo = None for sRuleId in dGraph[nextNodeKey]: try: if bDebug: echo(" >TRY: " + sRuleId + " " + sLineId) _, sOption, sFuncCond, cActionType, sWhat, *eAct = _rules_graph.dRule[sRuleId] # Suggestion [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL ] # TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ] # Disambiguator [ option, condition, "=", replacement/suggestion/action ] # Tag [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ] # Immunity [ option, condition, "!", "", iTokenStart, iTokenEnd ] # Test [ option, condition, ">", "" ] if not sOption or dOptions.get(sOption, False): bCondMemo = not sFuncCond or globals()[sFuncCond](self.lToken, nTokenOffset, nLastToken, sCountry, bCondMemo, self.dTags, self.sSentence, self.sSentence0) if bCondMemo: if cActionType == "-": # grammar error iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, iURL = eAct nTokenErrorStart = nTokenOffset + iTokenStart if iTokenStart > 0 else nLastToken + iTokenStart if "bImmune" not in self.lToken[nTokenErrorStart]: nTokenErrorEnd = nTokenOffset + iTokenEnd if iTokenEnd > 0 else nLastToken + iTokenEnd nErrorStart = self.nOffsetWithinParagraph + (self.lToken[nTokenErrorStart]["nStart"] if cStartLimit == "<" else self.lToken[nTokenErrorStart]["nEnd"]) nErrorEnd = self.nOffsetWithinParagraph + (self.lToken[nTokenErrorEnd]["nEnd"] if cEndLimit == ">" else self.lToken[nTokenErrorEnd]["nStart"]) if nErrorStart not in self.dError or nPriority > self.dErrorPriority.get(nErrorStart, -1): self.dError[nErrorStart] = self._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, \ sMessage, _rules_graph.dURL.get(iURL, ""), bShowRuleId, sOption, bContext) self.dErrorPriority[nErrorStart] = nPriority self.dSentenceError[nErrorStart] = self.dError[nErrorStart] if bDebug: echo(" NEW_ERROR: {}".format(self.dError[nErrorStart])) elif cActionType == "~": # text processor nTokenStart = nTokenOffset + eAct[0] if eAct[0] > 0 else nLastToken + eAct[0] |
︙ | ︙ |
Modified gc_core/py/lang_core/gc_rules_graph.py from [373592f3fb] to [dd48c4d265].
1 2 3 4 5 6 7 8 9 | """ Grammar checker graph rules """ # generated code, do not edit dAllGraph = ${rules_graphs} dRule = ${rules_actions} | > > | 1 2 3 4 5 6 7 8 9 10 11 | """ Grammar checker graph rules """ # generated code, do not edit dAllGraph = ${rules_graphs} dRule = ${rules_actions} dURL = ${rules_graph_URL} |
Modified gc_lang/fr/rules.grx from [0cb094d0b7] to [bb86697156].
︙ | ︙ | |||
868 869 870 871 872 873 874 | 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. __<s>/virg(virgule_point_fin_dialogue)__ | | | | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 | 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. __<s>/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. __<s>/virg(virgule_fin_dialogue)__ (, »,? )[a-zéà] @@0 <<- -1>> " », | » " # Virgule mal placée ou superflue. TEST: « Ça suffit{{. » }}dit-elle. TEST: « J’en ai plus qu’assez{{, » }}dis-je. TEST: {{Julien}} donne-moi le sel. TEST: dès son premier rendez-vous au centre TEST: Depuis combien de temps fumez-vous ? |
︙ | ︙ | |||
8119 8120 8121 8122 8123 8124 8125 | TEST: L’hostie n’est pas le {{cor}} du Christ. TEST: elle détestait son nouveau garde du {{cor}} TEST: Elle souffla puissamment dans le {{corps}} de chasse. # cou / coup / coût __conf_coup_cout_cou1__ | | | 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 | TEST: L’hostie n’est pas le {{cor}} du Christ. TEST: elle détestait son nouveau garde du {{cor}} TEST: Elle souffla puissamment dans le {{corps}} de chasse. # cou / coup / coût __conf_coup_cout_cou1__ [>cou|>coût|>cout] [de|d’] [>baguette|>barre|>bâton|>bec|>bélier|blues|>botte|>boule|>boutoir|>bol|>bite|>cœur|>chaud|>coude|>couteau|>dé|>dent|>déprime|>froid|fil|>filet|>foudre|>genou|>grâce|>griffe|>grisou|>gueule|>hache|>hanche|Jarnac|jus|>jeune|>klaxon|>main|maître|maitre|>massue|>marteau|>menton|>nostalgie|>pied|>poing|>poignard|>pouce|>pute|>queue|>rein|>rabot|>savate|>sang|>sabot|>sabre|>sifflet|>soleil|>sonde|>surin|>tête|>théâtre|>tonnerre|>torchon|>trique|>vent|vieux] [>cou|>coût|>cout] d’ [>éclat|>épée|>état|>épaule|œil|>estoc] [>cou|>coût|>cout] du sort [>cou|>coût|>cout] [dur|durs] <<- /conf/ -1>> coup|coups # Confusion probable. Le coût est le prix d’une chose. Le cou est la partie joignant le tronc à la tête. Pour ce qui frappe, écrivez “coup”. [>cou|>coup] de [>base|revient|reviens|>distribution|>développement|>production|>maintenance|>construction|>fonctionnement|>fabrication|>financement|>formation|>renonciation|>stockage|>transaction|>transfert|>transport|>transformation|>viabilisation] [>cou|>coup] de la vie |
︙ | ︙ | |||
8620 8621 8622 8623 8624 8625 8626 | TEST: il faut emballer, c’est pesé TEST: c’est emballé, c’est pesé. # étant donné que __conf_étant_donné_que__ étant [donner|donnait|donnais] [que|qu’] | | | 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 | TEST: il faut emballer, c’est pesé TEST: c’est emballé, c’est pesé. # étant donné que __conf_étant_donné_que__ étant [donner|donnait|donnais] [que|qu’] <<- /conf/ -2>> donné # Confusion probable. Locution “étant donné que”.|https://fr.wiktionary.org/wiki/%C3%A9tant_donn%C3%A9_que TEST: étant {{donnait}} qu’il ne sait pas de quoi il parle, ignorons-le. # évidement / évidemment __conf_évidemment_évidement__ [/VCint|/VCimp] ?[pas|plus|jamais|guère]¿ évidement |
︙ | ︙ | |||
8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 | à des faims <<- /conf/ -3>> fins # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. [à|a] >seul faim [de|d’] <<- /conf/ -3>> fin # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. >faim de non-recevoir <<- /conf/ -1>> =\1.replace("a", "").replace("A", "") # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. TEST: Elle manifestait son désaccord par une grève de la {{fin}}. TEST: ces enfants avaient une {{fin}} de loup TEST: Œuvrez à des {{faims}} funestes. TEST: il s’est donné bien des peines à seule {{faim}} de monter en grade TEST: Même {{faim}} de non-recevoir. # faut / faux __conf_faux_faut__ faut @:¬(?:Y|Oo|X|M|W)|>qu[e’]/ faut <end> | > > > > | 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 | à des faims <<- /conf/ -3>> fins # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. [à|a] >seul faim [de|d’] <<- /conf/ -3>> fin # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. jusqu’ à la faim <<- /conf/ --1>> fin # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. >faim de non-recevoir <<- /conf/ -1>> =\1.replace("a", "").replace("A", "") # Confusion. Pour évoquer la finalité de quelque chose, écrivez “fin”. TEST: Elle manifestait son désaccord par une grève de la {{fin}}. TEST: ces enfants avaient une {{fin}} de loup TEST: Œuvrez à des {{faims}} funestes. TEST: il s’est donné bien des peines à seule {{faim}} de monter en grade TEST: Jusqu’à la {{faim}} il n’aura rien deviné de la vérité TEST: Même {{faim}} de non-recevoir. # faut / faux __conf_faux_faut__ faut @:¬(?:Y|Oo|X|M|W)|>qu[e’]/ faut <end> |
︙ | ︙ | |||
9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 | au moment ou jusqu’ ou par ou d’ ou mais ou ni ou <<- /conf/ --1>> où # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”. ou et [comment|que|qui|quand|pourquoi|quel|quels|quelle|quelles] ou et $:R <<- /conf/ -1>> où # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”. vers ou | > | 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 | au moment ou jusqu’ ou par ou d’ ou mais ou ni ou c’ en [est|était|sera|serait] ou <<- /conf/ --1>> où # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”. ou et [comment|que|qui|quand|pourquoi|quel|quels|quelle|quelles] ou et $:R <<- /conf/ -1>> où # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”. vers ou |
︙ | ︙ | |||
9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 | TEST: à partir de l’instant {{ou}} elle est venue. ->> où TEST: depuis l’année {{ou}} nous sommes allés en Bretagne ->> où TEST: depuis la seconde {{ou}} tu as parlé ->> où TEST: depuis le jour {{ou}} il a été blessé. ->> où TEST: nous sommes dans une situation {{ou}} il faut avancer ->> où TEST: j’irai là {{ou}} le vent me portera ->> où TEST: cela peut vouloir dire plusieurs choses : qu’il y a anguille sous roche, ou qu’elles se trouvent dans de bonnes dispositions à notre égard. # pale / pâle __conf_pâle_pale__ [bien|très|trop|si|vraiment|tellement] >pale <<- /conf/ -2>> =\2.replace("a", "â").replace("A", "Â") # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale | > | 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 | TEST: à partir de l’instant {{ou}} elle est venue. ->> où TEST: depuis l’année {{ou}} nous sommes allés en Bretagne ->> où TEST: depuis la seconde {{ou}} tu as parlé ->> où TEST: depuis le jour {{ou}} il a été blessé. ->> où TEST: nous sommes dans une situation {{ou}} il faut avancer ->> où TEST: j’irai là {{ou}} le vent me portera ->> où TEST: cela peut vouloir dire plusieurs choses : qu’il y a anguille sous roche, ou qu’elles se trouvent dans de bonnes dispositions à notre égard. TEST: c’en est où ? # pale / pâle __conf_pâle_pale__ [bien|très|trop|si|vraiment|tellement] >pale <<- /conf/ -2>> =\2.replace("a", "â").replace("A", "Â") # Utilisez “pâle” pour évoquer la pâleur… Une pale est, entre autres choses, un élément d’une hélice.|http://fr.wiktionary.org/wiki/pale |
︙ | ︙ | |||
14056 14057 14058 14059 14060 14061 14062 | >condamné à mort >conférence [de|d’] presse >conseiller d’ orientation [scolaire|professionnelle] >contrôle [de|d’] routine >convention [récepteur|générateur] >coque [de|d’] noix >corbeille à >pain | | | 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 | >condamné à mort >conférence [de|d’] presse >conseiller d’ orientation [scolaire|professionnelle] >contrôle [de|d’] routine >convention [récepteur|générateur] >coque [de|d’] noix >corbeille à >pain >coup [de|d’] [avance|balai|barre|bâton|bec|bélier|bite|blues|bol|botte|boule|boutoir|cœur|chaud|coude|couteau|dé|dent|déprime|éclat|épaule|épée|estoc|État|foudre|fil|filet|froid|genou|grâce|>griffe|grisou|gueule|hache|hanche|jarnac|jeune|jus|klaxon|main|maître|maitre|marteau|massue|nostalgie|œil|patte|pied|poignard|poing|poker|pouce|pute|queue|rabot|rein|sabre|sabot|sang|savate|semonce|sifflet|soleil|surin|tête|théâtre|tonnerre|trique|torchon|vent|vieux] >coup [de|d’] baguette ?magique¿ >coup d’ épée dans l’ eau >coup d’ un soir >coup du sort >coureur [de|d’] >jupon >courroie [de|d’] transmission >course contre la montre |
︙ | ︙ | |||
14317 14318 14319 14320 14321 14322 14323 | >service d’ ordre >seuil [de|d’] tolérance >seuil [de|d’] tolérance à la douleur >silo à [>grains|blé] >soldat d’ élite >sonnette d’ alarme >sortie [de|d’] secours | | | | 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 | >service d’ ordre >seuil [de|d’] tolérance >seuil [de|d’] tolérance à la douleur >silo à [>grains|blé] >soldat d’ élite >sonnette d’ alarme >sortie [de|d’] secours >soue à >cochon >sujet [de|d’] prédilection >suspension [de|d’] séance >système d’ exploitation >système [de|d’] santé >système D >tableau [de|d’] chasse >table à repasser >table [de|d’] [calcul|chevet|nuit] >taille *NUM tas [de|d’] ferraille ?rouillée¿ >talon >aiguille tapis [de|d’] prière 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 tenants et aboutissants >ténor du barreau >tête à claques >tête [de|d’] [linotte|déterré+ses|mule] >terrain à découvert >tigre à dents [de|d’] sabre >tigre [de|d’] papier ?mâché¿ >tir [de|d’] barrage >tiret d’ incise >tireur d’ élite >titre [de|d’] [noblesse|propriété|séjour] |
︙ | ︙ |