arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

commit dee2907d087df9ab9889bae8fba7e939dbbf5c57
parent fc945fe0c387da2bc7f54bade362f4c4a4ee1e85
Auterice: Arthur Pons <arthur.pons@unistra.fr>
Date:   Wed,  1 May 2024 19:17:48 +0200

Modif slug et ajout partie slug dans extension fra

Slug permet maintenant de faire un lien vers une page et non
pas que vers un titre (ou une ref de bas de page)

Diffstat:
Mcontents/extension-francium/index.sh | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Mslug | 17++++++++++++-----
2 files changed, 121 insertions(+), 14 deletions(-)

diff --git a/contents/extension-francium/index.sh b/contents/extension-francium/index.sh @@ -1,7 +1,7 @@ #! page title: Étendre Francium \: Quelques exemples pratiques -description: Regardons ce que cela coûte d\'étendre Francium à travers deux besoins, celui d\'un système de tags pour les articles et de la publication des articles à l\'avenir +description: Regardons ce que cela coûte d\'étendre Francium à travers l\'implémentation de plusieurs besoins author: Arthur Pons publication: 2023-11-17 @@ -418,7 +418,107 @@ une règle personnalisée pour cette page qui ne dépend pas directement de son clône dans le dossier source mais de index.fr.sh ou index.en.sh selon la langue par défaut. -Notre site supporte le bilinguisme ! Il ne reste plus qu'à tout traduire ! +Notre site intègre une gestion basique du bilinguisme ! Il ne reste plus qu'à +tout traduire ! + +## S'auto-référencer dans un article + +J'ai récemment entrepris la rédaction d'une [longue page se faisant fréquemment +référence à elle même](http://bebou.netlib.re/faq). Pour renvoyer vers une +autre page du site ou pire, renvoyer vers un titre spécifiquement, il faut faire +preuve d'une mémoire colossale et d'une implémentation mentale de l'algorithme +de génération des identifiants de titre de votre traducteur markdown -> html. + +J'ai donc entrepris de créer un script permettant de lister toutes les options +et d'en choisir une. Ce script a pour dépendance fzy pour l'interface de choix +et ne fonctionnera qu'après une première construction du site puisqu'il va +chercher les données dans l'html et non pas dans les sources. + +Il faut d'abord mettre dans une variable la totalité des éléments +ayant un attribut `id` et les titres de tous les articles[^4] : + + link=$(find public -type f -iname '*.html' | + xargs grep -Er '(<title>|id=")' | + cut -b7- | + fzy) + +find liste tous les fichiers html, xargs grep permet de chercher toutes les +lignes contenant `<title>` ou `id="` dans chacun de ces fichiers puis cut +supprime le nom du dossier public. Le format de sortie est comme ceci : + + /youtube/index.html: <title>Guide de survie en territoire youtubesque</title> + /youtube/index.html: <h2 id="pourquoi-">Pourquoi ?</h2> + /youtube/index.html: <h2 id="pour-les-smartphones">Pour les smartphones</h2> + +Ensuite, le traitement sera différent selon si notre sélection est un +identifiant vers lequel renvoyer ou le titre d'une page entière. Pour +tester cela on utilise des grep : + + if $(echo "$link" | grep -q 'id='); then + [...] + else $(echo "$link" | grep -q '<title>'); then + [...] + fi + +Si l'on veut faire un lien vers un titre en particulier page on choisit la ligne +contenant la balise titre correspondante et le traitement est comme suit : + + if $(echo "$link" | grep -q 'id='); then + echo "$link" | + sed -E 's,:.+id=",#,;s/index.html//' | + cut -d'"' -f1 + else $(echo "$link" | grep -q '<title>') + [...] + fi + +On remplace tout ce qui se trouve entre le chemin du fichier et la première +apostrophe par un `#`, on retire l'index.html (optionnel) et on ne +garde que ce qu'il y a à gauche de l'apostrophe restante. L'avant-après : + + /youtube/index.html: <h2 id="pour-les-smartphones">Pour les smartphones</h2> + /youtube/#pour-les-smartphones + +Si l'on veut faire un lien vers une page, on choisit la ligne qui contient +sa balise titre et le traitement sera le suivant : + + if $(echo "$link" | grep -q 'id='); then + [...] + else $(echo "$link" | grep -q '<title>'); then + echo "$link" | + cut -d':' -f1 | + sed 's/index.html//' + fi + +On ne garde que le chemin du fichier dans lequel on a trouvé la balise avec cut +et on supprime index.html (toujours optionnel). L'avant-après : + + /youtube/index.html: <title>Guide de survie en territoire youtubesque</title> + /youtube/ + +Le script final : + + link=$(find public -type f -iname '*.html' | + xargs grep -Er '(<title>|id=")' | + cut -b7- | + fzy) + + if $(echo "$link" | grep -q 'id='); then + echo "$link" | + sed -E 's,:.+id=",#,;s/index.html//' | + cut -d'"' -f1 + else $(echo "$link" | grep -q '<title>'); then + echo "$link" | + cut -d':' -f1 | + sed 's/index.html//' + fi + +Si on veut l'utiliser dans vim à la volée en mode insertion on peut +utiliser cette macro : + + inoremap <buffer> (-l <ESC>:r!./slug<CR>kgJEa + +En tapant rapidement sur `(-l` en mode insertion fzy s'ouvrira, on fait son +choix et hop on continue à écrire derrière le lien nouvellement inséré. ## Conclusion @@ -428,15 +528,15 @@ pouvoir permettre une telle implémentation me semble petite et gérable sur le long terme. Le compte du nombre de lignes de code est délicat, est-ce que l'on compte les parties "template", est-ce que chaque pipe compte comme une ligne, chaque commande sed comme une autre ? En tout cas on peut remarquer qu'il est -possible de factoriser une quantité non négligeable du code écrit (pour lister -les tags par ex). Pour les tags je dirais qu'il y a environ une trentaine de -lignes importantes, une dizaine pour le bilinguisme. Ce n'est pas négligeable, -surtout quand on considère la relative crypticité de certaines commandes mais -**tout** est devant vos yeux. La totalité de l'implémentation a été décrite -ici. +possible de factoriser une quantité non négligeable du code écrit. +Pour les tags je dirais qu'il y a environ une trentaine de lignes importantes, +une dizaine pour le bilinguisme. Ce n'est pas négligeable, surtout quand on +considère la relative crypticité de certaines commandes mais **tout** est +devant vos yeux. La totalité de l'implémentation a été décrite ici. [^1]: du moins pour commencer, peut-être que j'en ferai d'autres à l'avenir [^2]: et à condition d'utiliser vim mais vraiment essayez. Passez en atelier les mardi après-midi à l'atrium sur le campus de l'Unistra pour vous faire aider :) [^3]: Peut-être qu'on pourrait le factoriser pour éviter d'avoir à le modifier à au moins deux endroits. +[^4]: J'ai choisi la balise `<title>` parce que c'est celle qui me permet le plus facilement d'identifier le contenu d'un article + -% diff --git a/slug b/slug @@ -1,9 +1,16 @@ #! /bin/sh -find public -type f -iname '*.html' | -xargs grep -Er 'id="' | +link=$(find public -type f -iname '*.html' | +xargs grep -Er '(<title>|id=")' | cut -b7- | - fzy | - sed -E 's,:.+id=",#,;s/index.html//' | - cut -d'"' -f1 + fzy) +if $(echo "$link" | grep -q 'id='); then + echo "$link" | + sed -E 's,:.+id=",#,;s/index.html//' | + cut -d'"' -f1 +else $(echo "$link" | grep -q '<title>') + echo "$link" | + cut -d':' -f1 | + sed 's/index.html//' +fi