Forums Casio - Projets de programmation

Index du Forum > Projets de programmation > textoutpc, pour décoder vos messages en BBcode en Python !
Cakeisalie5
Hors ligne
Membre de CreativeCalc
Points: 1654
Défis: 10
Message
Posté le 15/04/2018 01:59

textoutpc, pour décoder vos messages en BBcode en Python ! :

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 ).

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)




Cakeisalie5
Hors ligne
Membre de CreativeCalc
Points: 1654
Défis: 10
Message
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 :

a[i]k[center][b]b[justify]c[/center]d[/]wouhou

<p>a<i>k</i></p><div class="align-center"><p><i><b>b</b></i></p><div class="align-justify"><p><i><b>c</b></i></p></div></div><p><i>d</i>wouhou</p>


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.
----------------------------------
Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Besoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir
Hors ligne
Administrateur
Points: 12507
Défis: 136
Message
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 !
----------------------------------
Rise.
Cakeisalie5
Hors ligne
Membre de CreativeCalc
Points: 1654
Défis: 10
Message
Citer : Posté le 21/06/2018 11:25 | #
Y aura aussi moyen de convertir en Lightscript hein sinon
----------------------------------
Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Besoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir
Hors ligne
Administrateur
Points: 12507
Défis: 136
Message
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.
----------------------------------
Rise.
Cakeisalie5
Hors ligne
Membre de CreativeCalc
Points: 1654
Défis: 10
Message
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)
----------------------------------
Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Besoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Ninestars
Hors ligne
Membre
Points: 2077
Défis: 22
Message
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 ?
----------------------------------
Cakeisalie5
Hors ligne
Membre de CreativeCalc
Points: 1654
Défis: 10
Message
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) :

\[\s?(?P<bname>
        (?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) :

rgba?\s*\(
    \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…
----------------------------------
Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Besoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir
Hors ligne
Administrateur
Points: 12507
Défis: 136
Message
Citer : Posté le 29/07/2018 20:53 | #
Pour le site, j'en suis encore à savoir où et comment déployer une application en Flask…

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__".
----------------------------------
Rise.


Index du Forum > Projets de programmation > textoutpc, pour décoder vos messages en BBcode en Python !

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 34 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd