Lantsei.lesCigales.ORG

Makefile, maintenance d’un site internet statique

Cet article à pour objet la création et la maintenance d’un site internet statique à partir d’un fichier Makefile. Cet exécutable convertira des fichiers, écrits au format markdown, en langage html. Une liste des pages sera aussi créée.

📝 Note : Ce site internet s’appuie d’ailleurs sur cette base.


Installation du programme markdown.

sudo apt update && sudo apt install markdown -y

Structure des dossiers et des fichers

bin         #dossier contenant les scripts shell
html        #dossier contenant les pages html
media       #dossier contenant les images, entre autre
modele      #dossier contenant les modèles html
favicon.ico
index.html
Makefile
style.css

Le fichier Makefile

## Extentions à traiter
.SUFFIXES: .md .html

## Convertisseur à utiliser
    TOHTML = markdown

## Traitement des fichiers md à convertir en html :
    # "$@" correspond au fichier que l'on veut obtenir (page.html)
    # "$<" au fichier source (page.md)
.md.html:
    @echo "$< -> $@"
    @cat modele/en-tete.html > $@
    @${TOHTML} < $< >> $@
    @cat modele/pied-de-page.html  >> $@
    @bin/titre.sh $@

## Répertoire contenant les fichiers markdown sources
SRCDIR = /html/

## liste d'exclusion de fichiers
LIST = *.html

## Recherche des fichiers markdown
# "!=" permet de remplir la variable "SRC".
# find ${SRCDIR} -type f -name \*.md" permet de lister tous les fichiers "md" dans le dossier html.
#     "-a ! -path ${LIST}" : permet d'exclure des fichiers.
#     "-a ! -path ${SRCDIR}" : permet d'exclure des dossiers.
#     "| sort" : permet de trier la liste dans l'ordre alphabétique.
SRC != find ${SRCDIR} -type f -name \*.md \
    -a ! -path ${LIST} \
    -a ! -path ${SRCDIR}/archive/\* \
            | sort

## Variable qui contient la liste de tous les fichiers que l'on veut obtenir
HTML = ${SRC:.md=.html}

## instruction pour le traitement de la liste précédente
all :${HTML}

## localisation du fichier contenant la liste des pages
LIST = ${SRCDIR}/index.md
HTMLLIST = ${LIST:.md=.html}

## Génération de la liste
${LIST}: ${SRC}
    @echo "$@"
    @bin/liste.sh ${SRC} > $@

## Génération de la page html
all: md html
md: ${LIST}
html: ${HTMLLIST} ${HTML}

Création de deux fichiers html dans le répertoire modele

Le fichier en-tete.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <!--<link rel="stylesheet" href="/style.css" />-->
        <!--<link rel="icon" type="image/x-icon" href="/favicon.ico" />-->
        <title>
        </title>
    </head>
    <body>  

Le fichier pied-de-page.html

    </body>
</html>

Les scripts shell

Le script bin/liste.sh

Script permettant de générer une liste des pages html sous la forme <a href="">titre</a> dont le titre sera <h1>Liste</h1> :

#!/bin/sh
printf '%s\n\n' "# Liste"
for l in $@
do
    TITLE="$(grep -m1 "#" "${l}" | sed 's/^# //')"
    if [ -n "${TITLE}" ]; then
        md="$(printf "%s" ${l} | cut -d'/' -f2- )"
        name="$(basename ${md} .md)"
        echo="$(echo "html/"${name}".html")"
        printf '[%s](/%s)\n\n' "${TITLE}" "${echo}"
    fi
done

Le script bin/titre.sh

Ajoute un titre après la balise <title> située dans l’entête de la page html, ligne correspondant au titre <h1> trouvé :

#!/bin/sh
DEFAULT=" "
TITLE="$(grep -m1 "<h1>" "${1}"| \
sed -n -e 's/.*<h1>\(.*\)<\/h1>.*/\1/p')"
test -z "${TITLE}" && TITLE="${DEFAULT}"
sed -i "/<title>/a\\
${TITLE}" "${1}"

Rendre les fichiers de script exécutables

chmod +x *

Lancement de l’opération de maintenance.

make

📝 Note : Il est possible de créer un script pour lancer make sans avoir à se positionner à chaque fois dans le dossier racine du site.

#!/bin/bash
/var/www/make &> /dev/null

📝 Note : Il peut être utile de créer un script permettant de supprimer tous les fichiers html ainsi créés. Ainsi que les fichiers index.md qui peuvent créer une ligne morte dans la liste.

#!/bin/bash
find /var/www/html/ -type f -name *.html -delete
find /var/www/html/ -type f -name index.md -delete

🔗 Source: https://si3t.ch/..