#!/usr/bin/env bash ################################################################################ # Génère les fichiers HTML de mon site # # Copyright (C) 2022 rick G. # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . ################################################################################ set -e # liste des fichiers html à générer langDir="lang" tmpHeader="/tmp/header.html" annexes="css img patches" pathLinks="/home/site/a/" target="www" defaultLang="fr" header="header.html" footer="footer.html" org=0 testDocker=0 ################################################################################ # Génère un message d'aide ################################################################################ function print_help { cat << EOF Utilisation : $(basename $0) [options] [] génère les fichiers HTML du site. Il est possible de changer le dossier de destination ($target par défaut). Options : -h génère ce message et arrête le script -c nettoie les fichiers générés -t lance un docker pour pouvoir tester le site Les options suivantes seront codées dans un futur proche : -d défini la langue par défaut (son index sera mit à la racine); fr par défaut -n génère la langue dans le nom du fichier et non dans le chemin (example.org/fr/index.html -> example.org/index.fr.html) -o génère les fichiers org EOF } # pas besoin de continuer si on demande juste l'aide if [[ $@ =~ "-h" ]] then print_help exit 0 fi # vérification des arguments passés while [ -n "$1" ] do case $1 in "-o") # génération des fichiers org org=1 ;; "-c") # on nettoie les fichiers # TODO si on précise un dossier, nettoyer ce dossier echo "Nettoyage de $target" rm -rf $target exit 0 ;; "-t") # lancer un docker de test testDocker=1 ;; "-d") ;& "-n") echo "Commande non implémentée." exit 1 ;; "-"*) print_help exit 2 ;; *) target=$1 ;; esac shift done ############################################################################### # Génère un fichier header propre à une langue # # $1 : le chemin vers le fichier header.link ############################################################################### function generate_header { cat $header > $tmpHeader subtitle=$(sed -n -e "/%subtitle%/,/%endsubtitle%/p" $1 | sed -n -e "2p") sed -i -e "s/%subtitle%/$subtitle/g" $tmpHeader awk 'BEGIN { FS = ":" code = 0 } { if ($0 ~ /^%links%$/) { code = 1 next } else if ($0 ~ /^%endlinks%$/) { code = 0 } if (code && $1 !~ /^#/) { gsub(/ $/, "", $1); gsub(/^ /, "", $2) print " "$2"" } }' $1 >> $tmpHeader echo -e " \n" >> $tmpHeader } if [ $testDocker -eq 1 ] then docker build . --tag site && echo -e \ "\n\033[32mSite de test déployé sur l'adresse" \ "localhost:8080\033[0m" || exit 1 echo -e "\033[32mC-c pour quitter\033[0m\n" docker run --rm -p 8080:80 site docker rmi site exit 0 fi if [ -d $target ] then # TODO demander à l'utilisateur rm -rf $target fi mkdir $target for l in $(find $langDir -mindepth 1 -type d -prune -printf "%P\n") do generate_header lang/$l/header.link echo "Create folder $l in $target..." mkdir "$target/$l" for i in $(find $langDir/$l -type f -name "*.html" -printf "%P\n") do echo "[$l] Generate $i..." file="$target/$l/$i" #cat $header > $file cat $tmpHeader > $file # on extrait le bloc contenant les link, on les enlève et rajoute # # merci # https://www.theunixschool.com/2012/12/sed-10-examples-to-print-lines-from-file.html # https://stackoverflow.com/questions/68573654/copy-a-content-from-one-file-and-need-to-replace-in-another-file-using-sed # https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string # TODO pouvoir mettre plusieurs lignes link newHeader=$(sed -n -e "/%link%/,/%endlink%/p" $langDir/$l/$i | \ sed -e "/%link%/d;/%endlink%/d" -e 's/\//\\\//g' -e "i' | tr -d "\n") # je suppose que s'il y a moins de 10 caractères, alors on ne prend pas # en compte le nouveau link. if [ $(echo $newHeader | wc -c) -lt 10 ] then sed -i -e "/%links%/d" $file else # pour bien aligner newHeader="\ \ \ \ \ \ \ \ $newHeader" sed -i -e "/%links%/a$newHeader" $file fi cat $langDir/$l/$i $footer >> $file # nettoyage des balises précédemment utilisées sed -i -e "/%links%/d" $file sed -i -e "/%link%/,/%endlink%/d" $file sed -i -e "s/>${l^^}<\/a>/ id=\"choose\">${l^^}<\/a>/" $file sed -i -e "s/%file%/$i/" $file sed -i -e "s/%gitfile%/lang\/$l\/$i/" $file sed -i -e "s/%lang%/$l/" $file done done echo "Header links translation..." # cf. la page info 4.2 du manuel Bash (transforme un fichier en tableau) mapfile translateHeader < $langDir/links.config langs=${translateHeader[0]} nbLang=$(echo "$langs" | grep -c "|") for (( i=1; i<${#translateHeader[@]}; i++ )) do # pour chaque langue for j in $(seq 0 $nbLang) do t=$(( $j + 1 )) currentLang=$(echo ${translateHeader[0]} | cut -d\| -f $t | tr -d " ") currentFile=$(echo ${translateHeader[$i]} | cut -d\| -f $t | tr -d " ") # on doit modifier son lien de traduction for k in $(seq 0 $nbLang) do [[ $k -eq $j ]] && continue t=$(( $k + 1 )) lang=$(echo ${translateHeader[0]} | cut -d\| -f $t | tr -d " ") file=$(echo ${translateHeader[$i]} | cut -d\| -f $t | tr -d " ") sed -i -e "s/href=\"\/$lang\/.*\.html/href=\"\/$lang\/$file.html/"\ $target/$currentLang/$currentFile.html done done done # pour chaque fichier, on vérifie s'il n'est pas dans le fichier links.config # ou en double dans d'autres langues. # TODO le faire de manière plus fine pour ne mettre que les langues traduites echo "Remove useless lang header..." for f in $(find $target -type f -name "*.html") do if [[ $(grep -c $(basename $f | cut -d. -f1) $langDir/links.config) -eq 0 ]] && \ [[ $(find $target -name $(basename $f) | grep -c \n) -eq 0 ]] then sed -i -e '/id="lang"/,/\/div/d' $f fi done echo "Copy $annexes in $target..." cp -t $target -r $annexes echo "Generate default index page..." cp $target/$defaultLang/index.html $target for c in $(awk 'BEGIN { FS = "\n"; code = 0 } { if ($0 ~ /id="header-links"/) { code = 1 next } else if ($0 ~ /\/div/) { code = 0 } if (code) { print NR } }' $target/index.html) do sed -i -e "$c s/href=\"/href=\"$defaultLang\//" $target/index.html done echo "Link Links (lul)" ln -s $pathLinks $target if [ $org -eq 1 ] then echo "Generate org files..." #emacs -u $USER --script publish.el fi