Wicri:Dilib source, module Wicri, commande WicriRecentChanges

De Wicri Outils
Révision datée du 13 juillet 2020 à 10:15 par imported>Jacques Ducloy (Test)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
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