Index: compile_rules.py ================================================================== --- compile_rules.py +++ compile_rules.py @@ -549,10 +549,14 @@ print(" options defined for: " + ", ".join([ t[0] for t in lOpt ])) dOptions = { "lStructOpt": lStructOpt, "dOptLabel": dOptLabel } dOptions.update({ "dOpt"+k: v for k, v in lOpt }) return dOptions, dOptPriority + +def printBookmark (nLevel, sComment, nLine): + print(" {:>6}: {}".format(nLine, " " * nLevel + sComment)) + def make (lRules, sLang, bJavaScript): "compile rules, returns a dictionary of values" # for clarity purpose, don’t create any file here @@ -561,12 +565,15 @@ global dDEF lLine = [] lRuleLine = [] lTest = [] lOpt = [] + zBookmark = re.compile("^!!+") + for i, sLine in enumerate(lRules, 1): if sLine.startswith('#END'): + printBookmark(0, "BREAK BY #END", i) break elif sLine.startswith("#"): pass elif sLine.startswith("DEF:"): m = re.match("DEF: +([a-zA-Z_][a-zA-Z_0-9]*) +(.+)$", sLine.strip()) @@ -581,10 +588,15 @@ pass elif sLine.startswith(("OPTGROUP/", "OPTSOFTWARE:", "OPT/", "OPTLANG/", "OPTLABEL/", "OPTPRIORITY/")): lOpt.append(sLine) elif re.match("[  \t]*$", sLine): pass + elif sLine.startswith("!!"): + m = zBookmark.search(sLine) + nExMk = len(m.group(0)) + if sLine[nExMk:].strip(): + printBookmark(nExMk-2, sLine[nExMk:].strip(), i) elif sLine.startswith((" ", "\t")): lRuleLine[len(lRuleLine)-1][1] += " " + sLine.strip() else: lRuleLine.append([i, sLine.strip()]) Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -212,59 +212,59 @@ DEF: w4 \w\w\w\w+ -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# //////////////////////////////////////// PASSE 0 //////////////////////////////////////// -# paragraphe par paragraphe -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# - - - -# -# //////////////////////////////////////// CONTRÔLE DES ESPACES //////////////////////////////////////// -# - +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! PASSE 1: PARAGRAPHE PAR PARAGRAPHE +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! + + + +!!! +!!! +!!! Contrôle: espaces & tabulations +!!! +!!! # Espaces surnuméraires # Note : les tabulations ne sont pas soulignées dans LibreOffice. Mais l’erreur est bien présente. __/tab(tab_début_ligne)__ ^[    ]+ <<- ->> "" # Espace(s) en début de ligne à supprimer : utilisez les retraits de paragraphe. __/tab(tab_fin_ligne)__ [    ]+$ <<- ->> "" # Espace(s) en fin de ligne à supprimer. @@ -375,14 +375,15 @@ # Tout contrôle des espaces doit se faire avant ce point. # À partir d’ici, toute règle est susceptible de supprimer des caractères et les remplacer par des espaces ou des chaînes de longueur égale. -# -# //////////////////////////////////////// PRÉPROCESSEUR //////////////////////////////////////// -# - +!!! +!!! +!!! Processeur: efface les ponctuations gênantes (URL, sigles, abréviations, IP, heures, etc.) +!!! +!!! # e-mail __(p_email)__ \w[\w.-]*@\w[\w.-]*\w[.]\w+ <<- ~>> * @@ -502,10 +503,16 @@ TEST: Marion Maréchal-Le Pen. Afin que Maréchal ne soit pas analysé comme un impératif, “Le Pen” devient “Le_Pen”. TEST: Car [je] deviendrai plus insaisissable que jamais. #TEST: des {{homme}} #TEST: des [b]{{femme}}[/b] + +!!! +!!! +!!! Processeur: balises HTML et LaTeX +!!! +!!! # HTML __/html(p_html_amp_xxx)__ &[a-zA-Z]+; <<- ~>> _ __/html(p_html_lt)__ < <<- ~>> " <" __/html(p_html_gt)__ > <<- ~>> > @@ -521,17 +528,15 @@ __/latex(p_latex2)__ \\[,;/\\] <<- ~>> * __/latex(p_latex3)__ \{(?:abstract|align|cases|center|description|enumerate|equation|figure|flush(?:left|right)|gather|minipage|multline|quot(?:ation|e)|SaveVerbatim|table|tabular|thebibliography|[vV]erbatim|verse|wrapfigure)\} <<- ~>> * -# -# //////////////////////////////////////// RÈGLES DE CONTRÔLE //////////////////////////////////////// -# - - -############################## TYPOGRAPHIE ############################## - +!!! +!!! +!!! Contrôle: typographie, virgules, espaces insécables, unités de mesure… +!!! +!!! ### Écritures épicènes invariables # Attention, lors de la deuxième passe, on se sert du désambiguïsateur __[u](typo_écriture_épicène_pluriel)__ @@ -905,13 +910,14 @@ <<- ->> =\0.replace("2", "₂").replace("3", "₃").replace("4", "₄") # Typographie des composés chimiques. [!] TEST: __chim__ les molécules {{CaCO3}} et {{H2O}}… -# -# GRANDS NOMBRES --------------------------------------------------------------------------------- -# + +!!! +!!! Contrôle: grands nombres +!!! __[s]/num(num_grand_nombre_soudé)__ \d\d\d\d\d+ <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *") ->> =formatNumber(\0) # Formatage des grands nombres. @@ -941,13 +947,14 @@ TEST: Il a perdu {{20 000}} euros à la Bourse en un seul mois. -# -# DATES ------------------------------------------------------------------------------------------ -# +!!! +!!! Contrôle: dates +!!! + __[i]/date(date_nombres)__ (?> _ # Cette date est invalide. <<- ~>> =\0.replace(".", "-").replace(" ", "-").replace("\/", "-") @@ -956,13 +963,13 @@ TEST: le {{32.03.2018}} TEST: le {{81/01/2012}} TEST: 12-12-2012 -# -# REDONDANCES (dans le paragraphe) --------------------------------------------------------------- -# +!!! +!!! Contrôle: redondances +!!! __[i]/redon1(redondances_paragraphe)__ ({w_4})[  ,.;!?:].*[  ](\1) @@0,$ <<- not morph(\1, ":(?:G|V0)|>(?:t(?:antôt|emps|rès)|loin|souvent|parfois|quelquefois|côte|petit|même) ", False) and not \1[0].isupper() -2>> _ # Dans ce paragraphe, répétition de « \1 » (à gauche). @@ -971,15 +978,13 @@ TEST: __redon1__ Tu es son {{avenir}}. Et lui aussi est ton {{avenir}}. TEST: __redon1__ Car parfois il y en a. Mais parfois il n’y en a pas. - -# -# //////////////////////////////////////// PRÉPROCESSEUR //////////////////////////////////////// -# Dernier nettoyage avant coupure du paragraphe en phrases -# +!!! +!!! Processeur: Dernier nettoyage avant coupure du paragraphe en phrases +!!! # Trait d’union conditionnel (u00AD) __(p_trait_union_conditionnel1)__ \w+‑\w+‑\w+ <<- ~>> =\0.replace("‑", "") __(p_trait_union_conditionnel2)__ \w+‑\w+ <<- ~>> =\0.replace("‑", "") @@ -991,55 +996,53 @@ TEST: “C’est bon !”, croit savoir Marie. TEST: “Parce que… ?” finit par demander Paul. TEST: « Dans quel pays sommes-nous ? » demanda un manifestant. - -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# //////////////////////////////////////// PASSE 1 //////////////////////////////////////// -# phrase par phrase -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -[++] - +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! PASSE 1: PHRASE PAR PHRASE +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! +!! + +[++] # # DOUBLONS (casse identique) --------------------------------------------------------------------- #