New French post: Upgrading my org-mode websites
All checks were successful
continuous-integration/drone Build is passing
All checks were successful
continuous-integration/drone Build is passing
This commit is contained in:
parent
8b248296b7
commit
02a9f7f7e3
@ -4,6 +4,7 @@
|
|||||||
#+hugo_base_dir: ../
|
#+hugo_base_dir: ../
|
||||||
#+hugo_section: ./
|
#+hugo_section: ./
|
||||||
#+hugo_categories: emacs linux conlanging orgmode
|
#+hugo_categories: emacs linux conlanging orgmode
|
||||||
|
#+startup: content
|
||||||
|
|
||||||
* [EN] Open-Sourcing ALYS :ALYS:
|
* [EN] Open-Sourcing ALYS :ALYS:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@ -77,6 +78,174 @@ above.
|
|||||||
* Conlanging :@conlang:
|
* Conlanging :@conlang:
|
||||||
** TODO Writing my conlanging docs with Emacs :emacs:conlanging:
|
** TODO Writing my conlanging docs with Emacs :emacs:conlanging:
|
||||||
* Development :@dev:
|
* Development :@dev:
|
||||||
|
** [FR] Mettre à niveau mes sites org-mode :dev:emacs:
|
||||||
|
:PROPERTIES:
|
||||||
|
:EXPORT_FILE_NAME: mettre-a-nivea-mes-sites-org-mode
|
||||||
|
:export_hugo_menu: :menu "main"
|
||||||
|
:END:
|
||||||
|
*** Le Problème
|
||||||
|
Cela fait quelques temps que je réfléchis à une nouvelle manière de
|
||||||
|
gérer deux de mes sites web, [[https://conlang.phundrak.com][conlang.phundrak.com]] et
|
||||||
|
[[https://config.phundrak.com][config.phundrak.com]].
|
||||||
|
|
||||||
|
Les deux sites sont actuellement générés via un export depuis org-mode
|
||||||
|
(un des nombreux modes d’Emacs) directement vers du HTML. Sauf que
|
||||||
|
l’organisation du fichier HTML de sortie de me plaît pas, et depuis
|
||||||
|
plus de deux ans j’utilise un script rédigé en Dart et compilé vers
|
||||||
|
Javascript pour réorganiser les fichiers. En soit ce ne serait pas
|
||||||
|
trop grave si mes pages web n’étaient pas forcément lourdes. Mais
|
||||||
|
elles le sont! La plus lourde page de mon site de linguistique fait
|
||||||
|
232Ko (la page francophone sur le Proto-Ñyqy) et celle de mon site de
|
||||||
|
configuration fait 5,5Mo (configuration Emacs) ! Je parle bien de
|
||||||
|
fichiers HTML ! Il faut vraiment que ça change!
|
||||||
|
|
||||||
|
*** Nouveau Framework pour le front-end
|
||||||
|
À la base je m’étais lancé pour écrire un exporteur personnalisé pour
|
||||||
|
exporter mes fichiers org-mode vers des fichiers JSX qui seraient
|
||||||
|
utilisés par un projet [[https://reactjs.org/][Reac]]t, ou même [[https://nextjs.org/][Next.js]]. Mais j’ai récemment
|
||||||
|
découvert quelque chose qui pourrait être bien plus pratique pour
|
||||||
|
moi : [[https://vuejs.org/][Vue]] et tout particulièrement [[https://v3.nuxtjs.org/][Nuxt]] !
|
||||||
|
|
||||||
|
En effet, Nuxt lit le [[https://content.nuxtjs.org/guide/writing/mdc/][MDC]], ou Markdown Components. De fait, il est
|
||||||
|
possible avec MDC et Nuxt d’insérer dans du Markdown des composants
|
||||||
|
Vue soit en blocs soit en inline. Et pour moi, ça change tout ! Je
|
||||||
|
peux maintenant écrire un exporteur minimal qui se chargera simplement
|
||||||
|
d’exporter quelques éléments personnalisés vers des composants Vue,
|
||||||
|
voire même de simples macros org-mode pour exporter les composants
|
||||||
|
inline.
|
||||||
|
|
||||||
|
Et bien sûr, pour pallier au problème de fichiers HTML trop lourds, il
|
||||||
|
me faudra séparer mes fichiers actuels en plusieurs fichiers, mais
|
||||||
|
cela devrait être plus simple à gérer une fois la transition vers le
|
||||||
|
nouveau framework effectuée.
|
||||||
|
|
||||||
|
*** Et pour le backend ?
|
||||||
|
Mais ce n’est pas tout : un élément que j’aimerais ajouter à mon site
|
||||||
|
de linguistique serait un dictionnaire entre mes langues construites
|
||||||
|
et d’autres langues, qu’elles soient construites ou non. Ce
|
||||||
|
dictionnaire doit pouvoir être interactif, avec par exemple une
|
||||||
|
recherche, une page par mot, etc.
|
||||||
|
|
||||||
|
Je ne ferai certainement pas télécharger à mes utilisateurs
|
||||||
|
l’entièreté du dictionnaire à chaque recherche d’un mot dans le
|
||||||
|
dictionnaire, il ne peut donc pas être hébergé avec mon frontend, et
|
||||||
|
j’aurai besoin d’un backend avec une API REST pour gérer les requêtes
|
||||||
|
des visiteurs du site web. Maintenant la question est, quel type de
|
||||||
|
back-end ?
|
||||||
|
|
||||||
|
Tout d’abord, je vais complexifier un peu le problème : je suis un
|
||||||
|
grand amateur de org-mode. Je pourrais gérer ça via une base de
|
||||||
|
données classique, ajoutant chaque entrée manuellement, mais je vais
|
||||||
|
plutôt essayer de gérer tout ça via org-mode. Les fichiers texte sont
|
||||||
|
plus simples à versionner que des bases de données en un seul fichier
|
||||||
|
binaire. Du coup, il va falloir que je m’écrive un nouvel exporter,
|
||||||
|
mais lequel ?
|
||||||
|
|
||||||
|
Je pourrais rédiger un exporteur pour mon fichier ~dictionnaire.org~ qui
|
||||||
|
l’exporterait vers un fichier Json qui serait lu ensuite par mon
|
||||||
|
backend qui extraierait et enverrai à mes utilisateurs les
|
||||||
|
informations nécessaires. L’avantage serait de n’avoir quasiment pas
|
||||||
|
besoin de manipuler le Json et d’en envoyer tel quel. Mais l’ouverture
|
||||||
|
et fermeture constante du fichier n’est pas forcément la meilleure des
|
||||||
|
idées, quoi que cela pourrait permettre de remplacer le fichier
|
||||||
|
pendant que le backend tourne. Mais je suis sûr qu’on peut mieux
|
||||||
|
faire.
|
||||||
|
|
||||||
|
Ma solution suivante était d’utiliser EmacSQL, un paquet Emacs lui
|
||||||
|
permettant d’interagir avec des bases de données SQLite, PostgreSQL et
|
||||||
|
MySQL. Au moins ce serait une véritable base de données, avec
|
||||||
|
seulement un blob binaire à mettre à jour, et ce serait
|
||||||
|
potentiellement plus performant étant donné qu’il n’y aura qu’à ouvrir
|
||||||
|
une fois une connexion avec elle. Mais le problème est maintenant sa
|
||||||
|
mise à jour. Mince…
|
||||||
|
|
||||||
|
Vient enfin ma troisième solution qui, je pense, sera celle que je
|
||||||
|
vais adopter : utiliser une base de donnée type Firebase. L’idée d’un
|
||||||
|
verrouillage fournisseur ne me plaît pas franchement, donc j’ai décidé
|
||||||
|
d’utiliser une alternative open source et hébergeable : [[https://appwrite.io/][Appwrite]]! Je
|
||||||
|
peux écrire sur une de ses bases de données pendant que mes
|
||||||
|
utilisateurs peuvent la lire, donc la mise à jour n’est pas un
|
||||||
|
problème, et je n’ai rien à mettre en ligne, seulement une série de
|
||||||
|
requêtes à faire. Cependant, un problème reste : comment communiquer
|
||||||
|
avec Appwrite?
|
||||||
|
|
||||||
|
*** La quête pour un SDK Appwrite pour Emacs
|
||||||
|
Hélas, j’ai beau chercher, il n’existe aucun paquet pour Emacs
|
||||||
|
permettant une communication avec Appwrite. Mais ce n’est pas
|
||||||
|
franchement surprenant : Appwrite n’est pas encore extrêmement
|
||||||
|
répandu, et même Firebase ne dispose pas de paquet pour Emacs.
|
||||||
|
|
||||||
|
Bien heureusement, Appwrite dispose d’une API REST assez bien
|
||||||
|
documentée, et Emacs est capable de gérer des requêtes nativement via
|
||||||
|
sa bibliothèque ~url~, c’est donc naturellement que j’ai commencé à
|
||||||
|
travailler sur ~appwrite.el~, un SDK Appwrite pour du Emacs Lisp.
|
||||||
|
J’aurais pu utiliser ~request.el~, un paquet assez populaire pour Emacs
|
||||||
|
afin de gérer les requêtes HTTP, mais je ne suis pas grand fan de son
|
||||||
|
workflow et je préfère limiter au maximum le nombre de dépendances
|
||||||
|
dans mes paquets. Ce que ce paquet fait actuellement est une
|
||||||
|
transformation des paramètres nommés que mes fonctions acceptent en un
|
||||||
|
payload Json. Par exemple, ma fonction ~appwrite-stogare-list-buckets~
|
||||||
|
accepte les mot-clefs ~search~, ~limit~, ~offset~, ~cursor~, ~cursor-direction~
|
||||||
|
et ~order-type~. Ces arguments sont transformés en du Json via la
|
||||||
|
bibliothèque native d’Emacs afin de donner ceci :
|
||||||
|
#+begin_src js
|
||||||
|
{
|
||||||
|
"search": "my search request",
|
||||||
|
"limit": 30,
|
||||||
|
"offset": 0,
|
||||||
|
"cursor": "",
|
||||||
|
"cursorDirection": "before",
|
||||||
|
"orderType": "ASC",
|
||||||
|
}
|
||||||
|
#+end_src
|
||||||
|
|
||||||
|
Ce payload Json est enfin envoyé à l’API REST correspondante, en
|
||||||
|
l’occurrence ~/v1/storage/buckets~ comme on peut le voir [[https://appwrite.io/docs/server/storage?sdk=nodejs-default#storageListBuckets][sur la
|
||||||
|
documentation officielle]]. Bien sûr, les éléments optionels ne sont
|
||||||
|
pas nécessairement inclus afin d’éviter à avoir à envoyer trop
|
||||||
|
d’informations. Dans ce cas, tous les éléments du payload sont
|
||||||
|
optionels, ce qui ferait que le ~appwrite.el~ n’enverra que src_js{{}}
|
||||||
|
comme payload à l’API.
|
||||||
|
|
||||||
|
Pour l’instant, le projet en est encore à ses débuts, mais j’ai
|
||||||
|
commencé à travailler sur le SDK pour Appwrite que vous pouvez trouver
|
||||||
|
sur [[https://github.com/Phundrak/appwrite.el][ce dépôt Github]].
|
||||||
|
|
||||||
|
La question maintenant est : comment exporter mon dictionnaire vers
|
||||||
|
Appwrite ? La réponse me semble relativement simple ; je pourrai
|
||||||
|
écrire un exporteur org-mode dépendant de ~appwrite.el~ qui exportera
|
||||||
|
pour chaque mot qu’il rencontrera un payload Json vers mon instance
|
||||||
|
personnelle Appwrite. Et à la différence des exporteurs org-mode
|
||||||
|
habituels, ~ox-appwrite~ n’exportera aucun fichier sur mon système.
|
||||||
|
|
||||||
|
*** Conclusions
|
||||||
|
Au fur et à mesure de mon analyse du projet et de mes besoins, je me
|
||||||
|
suis rendu compte que j’aurai besoin d’outils plus intelligents que de
|
||||||
|
simples pages HTML exportées automatiquement via Emacs.
|
||||||
|
|
||||||
|
Ainsi, j’aurai besoin de créer un site web avec Nuxt, profitant ainsi
|
||||||
|
de sa capacité à rendre du Markdown avec du contenu interactif,
|
||||||
|
agissant en tant que frontend pour mon site web. Ce Markdown sera
|
||||||
|
exporté via org-mode à partir de mes fichiers déjà existants, bien
|
||||||
|
qu’à fragmenter afin de réduire la taille des fichiers de sortie.
|
||||||
|
|
||||||
|
Le backend sera une instance Appwrite que j’hébergerai moi-même sur
|
||||||
|
mes serveurs. Elle sera populée par un exporter org-mode custom via
|
||||||
|
Emacs, ce qui me permettra de continuer à gérer mes dictionnaires et
|
||||||
|
mes langues avec org-mode.
|
||||||
|
|
||||||
|
Ce projet est vraiment intéressant car cela m’a incité à explorer de
|
||||||
|
nombreuses possibilités et technologies différentes afin de trouver ce
|
||||||
|
qui correspond le mieux à mon besoin, notamment en me rendant compte
|
||||||
|
par exemple que React n’était pas forcément l’outil le plus adapté à
|
||||||
|
ce projet précisément. Cela me fera également travailler sur ma
|
||||||
|
capacité à interagir avec des backends et des API REST, tout autant du
|
||||||
|
côté front-end pour le site web que du côté SDK avec Emacs. Enfin, la
|
||||||
|
création de ce SDK ainsi que des exporteurs org-mode me sera bénéfique
|
||||||
|
afin d’approfondir ma connaissance d’Emacs et du Emacs Lisp.
|
||||||
|
|
||||||
|
Maintenant, au travail !
|
||||||
|
|
||||||
** [EN] Writing a Dynamic Array in C :dev:C:
|
** [EN] Writing a Dynamic Array in C :dev:C:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:EXPORT_FILE_NAME: writing-dynamic-vector-c
|
:EXPORT_FILE_NAME: writing-dynamic-vector-c
|
||||||
|
Loading…
Reference in New Issue
Block a user