.. post:: 2020-07-10 21:50
   :tags: néerlandais, PDF, ePub, sphinx
   :category: En coulisses
   :author: kujiu
   :location: BLA
   :excerpt: 1

Génération PDF et autres tribulations
=====================================

.. image:: assets/10_generation_pdf.svg
   :width: 70%
   :align: center
   :alt: Un homme manipule un ordinateur devant un site web.
   :title: Image par Katerina Limpitsouni

Cet article est le premier d'une longue série à
venir, à savoir le bilan de mes aventures
mensuelles. Enfin, plus ou moins, tout dépendra
des activités. Je souhaite vous montrer l'envers du
décor, comment un long projet à la fois artistique
et très technique se construit. Je vous le dis
de suite : la lecture sera dense ! Je commencerai
par un aperçu complet du mois écoulé avant
d'attaquer une deuxième partie très technique.
Enfin, je terminerai avec un dernier volet sur
l'architecture globale en troisième partie,
toujours réservée à un public geek.
Donc, ceux qui ne veulent pas de détails techniques
pourront abandonner la lecture quand je le dirai.
Il s'agit ici d'un point de situation.

Les tribulations mensuelles
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Apprentissage d'une langue
--------------------------

Le mois de juin n'a pas été très satisfaisant en
terme d'efficacité sur le projet. La faute en est
clairement au rattrapage dans ma formation. Je suis
arrivé en Belgique il y'a quelques années déjà, et
je ne connais toujours pas la langue la plus parlée
du pays. Je prends donc des cours du soir de
néerlandais depuis la rentrée scolaire 2019. J'ai
validé le niveau A1 en fin de mois.

Pour ceux qui ne le savent pas, la Belgique a
trois langues officielles : le néerlandais, le
français et l'allemand. Chacune d'elles est parlée
dans une zone bien précise. La Flandre parle
néerlandais, Bruxelles - une enclave en Flandre -
principalement français et un peu néerlandais,
et enfin la Wallonie en français - exceptée une
petite zone à l'Est où l'allemand est de mise.
Et avec ça, je n'ai même pas parlé des communes à
facilités, dans lesquelles il est possible de
parler une autre langue que celle de la région.
Bien sûr, chaque langue dispose de sa communauté,
et donc de son gouvernement. Et chaque région
(Flandre, Bruxelles et Wallonie) a également son
gouvernement. Donc, si l'on compte tout cela, nous
avons six gouvernements (néerlandophone,
germanophone, francophone, flamand, wallon et
bruxellois) auxquels il faut encore ajouter un
gouvernement fédéral. Comment ça, c'est compliqué ?
Non peut-être…

Toujours est-il que je vis à la frontière
linguistique franco-néerlandophone et je souhaite
ne plus être coupé de la moitié de la culture du
pays. L'objectif est clair : niveau A2 fin septembre
et potentiellement B1 dans un an. Et je peux vous
dire que je m'en donne les moyens ! J'ai acquis un
gros rythme de travail, il faut dire aussi que les
sept premiers mois de formation ont été plutôt
chaotiques : l'école n'avait strictement aucune
mesure d'adaptation à ma vue. J'ai pu trouver les
ressources pour rattraper le retard accumulé, et
je continue avec cet élan.

Unifier les médias
------------------

J'ai travaillé aussi sur une partie technique en
parallèle de la formation : l'unification des
médias. J'utilise un logiciel particulier pour
l'écriture, dédié normalement à la rédaction de
documentation. Il s'agit de
`Sphinx <https://www.sphinx-doc.org>`_. Il me
permet à la fois de créer un site web, un blog,
une histoire, un `PDF`, un `ePub` et je compte bien
l'utiliser aussi pour générer l'audio et préparer
les projets vidéo. Oui, rien que ça ! J'ai donc
passé un mois à peaufiner le thème global du
Nerv Project, à faire en sorte que ce thème
fonctionne quelque soit le média. Il reste quelques
bugs, vous pouvez vous en rendre compte en tentant
d'imprimer cette page.

Communication
-------------

Écrire un univers entier, c'est bien. Mais c'est
encore mieux s'il y'a des lecteurs. Je ne peux pas
vous dire grand chose ici pour ne pas gâcher la
surprise, mais je réfléchis à d'autres formats pour
vous proposer du contenu exclusif et amusant.
Je me pose aussi beaucoup de questions sur une
éventuelle officialisation du Nerv Project. Bref,
j'ai beaucoup de sujets en suspens sur ces questions
et ce sera exploré dans les prochains mois. Je
rappelle que vous pouvez rejoindre le salon IRC,
le serveur Discord ou encore le serveur Matrix.
Tous les liens sont sur le site du
`Nerv Project <https://www.nerv-project.eu>`_.

Question de langage
-------------------

J'ai eu aussi un retour plutôt désagréable d'une
certaine personne, qui se reconnaîtra peut-être.
Nous sommes dans une période où beaucoup de choses
sont remises en question, tant sur les inégalités
sociales que sur les expressions utilisées. Tous
mes travaux sont stockés sur un système pour la
gestion des versions, nommé `git`, et dont la
branche principale est nommée par défaut `master`.
Certains auront été impactés par les quelques jours
de maintenance sur le serveur, il s'agissait de
renommer ce terme devenu problématique par le terme
`main` bien plus juste dans son sens et bien plus
neutre politiquement parlant. C'est une grosse
étape, avec beaucoup de travail. Ce terme n'est pas
le seul remis en question, il y'a notamment les
`whitelists` pour les éléments à laisser passer et
les `blacklists` pour les éléments à bloquer. Il
semblerait, dans les recherches que j'ai rapidement
effectuées, que ce terme dérive de la couleur des
balles utilisées lors de votes à bulletin secret.
Une balle blanche pour l'accord, une balle noire
pour le désaccord. Du moins, pour certaines
sources non académiques. Si vous connaissez des sources
fiables, vous pouvez me les donner en commentaire.
En attendant, je ne tiens pas compte de cette
hypothèse.

Cependant, le mot `black` signifiait à la fois
quelque chose de mauvais ainsi que la punition
et la couleur noire. Le terme `blacklist`
est apparu en 1590, en pleine exploitation
esclavagiste et notamment des personnes à la peau
foncée. Ce terme est resté jusqu'à nos jours et je
ne nie aucunement que son origine est contestable
moralement. Je conçois parfaitement que ce terme
est problématique. Et puis, la composition du mot
ne donne pas une définition claire et juste du
principe. Des termes comme `blocklist` et
`acceptlist` seraient tellement plus élégants.

Malheureusement, ces concepts sont utilisés depuis
les débuts de l'informatique et perdurent à de très
nombreux endroits. Autant je pouvais corriger le
terme dans le nom des versions, moyennant déjà pas
mal de travail, autant il me paraît infaisable de
modifier le reste. C'est pour cela que je ne le
ferai pas. Il n'y a ni alternative convenable me
permettant d'utiliser des logiciels exempts de ces
termes ni solution viable pour les modifier
moi-même. Il faudrait que je réécrive de nombreuses
lignes de code, que je m'assure qu'elles ne soient
pas supprimées à la moindre mise à jour, etc. Il
ne s'agit plus de jours de travail mais d'années.
Qui plus est, quand le logiciel répond aux termes
utilisés dans des normes (je pense notamment au
serveur mail). Les développeurs de certains
logiciels se sont emparés du problème et s'occupent
déjà de corriger.

Cette clarification étant faite, je ne tolèrerai
aucune diffamation me concernant en raison d'un
logiciel tiers sur lequel je n'ai pas la main.

Et puis, quitte à être dans les sujets polémiques,
le Nerv Project n'utilisera aucunement une écriture
mettant à l'écart une frange de la population par
son côté inaccessible. Le point médian dit inclusif
empêche aux personnes souffrant de dyslexie ou de
cécité de lire. Encore une fois, je comprends le
besoin égalitaire face à la langue mais je refuse
d'être tout simplement interdit ou d'interdire à
qui que ce soit la lecture pour privilégier un
autre groupe. Une écriture inclusive doit l'être
pour tout le monde, sans mettre des gens sur le
bord de la route "parce qu'ils sont minoritaires"
ou parce que les systèmes technologiques nécessaires
ne peuvent pas être compatible. Et je vais être très
dur sur un point : IL EST TOTALEMENT HORS DE
QUESTION QUE J'ABANDONNE LE BRAILLE. Oui, il n'y a
pas de caractère officiel pour le point médian en
braille, mais ce n'est pas une raison pour
l'interdire. Si ce que je vous dis vous semble
aberrant, sachez que cela m'a été reproché.

Je vous rappelle que je fais aussi
partie de minorités, oui au pluriel. Gay et
légalement aveugle. Et la langue française n'est
clairement pas sympathique non plus dans ces cas.
Mais revenons à nos moutons. Je suis totalement
preneur si un accord sort concernant une langue
inclusive, simple, qui ne pose aucun problème.
Mes textes reprennent notamment des noms de métier
féminisés, il y'aura des personnages féminins
construits avec autant d'attention que les autres,
etc. Et il est absolument hors de question qu'il
en soit autrement. Et plus encore, si vous lisez
entre les lignes de l'univers du Nerv Project, vous
vous rendrez compte que cette agence secrète fictive
peut prendre tout un tas de qualificatifs peu
glorieux. C'est fait exprès, il faut bien qu'une
chose existe dans une fiction pour la dénoncer ou
pour poser des questions de société. Et dans les
futurs écrits, vous allez apprendre à détester le
fabuleux cardiologue. Et pas qu'un peu.

Concrètement, j'évite au maximum d'utiliser le
pluriel directement à un ensemble de personnes
listées. Ainsi, je n'écrirai pas "Marc, Martine
et Mehdi sont gentils" mais "le groupe d'amis
faisait preuve d'une gentillesse à toute épreuve"
(groupe est masculin singulier) ou "les
personnes" (féminin pluriel) ou encore "les gens"
(pluriel, genre selon la position dans la phrase).

Je regrette fortement le manque du neutre dans la
langue française, et je ne serai pas contre pour
définir, par exemple, un genre actuel comme neutre
et l'autre comme "genré". Si on
prend le masculin comme neutre, on dirait
"Marc est gentille", "Martine est gentille"
mais "Marc et Martine sont gentils". Mais on peut
aussi choisir l'inverse. Cette approche aurait
l'avantage de créer peu de différences dans la
langue, d'être totalement inclusif vu que tout le
monde a le même pronom et le même accord, et d'être
simple pour tout le monde. C'est une proposition
comme une autre. Je sais que certaines personnes
proposent l'accord de proximité, mais je trouve
la règle moins simple à appliquer. Il n'y a pas
de consensus aujourd'hui sur ces sujets-là et je ne
veux pas non plus perdre un public non sensibilisé
à ces questions. C'est pour cela que je me tiendrai
à appliquer les règles de français telles qu'elles
existent aujourd'hui, en utilisant un mot valise
pour parler d'un groupe plutôt que de référencer
directement plusieurs personnes directement par un
pronom. Et si jamais un tel cas se produirait, il
s'agirait juste d'une faute à la relecture, vous
pourrez directement me le signaler et je corrigerai
le texte.

Ainsi se termine la partie non technique. Il n'y
aura pas plus d'actualités dans la suite de cet
article.

Les avancées techniques
^^^^^^^^^^^^^^^^^^^^^^^

Du HTML vers le PDF
-------------------

Revenons donc à ce qui m'a occupé ce mois-ci.
`Sphinx` exporte nativement en `PDF` en utilisant
`LaTeX`. Cette manière de faire ne me convenait
pas pour une raison toute simple : il faut
maintenir à la fois un thème pour `HTML` et un
thème pour `LaTeX`. Et en plus, les spécificités
de `Sphinx` rendent le thème `LaTeX` difficilement
personnalisable. C'est donc beaucoup de travail
supplémentaire, à maintenir. C'est pour cela que
j'ai écrit deux extensions très simples pour
`Sphinx`. Il s'agit de
`sphinx_weasyprint_builder
<https://procrastinator.nerv-project.eu/nerv-project/sphinx_weasyprint_builder>`_
et de
`sphinx_pyppeteer_builder
<https://procrastinator.nerv-project.eu/nerv-project/sphinx_pyppeteer_builder>`_.
Les deux font exactement la même chose, mais pas
avec le même moteur. J'utilise donc la sortie
`HTML` de `Sphinx`, mais en version un seul fichier
à la sortie, puis j'applique une conversion du
`HTML` vers le `PDF`. Dans le premier cas, j'utilise
`WeasyPrint`, basé sur `Cairo`, qui propose une
conversion directe. Dans le second, il s'agit d'une
impression lancée avec le moteur de `Chromium`.

Tous les moteurs de rendu ont des approches
différentes et tous ne supportent pas de la même
manière les différents flux et les attributs CSS.
Et malheureusement, la partie impression est
relativement peu implémentée.

Un thème particulier
--------------------

Le thème `HTML` du Nerv Project pour `Sphinx` est
assez particulier pour plusieurs raisons. Il
est prévu pour être fonctionnel pour les sorties
`HTML`, `PDF` via `sphinx_pyppeteer_builder` et
`ePub`. Il est disponible pour tout le monde
`sur mon serveur gitea
<https://procrastinator.nerv-project.eu/nerv-project/sphinx_nervproject_theme>`_.
Je ne peux malheureusement pas le rendre compatible
avec `WeasyPrint` en raison de certaines complexités
du `CSS` non prises en charge. Et il me reste encore
quelques bugs sur la taille de certains blocs,
laissant ainsi de grands vides avec le format
impression. À noter que j'ai dû utiliser une table
pour de la mise en forme. Je n'aime pas ça, mais
c'est le seul moyen de garder des entêtes et
pieds-de-pages fixes.

Le thème fonctionne cependant parfaitement bien
pour l'affichage du site web. Il dispose de ses
quatre jeux de couleurs en mode site web uniquement
et d'un cinquième pour l'impression. Le format
`ePub`, quant à lui, ne permet pas de gérer des jeux
de couleurs en fonction du thème du système. Il a
donc fallu faire un choix sur ce point, et il
reprend donc le mode clair, car c'est celui qui est
généralement préféré par l'utilisateur. En plus,
c'est celui qui est le plus logique pour des
liseuses à encre électronique.


ePub, un nouveau chantier
-------------------------

Tant que nous sommes dans les problèmes liés au
format `ePub`, le retour de mes écrits est très mauvais
avec le programme `epubcheck`. J'ai un grand
nombre d'erreurs. J'ai pu corriger une partie liée
au thème. J'utilise même un module de mon cru,
`sphinx_fasvg
<https://procrastinator.nerv-project.eu/nerv-project/sphinx_fasvg>`_,
pour pouvoir utiliser des icônes de
`FontAwesome <https://fontawesome.com/>`_
au format `SVG`, et celui-ci empêche aujourd'hui
la génération d'un `ePub`. Il me reste donc du travail
pour mettre tout ça au point, et voir pourquoi
`Sphinx` lui-même me provoque des erreurs à la
vérification.

Retour à Gitea
--------------

Enfin, une dernière action de ce mois-ci change
beaucoup de choses sur l'infrastructure. J'ai
abandonné `GitLab` pour revenir à `Gitea`. Je
perds énormément de fonctionnalités que je
n'utilisais pas et quelques unes qui m'étaient
utiles. Mais ce changement me libère beaucoup de
ressources. `Gitea` consomme moins en `RAM` et en
processeur. Ça soulage un serveur qui est déjà
surchargé. Il me reste à me pencher sur quelle
solution `CI/CD` je vais déployer pour remplacer
celle que j'ai perdue.

Architecture du projet
^^^^^^^^^^^^^^^^^^^^^^

Parlons d'ailleurs architecture. Aujourd'hui,
j'utilise un seul serveur sur lequel tout est
installé, sans réelle séparation entre services.
Il héberge à la fois le serveur mail, les sites
web, mon serveur `XMPP`, et me sert de bureau
distant en `CLI`. Bref, ce n'est pas très propre,
surtout qu'il s'agissait à la base d'un bureau
distant et rien d'autre. Le choix de la distribution
Linux (Arch) n'était pas insensé à ce moment-là.

Une telle architecture ne va aujourd'hui plus du
tout, les besoins grossissent. Et donc une refonte
complète est à prévoir. Je regarde actuellement
différentes solutions pour cela. J'ai déjà identifié
quelques scénarios à mettre en œuvre, pour
automatiser la maintenance, la mise à jour des sites,
la création de nouvelles machines, l'élaboration
d'un plan de reprise d'activité et j'en passe.
Il va y avoir un gros travail dans les mois à venir
sur tout cela. Je peux déjà vous dire que j'ai
sélectionné `SaltStack` et `Zabbix`, et que je
lorgne sur `Uyuni`, et peut-être `OpenBuildService`.
Ce sujet sera très probablement abordé le mois
prochain de manière bien plus détaillée.
