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

header.inc.sh

modifier
  1. Ce code est à transcrire dans le répertoire ~/Annexer/tests/header.inc.sh et ne doit pas être exécutable.
  2. Lorsque le code est éprouvé, le transcrire dans le répertoire ~/Annexer/src
  3. Le code header.inc validé peut être transcrit dans le répertoire ~/Annexer/bin et ne doit pas être exécutable, le code doit être inclus dans un programme appelant par la commande 'source ~/Annexer/bin/header.inc'
  • Notez que ce code a été testé et peut être copié dans le répertoire des sources sans subir de tests préablables.
#! /bin/bash
# VERSION=200623
VERSION=210505
#H Nom du fichier de commandes : header.sh ou header.inc.sh (30 mai 2020)
#H Syntaxe : "./header.inc.sh <nom du livre>"
#H Exemple : "./header.inc.sh LivreTest" à la console pour les essais.
#H Ce fichier d'entête est commun aux fichiers de commandes annexer, lister,
#H télécharger, ajouter_sclt, ajouter_sclip dans lesquels ils sont inclus.
#H Date de création : 24 mars 2020
#H Modifié le : 14 mai 2020 par GC ajout des "données_de_conversions" url->utf8
#H Modifié le : 16 mai 2020 par GC maj de la nouvelle syntaxe de la commande.
#H Modifié le : 30 mai 2020 par GC maj pour l'installation automatique.
#H Modifié le 04 mai 2021 par JPL suppression des caractères ';' en fin de ligne
#H Modifié le 05 mai 2021 par JPL modification de la structure des répertoires
#H Version sur WikiLivres le : 17 mai 2020
#H
#D Le fichier de commandes header.sh doit être inclus dans tous les modules
#D de test du programme principal. Il initialise le répertoire des commandes,
#D le répertoire de travail du projet; le projet est le nom du livre, de
#D l'article ou de la page. Si ils n'existent pas ils seront créés
#D Ce projet éducatif et de tests est destiné à être utilisé sous wikilivres
#D en langue française et en caractères UTF8. 
#D Les variables Site et SitePrefix se rapportent à "fr.wikibooks.org".
#D Le programme est prévu pour fonctionner à l'initiative du contributeur qui
#D qui doit copier la page "Contenus" ou la page de la compilation dans le
#D répertoire de travail "~/Annexe/<nom du livre>"
#D Les modules en tests sont indépendants, cependant ils doivent être exécutés
#D dans l'ordre ./header.sh <livre>, ./lister <livre>, ./télécharger <livre>
#D ./ajouter_sclt <livre>, ./ajouter_sclic, ./ajouter_sclip <livre>
#D La liste des pages à analyser est indispensable dans tous les modules en
#D tests. L'absence de la liste des pages à analyser est signalée à chaque
#D lancement des modules du programme principal "Annexer"
#D
#D AVERTISSEMENT : Ce programme avec ses modules doit être utilisé par des
#D wikipédiens, à titre personnel. La structure du résultat est voisine de
#D l'impression par PediaPress. Pour cette raison ce programme n'est pas
#D commercialisable.
#D
#P Note : L'extraction de la documentation peut se faire par les commandes :
#P    Documentation :
#P mkd -Stw D header.sh <livre>_doc/header.inc.sh.D.doc
#P grep -e '#D' header.inc.sh | sed s/#D//g > <livre>_doc/header.inc.sh.D.doc
#P Organigrammes :
#P grep -e -n '#H' -e '#P' -e '#w' header.sh
#P ou : grep -E "#H|#P|#w" header.sh > <livre>_doc/header.sh.HPw.doc
#P   Exemples :
#P mkd -Stw D header.inc.sh LivreTest_doc/header.inc.sh.D.doc
#P grep -e '#D' header.sh | sed s/#D//g > LivreTest_doc/header.sh.D.doc
#P grep -n -E "#O|#P|#w" header.sh > LivreTest_doc/header.sh.HPw.doc 
#P
#O Vider (nettoyer) l'écran.
    clear
    echo $0, $1
#T Test break exit 0
#O Si l'option --t est présente, afficher la version de header.inc
    if [ "$0" = "./test-header.inc.bash" ] && [ "$1" = "--t" ] 
    then 
      echo "header.inc : Version "$VERSION
      sleep 2
    fi
#T Test break exit 0
#O Initialiser les répertoires des commandes et des données.
    RepRef=~/Annexer
    RepCom=~/Annexer/bin
    RepConv=~/Annexer/datas
#O Tester la présence du répertoire des commandes, si il n'existe pas,
#O   le créer
    echo "Test de présence du répertoire des commandes : "$RepCom
    if test -d $RepCom
    then
      echo " Le répertoire des commandes : "$RepCom" est présent !"
    else
      mkdir $RepCom
      echo " Le répertoire des commandes "$RepCom" a été créé !"
    fi    
#O Tester la présence du répertoire des données, si il n'existe pas,
#O   le créer
    echo "Test de présence du répertoire des données : "$RepConv
    if test -d $RepConv
    then
      echo " Le répertoire des données : "$RepConv" est présent !"
    else
      mkdir $RepConv
      echo " Le répertoire des données "$RepConv" a été créé !"
    fi

#O Initialiser la variable Conversion avec le lien vers le fichier
#O Données_de_conversion
    Conversions=~/Annexer/datas/données_de_conversions
#O Si le programme de test de header.inc est actif, alors vérifier la 
#O   présence du fichier de données
    if [ "$0" = "./test-header.inc.bash" ] && [ "$1" = "--t" ]
    then
      if test -a $Conversions
      then echo " Le fichier données_de_conversion est présent il ne sera pas actualisé."
      else 
      {
      echo "s/%E2%80%99/&amp;#8217;/g;s/%E2%82%AC/&amp;#8364;/g;s/%2F///g;s/%3F/?/g;" > $Conversions
      echo "s/%24/$/g;s/%21/!/g;s/%25/%/g;s/%2B/+/g;s/%3C/\&amp;lt;/g;s/%3E/&amp;gt;/g;" >> $Conversions
      echo "s/%5C/\/g;s/%B0/°/g" >> $Conversions
      echo "s/%E0/à/g;s/%E2/â/g" >> $Conversions
      echo "s/%E8/è/g;s/%E9/é/g;s/%EA/ê/g;s/%EB/ë/g" >> $Conversions
      echo "s/%EE/î/g;s/%EF/ï/g" >> $Conversions
      echo "s/%F4/ô/g" >> $Conversions
      echo "s/%F9/ù/g;s/%FB/û/g" >> $Conversions
      echo 's/%2C/,/g;s/%21/!/g;s/%3F/?/g;s/%40/@/g;s/%23/#/g;s/%24/$/g' >> $Conversions
      echo "s/%25/%/g;" >> $Conversions
      echo "s/%26/&amp;#x26;/g;" >> $Conversions
      echo "s/%28/(/g;s/%29/)/g;" >> $Conversions
      echo "s/%2B/+/g;" >> $Conversions
      echo "s/%3A/:/g;" >> $Conversions
      echo "s/%3D/=/g;" >> $Conversions
      echo "s/%5B/[/g;" >> $Conversions
      echo "s/%5D/]/g" >> $Conversions
      echo "s/%3B/;/g;s/%2F///g;s/%27//g" >> $Conversions
      echo 's/%22/"/g' >> $Conversions
      echo "s/%C3%A7/ç/g;s/%E7/ç/g" >> $Conversions
      echo "s/+/ /g;s/%7E/~/g;s/\/&amp;#92;/g" >> $Conversions
      echo "s/%0D/&amp;#x0D;/g;s/%0A/&amp;#x0A;/g" >> $Conversions
      echo "s/%C3%A0/à/g;s/%C3%A2/â/g" >> $Conversions
      echo "s/%C3%A9/é/g;s/%C3%A8/è/g;s/%C3%AA/ê/g" >> $Conversions
      echo "s/%C3%AE/î/g;s/%C3%AF/ï/g" >> $Conversions
      echo "s/%C3%B4/ô/g" >> $Conversions
      echo "s/%C3%B9/ù/g;s/%C3%BB/û/g" >> $Conversions
      echo "s/%C2%B7/-/g;s/%C2%AB/«/g;s/%C2%BB/»/g" >> $Conversions
    }
    echo " Le fichier '$Conversions' est créé."
    fi
  fi
#T cat $RepCom/$Conversions
#T exit
#T echo "https://fr.wikibooks.org/wiki/Fichier:Commerce_de_communaut%C3%A9s_indig%C3%A8nes.JPG"| sed -f $RepCom/$Conversions
#T exit
#T
#T echo "Paramètre d'entrée : "$1
#T exit 2
#O Créer la foncion header_syntax en mode test.
    function header_syntax
    {
      echo "Syntaxe de la commande header.inc en mode tests: header.inc [ --t | <livre>" ]
      echo -e "\033[1m-> ATTENTION\033[0m : Le nom du livre ne doit pas contenir le caractère 'espace'"
      echo "Exemples : 'test-header.inc.bash Faire_fleurir_le_sel' ou"
      echo "           'test-header.inc.bash ?' ou"
      echo "           'test-header.inc.bash --t' "
      echo " Le premier paramètre est transmis à la commande header.inc"
      #w seulement avec la commande 'Annexer'
      #w echo "ou header.inc <livre> [-v] [-pb||-pc]"
      #w echo "options -v:mode bavard, -pb ou -pc:versions personnalisées Wikibooks ou Commons."
      echo
    }
#O Tester la présence du premier paramètre de la ligne de commandes    
    if test -z "$1"
    then
      echo "-----"
      echo "Erreur, pas de paramètre en entrée"
      header_syntax
      exit 1;
    fi
    if test $1; then
      if [ $1 = '?' ]
      then
        header_syntax
        exit 0 
      fi
    fi
    if [ "$1" != "--t" ]
    then 
      echo "Projet : création de la page '$1.annexe' du livre : $1"
#O   Initialiser la variable "Projet" = répertoire de projet.
      Projet=$RepRef/$1
      echo "Répertoitre de projet : "$Projet
      echo "----------"
    else 
      echo -e "\033[33m Le projet n'est pas défini veuillez entrer un paramètre valide. \033[0m"
      exit 0
    fi
#T 
read -p "Si tout est correct : retour-chariot une pour continuer, Ctrl-C pour quitter >"
#O Tester la présence du répertoire du projet, si il n'existe pas, le créer.
    if test -d $Projet
    then
      echo "Le répertoire de projet : "$Projet" est correct !"
    else
      mkdir $Projet
      echo "Le répertoire de projet "$Projet" a été créé !"
    fi
#O Initialiser les variables 'Site' (nom du serveur) et 'SitePrefix'.
    Site="fr.wikibooks.org"
    SitePrefix="https://fr.wikibooks.org/wiki/"
#O Nettoyer l'écran, afficher les variables globales et le contenu du répertoire de projet.
#T  clear
    echo "----------"
    echo "Nom du projet: "$1
    echo "Site: "$Site
    echo "Préfixe du site: $SitePrefix pour la commande shell sed."
    echo "----------"
    echo "Liste des liens vers les articles à analyser:"
    echo "fichier : "$Projet/$1".list si il existe."
    if test -a $Projet/$1.list
    then
      echo "le fichier : "$Projet/$1".list existe."
    else
      echo -e "\033[31mle fichier : "$Projet/$1".list n'a pas encore été créé.\033[0m"
    fi
    echo "----------"
    echo "Liste des pages et articles à analyser:"
    echo "fichier : "$Projet/$1".prj si il existe."
    if test -a $Projet/$1.prj;
    then
      echo "le fichier : "$Projet/$1".prj existe."
    else
      echo -e "\033[31mle fichier : "$Projet/$1".prj n'a pas encore été créé.\033[0m"
    fi
    echo "----------"
    echo "Contenu du répertoire de travail du projet:"
    ls -al $Projet
    echo "----------"
# Fin header.inc.sh

ctrl-header.inc.bash

modifier

Ce code est à transcrire dans le répertoire ~/Annexer/tests/header.inc.sh et doit être rendu exécutable (chmod 755 ctrl-header.inc.bash)

ctrl-header.inc.bash contrôle des codes de header.inc.sh
vérifie que les lignes de codes ne contiennent pas de commentaire et lance les tests de validation avec test-header.inc.bash ci-après.
#! /bin/bash
#H file : ctrl-header.inc.bash

VERSION=210505

# Remplacer 'file.sh' par le nom du fichier de codes, exemple 'annexer.sh'
# Control if the local file.sh is clean
   echo -e "\033[1;33m Control header.inc.sh in the local test directory \033[0m" > text-control.txt
   echo -e "\033[1;33m Please check that the comment line does not contain an command \033[0m" >> text-control.txt
   grep -n -e "#O\|#P\|#T" header.inc.sh >> text-control.txt
   more text-control.txt
#T   echo -e "\033[31m ROUGE \033[0m"
#T   echo -e "\033[1;33m Please check that the comment line does not contain an command \033[0m"
   echo; echo "Continue ? y/n"
   read -s -e -n 1 -t 60 -p "y/n ? : " Inkey;echo
#T   echo "Inkey = $Inkey"
   if [ "$Inkey" != 'y' ]; then echo " Inkey is not yes, or time out after 60 sec, exit from $0"; exit 0;fi
   
# Copy file.sh file to fil without #O, #P,#T
   ls -l header.*
   echo -e "\033[1;33m Is the .sh file newer than the file without an extension ? \033[0m"
   echo -e "\033[1;33m Le fichier .sh est-il plus récent que le fichier sans extension ? \033[0m"
   read -s -e -n 1 -t 60 -p "y/n ? : " Inkey;echo
#T   echo "Inkey = $Inkey"
   if [ "$Inkey" != 'y' ]; then echo " Inkey is not yes, or time out after 60 sec, exit from $0"; exit 0;fi
   cat header.inc.sh | grep -v "#O\|#P\|#T" > header.inc

   echo " Test sans paramètre"
   ./test-header.inc.bash
   sleep 5
   
   echo " Test avec paramètre '?'"
   ./test-header.inc.bash ?
   sleep 5
   
   echo " Test avec paramètre '--t'"
   ./test-header.inc.bash --t
   sleep 5

   echo " Test avec paramètre 'LivreTest'"
   ./test-header.inc.bash LivreTest
   sleep 5

test-header.inc.bash

modifier

Ce code est à transcrire dans le répertoire ~/Annexer/tests/header.inc.sh et doit être rendu exécutable

#! /bin/bash
#H file : test-header.inc.bash
#H Syntaxe : ./test-header.inc.bash [ ? | --t | <livre> ]

VERSION=210505
   
# Begin tests
   echo "Premier paramètre : $1"
   if test -z $1
   then 
     echo " Syntaxe : ./test-header.inc.bash [ ? | --t | <livre> ]"
     exit -1
   fi
   source header.inc
   echo "retour : $?"