Fancy index, ou comment afficher une liste de fichiers de manière classe
========================================================================

:date: 2022-04-17
:tags: fancy index, apache httpd, apache, .htaccess
:slug: fancy-index
:url: fancy-index

Introduction
------------

Il faut dire ce qu'il est. Par défaut, la liste des fichiers et répertoires présentés par Apache httpd[ref]httpd est le nom officiel du serveur web de la fondation Apache. Cependant, la plupart des gens, moi-même compris, parlent de Apache et non Apache httpd.[/ref] est vieillot, pas attirant, etc[ref]Avis personnel et tout à fait subjectif.[/ref].

. image:: images/fancyIndex/demo1.png

Comment faire pour modifier simplement et facilement cette présentation ?

La solution s'appelle Fancy Index.

Diponible depuis longtemps avec Apache[ref]Depuis… bonne question en fait. C'était déjà présent dans la version 1.3, sortie en juin 1998, si j'en crois cette page de documentation : http://users.polytech.unice.fr/~buffa/cours/internet98/apache/apache_1.3b3/htdocs/manual/mod/mod_autoindex.html [/ref], c'est une option à activer, soit dans la configuration du site (ou du vhost), soit directement dans le répertoire voulu, en modifiant le fichier `.htaccess`.

Dans cet article, on modifiera le fichier `.htaccess` ; cela sera plus simple.

. note:: (corrigé le 23 mai 2022) Le module Fancy Index existe également pour Nginx, et un truc similaire existe pour lighttpd. Deux articles ont été publiés, un pour nginx, l'autre pour lighttpd.

. warning:: Toute erreur dans le fichier .htaccess se traduira par une erreur 500. Ne pas hésiter à commenter les lignes sur lesquels on peut avoir un doute en utilisant le symbole #

Les démos indiquées dans cet article sont accessibles ici :

https://blog.chibi-nah.fr/images/fancy-index/

. warning:: Les fichiers présents sont fictifs, et donnés uniquement pour exemple.


Sans Fancy Index
----------------

Cela se passe de commentaires.

. image:: images/fancyIndex/demo1.png

Cette présentation est celle par défaut, que l'on voit un peu partout, sans formatage spécifique.

Exemple réel : `Démo 1 <https://blog.chibi-nah.fr/images/fancy-index/Démo%201>`_

. note:: Selon la configuration du site, il est possible qu'un message d'erreur apparaisse à la place des fichiers.

   Vérifier que la configuration du site a bien l'option `Indexes` activée, sinon créer un fichier `.htaccess` et ajouter dedans `Options +Indexes` dans le répertoire contenant la liste des fichiers à afficher.

Avec Fancy Index
----------------

Créons un fichier `.htaccess` dans le répertoire, et dedans, ajoutons :

. code-block:: config

   Options +Indexes
   IndexOptions +FancyIndexing

Ici, `IndexOptions +FancyIndexing` sert à activer Fancy Index.

Voyons maintenant le résultat.

. image:: images/fancyIndex/demo2.png

Mmm, pas terrible en fait.

La police de caractère et la taille du texte ont un peu changé. Mais c'est tout.

Exemple réel : `Démo 2 <https://blog.chibi-nah.fr/images/fancy-index/Démo%202>`_

Options de Fancy Index
----------------------

Pour la liste de toutes les options, se référer à la page de documentation officielle sur le site Apache httpd :

https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html

Dans cet article, on ne verra pas toutes les options possibles (cela ne présenterait que peu d'intérêt).

Voyons les plus simples et celles qui semblent les plus utiles.

Changer les icônes
~~~~~~~~~~~~~~~~~~

Pour changer les icônes, rien de compliqué. Il faut, des icônes, et modifier le fichier .htaccess.

Les icônes utilisées ici pour l'exemple proviennent du thème Red Dot Black Plasma https://github.com/L4ki/Red-Dot-Black-Plasma-Themes

Créer un répertoire icons, faire une petite sélection d'icônes, les appeler

* archive.svg
* cue.svg
* flac.svg
* folder.svg
* image.svg
* ogg.svg
* text.svg
* up.svg

Ensuite, dans le fichier .htaccess, insérer les lignes suivantes :

. code-block:: config

   Options +Indexes
   IndexOptions +FancyIndexing +FoldersFirst

   DefaultIcon icons/text.svg
   AddIcon icons/folder.svg ^^DIRECTORY^^
   AddIcon icons/up.svg ..
   AddIcon icons/cue.svg .cue
   AddIcon icons/image.svg .png .jpg .jpeg .svg
   AddIcon icons/text.svg .txt
   AddIcon icons/archive.svg .zip
   AddIcon icons/flac.svg .flac
   AddIcon icons/ogg.svg .ogg

Ici, `+FoldersFirst` indique que l'on veut que les répertoires apparaissent en premier

`DefaultIcon`` indique l'icône qui sera utilisée par défaut. Ici, il s'agit de `text.svg`.

`AddIcon` indique que l'icône <icons/truc.svg> sera utilisée pour les fichiers dont l'extension se termine par <extension>.

Par exemple `AddIcon icons/cue.svg` sera utilisé pour tous les fichiers `.cue`.

. note:: On peut utiliser plusieurs extensions pour la même icône.

   Par exemple AddIcon icons/image.svg .png .jpg .jpeg .svg

Cependant, il y a une blague ici. Comment peut-on définir une icône pour les répertoires, vu qu'il n'y a pas d'extension et que le nom du répertoire peut ne pas être connu à l'avance ?

Heureusement, Apache httpd propose la valeur `^^DIRECTORY^^`. Utiliser cette valeur pour l'icône du répertoire.

Voilà ce que cela donne :

. image:: images/fancyIndex/demo3.png

Exemple réel : `Démo 3 <https://blog.chibi-nah.fr/images/fancy-index/Démo%203>`_

Changer complètement le style et la présentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

. note:: Attention les yeux !

Là, on peut voir à quel point on peut complètement changer la présentation de la page.

Contrairement aux exemples précédents, je vais montrer directement le résultat, et après, expliquer comment j'ai fait.

Thème clair

. image:: images/fancyIndex/demo4.png

Thème sombre

. image:: images/fancyIndex/demo4-dark.png

Le côté rigolo ? Le thème s'adapte en fonction des préférences définies côté navigateur ou côté système d'exploitation[ref]En fait, rien de magique, c'est juste une règle CSS 3 qui gère ça.[/ref].

Exemple réel : `Démo 4 <https://blog.chibi-nah.fr/images/fancy-index/Démo%204>`_

. note:: Comme j'utilise ici une feuille de style similaire à celle du blog, le fond et le texte apparaissent de la même couleur sur la capture d'écran et dans la page d'exemple.

Organisation des fichiers :

. code-block:: bash

   Démo 4 $ tree -a
   .
   ├── .cover.jpg
   ├── .footer.html
   ├── .head.html
   ├── .htaccess
   ├── .icons
   │   ├── archive.svg
   │   ├── cue.svg
   │   ├── flac.svg
   │   ├── folder.svg
   │   ├── image.svg
   │   ├── ogg.svg
   │   ├── text.svg
   │   └── up.svg
   ├── .style.css
   ├── Ys2EMIDI.zip
   ├── Ys2-SC8820.cue
   ├── Ys2-SC8820.flac
   └── Ys2-SC8820.ogg

   1 directory, 17 files


Dans le répertoire démo 4, le répertoire contenant les icônes a été nommé `.icons` [ref]La présence d'un point devant un fichier ou un répertoire indique sur tout système Unix/Linux que ce fichier ou répertoire doit être caché.[/ref].
Dans ce répertoire, j'ai placé les icônes listées plus haut, même si toutes[ref]tourte ![/ref] ne seront pas utilisées.

Ensuite, j'ai créé une feuille de style simple, enregistrée à la racine du répertoire, et nommée `.style.css`.

. code-block:: css

   html {
       font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
   }

   body {
       color: #4a4a4a;
       background-color: #e9e9e9;
   }

   a {
       text-decoration: none;
       color: #2c8898;
   }

   a:hover {
       color: #982c61;
       text-decoration: none;
       border-bottom: 2px solid #4a4a4a;
   }

   img {
       height: auto;
       max-width: 100%;
       margin-top: 0px;
   }

   /* dark theme */

   @media (prefers-color-scheme: dark) {
       body, h1, h2, h3, h4, h5, h6 {
           color: #d9d8dc;
           background-color: #222222;
       }

       a {
           color: #eb99a1;
       }

       a:hover {
           color: #DA4453;
           border-bottom: 2px solid #d9d8dc;
       }
   }

Puis, ajout d'une image d'illustration, appelée `.cover.jpg`.

Ensuite, création des deux fichiers html, un appelé `.head.html` contenant la déclaration html, les entête…, et un appelé `.footer.html`, contenant la fin.

Contenu du fichier `.head.html` :

. code-block:: html

   <!DOCTYPE html>
   <html lang="fr">
       <head>
           <meta charset="utf-8" />
           <link rel="stylesheet" type="text/css" href=".style.css">
           <meta name="viewport" content="width=device-width, initial-scale=1.0">
           <title>ys2</title>
       </head>
       <body>
           <p>Ys II Eternal (MIDI) - SC-88Pro - SC-8820</p>
           <img src=".cover.jpg" />

Contenu du fichier `.footer.html` :

. code-block:: html

           <p>Ys2-SC8820.cue + flac : Version SC-88Pro enregistrée avec un Roland SC-8820. L'ensemble des pistes est dans un seul fichier flac, d'où la nécessité d'utiliser le fichier .cue comme TOC.</p>
           <p>Ys2-SC8820.ogg : Pareil que la version flac, mais réencodé/compressé en ogg/vorbis. Il faudra modifier le fichier .cue pour indiquer que le fichier audio est le fichier .ogg et non .flac</p>
           <p>À noter : les nom des titres correspondent aux noms indiqués dans program.txt et ne correspondent pas forcément aux titres des albums.</p>
           <p>Ys2EMIDI.zip : contient l'ensemble de l'OST au format MIDI. Nécessite un Roland Sound Canvas SC-88, SC-88Pro, SC-8820, SC-8850 ou SC-D70</p>
       </body>
   </html>

. note:: Apache httpd insère automatiquement la liste des fichiers entre ces deux fichiers .html. Cela signifie que si on fusionne les deux fichiers html en un seul, le contenu doit être valide.

Enfin, reste le fichier `.htaccess`.

. code-block:: config

   Options +Indexes
   IndexOptions +FancyIndexing +SuppressColumnSorting +SuppressLastModified +SuppressSize +htmltable +SuppressHTMLPreamble
   HeaderName .head.html
   ReadmeName .footer.html
   IndexIgnore ..

   # Icones
   DefaultIcon .icons/text.svg

   AddIcon .icons/folder.svg ^^DIRECTORY^^
   AddIcon .icons/up.svg ..
   AddIcon .icons/cue.svg .cue
   AddIcon .icons/image.svg .png .jpg .jpeg .svg
   AddIcon .icons/text.svg .txt
   AddIcon .icons/archive.svg .zip
   AddIcon .icons/flac.svg .flac
   AddIcon .icons/ogg.svg .ogg

   #description
   AddDescription "Archive contenant les pistes MIDI" "Ys2EMIDI.zip"
   AddDescription "Liste de lecture au format CUE" "Ys2-SC8820.cue"
   AddDescription "Fichier audio FLAC" "Ys2-SC8820.flac"
   AddDescription "Fichier audio OGG/Vorbis" "Ys2-SC8820.ogg"

Là, on se rend compte que des éléments ont été ajoutés.

Commençons par `IndexOptions`

* `+SuppressColumnSorting` : retire le tri des colonnes
* `+SuppressLastModified` : retire la colonne `Date de dernière modification`
* `+SuppressSize` : retire la colonne `taille du fichier`
* `+htmltable` : utilise une vraie table html et non des balises <pre></pre> pour afficher la liste des fichiers
* `+SuppressHTMLPreamble` : supprime l'entête html générée par Apache

. note:: Comme il n'y a pas de répertoire ici, l'option `+FoldersFirst` n'a pas été utilisée ici

. warning:: N'oubliez pas le symbole + devant les paramètres pour les activer.

Ensuite.

* `HeaderName .head.html` : nom du fichier html, partie du haut.
* `ReadmeName .footer.html` : nom du fichier html, partie du bas.
* `IndexIgnore ..` : indique que le répertoire `..` doit être masqué.

Concernant les icônes, peu de changements. Seul leur emplacement a été modifié, le répertoire contenant les images s'appelant ici `.icons`.

Et enfin, la description des fichiers.

Prenons par exemple `AddDescription "Archive contenant les pistes MIDI" "Ys2EMIDI.zip"`, ici, "Archive contenant les pistes MIDI" correspond à la description, et "Ys2EMIDI.zip" correspond au nom du fichier.

. note:: On peut utiliser l'extension .zip pour donner la même description à tous les fichiers .zip.

. note:: On peut également décrire des répertoires.


Conclusion
----------

Cet article n'a pas la prétention d'être pleinement exhaustif concernant toutes les possibilités offertes par Fancy Index. Cependant, je pense que la démo 4 montre vraiment ce qu'il est possible de faire avec ce module Apache httpd.


--