Meta-Press.es

Moteur de recherche décentralisé & revue de presse automatisée

Version 1.8.1 : moins de bugs, plus de sources, plus de month_nb (du tout)

La v1.8.1 ne devait être qu’une opération de maintenance :

  • mettre à jour les dépendances

  • réparer les bugs introduits

  • ajouter des sources…

Mais les évènements prirent une toute autre tournure et cette version restera comme celle à laquelle j’ai pu me débarrasser d’une de mes propres dépendances : month_nb.

À la 1ère ouverture, cette version ouvre des onglets frénétiquement, ça n’arrive plus aux ouvertures suivantes (c’est un problème lié aux recherches automatiques et à l’heure d’été).
Des utilisateurs ont reporté une frénézie d’ouverture d’onglet depuis la page des réglages, persistante à chaque ouverture de page. Ce bug est corrigé avec la version 1.8.2

1. month_nb

Cette bibliothèque de fonction (une seule fonction…), présentée ici et , permet de convertir un nom de mois en son numéro, sans même avoir à connaître la langue employée. Ça marche pour 72 langues. C’était une approche minimaliste (±300 lignes de code), basée sur un arbre compact d’expressions régulières attrapant, lettre par lettre, des débuts de nom de mois.

C’était intéressant en JavaScript parce que c’était 20x plus compacte que les alternatives et c’était unique par l’aspect : pas besoin de connaissance a priori de la langue des noms de mois convertis.

En utilisant l’API Intl.DateTimeFormat (qui étaient peut être déjà opérationnelle en 2014 mais bougeait encore en août dernier), il est désormais possible de remplacer les 300 lignes de month_nb par 5 lignes de JavaScript encapsulées dans 3 fonctions (comme le montre ce premier commit commit sur le sujet).

Le principe est simple ici : le navigateur sait comment les noms de mois s’écrivent pour 218 locales (dans un Firefox 102.0a1) alors quand il y a besoin d’en convertir un en son numéro, il suffit de parcourir la liste des mois d’une langue donnée et de voir quel est l’index du mois dans la liste… Ça a fonctionné du premier coup pour presque toutes les sources !

Voici les quelques exceptions notables :

  • la version espéranto du Monde Diplomatique utilise des noms de mois en anglais pour les dates de ses résultats (j’ai donc ajouté une propriété date_locale dans la définition des sources pour préciser la langue des dates quand ce n’est pas celle des résultats)

  • le néerlandais (nl) qui utilise une abréviation pour le mois de mars qui n’est pas le début du nom du mois tronqué : maart est abrégé en mrt. (j’ai donc ajouté une comparaison sur les versions courtes des noms de mois, que le navigateur peut aussi fournir, en cas d’échec avec la version longue)

  • les noms de mois en Russe sur Wikipedia n’étaient pas reconnus. Après quelques échanges sur Mastodon j’ai appris que c’était dû à un mécanisme de déclinaison "d’appartenance" des noms dans cette langue en fonction de leur contexte d’utilisation (on marque bien le genre et le nombre nous…). J’ai donc ajouté, à la suite des mois en version courte, une comparaison sur les noms de mois déclinés dans le cas du Russe

  • enfin, les langues arabes comme la version égyptienne de Wikipedia (ar-eg) ou la version iranienne du Monde Diplomatique (fa-ir) ne fonctionnent pas non plus et je pense que je vais avoir besoin d’aide pour les réparer (comme signalé sur le compte Mastodon officiel de Meta-Press.es).

J’ai créé month_nb avec les premiers prototypes de Meta-Press.es en 2013… ce projet m’a coûté des larmes de sang nocturne (et plus récemment diurnes pour Christopher), mais après des heures de pagaille de droite-à-gauche dans nos éditeurs et sans vraiment savoir ce qu’on faisait, au moins on avait réussi à faire fonctionner ces langues arabes avec month_nb. Toutefois, la gestion des abréviations dans toutes les langues n’était pas envisageable elle (trop de collisions).

Ce coup-ci, les bonnes listes de noms de mois, ajoutées au bon endroit, seront sûrement suffisantes pour faire à nouveau fonctionner ces langues (comme pour le Russe).

1.1. Nom des langues et des pays

Sur ma lancée j’ai aussi remplacé la liste des noms de langue (mise en place par l’un des stagiaires) par une approche similaire d’introspection du navigateur via l’API Intl.DisplayNames, et puis ajouté les noms de pays (que nous n’avions pas jugée suffisamment utile avant). Les deux sont désormais affichées dans la langue du navigateur de l’utilisateur (alors que les langues étaient affichées dans leur langue avant).

D’ailleurs dans l’ensemble (et comme le mesure la commande cloc) j’ai déjà "harmonisé" (vers le néant) 25% des lignes de code produites par les stagiaires (conservant les fonctionnalités, perdant plein de temps).

Je voulais aussi remplacer notre liste de fuseaux horaires (utilisée dans les réglages) mais l’API correspondante : Intl.Locale.timeZones ; n’est pas encore supportée par Firefox.

Je vais garder un œil là dessus pour éliminer cette surface de maintenance le plus vite possible.

2. Mise à jour des dépendances et petites réparations

Outre le retrait de month_nb certaines dépendances ont simplement été mises à jour pour cette nouvelle version :

  • Choices.js v10.1.0 (enfin une mise à jour disponible pour ce projet qui cherchait de nouveaux mainteneurs et semble les avoir trouvés)

  • Browser-polyfill.js v3.0.1

  • Gettext.js v1.1.0

Ces mise à jour ont entrainé quelques petites réparations et précautions à prendre suite à des annonces de fonctionnalités abandonnées prochainement. J’ai également réglé le problème avec la pagination de ListJS (qui entraînait un défilement en haut de page à chaque changement de page) par une solution que j’ai pris le temps de remonter au projet. Ce bug fut probablement introduit par la version 2.3.1 de ListJS, mise à jour il y a 9 mois dans Meta-Press.es…

La fonctionnalité de retrait des résultats d’une source a également été réparée pour les sources comportant des parenthèses dans leur nom comme : "Wikipedia (pl)". La nouvelle méthode est nettement plus rapide et affiche désormais un curseur d’attente pendant l’opération.

Les imports et les exports aussi affichent un curseur d’attente. Ça doit faire 3x que j’annonce cette fonctionnalité mais c’est moins simple qu’il n’y parait. Il faut que le traitement derrière le changement de curseur soit asynchrone, sinon le navigateur se lance dans le calcul avant que le curseur d’attente ne soit rendu visible et il faut forcer ce curseur d’attente même sur les liens (et les boutons que je maquille en lien) car le curseur signalant le lien reste affiché sinon (ce qui peut donner l’impression qu’il faut secouer la souris pour que le curseur d’attente s’affiche…).

2.1. Limitations du browser.storage

Un autre bug assez pénible fut introduit avec la précédente version de Meta-Press.es et sa nouvelle liste des sources. Un bouton de cette interface permet de retirer toutes les sources de la sélection courante (en les ajoutant à la liste des sources explicitement dé-selectionnées). Ça fonctionne bien avec les deux derniers onglets (les sources ajoutées ou les sources retirées de la sélection courante), mais si on clique dessus sur l’un des deux premiers onglets (toutes les sources ou toutes les sources sélectionnées) cela abouti à une sélection vide et Meta-Press.es le signale puis restaure les tags par défaut. Le problème c’était que les utilisateurs se retrouvaient bloqués dans une boucle infinie de popup signalant une sélection vide.

J’ai réparé ça et ai beaucoup appris ce faisant. Il n’y aurait pas dû y avoir cette boucle, elle était créée par une limitation du stockage proposé par le navigateur aux WebExtensions. Ces limites sont : 512 objets, de 8 ko maximum chacun, pour un total ne dépassant pas 100 ko.

Ça représente une liste de ±200 sources (ajoutées ou retirées de la sélection). Les listes plus grosses fonctionnent mais ne sont plus sauvegardées.

En évitant de sauvegarder de trop gros objets dans le stockage de l’extension, il n’y a plus de boucle infinie, mais une meilleure solution est encore à trouver. Pour l’instant, j’utilise l’URL principale d’une source en guise de clé d’identification. Ça présente l’avantage de permettre de retrouver une source connue à partir d’un fichier RSS pris sur le web, ou de garantir qu’un vieil export sera encore reconnu par une version mise à jour de Meta-Press.es (et tout ça sans le moindre "coût" pensais-je jusqu’à ce qu’on atteigne une limite du browser.storage).

Ces limites sont désormais surveillées de près et un rapport s’affiche dans la console JavaScript quand on ouvre un nouvel onglet de Meta-Press.es.

3. Nouvelles sources

Cette nouvelle version embarque 62 sources de plus, pour un total de 378, de 59 pays (+4) et en 33 langues (+10).

Le type de source Agenda accueille l' agendamilitant.org (en plus de toutes les instances de Demosphère, pour un total de 30 agendas, et attendant que cette feature-request soit traitée du côté de Mobilizon).

Le type de source Encyclo. comporte désormais 14 langues de Wikipedia, pour un total de 20 sources encyclopédiques indexées.

Un type de source Réseaux sociaux fait son apparition, regroupant 14 sources dont Invidious et plusieurs langues de Dailymotion. D’autres sources "web" suivront et n’hésitez pas à proposer un meilleur nom pour cette catégorie.

Mais la nouvelle star des sources c’est l’instance Scrutari du Coredem dans le type de source renommé Doc. (incluant Wikileaks et ArretSurImages.net).

Scrutari est un moteur de recherche en logiciel libre qui indexe 58 663 ressources en provenance de 38 sites promouvant une démocratie mondiale. Cette source se retrouve ventilée en 14 langues.

4. Nouveaux fichiers

Pour finir, 3 fichiers ont fait leur apparition dans le dépôt :

  • .eslintrc.json qui contient des directives de configuration pour l’analyseur de code ESLint, pour aider à appliquer les règles de présentation du code

  • wiki/incompatible_sources.adoc qui n’est pas vraiment nouveau puisque c’est tout simplement la page du wiki du projet listant les sources qu’il n’a pas été possible d’ajouter… (elle sera probablement plus visible là, et assurément plus facile à maintenir pour moi)

  • json/broken_sources.json un fichier où j’ai déplacé les restes d’environ 50 définitions de sources impossibles à finir ou cassées depuis. La motivation était là de ne plus envoyer ces 1440 lignes de JSON pour rien aux utilisateurs… et j’en ai profité pour en réparer certaines.

Avant d’ajouter une nouvelle source, il est recommandé de jeter un œil à ces deux derniers fichiers pour trouver des traces d’hypothétiques essais précédents.