# Auto-éditer un wikilivre/Auto-référencer

Programmation bash (exercices, tests et documentation.) Un livre appartenant à la série Programmation de Wikilivres.
self-referencing
* Une version imprimable du livre « Auto-éditer un wikilivre » est disponible. (voir/ modifier)
* Ce livre a été classé comme étant accessible aux lecteurs de niveau 12.

## Codes shell pour créer la page « Annexe » d'un wikilivre
### Pourquoi avoir choisi le shell bash ?

    Les codes shells sont les plus proches du code machine, ils sont donc ultra-rapides, même sur de très vieux micro-ordinateurs, ils sont disponibles pour tous les systèmes d'exploitation, gratuits, efficaces, parfois difficiles à mettre en œuvre ou à comprendre car les règles sont strictes et les différentes versions diffèrent quelque peu selon que l'on choisit les versions posix ou gnu ou autres shells : csh, tcsh, ksh, etc.

### Synopsis de ce projet

    Examiner le projet en préétude, avec le LivreTest Ce projet doit permettre de créer la page Annexe des livres de wikilivres, avec :
* Les références.
* La liste des articles avec le lien, la licence associée, ainsi que les noms des contributeurs.
* La liste des illustrations avec le lien, la licence associée, ainsi que les noms des auteurs.
* La licence de la page principale ou de sa version imprimable.

### Outils de programmation

* Le shell BASH : Le programme sera écrit en code bash (Bourne again shell) ou Bourne_shell(bsh ou sh), sous linux de préférence. Il existe des versions de bash pour d'autres systèmes d'exploitation.
* Le système d'exploitation : Préférez Ubuntu pour avoir un accès direct aux paquets de mkd et ses applications dérivées, par le serveur sécurisé launchpad
* Le logiciel mkd : extracteur de documents. Il est recommandé de l'installer dès que possible..
* En complément de mkd, le shell mkddocu extracteur de documents écrit en bash. Avec l'option -s il extrait toutes les chaînes de caractères pré-encodées pour les traductions avec gettext.
       À défaut de mkd vous pouvez compiler mkdcpp

### Directives de programmation

    Les modules du programme devront être indépendants et éprouvés séparément avant d'être intégrés dans le programme principal. Pour ce faire on écrira un module d'entête header.sh qui servira aux tests de chaque module. Ce module d'entête fonctionnera comme les module "include" des langages C, c++ etc. Ce sera le fichier d'entête de chaque module inclus avec la commande shell source. Exemple : source header.sh

### Utiliser les codes d'extraction suivants pour les logiciels de documentation

    #H pour les commentaires d'entête. On va les retrouver dans toutes les commandes du projet #O pour les commentaires d'organigramme. #P pour les commentaires destinés aux Programmeurs. #S pour les commentaires de structure. #T pour les commentaire de tests, ce sont souvent des points d'arrêt pour la mise au point. #w pour des commentaires d'attention, de mise en garde.

### Internationalisation des messages

    Tous le messages affichés avec la commande echo devront être traduits en anglais, langue de base pour les traductions, puis intégrés dans le programme final. Un fichier .pot sera créé pour les messages puis traduits à l'aide de Poedit et compilés sous forme de fichier .mo copiés dans les répertoires de traduction habituels.

### Internationalisation des manuels

* Un manuel man(1) unix sera écrit en français puis traduit en anglais.
* Un manuel html sera écrit en français et en anglais pour être lus à l'aide de navigateurs internet.

### Références

   * ↑ http://pwet.fr/man/linux/commandes/posix/
   * ↑ https://korben.info/installer-shell-bash-linux-windows-10.html
   * ↑ Mkd_(Extracteur_de_documents)/La_commande_mkd#Disponibilité
   * ↑ Mkd_(Extracteur_de_documents)/Ajouter_des_modules#
   * ↑ https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/mkdcpp

### Entête des modules
#### Organigramme

Code header.sh

#### Référence de l'article pour cette section

    Version du 25 mai 2020

#### Version actualisée
## header.inc.sh

* Ce code est à transcrire dans le répertoire ~/Annexer/tests/header.inc.sh et ne doit pas être exécutable.
* Lorsque le code est éprouvé, le transcrire dans le répertoire ~/Annexer/src
* 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.

### ctrl-header.inc.bash

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.

### test-header.inc.bash

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

### Annexer (main)
#### (Appendix)

Annexer ou annexer.sh est la page principale qui permet de produire la page « Annexe », elle utilise les commandes shell "header.sh, "lister", "télécharger", "ajouter_sclt", "ajouter_sclic" et "ajouter_sclip".

#### Documentation

    mkd -Stw D annexer Bash_doc/annexer.D.doc, qui respecte les tabulations, ou : mkd -sStw D annexer > Bash_doc/annexer.D.doc, avec une présentation comme ci-dessous.

#### Organigramme

    mkd -nStw O annexer Bash_doc/annexer.O.doc
Code du programme maître annexer

#### Version de référence pour cet article du 20 mai 2020

    Annexer.sh

#### Tests unitaires du fichier de commandes annexer

Faire un brouillon avec le micro-ordinateur sous linux (ou autre système acceptant les shells bash).
* Avec un micro-ordinateur doté d'un système d'exploitation unix ou linux.
* Copier le code du fichier annexer dans un éditeur de texte comme Notepadqq, Gedit, ou Bluefish.
* Créer le répertoire Annexer avec l'éditeur, ou, sous console : mkdir ~/Annexer
* Enregistrer le texte avec pour nom annexer dans le répertoire Annexer.
* Sous console, entrer dans le répertoire Annexer : cd ~/Annexer
* Copier le code de la commande header.sh dans ~/Annexer/.
* Rendre les commandes annexer et header.sh exécutables : chmod 777 annexer header.sh
* Pour tester, lancer la commande ./annexer LivreTest.
* Observer le répertoire LivreTest : ls -l ~/Annexer/LivreTest qui doit être vide.
* Copier et coller tous les codes des modules : header.sh, lister, télécharger, ajouter-sclt, ajouter_sclic, ajouter_sclip, dans le répertoire des commandes Annexer. exemple : code header.sh dans le fichier ~/Annexer/hearder.sh, etc.
* tous les fichiers shell doivent être exécutables chmod 777 lister télécharger ajouter_sclt ajouter_sclic ajouter_sclip
* Éditer et copier le contenu de la page Contenus de la version imprimable, dans le répertoire de travail du projet, ~/Annexer/<nom du livre>/. avec pour nom <nom du livre>.contenu ou le contenu d'une page de compilation, avec pour nom <nom du livre>.compilé. ls -l ~/Annexer/<nom du livre> doit maintenant afficher un de ces deux fichiers.
Note : Si, par exemple, vous lancez la commande ./annexer LivreTest ou ./header.sh LivreTest de n'importe répertoire, les répertoires ~/Annexer et ~/annexer/LivreTest seront automatiquement créés au bon endroit par l'entête header.sh. Il suffira de copier le fichier de commandes annexer ou annexer.sh dans le répertoire de fichiers de commandes : "mv ./annexer ~/Annexer/annexer" ou shell bash sous windows, "mv ./annexer.sh ~/Annexer/annexer.sh"

#### Annexe obtenue
##### Impression visuelle de cette annexe

Utilisateur:Goelette_Cardabela/Sandbox/LivreTest/Annexe_bis

###### Comparer avec la versions manuelle ou semi-automatique

Utilisateur:Goelette_Cardabela/Sandbox/LivreTest/Annexe

### Lister (module)
#### (List)

Créer une liste des liens vers les pages qui composent le livre.

#### Organigramme

Code du module lister

#### Référence pour cet article

    lister

#### Article actualisé

    #! /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

#### Exemple de page Contenus du livre en test LivreTest

    LivreTest.contenu
La page Contenus d'une version imprimable contient l'Article maître du livre OU la liste des articles qui composent le livre. Dans ces tests nous incluons les deux versions qui nous permettrons de distinguer des présentations différentes de la page Annexe du livre.

#### Exemple de page du livre en test, LivreTest compilé

    LivreTest.compilé
Nous faisons ici les mêmes remarques que pour la page Contenus de la version imprimable. La première ligne, qui est un lien vers la page principale n'existe pas, normalement, dans une version compilée. Si elle est présente dans de fichier, c'est pour la même raison de démonstration que précédemment: voir les différences de présentation de la page Annexe du livre.

#### Exemple de listes obtenues pour le livre LivreTest

    LivreTest.list
    LivreTest.prj

#### Tests du module lister

Le but est d'obtenir un fichier qui content la liste des liens vers les pages d'un livre de wikilivres à documenter.
Nous pouvons obtenir ces liens grâce aux pages « Contenus » des Versions imprimables et « Compilation » issue de la compilation d'une page. (Menu à gauche d'une page wikimedia.) Il est aussi possible d'éditer et d'enregistrer manuellement une telle liste.

##### Les lignes qui méritent notre attention

La ligne 65 dans l'édition du 26 avril 2020 : Remarque : $Projet est un répertoire et $1.contenu est un fichier.
Cette ligne prend en compte le texte de la page Contenus de la Version imprimable du livre pour créer le fichier de liste.
La ligne elle même signifie :
La ligne 79 de la même édition :
Cette ligne prend en compte le texte de la page Compilation de la Version compilée du livre pour créer le fichier de liste.
Le commentaire est le même que pour la ligne précédent à ceci près qu'au premier filtre on supprime aussi le caractère ':' du début de ligne des fichiers issus de la compilation.

##### Tests de la commande

* Copier le code du chapitre Lister dans un éditeur et enregistrer ce code dans le répertoire Annexe sous le nom « lister » ou « lister.sh »
* Autoriser l'exécution du code par la commande chmod 777 ~/Annexe/lister
* Copier le « Contenus » de la Version imprimable vu précédemment dans ce sous chapitre,
* Enregistrer ce « Contenus » dans le fichier Annexe/LivreTest/LivreTest.contenus
* Lancer la commande ./lister LivreTest
Vérifier que l'on obtient les fichier
    ~/Annexe/LivreTest/LivreTest.list :
Vérifier que l'on a modifié les autorisations du fichier LivreTest.contenus afin qu'il ne puisse pas être supprimé par mégarde lors des manipulations de fichiers.
    ~/Annexe/LivreTest/LivreTest.prj :
Vérifier avec la commande : ~/Annexer$ ls -l ~/Annexer/LivreTest/LivreTest.contenu, que le fichier LivreTest.contenu est en lecture seule pour tous les utilisateurs : -r--r--r--.

### Télécharger (module)
#### (Download)

    Télécharger le code source de la page ou la sous page grâce à la liste obtenue dans la section lister.

#### Organigramme

Code du module télécharger

#### Test du module « télécharger »

Le but est de télécharger tous les fichiers html qui composent le livre grâce au fichier de liste obtenu précédemment.

##### Les lignes qui méritent notre attention

ligne48 de la version du 26 avril 2020
Cette ligne crée la structure complète des répertoires et fichiers, depuis la racine du site, jusqu'aux fichiers html qui composent le livre.

###### Exemple

    lignes 80 à 96 de la version du 26avril 2020
    ligne 4 : On ajoute .html à la variable $ligne puis on copie dans le fichier source local, toute la ligne en supprimant https://.
    ligne 5 : On affecte la variable Source le texte enregistré dans le fichier source
    ligne 6 : On affiche à la console le nom de la variable $Source :
       Exemple pour la première ligne : fr.wikibooks.org/wiki/Utilisateur:Goelette Cardabela/Sandbox/LivreTest.html
    ligne 8 : On copie le dernier champ de la ligne dans le fichier destination. C'est du texte !
       Exemple pour la première ligne : LivreTest
    ligne 10 : On en profite pour créer le répertoire correspondant à ce champ dans le répertoire courant.
       ~/Annexer/LivreTest est le répertoire racine du projet, ~/Annexer/LivreTest/LivreTest sera le répertoire de travail de la page principale.
    ligne 11 : On ajoute à ce dernier champ l'extension .html que l'on concatène au fichier destination. C'est une url !.
    ligne 15 : On copie les fichiers html du répertoire source (local) vers le répertoire de destination (local).
       On obtient finalement le lien ~/Annexer/LivreTest/LivreTest/LivreTest.html où la variable du projet $Projet est ~/Annexer/LivreTest.
       Il faudrait ajouter $Projet/ devant source et destination pour être certain de copier dans le répertoire de travail racine.

##### Tests de la commande télécharger

On devrait obtenir :

###### Liste des répertoires créés avec la commande télécharger LivreTest.

. .. ArticleDeux ArticleTrois ArticleUn fr.wikibooks.org LivreTest LivreTest.compilé LivreTest.compilé.test LivreTest.contenu LivreTest.contenu.test LivreTest.dirs LivreTest.list LivreTest.locale.list LivreTest.mainPage LivreTest.prj wget-log-télécharger.txt

### Ajouter sclt (module)
#### (Adding sclt) or (Append sclt)

Ajouter la section article, source, licence, contributeur(s).

#### Organigramme

Code du module ajouter_sclt

#### Tests du module ajouter_sclt

Le but est de créer l'entête de la page Annexe et d'y ajouter la liste des articles avec les sources, licences, contributeurs.
Les numéros des pages n'est possibles que lorsque la version imprimable aura été créée, avec une post-indexation et une post-annexion.

##### Les lignes qui méritent notre attention

Remarque : Dans les explications du code on entend par projet le nom du projet entré en paramètre dans la commande ./ajouter_sclt projet
Lignes 117-119 de la version du 29 avril 2020
mkd n'est pas inclus dans les distributions linux. les paquets et sources sont téléchargeable pour tous les systèmes d'exploitation. Pour toute informations complémentaires : mkd (commande unix), Mkd_(Extracteur_de_documents) Cette ligne de commandes extrait tous les commentaires avec une sortie dans un fichier projet.tmp ainsi que vers la sortie standard (l'écran par défaut) où elle est reprise pour être listée en colonne grâce au séparateur de chaînes ','.
Lignes 124-130
$ligne est la variable lue ligne par ligne du fichier de liste projet.pj dans une boucle tant qu'il y a des lignes à lire, faire ... Cette ligne est aussi le nom de l'article qui va être analysé. Si $ligne n'est pas le nom du livre (de l'article principal) le nom de l'article est ajouté à la page $PageSclt.
Lignes 132-139
La deuxième ligne crée le fichier de .RevisionId dans lequel on écrit une chaîne de caractères sans retour à la ligne. La troisième ligne :
Lignes 152-164
* La ligne 2 initialise dans le répertoire $Projet/$ligne/, le fichier $ligne.license de l'article $ligne.
* Les lignes 3 et 5 sont des commentaires de tests à l'usage des programmeurs.
* La ligne 4 produit les fichier .license dans le répertoire de l'article correspondant.
* La ligne 5 :
* Les lignes 6 à 9 ajoutent la license à $PageSclt si la license concerne un article et non la page principale du livre.
* La ligne 10 affiche à l'écran le contenu du fichier qui vient d'être créé.
* La ligne 13 : mêmes remarques que précédemment par sélection du bas de page en français avec licence.
Lignes 155-159
* mêmes remarques que pour les actions précédentes.

##### Tests de la commande
###### Apparence provisoire un peu arrangée pour ne pas intervenir sur l'index des sections de cet article ...

Annexe
Références
Contenus
https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Sandbox/LivreTest
https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Sandbox/LivreTest/ArticleUn
https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Sandbox/LivreTest/ArticleDeux
https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Sandbox/LivreTest/ArticleTrois
Source de cette édition
https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Sandbox/LivreTest
Sources licences et contributeurs des articles
Les sources listées pour chaque article fournissent des informations de licence plus détaillées, y compris le statut des droits d'auteurs, les détenteurs de ces droits et les conditions de licence.
ArticleUn , source : https://fr.wikibooks.org/w/index.php?oldid=632571 , licence : https://creativecommons.org/licenses/by-sa/3.0/ , auteur(s) : Goelette Cardabela
ArticleDeux , source : https://fr.wikibooks.org/w/index.php?oldid=632572 , licence : https://creativecommons.org/licenses/by-sa/3.0/ , auteur(s) : Goelette Cardabela
ArticleTrois , source : https://fr.wikibooks.org/w/index.php?oldid=632573 , licence : https://creativecommons.org/licenses/by-sa/3.0/ , auteur(s) : Goelette Cardabela

### Ajouter scli (trois modules indépendants)
#### (Adding scli) or (Append scli)

Ajouter la section image, source, license, contributeurs(s) à la page Annexe.

#### Les fichier de commandes scli
##### On peut concevoir deux façon ce référencer les images

* La version globale : on extrait les images de la page principale.
* La version par article : les images sont extraites de chaque article, ce qui donne :

##### Version classique sclic (module)
###### Organigramme programmeur

Code ajouter_sclic

##### Version personnalisée par article sclip (module)

Cette commande est composée de trois parties :
* Le module principal. Il prépare l'entête de la section Images, source, licence, auteur puis exécute l'un ou l'autre des modules de récupération des images.
* Le module de récupération des images de Commons dans le sous-répertoire de la page du livre.
* Le module de récupération des images sur le site Wikilivres.
Chacun de ces modules peut être éprouvé séparément.
Il n'est pas envisagé de détailler l'explication des lignes de codes, on peut considérer que la compréhension des codes de commandes bash est suffisamment assimilée à ce niveau de la programmation. Les explications éventuelles se trouvent au sein du code de programmation.

##### Entête ajouter_sclip
###### Documentation

** ajouter_sclic ##########
** ajouter_sclip ##########

###### Organigramme

Code ajouter_sclip

##### Module sclipco.inc

Code sclipco.inc

##### Modude sclipwb.inc

Code sclipwb.inc

#### Comparaison des annexes obtenues pour la page LivreTest
##### Annexe classique avec sclic

Éditer cette annexe.

##### Annexe personnalisée avec le téléchargement sur le serveur Commons

Éditer cette annexe.

##### Annexe personnalisée avec le téléchargement sur le serveur Wikilivres

Éditer cette annexe.

##### Comparaison avec l'annexe manuelle ou semi-manuelle

Éditer cette version manuelle.

## Tests unitaires et d'intégration

Les fichiers de commandes shell peuvent être éprouvés successivement, sous linux ou sous d'autres systèmes d'exploitation acceptant les commandes shell bash : Windows 10, MinGw, Cygwin, ....
Pour effectuer ces tests il faut se placer dans le répertoire utilisateur et créer un répertoire qui regroupe les fichiers de commandes. Dans les exemples présentés : mkdir ~/Annexer
Les fichiers de commandes :
header.sh, annexer, lister, télécharger, ajouter-sclt, ajouter-sclic, ajouter-sclip, sont prévus pour être placés dans ce répertoire des commandes ~/Annexer. Le fichier header.sh est non seulement un fichier de commandes, il est aussi un fichier d'entête pour tous les modules en tests unitaires.
Les commandes peuvent être éprouvées avec tous les livres disponibles. Pour les essais de ces versions en tests, nous avons utilisé le livre « LivreTest ».
La commande « annexer » permet le test d'intégration de tous les modules avec des points d'arrêt possibles après chaque module testé.
Rendez-vous dans le chapitre Annexer pour effectuer ces test et/ou avoir plus d'informations.

## Copier et installer les fichiers de l'application et des tests

Ces versions, mises à jour, peuvent être différentes des premières versions exposées dans les chapitres de cet article.
Éditer la page originale

### Codes de l'application en français avec les manuels
#### Il est possible de télécharger cette application expérimentale à but éducatif

    Télécharger par ftp Remarque concernant l'état du serveur de téléchargements
* télécharger Annexer-fr_200701.zip qui contient les copies des articles ci-dessous,
* télécharger md5sum_Annexer-fr_200701.zip qui contient la somme de contrôle attestant que le fichier n'a pas subi de modification.
* md5sum de Annexer-fr_200701.zip: c4825faa84eef1514d72edb0bd7b394e
* Les droits de copies et de partages des fichiers téléchargés sont ceux des articles ci-dessous.
* Copier le contenu de la page du premier module header.inc.sh dans un éditeur de texte comme Notepadqq, l'enregistrer sous le nom header.inc.sh dans le répertoire des tests ~/Annexer/tests/header.inc.sh/header.inc.sh que vous aurez créé.
* Y copier également des programmes de test ctrl-header.inc.bash et test-header.inc.bash
* Ouvrir un terminal. Dans le répertoire '~/Annexer/test/header.inc.sh/', modifier le mode de lecture-écriture-exécution des programmes de contrôle et de tests de header.inc.sh de la façon suivante : chmod 755 *.bash Exécuter le module sans paramètre : ./ctrl-header.inc.bash puis avec le paramètre LivreTest
* Éditer la page LivreTest.contenu, copier la partie éditée et l'enregistrer sous le nom LivreTest.contenu dans le répertoire Annexer/LivreTest qui vient d'être créé par l'exécution de ./ctrl-header.inc.bash LivreTest.
* Copier le contenu de la page du module lister.sh, pour les tests, et l’enregistrer sous le nom '~/Annexer/tests/lister.sh/lister.sh '. Y copier également les programmes ctrl-lister.bash, et test-lister.bash Faire les test du module et observer les modifications du répertoire Annexer/LivreTest.
* ... et ainsi-de-suite. Le dernier fichier à créer est le fichier d'exécution globale annexer.
* Annexes que l'on doit obtenir : 1) Annexe globale - 2) Annexe personnalisée wb - 3) Annexe personnalisée co.
    Annexe obtenue avec la version 200623 de l'application Faire_fleurir_le_sel/Annexe

#### Fichiers du logiciel annexer
##### Les fichiers suivants, en cours de réécritures, devront être installés dans le répertoire ~/Annexer/src, puis installés avec l'installateur.

Auto-éditer_un_wikilivre/Auto-référencer/header.inc.sh Fichier d'entête, inclus dans tous les modules. Version 210505
Auto-éditer_un_wikilivre/Auto-référencer/lister.sh Crée les fichiers de listes pour les modules suivants. Version obsolète 200701
Auto-éditer_un_wikilivre/Auto-référencer/télécharger.sh Télécharge les pages de Wikilivres selon les listes générées.Version obsolète 200623
Auto-éditer_un_wikilivre/Auto-référencer/ajouter_sclt.sh Ajoute l'entête pour les textes et les articles de l'Annexe. Version obsolète 210125
Auto-éditer_un_wikilivre/Auto-référencer/ajouter_sclic.sh Ajoute l'entête globale pour les images et illustration, etc. Version obsolète 210125
Auto-éditer_un_wikilivre/Auto-référencer/ajouter_sclip.inc.sh Ajoute les textes des conditions de copie des images. Version obsolète 210125
Auto-éditer_un_wikilivre/Auto-référencer/sclipwb.sh Ajoute, par article, les liens vers les images selon Wikilivres. Version obsolète 210125
Auto-éditer_un_wikilivre/Auto-référencer/sclipco.sh Ajoute, par article, les liens vers les images selon Commons. Version obsolète 210125
    ↑ Ce module sclipco.sh utilise des données produites par le module sclipwb sclipco.sh l’exécutable est à réviser. Avis du 30 juillet 2020 et du 25/01/2021.
Auto-éditer_un_wikilivre/Auto-référencer/annexer.sh Commande globale. Version obsolète 200626
Auto-éditer_un_wikilivre/Auto-référencer/md5sum_src-orig Somme de contrôle des fichiers depuis la Version 200623
Auto-éditer_un_wikilivre/Auto-référencer/cp-localsrc-2-localbin . Version 210504
    ↑ L'Installateur ci-dessus installe les fichiers de commandes dans le répertoire d'exécution ~/Annexer, il doit d'être installé en mode exécutable dans le répertoire des sources ~/Annexer/src.

#### Fichiers de documentation du logiciel annexer

    Les fichiers suivants doivent être installés dans le répertoire ~/Annexer/tests/02-manuels. Effectuer les tests puis installer le manuel dans le système linux avec makeman_annexer.sh Après avoir effectué l'installation dans le système linux, vous pouvez utiliser le script htmlman.sh pour créer le manuel en html et texte pour l'imprimante.
Auto-éditer_un_wikilivre/Auto-référencer/annexer_fr.1 Fichier nroff avec un aperçu, pour l'installation du manuel français version 200626
Auto-éditer_un_wikilivre/Auto-référencer/annexer_fr.html Fichier html avec un aperçu, pour l'installation du manuel français version 200626
Auto-éditer_un_wikilivre/Auto-référencer/makeman_annexer.sh Cet exécutable installe le manuel dans la sructure unix/linux en français.

#### Fichiers d'installation
##### INSTALLER.sh

Cette commande télécharge tous les fichiers de commandes et installe l'application dans les répertoires du PC.

##### Syntaxe

    INSTALLER.sh [ liste | pour moi | pour tous | pour admin ]
       Exemples dans le répertoire d installation : ~/tmp
       -> exemple ./INSTALLER.sh annexer.list, pour télécharger les articles depuis wikilivres.
       -> exemple ./INSTALLER.sh pour moi, pour copier les codes dans ~/Annexer.
       -> exemple ./INSTALLER.sh pour tous, pour copier les codes exécutables dans /usr/local/bin.
       -> exemple ./INSTALLER.sh pour admin, pour copier les codes exécutables dans /usr/local/sbin.
Fichier original à copier-coller pour télécharger l'application Annexer, avec le fichier annexer.list qui contient la liste des fichiers à télécharger : $^{vβ200604}$ Auto-éditer_un_wikilivre/Auto-référencer/INSTALLER.sh shell exécutable
$^{vβ210419}$ Liste des fichiers à copier Texte pour mémoire, préférer lancer les copies avec la page wikilivres
Auto-éditer_un_wikilivre/Auto-référencer/html_data_conversions Copie pour contrôle du fichier INSTALLER.sh md5sum : c7a7e6eb3347e2f0d614df29029d5578
Auto-éditer_un_wikilivre/Auto-référencer/html_url_conversions Copie pour contrôle du fichier INSTALLER.sh md5sum : a01327f2138adeffea16e446be79e917

## Post-référencer post-indexer un wikilivre
### Post-référencer

    Créer l'Annexe après avoir créé la version imprimable d'un livre. Ceci inclut les liens vers les pages Version_imprimable/Annexe et Version_imprimable/Index créées bien que sans contenu réel au moment de la création de l'Annexe.

### Post indexer

    Cela veut dire "Créer les liens entre les articles et les numéros des pages du livre. Cela se fait de façon naturelle avec OpenOffice et LibreOffice.

## Post indexer avec Open Office (OO) ou LibreOffice

Avec OpenOffice ou LibreOffice on n'obtient pas l’équivalent d'une Version imprimable d'un wiki-livre. Comparer les deux versions PDF de La goélette Cardabela - (De 1979 à 1999), tout pour la re-construire. * La version pour liseuse est construite avec LibreOffice, le fichier PDF est produit avec une réduction de la définition de 300px pour être téléversable sur Wikimedia Commons. Il y a été nécessaire de revoir la configuration des images et de créer une copie d'écran pour insérer les formules mathématiques. * La version PDF (avec couverture) est plus ancienne, elle a été produite avec l'application PDF24 et la version imprimable. Le PDF est généré avec une résolution de 700px. Il n'y a eu aucun problème avec les formules mathématiques lors de la création du PDF.
    Il faut donc noter que les éditeurs OO et LO n'aiment pas les formules mathématiques copiées de Wilikivres..

### Survol rapide de post indexation avec le LivreTest
#### Préparation du document avec OO

* Démarrer "OpenOffice Writer".
    Au démarrage la page est en style "Standard". Modifier le style de la page en style "Première page". (Pour le sommaire dont la page ne doit pas être numérotée). Appuyer sur la touche "F11", Choisir "Style et formatage" puis "Première page" et validez par un retour chariot.
* Insérer une "Nouvelle page" de style "Première page". (Pour le verso du sommaire qui ne doit pas être numéroté.)
    "Insérer" un "Saut manuel", avec le choix du "Style" : "Première page", sans cocher "Modifier le numéro de page".
* Insérer une troisième 'Nouvelle page" style "Première page" pour y insérer le premier article.
* Insérer une quatrième page, style "Standard", et valider la numérotation qui doit commencer à 1, page du sommaire, bien qu'elle ne soit pas affichée. Le premier numéro de page visible sera ici la page 4.

#### Copier le document dans OO

* Se déconnecter du compte utilisateur wikilivres. (Cela évite de recopier les renvois tels que ↑ [URL] [[lien]].), numéro de section et sous-section qui ne doivent pas apparaître dans le pages du vivre. Ceci facilite aussi la création table des matières et de l'index alphabétique.
* Dérouler les textes masqués.
* Surligner et copier (avec touches Crtl+C) le document. (Chaque article ou tout le document.)
* Coller (avec touches Ctrl+V) le document dans la page de "Style standard".
* Le cas échéant, chercher et supprimer les liens associés aux chapitres « ↑ », « [URL][[lien]] », numéros de chapitres.
* Corriger la mise en page, réinsérer les sauts de pages qui n'auront pas été pris en compte.
* Corriger la mise en page des tableaux. Il est parfois préférable de créer de nouveaux tableaux et d'y coller le contenu des tableaux mal agencés.

##### Créer l'« Index lexical »

Il faut commencer par créer tous les index afin qu'ils soient pris en compte dans la table des matières. Documentation : Index lexical, Fichier de concordance.
* Ajouter une page de style standard à la suite du document pour y insérer les index. Dans le menu « Insérer, saut manuel, saut de page », Choisir style Index et placer le curseur en haut de la page.
* Créer l'indexation : « Insertion/Index et tables », choisir « Entrée » et « Index lexical »
* Dans le champ « Entrée » surligner le mot ou la phrase à indexer. Carthagène des Indes dans l'exemple ci-dessous.
* Dans le champ « Clé 1 » LivreTest dans l'exemple ci-dessous.
* Dans le champ « Clé 2 » Annexe dans l'exemple ci-dessous.
* Cliquer sur « Insérer »
Exemple d'Index lexical créé pour l'exercice "LivreTest" (Utilisateur:Goelette_Cardabela/Sandbox/LivreTest).

##### Créer l'« Index des illustrations »

L'index des illustrations aura peut-être été créé par le programme Annexer qui renvoie à l'adresse internet d'origine. Cependant, pour les liseuses il est intéressant de créer cet index des illustrations avec OpenOffice ou LibreOffice; cet index renvoie à l'image dans le livre.
Pour créer cet index automatique il est nécessaire de cliquer sur l'image puis de faire un clic droit pour faire apparaître un menu.
* Sélectionner Légende
* Dans la fenêtre Légende placer le nom de l'image.
* Dans la fenêtre Catégorie sélectionner illustration.
* Dans le bas du menu apparaît Illustration 1 : nom de l'illustration.
* Choisir la position de ce texte dans le bas de l’image infra, sinon supra au dessus.
* Créer l'index des illustrations dans le menu des insertions Table des matières et index.
* Choisir, dans Afficher : Texte de légende.
Exemple :
    url de la page : https://commons.wikimedia.org/wiki/File:LivreTest.pdf
    url du fichier : https://upload.wikimedia.org/wikipedia/commons/7/70/LivreTest.pdf
Important: Dans toutes ces opérations, penser à Actualiser les changements, Tout, ou aux choix proposés.

##### Créer la « Table des matières »

La table des matière se place dans, ou après, la page Index, après la table des illustrations dans un ouvrage traditionnel. Toutefois, dans les ouvrages de Wikilivres la table des illustrations, avec les liens Internet, se place dans la page Annexe si elle est créée avec le programme Annexer, après la table des articles. Il est aussi possible de placer la table des matières en début de livre en remplacement du Sommaire, il suffit de remplacer le nom Table des matières par Sommaire.
Créer une page de style "première page" pour y insérer la table des matières. Placer le curseur au début de la page.
La table des matières donne le titre des articles et des sections. Il n'y a pratiquement aucun travail supplémentaire pour établir cet index. Dans le menu « Insertion/Index et tables », choisir « Table des matières » puis décocher la case « Protéger contre toute modification manuelle », puis cliquer sur « OK ». C'est terminé, l'index se place où votre souris a positionné le curseur. Les liens internes vers les chapitres peuvent être effacés si l'index n'est pas protégé contre les modifications manuelles.
Exemple de table des matières créé pour l'exercice "LivreTest".
Dans cet exemple on utilise la mise en page <pre>...</pre> avec des espaces et des tabulations. Dans une syntaxe wiki ou html on peut utiliser :  <span style="float:right">..... 1</span> pour numéroter les pages à droite. ....................... 1

## Indexer un wikilivre

Rappel : (OO est l'abréviation de OpenOffice)

### Préparer le « Modèle de livre » pour OO

* Procéder comme dans le sous-chapitre précédent , créer autant de pages de style "Première page" qu'il y aura de pages non numérotées, ou numérotées différemment des pages du contenu (i, ii,iii, etc.) : L'énumération suivante est non-exhaustive : Deux éventuelles pages de gardes blanches (pour les gros livres), faux titre (modèle:faux-titre, verso de faux titre (modèle:verso de faux-titre), page de titre avec sous-titre et le nom de l'éditeur (modèle:Page de titre), un verso de titre (modèle:Colophon), sommaire, voire un dos de sommaire (vierge ou non), six ou huit pages en général, sachant que les Contenus, Sommaires, et les Chapitres doivent toujours commencer sur une page impaire.
* Ajouter une page standard pour le foliotage, à la suite du document. La numérotation doit commencer à 1, page à droite, suivie d'une page verso à gauche, cette page 1 peut être la première page de garde ou la page de faux-titre. Le style de page est indiqué sous la fenêtre d'édition. Pour faciliter la numérotation gauche et droite, choisissez (F11) Style standard avec Mise en page en Vis-à-vis, puis activer l'En-tête ou/et Pied de page, décocher Contenu identique gauche/droite.
* Ajouter les pages de la fin du document en style "Première page", (Postface, pages de garde, etc.) 2 au minimum. À défaut, d'autres pages pourront facilement être ajoutées.
* Enregistrer ce document avec le nom « Modèle de livre ». Ce document évitera de tout recommencer avec la conversion d'un autre wiki-livre vers OpenOffice.

### Recopier le contenu WikiMedia (textes et images) dans OO

    Méthode 1 : Surligner et Copier (clic Ctrl-c) le contenu WikiMedia à recopier sans être connecté, ceci permet d'éviter d'être obligé de supprimer les ↑ [URL] [[lien]]. La méthode convient lorsqu'il y a des textes masqués que l'on doit dérouler avant de copier.
    Méthode 2 : Éditer, surligner, copier, avec le menu Modifier s’il n'y a pas de texte masqué.
    Méthode 3 : Éditer, surligner, copier, chaque chapitre et coller le début de chaque chapitre dans une page de style première page de droite, puis les pages suivantes dans les pages de style standard. Le titre du chapitre doit être style Titre 1 en première ligne.
* Coller ce contenu dans "OO writer" (clic Ctrl-v), le contenu collé ne tient pas compte des directives {{Nouvelle page imprimée}}
* Rétablir les nouvelles pages à imprimer dans "OO Writer" : "Insertion" + "Saut manuel" + "Saut de page"
* Faites une sauvegarde initiale du contenu dans le style date-titre-initial.

### Corriger et compléter les pages

* Si vous disposez d'un correcteur analyseur de syntaxe ("Antidote" ?), c'est le moment de vous en servir.
* Faites une sauvegarde du contenu corrigé dans le style date-titre-corrrigé. Toutes les sauvegardes doivent ensuite être incrémentées de façon à retrouver les originaux si ça tourne mal après ou au cours d'une intervention. Il existe une macro qui fait cela : https://forum.openoffice.org/fr/forum/viewtopic.php?f=18&t=18566.
* Vous pouvez maintenant insérer l'index lexical "Insertion" + "Index et tables" + "Entrée" (Voir la section précédente Indexation de l'index lexical).
* Faites une sauvegarde incrémentée.
* Insérer une « En-tête » dans les pages de contenu (ou un pied de page) dans laquelle vous pourrez placer le numéro de page qui doit commencer à '1' sur une page impaire. Cliquez sur la touche F11 pour obtenir les listes de styles et formatages. Finissez par ajouter "Insérer" une "Règle horizontale" (sur la même ligne). Cette règle crée une sorte de séparateur entre le texte et l'entête.
* Pour finir Recopiez les éventuelles pages de présentation et faites une sauvegarde du fichier.
* Supprimez l'« En-tête » de la première page de chaque chapitre recopié.

### Documentation générale

* Une liste des styles de pages est disponible sur https://fr.wikipedia.org/wiki/Page_(livre)#Lexique.
* Exemple de modèle pour les couvertures : {{Couverture d'un wikilivre}}
* Visualiser le fichier PDF cette page, daté du 23 septembre 2019 https://upload.wikimedia.org/wikipedia/commons/e/eb/Référencement_manuel_des_pages_et_livres_de_MediaWiki-fr.pdf
* Créez une compilation des fichiers du livre (menu latéral, "imprimer/exporter") et voyez ce que propose PediaPress. Vous pourrez noter à part les résultats qui vous conviennent (le copier-coller ne marche pas), si tout est bon commandez le livre.

### Conseils pour les cadres et les formules mathématiques dans OO

Les images sont souvent mal recadrées. Le plus simple est de recopier l'image ailleurs dans le texte ou dans de nouveaux cadres créés. Replacer aussi le texte sous l'image.
Les blocs de formules mathématiques ne sont pas reproduits correctement. Il est préférable de faire une copie d'écran du bloc et de recopier l'image, éventuellement recadrée, à sa place dans le texte.

### Imprimer

Créer un PDF pour l'imprimante et pour les « liseuses ».
* La version peut être convertie et enregistrée au format PDF/A (non modifiable) par le menu d'OpenOffice. PDF avec les liens internets : Dans l'option Liens (Link): cochez l'export des liens (Export bookmark as named destination).
* Il est aussi possible d'imprimer au format PDF avec une imprimante PDF telle que PDF24 qui a de nombreux avantages dont celui d'imprimer en haute qualité et de permettre de déplacer, ajouter, supprimer, et remplacer des pages.

## Alternative à l'indexation avec OpenOffice ou LibreOffice

Cette alternative permet de conserver la présentation de l'auteur du livre.
La page Annexe créée avec le programme annexer résout le plus grand des problèmes.
    Pour créer l'index des chapitres on peut utiliser le mot magique __TOC__ dans la page Index ou la copie de l'encadré des Sections.
    Pour créer un index alphabétique on peut
* recopier l'index des chapitres dans un tableur,
* ajouter les numéros des pages dans la colonne B, trouvées dans la pré-édition PDF,
* supprimer les numéros de chapitres pour ne conserver que le texte dans la colonne A, puis
* trier dans l'ordre alphabétique et
* placer cet "index alphabétique" dans la page Index.
* Créer un nouveau PDF avec une numérotation des pages, incluant les pages Annexe et Index.

## Références

* ↑ https://korben.info/installer-shell-bash-linux-windows-10.html
* ↑ http://montefiore.ulg.ac.be/~nvecoven/ci/files/tuto_bash/tuto_bash.html
* ↑ Installer les fichiers de l'application originale en français
* ↑ https://forum.openoffice.org/fr/forum/viewtopic.php?p=185643#p185643 Writer - Index Lexical
* ↑ https://help.libreoffice.org/6.3/fr/text/swriter/01/04120250.html?DbPAR=WRITER#bm_id3148768 Fichier de concordance
* ↑ https://fr.wikibooks.org/wiki/Utilisateur:Goelette_Cardabela/Lecture_et_impression_des_livres_de_Wikilivres#créer_un_PDF_pour_l'imprimante
* ↑ https://fr.wikibook.org/Auto-éditer_un_wikilivre/Auto-référencer

## Index des sections

Sections ↑