Auto-éditer un wikilivre/Auto-référencer/lister.sh

Un livre de Wikilivres.
#! /bin/bash
# Fichier : lister.sh
VERSION=200701
#P Nom du fichier de commandes : lister
#P Syntaxe : "lister <nom du livre>"
#P Exemple : "./lister LivreTest" à la console.
#P Date de création : 26 mars 2020
#P Modifié le : 26 avril 2020 par GC
#P Modifié le : 30 mai 2020 par GC pour l'installation automatique.
#P Modifié le : 30 juin par GC pour inclure les sommaires aux fichiers de liste
#P Version de documentation sur WikiLivres le : 26 avril 2020
#P 
#P LES FICHIERS DE COMMANDES 
#P## header.sh ##############
#P header.sh, a créé le répertoire des commandes si celui-ci ne préexistait pas
#P   il a vérifié la validité ou invalidé de ligne de commande, initialisé
#P   les variables $Projet, $Site, $SitePrefix, vérifié l'existence des
#P   fichiers de liste "$Projet/$1".list et "$Projet/$1".prj, puis affiché le
#P   contenu du répertoire de travail.

#D L'objet de cette commande est de créer le fichier de liste $Projet/$1.list
#D   avec le fichier "contenu" prioritaire, sinon avec le fichier "compilé"
#D   si il existe.
#D Le 23 avril; créer la liste de projet $Projet/$1.prj a été jugée nécessaire
#D   pour que l'utilisation des boucles de commandes s'exécutent dans l'ordre
#D   de présentation des textes et des images afin de créer la page "Annexe"
#D   du livre (ou de la page).
#D
#D Si le fichier "<livre>.contenu" (copie de la page "Contenus" de la version
#D   imprimable) n'exite pas le programme teste la présence du fichier de
#D   compilation "<livre>.compilé", et si celui-ci n'est pas présent le
#D   programme se termine  avec un code de retour à 1.
#D Lorsque le programme se termine normalement le code de retour est 0, le
#D   fichier examiné aura été protégé contre l'effacement, donc en lecture
#D   seule, et le fichier projet.list aura été créé.
#D Le contenu des listes sont affichés pour être validés.
#D
#P L'extraction de la documentation peut se faire par la commande :
#P   mkd -Stw DP lister

#O inclure le fichier d'entête header.sh
    source header.inc

#O## lister #################
if [ $0=lister ]; then echo "lister : Version "$VERSION; fi

#O effacer tous les fichiers *.list,
rm *.list
#O initialiser la variable de retour à 0
retour=0
err1=1 #P initialise une valeur d'erreur
#T echo "retour = "$retour
#T echo "valeur d'erreur de retour N°1 = "$err1
#T exit

#O initialisation du fichier de liste avec la page racine du livre
    echo "https://$Site/wiki/$1" > $Projet/$1.list

#O créer le fichier de liste $Projet/$1.list avec les fichiers "contenu" ou  
#O   "contenus" prioritaires, ou avec les fichier "Sommaire" ou 
#O   "Sommaire_du_livre", sinon avec le fichier "compilé" si ils existent.
#O 
#O si un fichier de contenu existen, affecter la variable $Contenu, protéger
#O   le fichier conte l'écriture.
#P REMARQUE:les extensions en majuscules peuvent avoir tét produites par la 
#P   fonction "findbook.sh" par la commande "findbook.sh [ url ]" du sommaire 
#P   ou du fichier de Contenus de la version imprimable du livre.
#P   Exemple : (findbook.sh se trouve dans le répertoire ~/Annexer/bin)
#P   ./findbook https://fr.wikibooks.org/w/index.php?title=Goélette_Cardabela/Sommaire_du_livre
#P   Dans ce cas le répertoire du projet aura été créé dans ~/Annexer, et le
#P   fichier "Contenu=$Projet/$1.Sommaire" du_livre aura été créé dans ce 
#P   répertoire.
    if test -r $Projet/$1.contenu; then Contenu=$Projet/$1.contenu; fi
    if test -r $Projet/$1.Contenus; then Contenu=$Projet/$1.Contenus;fi
    if test -r $Projet/$1.compilé; then Contenu=$Projet/$1.compilé;fi
    if test -r $Projet/$1.Sommaire; then Contenu=$Projet/$1.Sommaire;fi
    if test -r $Projet/$1.Sommaire_du_livre; then Contenu=$Projet/$1.Sommaire_du_livre;fi
    chmod 444 $Contenu
    echo "Contenu : "; ls -l $Contenu
    
#O si la variable "$Contenu" n'existe pas existe ou n'est pas vide,
    if test -z $Contenu
#O alors : afficher les raisons de l'échec et recommander la marche à suivre.
    then
      clear
      echo "Les pages $Projet/$1.contenu et $Projet/$1.compilé n'ont pas été trouvées"
      echo ""
      echo  -e "\033[31m copier la page 'Contenus' du livre dans le fichier $Projet/$1.contenu \033[0m"
      echo ""
      echo -e "\033[31m  ou : copier la page de compilation dans le fichier $Projet/$1.compilé \033[0m"
      let retour+=1;
#O   afficher le code de retour de la commande et quitter. 
#P   Le code $retour n'est valable que pour un appel de fonction n'est pas pour
#P     une commande directe.
     if "$O" != "./lister" 
     then
       echo "code de retour : $retour"
       return $retour
     else
       exit $retour
     fi
#O fin si la variable "$Contenu" n'existe pas existe ou n'est pas vide,
    fi 
    
#O   si la variable "$Contenu" est égale à la chaîne "$Projet/$1.contenu" ou "$Projet/$1.Contenus"
      if [ "$Contenu" = "$Projet/$1.Contenu" ] || [ "$Contenu" = "$Projet/$1.Contenus" ]
#O   alors :
      then 
      {
#O     créer la liste des articles de la page avec la page de Contenus du livre.
        echo ""
        echo "$Projet/$1.list avec $Contenu :"
        cat $Contenu | sed "s/\[\[/$SitePrefix/g" | tr '|' '\n' | sed "s/\]\]//g" | grep "wiki" | tr ' ' '_' >> $Projet/$1.list
#O     créer le fichier de projet avec la page de Contenus du livre.
        cat $Contenu | grep $1 | sed "s/\[\[//g" | tr '|' '\n' |grep $1 | sed "s/$1\]\]/\r/g" | sed "s/\]\]//g" | cut -sd '/' -f2-5 > $Projet/$1.prj
      }
      fi
      
#O   si le fichier LivreTest.compilé existe,
      if test -r $Projet/$1".compilé" 
#O   alors :
      then 
      {
#O     créer la liste avec la page compilée.
        echo ""
        echo "$Projet/$1.list avec $Projet/$1.compilé :"
        cat $Projet/$1.compilé | sed "s/:\[\[/$SitePrefix/g" | tr '|' '\n' | sed "s/\]\]//g" | grep "wiki" | tr ' ' '_' >> $Projet/$1.list
#O     créer le fichier de projet avec la page compilée
        cat $1.compilé | grep $1 | sed "s/:\[\[//g" | tr '|' '\n' | grep $1 | sed "s/$1\]\]/\r/g" | sed "s/\]\]//g" | cut -sd '/' -f2-5 > $Projet/$1.prj
      }
      fi
       
#O   si la variable "$Contenu" est égale à la chaîne "$Projet/$1.Sommaire" ou "$Projet/$1.Sommaire_du_livre"
      if [ "$Contenu" = "$Projet/$1.Sommaire" ] || [ "$Contenu" = "$Projet/$1.Sommaire_du_livre" ]
#O   alors :
      then 
      {
#O     créer la liste des articles de la page avec la page de Contenus du livre.
        echo ""
        echo "$Projet/$1.list avec $Contenu :"
        cat $Contenu | sed "s/\[\[/\n$SitePrefix/g" | grep -e "https:" | grep -v "Catégorie:" | grep -v "#" | sed "s/{{BASEPAGENAME}}/$1/g" | tr '|' '\n' | sed "s/\]\]//g" | grep "wiki" | tr ' ' '_' >> $Projet/$1.list
        exit 0
        #cat $Contenu | sed "s/\[\[/$SitePrefix/g" | tr '|' '\n' | sed "s/\]\]//g" | grep "wiki" | tr ' ' '_' >> $Projet/$1.list
#O     créer le fichier de projet avec la page de Contenus du livre.
        cat $Contenu | grep "[[" | sed "s/\[\[//g" | tr '|' '\n' | grep $1 | sed "s/$1\]\]/\r/g" | sed "s/\]\]//g" | cut -sd '/' -f2-5 > $Projet/$1.prj
      }
      fi

#O afficher les listes pour contrôle et retourner la valeur 0 si tout est correct.
echo ""
echo " fichier Projet.list"
cat $Projet/$1.list
echo ""
echo " fichier Projet.prj"
cat $Projet/$1.prj
echo " "
read -p "Si tout est correct : retour-chariot pour continuer, Ctrl-C pour quitter > "
exit 0
# Fin lister.sh