Utilisateur:PamputtBot/enlever bandeau creation automatique.cpp

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

Ce programme fait suite à cree par PiedBot.cpp puisqu’il permet de générer une liste des articles qui ont un bandeau {{vérifier création automatique}} alors qu’un humain est repassé sur l’article depuis l’apposition du modèle.

Ce code c++ lit ligne par ligne le dump d’historique complet du Wiktionnaire que l’on a précédemment récupéré ici et décompressé dans le dossier de enlever_bandeau_creation_automatique.cpp. On compile le programme avec la commande suivante

  • g++ enlever_bandeau_creation_automatique.cpp -o enlever_bandeau.exe

puis on l’exécute en tapant ./enlever_bandeau.exe Le programme crée un fichier bandeau_a_enlever.txt qui contient une liste de tous les articles créés par Utilisateur:PiedBot, qui ont un bandeau {{vérifier création automatique}} et qui ont été modifiés par un humain depuis.

On retire ensuite le bandeau des pages concernées en utilisant, en principe, la commande suivante

  • python core/pwb.py core/scripts/replace.py -regex "\{\{vérifier création automatique.*\}\}\n" "" -file:bandeau_a_enlever.txt -summary:"Retrait de {{vérifier création automatique}}"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

bool verif_bot(vector <string> contributeur) {
  //renvoie "vrai" si aucun humain n'a touche a l'article
  for(unsigned int i=0 ; i<contributeur.size() ; i++) {
    if(contributeur[i].find("bot")==string::npos &&
       contributeur[i].find("Bot")==string::npos &&
       contributeur[i].find("Interwicket")==string::npos) { //on n'a pas trouvé le mot "bot"
      return false;
    }
  }
  return true; // aucun humain n'a édité l'article
}

bool estPiedBot(vector <string> contributeur) {
  if(contributeur.size()==0) // aucun contributeur (utile pour le premier passage)
    return false;

  if(contributeur[0].find("PiedBot")!=string::npos) // le premier contributeur est PiedBot
    return true;

  return false;
}

int main(int argc, char **argv) {
  ifstream infile("frwiktionary-latest-pages-meta-history.xml",ifstream::in);
  if(!infile) {
    cout << "Pas de fichier d’historique" << endl
         << "Telecharger le à https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-meta-history.xml.7z" << endl;
    return 0;
  }

  ofstream out("bandeau_a_enlever.txt",ofstream::out);
  if(!out) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }

  string titre, titre_prec;
  vector <string> contributeur;
  bool creation_auto = false;

  string line;
  size_t pos1, pos2;
  unsigned int cmpt = 0;

  while(getline(infile,line)) {
    if(line.find("<title>")!=string::npos) {
      // on extrait le titre des balises <title>
      pos1 = line.find("<title>");
      pos2 = line.find("</title>");
      titre= line.substr(pos1+7,pos2-pos1-7);
      
      if(titre!=titre_prec) {
	// on change de titre
	if(estPiedBot(contributeur) && !verif_bot(contributeur) && creation_auto) { // le premier contributeur est PiedBot et
	                                                                            // un humain a edite l'article et 
	                                                                            // {{vérifier création automatique}} est présent
	  // cout << titre_prec << endl;
	  out << titre_prec << endl;
	  cmpt++;
	}
	contributeur.clear();
	titre_prec = titre;
	creation_auto = false;
      }
    }
 
    // on recupere le nom du contributeur
    if(line.find("<username>")!=string::npos) {
      pos1 = line.find("<username>");
      pos2 = line.find("</username>");
      line = line.substr(pos1+10,pos2-pos1-10);
      contributeur.push_back(line);
      // on le remet a false de sorte que la derniere modification de l'article contienne {{vérifier création automatique}}
      // le flag sera true uniquement si la dernière modification de l'article contient {{vérifier création automatique}}
      creation_auto = false;
    }
    // ou l’IP qui a servi a contribué
    if(line.find("<ip>")!=string::npos) {
      pos1 = line.find("<ip>");
      pos2 = line.find("</ip>");
      line = line.substr(pos1+4,pos2-pos1-4);
      contributeur.push_back(line);
      // on le remet a false de sorte que la derniere modification de l'article contienne {{vérifier création automatique}}
      // le flag sera true uniquement si la dernière modification de l'article contient {{vérifier création automatique}}
      creation_auto = false;
    }
 
    // on regarde si le modèle « vérifier création automatique » est présent
    if(line.find("{{vérifier création automatique")!=string::npos)
      creation_auto=true;
  }
  infile.close();
  out.close();
  
  cout << cmpt << " articles trouves" << endl;
  return 1;
}