Wicri:Dilib source, module Wicri, commande WicriRecentChanges : Différence entre versions

De Wicri Outils
imported>William Tardot
imported>William Tardot
(Code source)
Ligne 13 : Ligne 13 :
 
Buffer *bd2;
 
Buffer *bd2;
  
 +
// Fonction qui retourne la date du jour en format "AAAA-MM-JJ"
 
char *DateDuJour()
 
char *DateDuJour()
 
{
 
{
Ligne 28 : Ligne 29 :
 
int main()
 
int main()
 
{
 
{
int compteur=0;
+
  // Initialisation des variables
char *dateModif;
+
  int compteur=0;
SxmlNode *docu ,*son;
+
  char *dateModif;
bd1=NewBuffer();
+
  SxmlNode *docu ,*son;
bd2=NewBuffer();
+
  bd1=NewBuffer();
dateDebut=DateDuJour();
+
  bd2=NewBuffer();
 +
  dateDebut=DateDuJour();
  
printf("Date du jour : %s\n", dateDebut);
+
  printf("Date du jour : %s\n", dateDebut);
printf("Voici la liste des wikis ayant été modifiés aujourd'hui :\n");
+
  printf("Voici la liste des pages ayant été modifiées aujourd'hui :\n");
  
while ((docu=SxmlInputGetDocumentElement())) {
+
  while ((docu=SxmlInputGetDocumentElement())) {
    //printf ("SxmlInputRecordKey = %s\n", SxmlInputRecordKey);
+
      // Si 'docu' a au moins un fils, on le stock dans 'son'
    if ((son=SxmlFirstChild(docu))){
+
      if ((son=SxmlFirstChild(docu))){
    //printf("SxmlNodeName(son) = %s\n", SxmlNodeName(son));
+
        // Boucle qui traite tous les fils de 'docu'
    do{
+
        do{
    if(strcmp(SxmlNodeName(son),"query")==0){
+
            // On regarde si un des fils de 'docu' est une balise 'query'
    if(strcmp(SxmlNodeName(SxmlFirstChild(son)),"recentchanges")==0){
+
            if(strcmp(SxmlNodeName(son),"query")==0){
        SxmlNode *rc=SxmlFirstChild(SxmlFirstChild(son));
+
              // On regarde si le premier fils de  'son' est une balise 'recentchanges'
        do{
+
              if(strcmp(SxmlNodeName(SxmlFirstChild(son)),"recentchanges")==0){
          dateModif=SxmlGetAttribute(rc,"timestamp");
+
                  // On prend le premier fils de la balise 'recentchanges' qui s'appelle 'rc' et qui contient toutes les informations sur les modifications
          //printf("\tdate debut = %s\n", dateDebut);
+
                  SxmlNode *rc=SxmlFirstChild(SxmlFirstChild(son));
          //printf("\tdate modif = %s\n", dateModif);
+
                  do{
          //printf("\tdate différence = %d\n",strcmp(dateDebut,dateModif)); //négatif = modifié aujourd'hui
+
                    dateModif=SxmlGetAttribute(rc,"timestamp"); // On récupère la date de la modification
          if (strcmp(dateDebut,dateModif)<0){
+
                    if (strcmp(dateDebut,dateModif)<0){ // On calcule la différence entre la date du jour et celle de la modification
            printf ("\t- %s\n", SxmlInputRecordKey);
+
                        printf ("\t- Nom du Wicri : %s\n", SxmlInputRecordKey); // On affiche le nom du wicri concerné
            compteur++;
+
                        compteur++; // On rajoute 1 au compteur de pages modifiées
            printf("Page modifiée : %s, par %s.\n", SxmlGetAttribute(rc,"title"), SxmlGetAttribute(rc,"user"));
+
                        // On affiche le nom de la page modifiée et l'utilisateur à l'origine de cette modification
            putchar('\n');}
+
                        printf("Page modifiée : %s, par %s.\n", SxmlGetAttribute(rc,"title"), SxmlGetAttribute(rc,"user"));
        }while(rc=SxmlNextSibling(rc));
+
                        putchar('\n');}
  //printf("test attribut timestamp = %s\n", date);
+
                  }while(rc=SxmlNextSibling(rc)); // On répète la même opération pour chaque modification sur le wicri
        //printf("test date : (%.*s)\n", 10, date);
+
              }
        //
+
            }
        }
+
        }while((son=SxmlNextSibling(son)));
  // SxmlPrint(son);
+
      }
      }
+
  };
    }while((son=SxmlNextSibling(son)));
+
  printf("%d pages ont été modifiées aujourd'hui.\n", compteur);
    }
 
};
 
printf("%d wikis ont été modifiés aujourd'hui.\n", compteur);
 
 
}
 
}
 
</source>
 
</source>

Version du 9 juillet 2020 à 12:19

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

cat testDilib/wiki.dict    \
  | ./testDilib/WicriExpandApiFromList  \
    -a  "list=recentchanges&rcprop=title|ids|sizes|flags|user|timestamp&rclimit=3" \
  | ./testDilib/WicriRecentChanges