Utilisateur:PamputtBot/anagr.cpp

/*
  g++ anagr.cpp -std=c++17 -o anagr
  ./anagr /chemin/vers/frwiktionary-latest-pages-articles.xml
*/

#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
 
using namespace std;

string getCodeLangue(string line) {
  size_t pos1 = line.find("{{langue|")+9;
  size_t pos2 = line.find("}}", pos1);
  return line.substr(pos1,pos2-pos1);
}
 
int main(int argc, char **argv) {

  if(argc == 1 || argc>2) {
    cout << argv[0] << " /chemin/vers/frwiktionary-latest-pages-articles.xml" << endl;
    return 0;
  }
  string nomFichier = argv[1];
  
  //https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-articles.xml.bz2
  ifstream infile(nomFichier.c_str(),ifstream::in);
  if(!infile) {
    cout << "Le fichier " << nomFichier << " n'existe pas" << endl;
    return 0;
  }

  string nomFichierSortie = "/data/project/wiktionnaire-pamputt/anagramme/liste_mot_par_langue.txt";
  ofstream out(nomFichierSortie.c_str(), ofstream::out);
  if(!out) {
    cout << "Probleme avec le fichier de sortie" << endl;
    return 0;
  }
 
  string titre;
  vector<string> codesLangue;
  string ns;
 
  string line;
  size_t pos1, pos2;
  unsigned int cmpt = 0;
  map <string, unsigned int> cmpt_section_anagr;

  while(getline(infile,line)) {
    if(line.find("<page>")!=string::npos) {
      titre = "";
      codesLangue.clear();
      ns = "";
      bool is_redirect = false;
      bool balise_text = false;
      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(line.find("<ns>")!=string::npos) {
          //on vérifie que l'espace de nom est bien « 0 »
          pos1 = line.find("<ns>");
          pos2 = line.find("</ns>");
          ns   = line.substr(pos1+4,pos2-pos1-4);
        }

        if(line.find("<text")!=string::npos)
	  balise_text = true;

        if((line.find("#REDIRECT")!=string::npos ||
	    line.find("#redirect")!=string::npos ||
	    line.find("#Redirect")!=string::npos) &&
           balise_text)
          is_redirect = true;

        if(line.find("{{langue|")!=string::npos &&
           line.find("==")!=string::npos &&
           balise_text)
          codesLangue.push_back(getCodeLangue(line));

        if(line.find("{{S|anagrammes}}") != string::npos &&
           !codesLangue.empty())
          cmpt_section_anagr[codesLangue.back()]++;

        if(line.find("</page>")!=string::npos)
          break;
      }
 
      if(ns=="0" &&
         !is_redirect &&
         titre.find("Titres non pris en charge") == string::npos) {
        for (const auto& codeLangue : codesLangue)
          out  << titre << " ; " << codeLangue << endl;
        cmpt++;
        if(cmpt%10000 == 0)
          cout << cmpt << "\t" << titre << endl;
      } 
    }
    // if(cmpt==10) break;
  }
  infile.close();
  out.close();
 
  cout << cmpt << " articles trouves" << endl;
  for (auto const& [code, val] : cmpt_section_anagr)
    if(code == "fr")
      cout << val << " sections anagrammes dans les entrées en " << code << endl;
  return 1;
}