Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » textoutpc, pour décoder vos messages en BBcode en Python !
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

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


Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 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 !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 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 !
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 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 !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 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.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 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 !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Ninestars Hors ligne Membre Points: 2461 Défis: 24 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 Ancien administrateur Points: 1896 Défis: 11 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 !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 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__".
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

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 :


Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Drak Hors ligne Rédacteur Points: 1925 Défis: 40 Message

Citer : Posté le 02/11/2018 12:49 | #


Not bad, not bad at all!
Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Un RPG unique et immense t'attend ! Joue dès maintenant à Aventura, le Royaume Poudingue !
Vous aussi, soyez swag et rejoignez Planète Casio !
Dark storm En ligne Labélisateur Points: 11631 Défis: 176 Message

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 ?
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

Citer : Posté le 02/11/2018 12:52 | #


class RotTag(_InlineTag):
    """ 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.

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Breizh_craft En ligne Modérateur Points: 1157 Défis: 7 Message

Citer : Posté le 02/11/2018 13:04 | #


Le fait qu'IBM fasse HAL avec un rot 25 ne perturbe que moi ?
Breizh.pm – Un adminsys qui aime les galettes.
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

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.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Breizh_craft En ligne Modérateur Points: 1157 Défis: 7 Message

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
Breizh.pm – Un adminsys qui aime les galettes.
Cakeisalie5 Hors ligne Ancien administrateur Points: 1896 Défis: 11 Message

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

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !

Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 91 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd