/* 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>usingnamespacestd;stringgetCodeLangue(stringline){size_tpos1=line.find("{{langue|")+9;size_tpos2=line.find("}}",pos1);returnline.substr(pos1,pos2-pos1);}intmain(intargc,char**argv){if(argc==1||argc>2){cout<<argv[0]<<" /chemin/vers/frwiktionary-latest-pages-articles.xml"<<endl;return0;}stringnomFichier=argv[1];//https://dumps.wikimedia.org/frwiktionary/latest/frwiktionary-latest-pages-articles.xml.bz2ifstreaminfile(nomFichier.c_str(),ifstream::in);if(!infile){cout<<"Le fichier "<<nomFichier<<" n'existe pas"<<endl;return0;}stringnomFichierSortie="/data/project/wiktionnaire-pamputt/anagramme/liste_mot_par_langue.txt";ofstreamout(nomFichierSortie.c_str(),ofstream::out);if(!out){cout<<"Probleme avec le fichier de sortie"<<endl;return0;}stringtitre;vector<string>codesLangue;stringns;stringline;size_tpos1,pos2;unsignedintcmpt=0;map<string,unsignedint>cmpt_section_anagr;while(getline(infile,line)){if(line.find("<page>")!=string::npos){titre="";codesLangue.clear();ns="";boolis_redirect=false;boolbalise_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(constauto&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(autoconst&[code,val]:cmpt_section_anagr)if(code=="fr")cout<<val<<" sections anagrammes dans les entrées en "<<code<<endl;return1;}