Discussion utilisateur:Od1n/Discussions avec Micthev
Trop ou pas assez
modifierJe vais m'arracher les cheveux un par un !!! Bon vaut mieux trop que pas assez ! certes ! Le robot ne me fait plus aucun faux-positif sur nbordi.py grâce à ta magnifique regex. Mais tu pourrais l'améliorer ? J'ai beau tourner le problème dans tous les sens je ne vois pas comment faire en sorte que maintenant il ne fasse pas de faux-négatifs like that. Extrait du code d'exception (que tu voies à quoi ça ressemble) :
'ref': re.compile(r'(?ism)<ref[ >].*?</ref>'),
'startspace': re.compile(r'(?m)^ (.*?)$'),
'table': re.compile(r'(?ims)^{\|.*?^\|}|<table>.*?</table>'),
'template': re.compile(r'\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}\})*\}\})*'
'\{\{.*?\}\}'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}\})*\}\})*'
'\}\}'),
Merci beaucoup et bonne journée. Cordialement, Micthev (discuter ⇐ /!\), le 8 mai 2011 à 09:18 (CEST)
- Bonjour,
- Un autre avantage des modèles récupérés proprement est qu'ils sont très simples à manipuler
- Donc, une fois que tu as obtenu les matches de 'template', tu exécutes une nouvelle regex sur ces matches, dans ce genre :
^\{\{\s*(?:[Tt]itre +mis +en +forme|[Tt]itre +incorrect|etc.)\s*\|
- Si ça matche, il s'agit d'un template "whitelisté" et tu peux donc effectuer la modification désirée à l'intérieur.
- Ce code peut être écrit de moult façons, par exemple :
$whitelist = array('[Tt]itre +mis +en +forme', '[Tt]itre +incorrect'); // etc.
$regex_whitelisted_template = '@^\{\{\s*(?:' . implode('\|', $whitelist) . ')\s*\|@u';
- Tu peux aussi capturer le nom du modèle et tester s'il est présent dans une liste :
preg_match('@^\{\{([^\|]+)\|@u', $modele_a_tester, $resultats);
$nom_modele = $resultats[1];
// je trouve que c'est plus simple et fiable que de gérer les espaces au niveau de la regex
$nom_modele = trim($nom_modele);
// bien sûr, doit être exécuté *après* le trim
$nom_modele = ucfirst($nom_modele);
// le cas de figure se présente quelquefois :
// (vérifie aussi que ton code remplace bien 3 espaces par un seul ;-)
$nom_modele = preg_replace('@ @u', ' ', $nom_modele);
if (in_array($nom_modele, array('Titre mis en forme', 'Titre incorrect'))) {
// le modèle est whitelisté
}
- Tu vois qu'il y a possibilité de s'en sortir
- Autre chose, comme la quantité de modèles à whitelister serait énorme, il faudrait que le bot ne défasse pas ce qui est déjà bien. Par exemple, il ne faut pas qu'il enlève les {{3e}} qui seraient déjà en place dans une infobox. Quant à l'approche inverse consistant à faire une blacklist de modèles, pour moi c'est un non catégorique à cause des faux-positifs !
- od†n ↗blah 8 mai 2011 à 12:59 (CEST)
En fait j'ai laissé de côté de whitelistage et / ou blacklistage, cela risque d'être compliqué. Et de demander beaucoup d'effort pour au final pas grand chose : je m'explique : le robot modifiant ce qu'il y a à modifier partout ailleurs, un contributeur lambda le vois et applique (normalement) les modifications manquantes. J'en ai par le passé vu plein complétant les modifications de mon robot en reprenant celle-ci. Le souci est toute autre. Je voudrais exclure les modèle des modifications tout bonnement. Mais quand tu regarde cet article, rien qu'au début dans le tableau 1re n'est pas remplacé par {{1re}}
, dans le titre de l'image 17e n'est pas remplacé par {{17e}}
, etc. La présence de {{Titre mis en forme|{{17e}} législature du Canada}}
avant, l'empêche, en effet, bizarrement il semble croire que tout le code d'après se trouve dans un modèle.
Je t'explique en deux mots le principe du pywikibot qui peut être t’éclairera sur la regex à mettre en place.
dans nbordi.py tu as :
text = pywikibot.replaceExcept(
text,
ur"(\n|#|\*|'| |\(|\|)1 *(<sup>|<small>)(i?[éeè]re)(</sup>|</small>)( |\)|\]|\n|\.|,|{)",
ur"\1{{1re}}\5",
['math', 'link', 'cat', 'hyperlink', 'gallery', 'source',
'nowiki', 'interwiki', 'timeline', 'template', 'comment'])
ce code devrait remplacer toute occurrence correspondante à {{1re}}
sous la condition que cette occurence ne soit pas :
- dans une balise math
- dans un lien interne
- dans un lien externe
- dans une catégorie
- dans une balise gallery
- dans une balise source
- dans une balise nowiki
- dans un interwiki
- dans un timeline
- dans un modèle
- dans un commentaire
les exceptions sont gérées dans le fichier textlib.py de la façon suivante :
'comments' : re.compile(r'(?ism)<!--.*?-->'),
'includeonly': re.compile(r'(?ism)<includeonly>.*?</includeonly>'),
'nowiki': re.compile(r'(?ism)<nowiki>.*?</nowiki>'),
'pre': re.compile(r'(?ism)<pre>.*?</pre>'),
# L'espace avant le /source n'existe pas normalement ;)
'source': re.compile(r'(?is)<syntaxhighlight .*?< /source>'),
'math': re.compile(r'(?ism)<math>.*?</math>'),
'timeline': re.compile(r'(?ism)<timeline>.*?</timeline>'),
'header': re.compile(r'\r\n=+.+=+ *\r\n'),
'ref': re.compile(r'(?ism)<ref[ >].*?</ref>'),
'startspace': re.compile(r'(?m)^ (.*?)$'),
'table': re.compile(r'(?ims)^{\|.*?^\|}|<table>.*?</table>'),
'template': re.compile(r'\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}\})*\}\})*'
'\{\{.*?\}\}'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}\})*\}\})*'
'\}\}'),
'hyperlink': compileLinkR(),
'gallery': re.compile(r'(?is)<gallery.*?>.*?</gallery>'),
'link': re.compile(r'\[\[[^\]\|]*(\|[^\]]*)?\]\]'),
'interwiki': re.compile(r'(?i)\[\[:?(%s)\s?:[^\]]*\]\][\s]*'
% '|'.join(site.validLanguageLinks() + site.family.obsolete.keys())
),
Qu'est ce qui colle pas dans cette p*** d'exception ? (template) . Merci par avance. Cordialement,Micthev (discuter ⇐ /!\), le 8 mai 2011 à 17:07 (CEST)
- trouvé. T'aurais pas essayé d'agrandir ma regex par hasard ? Y'a un problème d'imbrication. od†n ↗blah 8 mai 2011 à 18:08 (CEST)
- Donc il y a déjà cela, la regex que tu as doublé en juxtaposant avec
\{\{.*?\}\}
fait qu'elle ne matche plus que les modèles qui contiennent un autre modèle (exemple{{titre mis en forme|{{1er}}... }}
). C'est un point à corriger sinon tu vas avoir plein de faux négatifs, mais ce n'est pas la cause du présent problème. - Le vrai problème semble se trouver au niveau du «
replaceExcept(text, ur"(\n|#|\*|'| |\(|\|)1 *(<sup>|<small>)(i?[éeè]re)(</sup>|</small>)( |\)|\]|\n|\.|,|{)", etc.
» qui ne trouve que s'il y a un <sup> ou un<small>. Il ne trouve pas les abréviations "brutes" sans aucun modèle, pas plus qu'il ne trouve les {{exp}} ou les{{re}}, etc. - od†n ↗blah 8 mai 2011 à 18:39 (CEST)
- Arf bah j'ai mal transformé ta regex en python pourtant je n'ai fait que retranscrire la variable. Tu peux le faire ? ( :( )
- Sinon bah non cela vient pas du replace. Celui que je t'ai donné n'était qu'en exemple, dans le code, tu as une ligne au dessus de celle ci qui dit :
text = pywikibot.replaceExcept(
text,
ur"(\n|#|\*|'| |\(|\|)1 *(i?[éeè]re)( |\)|\]|\n|\.|,|{)",
ur"\1{{1re}}\3",
['math', 'link', 'cat', 'hyperlink', 'gallery', 'source',
'nowiki', 'interwiki', 'timeline', 'template', 'comment',])
- Pour le {{re}}, {{er}}, etc. Cela vient après. Pour les {{exp}}, oubli de ma part que j'ajouterai quand ce bousin ne ferait plus de faux négatif sur ce qu'il a déjà . Merci pour tes réponses rapides, et de me donner de ton précieux temps. Cordialement, Micthev (discuter ⇐ /!\), le 8 mai 2011 à 19:48 (CEST)
- Tant qu'à faire, j'attends que ceci soit corriger avant de lancer cette bête. Cordialement,Micthev (discuter ⇐ /!\), le 8 mai 2011 à 20:04 (CEST)
- Note hors sujet : vivement LiquidThreads !! Nos discussions ne ressemblent vraiment à rien. Cordialement, Micthev (discuter ⇐ /!\), le 8 mai 2011 à 20:15 (CEST)
- Ça marche ! J'avais effectivement fais n'importe quoi avec ta regex :
'template': re.compile(r'\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{(?:[^\{\}]|'
'\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}|\{\{\{(?:[^\{\}]|'
'\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{'
'(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})*\}\}\})*\}\}\})*\}\}'),
- Merci beaucoup. Cordialement, Micthev (discuter ⇐ /!\), le 9 mai 2011 à 02:00 (CEST)
- Note hors sujet : vivement LiquidThreads !! Nos discussions ne ressemblent vraiment à rien. Cordialement, Micthev (discuter ⇐ /!\), le 8 mai 2011 à 20:15 (CEST)
- Tant qu'à faire, j'attends que ceci soit corriger avant de lancer cette bête. Cordialement,Micthev (discuter ⇐ /!\), le 8 mai 2011 à 20:04 (CEST)
- Donc il y a déjà cela, la regex que tu as doublé en juxtaposant avec
Tu es un grand malade . Cordialement, Micthev (discuter ⇐ /!\), le 9 mai 2011 à 18:42 (CEST)
- Tu vas voir, ça va être de toute beauté ! En tout cas, il est clair qu'il y aurait des améliorations à apporter sur le wiki pour pouvoir afficher du code sans bousiller la mise en page notamment en ce qui concerne l'indentation...
- Tant que je suis là, c'est une excellente chose que le problème avec la regex soit solutionné, et un grand merci pour ceci
- od†n ↗blah 9 mai 2011 à 18:52 (CEST)
- Mais je t'en prie, c'est tout à fait normal. Au passage le robot s'est arrêté ce matin, je l'ai relancé ce soir il en est à
Bz...
dans les analyses, donc tu as encore un peu de temps. Ha oui c'est bien pour cela que j'attends avec grande impatience LiquidThreads. . Bon je te laisse faire ta tambouille. Reportes la sur ma pdd quand tu as fini hein . Cordialement, Micthev (discuter ⇐ /!\), le 9 mai 2011 à 19:05 (CEST)
- Mais je t'en prie, c'est tout à fait normal. Au passage le robot s'est arrêté ce matin, je l'ai relancé ce soir il en est à
[Micbot] références appelées depuis leur inclusion dans {{références}}
modifierHello Micthev, j'ai vu passer cette erreur, qui vient d'une façon de faire (encore ?) peu répandue sur l'encyclopédie, que tu connais peut-être ou pas, l'utilisation du paramètre |références=
dans {{références}}. Il permet de ne faire qu'appeler des refs dans le corps du texte ; à l'édition le texte est seulement parsemé de ref name
et pas de mise en forme lourdes et gênantes pour la lecture. Je ne sais pas si tu peux faire en sorte que ton bot voie s'il est dans un modèle {{références}} ou pas ? Totodu74 (devesar…) 12 mai 2011 à 13:19 (CEST)
- Arf j'avais normalement corrigé cette erreur qu'il ne devait plus commettre, je regarderais ce soir ce qu'il s'est passé. Cordialement, Micthev (discuter ⇐ /!\), le 12 mai 2011 à 15:05 (CEST)
- En passant, j'ai vu ceci dans le typo.py :
ref = re.compile(u'r[ée]f[ée]rences=([^~]+)</ref>')
- ... et si le modèle contient «
références =
» ? od†n ↗blah 12 mai 2011 à 19:02 (CEST)- Concernant l'erreur rapportée par Toto, elle est due à la présence d'un « ~ » dans l'une des URL od†n ↗blah 12 mai 2011 à 19:09 (CEST)
- Arf je vais remplacer ~ par un caractère plus spécial genre þ.
- Pour le problème d'espace que penses tu de :
ref = re.compile(u'[rR][ée]f[ée]rences([ ]+)?=([ ]+)?([^þ]+)</ref>')
- ?
- Bonne journée. Cordialement, Micthev (discuter ⇐ /!\), le 13 mai 2011 à 09:18 (CEST)
- Plop,
([ ]+)?
→(\s*)
([^þ]+)
→(.+)
avec flag dotall- Aussi, il y a une possibilité de faux positif si une référence "normale" se situe après un modèle {{Références}}, ce qu'il est je pense possible de rencontrer.
- Enfin un petit détail, il peut aussi arriver que les références dans ce modèle soient séparées par une ligne vide (je l'ai déjà fait, par exemple), autrement dit 2 linefeeds au lieu d'un seul. Je n'ai pas regardé, peut-être que c'est déjà bon, mais il faut que le bot ne modifie pas la forme du code le cas échéant.
- Bien à toi, od†n ↗blah 13 mai 2011 à 15:47 (CEST)
- Plop,
-
- Vu, j'ai eu un peu peur en voyant votre langage martien mais je crois avoir saisi l'idée (même si je ne sais pas à quoi sert le caractère bizarre qu'on ne devrait pas rencontrer) , merci pour votre rapidité ! Totodu74 (devesar…) 13 mai 2011 à 13:41 (CEST)
- Toto ne t'inquiète pas on s'y fait vite . Fait ! Avec pour exception references :
'references': re.compile(r'\{\{[Rr]éférences(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}'
'|\{\{\{[^\{\}]*\}\}\})*\}\}|\{\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}'
'\})*\}\}\})*\}\}|\{\{\{(?:[^\{\}]|\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}'
'\})*\}\}|\{\{\{(?:[^\{\}]|\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}'
'\})*\}\}\})*\}\}\})*\}\}'),'
- Bonne journée. Cordialement, Micthev (discuter ⇐ /!\), le 14 mai 2011 à 17:52 (CEST)
- Vu, j'ai eu un peu peur en voyant votre langage martien mais je crois avoir saisi l'idée (même si je ne sais pas à quoi sert le caractère bizarre qu'on ne devrait pas rencontrer) , merci pour votre rapidité ! Totodu74 (devesar…) 13 mai 2011 à 13:41 (CEST)
- Concernant l'erreur rapportée par Toto, elle est due à la présence d'un « ~ » dans l'une des URL od†n ↗blah 12 mai 2011 à 19:09 (CEST)