textoutpc, pour décoder vos messages en BBcode en Python !
Posté le 15/04/2018 01:59
Howdy!
À l'heure où je rédige ce topic, le site Planète Casio est encore dans une version qui date d'il y a sept ans (qui a certes beaucoup évolué depuis) : la version 4.2 (
v42 pour les intimes). Vous savez peut-être que le site, en l'état, est compliqué à maintenir, que sa structure date de 2006 et a été faite par des débutants de l'époque (les fondateurs du site), et que la maintenance, comprenant l'ajout de fonctionnalités et la correction de bugs, est une tâche pénible et douloureuse ; c'est pourquoi la reconstruction du site est en projet depuis des années, et que les administrateurs, conjointement avec certains membres, commencent doucement à s'y mettre (voir
le topic de référence).
Cette nouvelle version du site, cela a été décidé il y a moins d'un an, sera codée en Python 3.x avec le micro-framework Flask. Parmi les autres choix technologiques déjà faits figurent celui du langage utilisé dans le forum une fois reconstruit, qui s'est porté sur le Markdown, plus spécifiquement sur une version de celui-ci qui a été développée spécialement pour Planète Casio par
Lephenixnoir : le
Lightscript. Cependant, afin de pouvoir passer les données de la version actuelle, notamment les programmes avec leurs descriptions (avec l'accord de leurs auteur⋅e⋅s) et les topics existants, à la future version, il faudra bien passer à un moment ou à un autre du langage actuel, un BBcode dont le traducteur en HTML a été codé par les fondateurs et que j'ai récemment remanié dans son intégralité, au Lightscript.
Pour cela, et parce que je souhaite aller au bout de ce que le BBcode propose, j'ai souhaité réitérer l'expérience du traducteur BBcode à d'autres langages type HTML, en adoptant une posture bien plus orientée objet et flux que celui que j'avais écrit en PHP. C'est pour cela que j'ai lancé un projet de module Python 3.x, qui est l'objet de ce topic : le module
textoutpc. Ce module prend en langage source du BBcode et permet la génération de texte HTML et Lightscript.
Gardez à l'esprit que pour le moment, ce module est
en cours de développement. Il souffre encore de bogues très gênants, et sa sécurité n'a nullement été testée (je compte poker
Xavier59 dès que j'aurai corrigé et implémenté à peu près tout ce que je veux
![](https://www.planet-casio.com/images/smileys/wink.gif)
). Une démonstration est disponible à l'adresse suivante :
https://textout.touhey.pro/
Que permet ce module dans le langage ?
Le langage source reste du BBcode. Le BBcode n'est nullement standardisé, c'est pourquoi en parler au singulier est un peu limite : certains donnent même des arguments aux tags, comme par exemple
[tag arg1="valeur 1" coucou="Salut !"] ! J'ai donc choisi de rester au maximum compatible avec les implémentations successives du BBcode de la v42 (en implémentant quelques bogues de l'ancienne implémentation, tel que l'injection CSS en utilisant le tag
[color]) tout en ajoutant quelques fonctionnalités qu'on trouve sur des implémentations répandues de ce langage.
L'approche de mon module est donc de considérer que les tags sont utilisés de la façon suivante :
[tag]Ce tag a du contenu[/tag]
[tag][/tag] Le tag précédent n'a pas de contenu.
[tag]Ce tag est fermé de façon rapide.[/]
[tag=contenu]Ce tag a un argument ![/]
Selon s'il faut mettre un argument aux tags ou non dépend des tags et de ce dont ils ont besoin.
Les tags sont décrits dans la documentation présente dans le dépôt,
ici (en anglais). Je traduirai en français ici quand j'aurai un moment.
FÀQ
Q: Quelle est la licence du projet ?
A: Ce projet est
sous licence MIT.
Q: Peut-on contribuer au projet ?
A: Pour le moment, il s'agit là d'un projet personnel. Si vous souhaitez contribuer en apportant un bout de code pour corriger un bug, faites-le moi savoir en répondant ici, en m'envoyant un message privé, en ajoutant une issue ou pull request sur le Gitlab ou en m'envoyant un e-mail !
Q: Quelles normes régissent la présentation du code ?
A: Tabulations de quatre colonnes, 79 colonnes maximum (le retour à la ligne est le 80ème). Je sais que je ne respecte pas la PEP8 avec ces instructions, mais je tiens trop à mes tabulations pour faire machine arrière.
Si vous avez la moindre question à laquelle vous souhaitez que je réponde, n'hésitez pas à me demander en répondant à ce topic, en m'envoyant un message privé ou un courriel (e-mail)
Citer : Posté le 21/06/2018 02:38 | #
Ça commence à marcher. Il y a encore pas mal de bugs relevés par les tests unitaires (je suis descendu de 21 avec des bugs franchement pas esthétiques à 16 qui vont un peu plus dans le détail), mais grosso modo, la conversion de ceci marche et donne quelque chose de propre en HTML :
Vous remarquerez que les superblocs d'alignement (align-center et align-justify) sont imbriqués. Ce n'est pas super propre, mais en soi, ça n'est pas gênant puisque ce sont des blocs qui peuvent effectivement s'imbriquer en HTML sémantique avec les propriétés CSS du bloc le plus à l'intérieur qui override bien celles du bloc plus à l'extérieur.
Je travaille encore (parfois… mon rythme de développement est très aléatoire) à résoudre les bugs restants et à implémenter les balises correctement avec un traducteur qui tient 100% la route. Quand j'aurai fini cette phase de développement, après la phase d'audit, ça sera prêt à l'utilisation.
Mon blog ⋅ Mes autres projets
Citer : Posté le 21/06/2018 07:16 | #
Intéressant ! Ton exemple est très court mais nous en apprend beaucoup sur le fonctionnement de la chose.
On mettra ça en prod' pour archiver les vieux messages quand tu auras complété ta batterie de tests. Merci de ton aide !
Citer : Posté le 21/06/2018 11:25 | #
Y aura aussi moyen de convertir en Lightscript hein sinon
Mon blog ⋅ Mes autres projets
Citer : Posté le 21/06/2018 14:20 | #
Mais si on fait ça ton outil sera one-time et on ne s'en servira plus après la migration, ce serait triste.
Plus sérieusement, Lightscript risque de ne pas supporter toutes les features tout de suite (voire tout court), donc la traduction en HTML sera sans doute préférable pour les archives.
Citer : Posté le 21/06/2018 14:23 | #
Déjà, cet outil c'est surtout un défi personnel, une continuité de la version en PHP pour avoir l'achievement. Qu'il serve en one-time ou en continu, derrière, osef.
Et après, c'est pas grave si Lightscript ne comprend pas tout, le but est de migrer un maximum de choses. Au pire des cas, soit on fait des balises qui produisent un résultat en texte type les balises vidéo qui produisent de simples liens etc.
Ajouté le 27/07/2018 à 01:03 :
Objectif 0 fails atteint ! Il me reste quelques grosses fonctionnalités à ajouter dont par exemple :
- faire un mode zéro blocs pour des contextes inlines (shoutbox ou commentaires de programmes par exemple).
- faire des listes avec les tags [*], [**], etc.
- ajouter une balise d'image avec lien type [imgurl=https://example.org/about-the-image.png]https://example.org/image.png[/imgurl] (les liens hypertexte étant faits de base pour du texte et non des images, et l'image étant par défaut cliquable pour mener vers la ressource directement).
- faire un système de superseed pour regrouper par exemple <span style="font-weight: bold"><span style="text-decoration: underline">aa</span></span>.
- lister les erreurs lorsqu'il y en a pour pouvoir les donner à l'utilisateur (e.g. ligne 1, colonne 24 : couleur invalide : "rgb(56, 25, 279)").
- produire du lightscript (pour l'instant, l'outil ne produit que du HTML).
- regarder s'il n'y a pas de failles de sécurité.
- gérer les tags avec keywords du genre [tag key=value other="something else"] (ça pour le coup c'est du bonus de chez bonus).
J'essaierai de prochainement mettre en place un site web de démonstration sur lequel vous pourrez triturer le traducteur, avec description du langage tel qu'actuellement implémenté (actuellement décrit ici)
Mon blog ⋅ Mes autres projets
Citer : Posté le 27/07/2018 08:04 | #
Je ne savais pas que tu faisais ça, je suis passé à coté. C'est top !
J'imagine qu'il y a un gros travail sur les regexp ?
Citer : Posté le 27/07/2018 13:16 | #
Il n'y a que deux grosses expressions régulières, à savoir celle générale pour matcher un tag au niveau du lexer (lien) :
(?P<bname_e>[^\/\[\]\=][^\[\]\=]* (\[(?&bname_e)\]?)*)*
)
(\s?=\s?(?P<value>
(?P<value_e>[^\[\]]* (\[(?&value_e)\]?)*)*
))?\s?\]
|
\[[\\/]\s?(?P<ename>
(?P<ename_e>[^\/\[\]\=][^\[\]\=]* (\[(?&ename_e)\]?)*)*
)\s?\]
|
(?P<parsep>[\n]{2,})
|
(?P<sname>`|[\n])
Et celle, un peu plus particulière, pour lire les couleurs (lien) :
\s* (?P<rgb_r>[0-9]{1,3}) \s* ([,\\s]
\s* (?P<rgb_g>[0-9]{1,3}) \s* ([,\\s]
\s* (?P<rgb_b>[0-9]{1,3}) \s* ([,\\s]
\s* ((?P<rgb_a_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<rgb_a_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*
)?)?)?
\)|
hsla?\s*\(
\s* (?P<hsl_hue>-? ([0-9]+\.?|[0-9]*\.[0-9]+) )
(?P<hsl_agl>deg|grad|rad|turn|) \s*[,\\s]
\s* ((?P<hsl_sat_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hsl_sat_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*[,\\s]
\s* ((?P<hsl_lgt_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hsl_lgt_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*([,\\s/]
\s* ((?P<hsl_aph_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hsl_aph_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*
)?
\)|
hlsa?\s*\(
\s* (?P<hls_hue>-? ([0-9]+\.?|[0-9]*\.[0-9]+) )
(?P<hls_agl>deg|grad|rad|turn|) \s*[,\\s]
\s* ((?P<hls_lgt_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hls_lgt_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*[,\\s]
\s* ((?P<hls_sat_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hls_sat_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*([,\\s/]
\s* ((?P<hls_aph_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hls_aph_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*)?
\)|
hwb\s*\(
\s* (?P<hwb_hue>-? ([0-9]+\.?|[0-9]*\.[0-9]+) )
(?P<hwb_agl>deg|grad|rad|turn|) \s*[,\\s]
\s* ((?P<hwb_wht_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hwb_wht_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*[,\\s]
\s* ((?P<hwb_blk_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hwb_blk_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*([,\\s/]
\s* ((?P<hwb_aph_per> ([0-9]+\.?|[0-9]*\.[0-9]+) ) \s*%
|(?P<hwb_aph_flt> (0*[01]\.?|0*\.[0-9]+) )) \s*)?
\)|
\# (?P<hex_digits> [0-9a-f]+)
|
(?P<legacy_chars> [0-9a-z]+)
Tout le reste c'est du code, pour rendre ça facile pour créer d'autres tags et étendre en général
Ajouté le 29/07/2018 à 20:40 :
Version 0.2 publiée sur PyPI, au menu : corrections de bugs, changé l'implémentation des smileys (pour la cohérence du truc), ajout d'un mode en ligne (pour des contextes type shout ou commentaires de programmes). Pour le site, j'en suis encore à savoir où et comment déployer une application en Flask…
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/07/2018 20:53 | #
Par ici : https://git.planet-casio.com/devs/PCv5/wikis/Environnement-de-d%C3%A9veloppement
Et pour l'appli Python, c'est tout pareil, il suffit d'avoir une variable app qui contient l'application Flask et virer la partie habituelle qui lance le serveur local si __name__ == "__main__".
Citer : Posté le 02/11/2018 12:41 | #
Ça y est, je passe tous mes unit tests et faut encore que je trouve comment déployer mon app d'une façon que je trouve propre (idéalement Heroku-like). Un petit teaser :
Mon blog ⋅ Mes autres projets
Citer : Posté le 02/11/2018 12:49 | #
Not bad, not bad at all!
Citer : Posté le 02/11/2018 12:51 | #
Heu… J'ai un doute quand à la pertinence de la fonction rot
Simple délire ou tentative d'ajout de fonctions inutiles ?
Citer : Posté le 02/11/2018 12:52 | #
""" Tag which un-rot13 a content.
Demonstration tag for content processing.
Example uses:
[rot=13]obawbhe[/rot]
[rot13]Obawbhe[/rot13]
"""
Donc pas entièrement un délire, plutôt un tag de test.
Mon blog ⋅ Mes autres projets
Citer : Posté le 02/11/2018 13:04 | #
Le fait qu'IBM fasse HAL avec un rot 25 ne perturbe que moi ?
Citer : Posté le 02/11/2018 13:30 | #
Non, c'est fait exprès. L'idée dans le choix de HAL est que chaque lettre les plaçait devant IBM.
Citer : Posté le 02/11/2018 13:31 | #
Officiellement, non, ça a toujours été démenti. Me suis renseigné entre-temps. C'est juste une très belle coïncidence
Citer : Posté le 11/02/2019 19:39 | #
J'ai ressorti ma démo des enfers et même s'il y a un unit test que ça marche pas, je l'ai mise en ligne, elle est dispo sur https://textout.touhey.pro/. il manque du CSS et du JS pour aller avec les balises mais ça fonctionne.
Un jour faudra que je finisse ce projet. Si vous aimez le CSS/JS, vous pouvez proposer du style pour les éléments ; je n'ai pas listé les classes nécessaires ou ce qu'elles font, il faut malheureusement aller regarder dans les sources…
Mon blog ⋅ Mes autres projets