Wicri:Dilib source, module Wicri, commande WicriRecentChanges

De Wicri Outils
logo travaux La commande n'est pas finie. Des modifications peuvent être apportées. (La commande renvoie toutes les pages du réseau ayant été modifiées le jour où celle-ci a été exécutée ainsi que l'auteur de la modification. De plus, on obtient seulement les 3 dernières modifications.)

Code source

/*   -*- coding: utf-8 -*-  */
#include "SxmlNode.h"
#include <getopt.h>
#include "Buffer.h"

char *dateDebut;
Buffer *bd1;
Buffer *bd2;

// Fonction qui retourne la date du jour en format "AAAA-MM-JJ"
char *DateDuJour()
{
   BufferReset(bd1);
   BufferAppendIsoDateOfTheDay(bd1);
   BufferReset(bd2);
   BufferStrncpy(bd2, BufferString(bd1), 4);
   BufferStrcat(bd2,"-");
   BufferStrncat(bd2, BufferString(bd1)+4, 2);
   BufferStrcat(bd2,"-");
   BufferStrncat(bd2, BufferString(bd1)+6, 2);
   return BufferString(bd2);
}

int main()
{
   // Initialisation des variables
   int compteur=0;
   char *dateModif;
   SxmlNode *docu ,*son;
   bd1=NewBuffer();
   bd2=NewBuffer();
   dateDebut=DateDuJour();

   printf("Date du jour : %s\n", dateDebut);
   printf("Voici la liste des pages ayant été modifiées aujourd'hui :\n");

   while ((docu=SxmlInputGetDocumentElement())) {
      // Si 'docu' a au moins un fils, on le stock dans 'son'
      if ((son=SxmlFirstChild(docu))){
         // Boucle qui traite tous les fils de 'docu'
         do{
            // On regarde si un des fils de 'docu' est une balise 'query'
            if(strcmp(SxmlNodeName(son),"query")==0){
               // On regarde si le premier fils de  'son' est une balise 'recentchanges'
               if(strcmp(SxmlNodeName(SxmlFirstChild(son)),"recentchanges")==0){
                  // On prend le premier fils de la balise 'recentchanges' qui s'appelle 'rc' et qui contient toutes les informations sur les modifications
                  SxmlNode *rc=SxmlFirstChild(SxmlFirstChild(son));
                  do{
                     dateModif=SxmlGetAttribute(rc,"timestamp"); // On récupère la date de la modification
                     if (strcmp(dateDebut,dateModif)<0){ // On calcule la différence entre la date du jour et celle de la modification
                        printf ("\t- Nom du Wicri : %s\n", SxmlInputRecordKey); // On affiche le nom du wicri concerné
                        compteur++; // On rajoute 1 au compteur de pages modifiées
                        // On affiche le nom de la page modifiée et l'utilisateur à l'origine de cette modification
                        printf("Page modifiée : %s, par %s.\n", SxmlGetAttribute(rc,"title"), SxmlGetAttribute(rc,"user"));
                        putchar('\n');}
                  }while(rc=SxmlNextSibling(rc)); // On répète la même opération pour chaque modification sur le wicri
               }
            }
         }while((son=SxmlNextSibling(son)));
      }
   };
   printf("%d pages ont été modifiées aujourd'hui.\n", compteur);
}

Mise en œuvre

Importation

WicriGetPage -l wicri-outils.fr -p "Wicri:Dilib source, module Wicri, commande WicriRecentChanges"   \
      | MediaWikiExtractSources -w | HfdStoreFile

Compilation

gcc testDilib/WicriRecentChanges.c $DILIB_CC   -o testDilib/WicriRecentChanges

Test

Sur les machines des stagiaires
cat testDilib/wiki.dict    \
  | ./testDilib/WicriExpandApiFromList  \
    -a  "list=recentchanges&rcprop=title|ids|sizes|flags|user|timestamp&rclimit=3" \
  | ./testDilib/WicriRecentChanges
A partir de la version V0.6.35 de Dilib
cat testDilib/wiki.dict    \
  | WicriExpandApiFromList  \
    -a  "list=recentchanges&rcprop=title|ids|sizes|flags|user|timestamp&rclimit=3" \
  | ./testDilib/WicriRecentChanges