Le web de Dominique Guebey – Bazar informatique

Page : http://www.dg77.net/tekno/manuel/rexxrss.htm


   D o m i n i q u e   G u e b e y    J u n g l e      Bazar informatique

Générateur Rexx de fichiers RSS 2.0

Présentation

Voici un script sans fioritures, programmé en Rexx. Son but est de lire des données récupérées plus ou moins laborieusement dans un fichier texte, et de les sortir convenablement emballées dans un fichier RSS réglementaire. De fastidieuses séances de copier-coller sont ainsi épargnées au webmestre.

Quelques finitions doivent être encore apportées au fichier sorti (titre général, build et pubDate…). On peut les réaliser en un tournemain avec un bon éditeur (fonction rechercher/remplacer…). Mais d’autres méthodes sont encore plus efficaces. Les transformation XSLT, par exemple, ne sont pas pour les chiens : voir notre modeste contribution.

Exemple

La source d’origine :

Illzach 03/05/09 - CHAMP. D'ALSACE INTERCLUBS R1 et R2
** 3000m SEF
1 20'18s00 SCHELCHER Isabelle Fc Mulhouse
** 5000m SEM
1 33'58s28 ELOY…
http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&frmmode=1&frmespace=0&frmcompetition=031356

Haguenau 03/05/09 - Interclubs 1er Tour : N1 A B C
** 3000m SEF
1 13'28s93 DELON Laurene Pays de Colmar Athle JUF
2 15'38s13 …
http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&frmmode=1&frmespace=0&frmcompetition=036372

Bordeaux 03/05/09 - Interclubs 1er Tour : N1 A C
** 3000m SEF
1 15'00s87 NARGUET Sandrine Sa Merignac,
2 15'14s95 MARCOU Amandine Sa Merignac…
http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&frmmode=1&frmespace=0&frmcompetition=038771

Remarques :

Le résultat :

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" 
xmlns="http://blogs.law.harvard.edu/tech/rss"
xmlns:dg="http://ns.dg77.net/XML/" 
>
   <dg:d:description>
      <dg:cre></dg:cre>
      <dg:upd></dg:upd>
   </dg:description>
   <channel>
      <title></title>
      <description></description>
      <link></link>
      <lastBuildDate></lastBuildDate>
<item>
   <guid>01779</guid>
   <title>Illzach 03/05/09 - CHAMP. D'ALSACE INTERCLUBS R1 et R2</title>
   <description>
   ** 3000m SEF
   1 20'18s00 SCHELCHER Isabelle Fc Mulhouse
   ** 5000m SEM
   1 33'58s28 ELOY…
   </description>
   <link>http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&amp;frmmode=1&amp;frmespace=0&amp;frmcompetition=031356</link>
   <pubDate></pubDate>
</item>
<item>
   <guid>1780</guid>
   <title>Haguenau 03/05/09 - Interclubs 1er Tour : N1 A B C</title>
   <description>
   ** 3000m SEF
   1 13'28s93 DELON Laurene Pays de Colmar Athle JUF,
   2 15'38s13 …
   </description>
   <link>http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&amp;frmmode=1&amp;frmespace=0&amp;frmcompetition=036372</link>
   <pubDate></pubDate>
</item>
<item>
   <guid>1781</guid>
   <title>Bordeaux 03/05/09 - Interclubs 1er Tour : N1 A C</title>
   <description>
   ** 3000m SEF
   1 15'00s87 NARGUET Sandrine Sa Merignac,
   2 15'14s95 MARCOU Amandine Sa Merignac…
   </description>
   <link>http://bases.athle.com/asp.net/liste.aspx?frmbase=resultats&amp;frmmode=1&amp;frmespace=0&amp;frmcompetition=038771</link>
   <pubDate></pubDate>
</item>
   </channel>
</rss>
Le programme
/* Met dans un fichier RSS 2.0 le contenu d'un fichier texte    */
/*  Pour chaque item :
 - Au moins une ligne vide entre chaque item
 - 1ere ligne : titre
 - ligne(s) intermediaire(s) : description
 - derniere ligne : lien
                                                              */
say " Fichier lu ? " ; pull entree
say " Fichier sorti ? " ; pull sortie
say " Premier numero a utiliser ? " ; pull numero

if sortie="" then exit

OKF = 0     /* 1=au moins une ligne non vide  */
ITEM = 0    /* 1=sortie d'un item commencee   */
TITR = 0    /* 1=le titre de l'item est sorti */
DESCR = 0   /* 1=sortie description commencee */

DO while lines(entree)>0
    ligne = linein(entree)
    parse var ligne 1 zontest 2 /* 1er caractere de la ligne */
    if zontest=" " then do      /* ligne blanche             */
            if ITEM==1 then call FINITM
        end
        else do
            if OKF==0 then call DEB /* 1ere sortie : mettre les entetes */
            ITEM = 1
            if TITR = 0 then do /* 1ere ligne item doit contenir le titre */
                    call lineout sortie, '<item>'
                    if numero \= 0 then do
                        call lineout sortie, '   <guid>'numero'</guid>'
                        numero = numero + 1
                        end
                    call lineout sortie, '   <title>'ligne'</title>'
                    TITR = 1
                end
                else do
                    parse var ligne 1 zontest 8
                    if zontest == 'http://' then do
                            if DESCR == 1 then call FDESC
                            /* remplace les "&" par l'entite correspondante */
                            call NETTOIE '&', '&amp;'
                            call lineout sortie, '   <link>'ligne'</link>'
                        end
                        else do
                            if DESCR == 0 then call lineout sortie, '   <description>'
                            DESCR = 1
                            call NETTOIE '--', '- - '  /* "--" indesirable en XML */
                            call NETTOIE '<', '&lt;'
                            call lineout sortie, '   'ligne
                        end
                end
        end
END
if ITEM == 1 then call FINITM
if OKF == 1 then do
    call lineout sortie, '   </channel>'
    call lineout sortie, '</rss>'
    end
exit
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
DEB:
OKF = 1
/*    - Sort Tags de debut                                     */
call lineout sortie, '<?xml version="1.0" encoding="iso-8859-1"?>'
call lineout sortie, '<rss version="2.0" '
call lineout sortie, 'xmlns="http://blogs.law.harvard.edu/tech/rss"'
call lineout sortie, 'xmlns:dg="http://exe.dg77.net/XML/" '
call lineout sortie, '>'
call lineout sortie, '   <dg:description>'
call lineout sortie, '      <dg:cre></dg:cre>'
call lineout sortie, '      <dg:upd></dg:upd>'
call lineout sortie, '   </dg:description>'
call lineout sortie, '   <channel>'
call lineout sortie, '      <title></title>'
call lineout sortie, '      <description></description>'
call lineout sortie, '      <link></link>'
call lineout sortie, '      <lastBuildDate></lastBuildDate>'
return
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*        Termine description                                   */
FDESC:
call lineout sortie, '   </description>'
DESCR = 0
return
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*        Termine un item                                       */
FINITM:
if DESCR==1 then call FDESC
call lineout sortie, '   <pubDate></pubDate>'
call lineout sortie, '</item>'
ITEM = 0
TITR = 0
return
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
NETTOIE:
parse arg chaine1, chaine2
apres = ligne
ligne = ''
avant = ''
do while apres \= ''
   numcar = Pos(chaine1,apres)
   if numcar==0 then do
        ligne = ligne || apres
        leave
        end
   numcar=numcar-1
   if numcar > 0 then do
        avant = avant || substr(apres,1,numcar) || chaine2
        ligne = avant
        end
   numcar = numcar+2
   apres = substr(apres,numcar)
end
return