Libera Suite est une « nouvelle » suite bureautique libre pour Linux, Windows et macOS. Elle comprend actuellement un traitement de texte, un tableur, un logiciel de présentation et une visionneuse de fichiers Visio. Elle fonctionne sur votre ordinateur, sans compte, sans service en ligne et sans télémétrie. Elle sait ouvrir et enregistrer les formats de Microsoft Office et OpenDocument. Comparées à d’autres applications similaires, elle est relativement rapide à démarrer et légère.
Elle est bâtie sur les composants d’Euro-Office, le fork d’ONLYOFFICE lancé en avril par une coalition d’entreprises européennes, dont Abilian (société de l’auteur de cette dépêche), qui développe Libera Suite. Elle est en bêta publique depuis le 1ᵉʳ octobre.
Une seule commande, libera, ouvre chaque document dans l’application qui lui correspond :
Libera Words, le traitement de texte : .docx, .odt, .rtf, .txt, .md ;
Libera Tables, le tableur : .xlsx, .ods, .csv ;
Libera Slides, les présentations : .pptx, .odp ;
Libera Diagrams, la visionneuse de fichiers Visio : .vsdx.
Les quatre applications partagent des fonctions comme l’export PDF, l’impression, la correction orthographique en cinq langues et la récupération du travail après un plantage.
Addition pratique: la commande libera --convert permet de convertir entre les différents formats pris en charge, ou d’exporter vers PDF. Par exemple, libera --convert *.docx -t pdf convertit un lot de documents vers PDF sans ouvrir de fenêtre. Son ergonomie est inspirée de Pandoc.
Comment l’installer
Linux (Ubuntu 22.04, Debian 12, Fedora 36, RHEL 9 et plus récents, x86_64 et arm64) : curl -fsSL https://cdn.abilian.com/libera/install.sh | sh. Si Flatpak est présent, le script installe un paquet Flatpak qui contient tout ; sinon, il installe la commande libera.
macOS (Apple Silicon) : brew install abilian/tap/libera, ou le même script. Homebrew fonctionne aussi sous Linux (à condition évidemment de l’avoir installé).
Windows 10 et 11 : un installateur, sans droits d’administration.
Pour les utilisateurs et les utilisatrices de Python, Libera Suite est aussi publiée sur PyPI. Sous macOS et Windows, uvx libera suffit : au premier lancement, la commande propose de télécharger les composants d’Euro-Office. Sous Linux, un environnement Python isolé ne voit pas les liaisons GTK de la distribution : il faut passer par pipx install --python /usr/bin/python3 --system-site-packages libera.
Euro-Office fournit ses outils d’édition sous forme de composants Web, écrits en JavaScript. Ces composants s’exécutent dans un moteur de navigateur et confient les conversions de fichiers, l’accès au disque et les autres aspects de l’intégration au système d’exploitation et à l’environnement graphique hôte (menus, boîtes de dialogue…) à l’application qui les héberge. Libera Suite est cette application hôte, écrite en Python. Elle affiche les composants dans le moteur de rendu web fourni par le système (WebKit sous Linux et macOS, WebView2 sous Windows) et confie les conversions de formats (y compris l’import/export de fichiers) au convertisseur d’Euro-Office.
Près de 700 tests automatisés vérifient son fonctionnement. Une partie d’entre eux ouvre de vrais documents dans ces composants et contrôle le résultat affiché.
Nous compilons nous-mêmes les composants d’Euro-Office, depuis ses sources, pour Linux, macOS et Windows. Les correctifs nécessaires sont tous publiés et expliqués. Nous avons aussi corrigé (à ce jour) 68 défauts du convertisseur dans la lecture et l’écriture des fichiers OpenDocument, repérés grâce aux fichiers de test de LibreOffice.
L’application hôte est sous licence Apache 2.0. Les composants issus d’Euro-Office / ONLYOFFICE restent sous licence AGPL 3.0.
Réseau
Libera Suite se connecte pour télécharger les composants d’Euro-Office à l’installation. Une fois par jour au plus, elle vérifie aussi si une nouvelle version existe, sans rien télécharger ; la ligne check_updates = false du fichier de configuration désactive cette vérification.
Les limites de la bêta
L’interface est en anglais. Chaque document a sa propre fenêtre, sans onglets. Microsoft Office ne voit pas les verrous de Libera Suite. L’application Diagrams est en lecture seule. Ni l’édition des PDF ni le publipostage ne sont encore disponibles. L’installateur Windows et l’application macOS ne sont pas encore signées. La page État des lieux en donne la liste complète.
Vos retours
Nous cherchons des testeurs. Le moteur de mise en page est relativement éprouvé (plus pour les formats MS-Office que pour ODF, mais on y travaille). La cause des bugs éventuels se trouve le plus probablement dans notre processus de build, de paquetage et de distribution, dans l’absence d’une police ou d’une ressource. Ces défauts se corrigent vite, à condition de les voir. Le retour le plus utile est donc un document qui s’affiche mal, joint à un ticket avec la sortie de libera --diagnose.
Chercher un sujet sur le web, c'est ouvrir dix onglets. Puis copier des liens à la main. Puis recommencer.
Alors j'ai écrit scrapaud.
C'est un seul fichier Python. Bibliothèque standard uniquement, Python 3.11 ou plus. Pas de pip install, pas d'environnement virtuel. On copie le fichier et on le lance.
Il interroge 14 moteurs d'un coup : SearXNG, DuckDuckGo, GitHub, Wikipedia, arXiv et d'autres. Les résultats sont fusionnés, classés, dédoublonnés. Ensuite il va chercher les pages et en tire ce qu'on lui demande : liens, tableaux, images, emails, texte. Il lit aussi les PDF (avec pdftotext) et les documents Office. Il sait fabriquer des listes de mots triées par fréquence. Il parle à des services .onion grâce à un client SOCKS5 intégré, à condition d'avoir Tor en local. Pour les pages construites en JavaScript, il faut en plus un Chromium. Ces outils sont optionnels : sans eux, le reste fonctionne. La sortie se fait en JSON, CSV, Markdown, HTML ou texte brut.
Sauf qu'un outil de scraping peut vite devenir pénible pour les sites visités. J'ai donc mis des garde-fous par défaut. Le robots.txt est respecté sur les pages découvertes. Il y a une pause par site, même en parallèle. Les cookies ne partent que vers l'hôte visé. Le réseau privé est bloqué, sauf demande explicite.
Il y a aussi des limites, et je préfère les dire. Les moteurs gratuits changent ou tombent sans prévenir. DuckDuckGo est intermittent. Plusieurs sites de paste refusent les robots, et je ne contourne pas ces refus. Une instance SearXNG locale améliore beaucoup la recherche, parce que les moteurs grand public bloquent vite les requêtes automatiques. L'option --doctor --deep dit ce qui répond vraiment au moment où on la lance. Et je ne l'ai testé que sous Linux Mint 22, rien sous macOS ni Windows.
Le code fait environ 3 600 lignes. Il est pensé pour des données publiques, et le README contient une section sur l'usage responsable.
Personnellement, je préfère un outil petit, lisible et sans dépendance. C'est un choix, pas une vérité.
Les retours m'intéressent, surtout sur ce qui casse et sur les moteurs à ajouter. Et si vous pensez que la bibliothèque standard seule est un mauvais pari, dites-le-moi.
Flet est un framework qui permet de développer des applications web, desktop et mobile avec un seul code Python. Il propose plus de 150 contrôles et services, des paquets Python précompilés pour iOS et Android (NumPy, pandas, Pillow), ainsi que la commande flet build pour préparer la distribution, App Store et Google Play compris. Le framework gère aussi les tests avec pytest, l’exécution dans le navigateur via Pyodide et WebAssembly, les extensions basées sur Flutter, l’accessibilité et un serveur MCP pour assistants de code.
En C++ (comme en C), nous n'avons pas de telle garantie, si bien que l'affichage est non spécifié : cela peut aussi bien être 0 suivi de 1 que 1 suivi de 0 pour :
Mais avec la petite astuce suivante on peut forcer l'ordre d’exécution, car les arguments d'une initializer_list sont ordonnés (cf. https://timsong-cpp.github.io/cppwp/n3337/dcl.init.list#4) (ici en utilisant les deduction guide).
std::apply(foo,std::tuple{0,1});
Cependant on force alors tous les arguments de foo à être passés par valeur. On peut améliorer ce comportement pour respecter les r-value etc de la façon suivante :
On a ainsi ordonné les arguments d'appel sans perdre le contrôle fin du passage d'argument que permet C++.
Et voilà, une petite sucrerie de C++, probablement rien de nouveau sous le soleil pour les experts, mais ça m'a beaucoup amusé de jouer avec ça hier soir !
Et accessoirement, ça résout un bug dans Pythran, mais ça, c'est juste pour mon plaisir personnel.
En 2022, nos amis d'IndieHosters ont obtenu le soutien de la fondation NLNet pour financer plusieurs développements autour du protocole SCIM2. Ils avaient fait appel à nous pour travailler sur l'intégration de SCIM dans le protocole Matrix, dans le serveur synapse et pour créer un utilitaire de test en ligne de commande. On vous en parlait ici. Les contributions à Matrix et synapse n'avaient pas été intégrées, mais la création de l'utilitaire en ligne de commande avait déclenché chez nous la création d'un ensemble de bibliothèques Python autour du protocole SCIM que nous avons rassemblées sous python-scim :
L'hiver dernier nous avons à nouveau souscrit et obtenu le soutien du programme NGIZero Entrust pour fortifier python-scim et créer de nouvelles intégrations. Notamment en proposant une solution différente pour l'implémentation du protocole avec synapse, et dans des outils de LaSuite, on vous en reparle plus tard.
Voici notre premier point d'étape.
Nous avons traité la grande majorité des tickets et requêtes de fusion ouverts, et ré-organisé les bibliothèques de cette manière :
scim2-models s'occupe de la validation et de la production des données, et offre une interface de manipulation native en Python. C'est elle qui implémente la plupart des règles des spécifications sur le modèle de données et porte une grande partie de la complexité.
scim2-server propose des primitives pour implémenter un serveur SCIM. La plupart des traitements courants sont implémentés (comme la gestion des erreurs HTTP, la pagination des réponses, les ETags etc.). La bibliothèque est faite pour être branchée à un framework web (comme Django, Flask ou FastAPI par exemple) et à une base de données (via SQLAlchemy ou l'ORM Django). La bibliothèque embarque aussi deux serveurs SCIM2 d'exemple (fonctionnant en WSGI et ASGI) avec un stockage volatile en mémoire.
pytest-scim2-server embarque un serveur de test dans une fixture pytest, pour tester facilement des applications clientes.
scim2-client permet de découvrir les ressources exposées par un serveur, et créer et envoyer des requêtes SCIM vers ce serveur. Elle permet de vérifier la conformité des requêtes avant envoi, et se branche sur n'importe quel moteur de requêtes HTTP. Elle embarque des moteurs ASGI et WSGI pour faire des tests unitaires rapides sans passer par le réseau, et un moteur httpx2 pour le monde réel.
scim2-tester joue une série de scénarios pour vérifier la conformité du comportement de serveurs de test ou de production. La bibliothèque tente d'être exhaustive et de faire des vérifications sur chacun des attributs de chacune des ressources proposées par le serveur.
scim2-cli est un utilitaire en ligne de commande qui permet de faire des requêtes à un serveur, et de lancer un test de conformité sur ce serveur.
La première passe d'amélioration a consisté en :
L'implémentation des filtres. Les filtres permettent de faire des requêtes sur certaines ressources précisément selon certains critères, ainsi que de patcher des sous-attributs précis de ressources. La difficulté de cette tâche résidait principalement dans la traduction de la grammaire des filtres en un AST Python, la manipulation de cet AST par la bibliothèque pour effectuer un vrai filtrage, et enfin en offrir un transpileur pour convertir cet AST en requêtes SQL par exemple.
L'implémentation des opérations par lots. Les opérations par lots (ou BULK) permettent d'effectuer plusieurs opérations en une seule requête, mais apportent la possibilité de dépendances cycliques entre les opérations.
L'implémentation de la pagination par curseurs décrite par la RFC 9865. La pagination par curseurs s'oppose à la traditionnelle pagination par indexes, et s'illustre par sa stabilité et la garantie de ne pas présenter de ressource en doublon, même quand le jeu de données évolue en cours de lecture.
De nombreux nettoyages, améliorations et corrections de bugs, notamment pour la conformité des cas spéciaux de PATCH.
À venir dans l'écosystème, des intégrations officielles pour Django, Flask, FastAPI et SQLAlchemy. Possiblement un peu de réorganisation (peut-être que nous allons extraire les serveurs d'exemple dans leur propre projet, ainsi que la gestion des storages).
Nous remercions à nouveau chaleureusement la fondation NLNet pour nous permettre de travailler sur ces projets.
On vous tient au courant rapidement pour la suite.