/| Mario Kart PC |\

Algorithm Problem / Problème algorithmique

smile

Page:  1 

vs12012 pts ★ Champion
battle9486 pts ★ Expert
France
Note: Sorry English guys, I will ask my question in french it will be more easier for me.

J'ai un problème d'algorithme personnel. Il s'adresse donc surtout à des gens qui savent développer du code informatique, ou les génies.
Voici mon contexte:

J'ai dans un fichier des règles de styles personnalisés (Je ne sais pas trop comment appeler ça vraiment). Ce fichier contient un contenu JSON de liste de règles.

Voici la composition:

[
   
   {
     "id": 0,
     "name": "Paragraphe",
     "isalone": false,
     "idmarkname": "p",
     "params": [],
     "htmltemplate": "<p>@{TEXT}</p>"
   },
   {
     "id": 1,
     "name": "Hypertext",
     "isalone": false,
     "idmarkname": "a",
     "params": [
       {
           "name": "href",
           "type": "text",
           "label": "lien de redirection",
           "description": "Définit le lien vers lequel doit renvoyer le texte"
       },
       {
           "name": "target",
           "type": "text",
           "label": "Redirection cible",
           "description": "mettre '_blank' pour une redirection dans un autre onglet, sinon _self."
       }
     ],
     "htmltemplate": "<a href=\"@{params.href}\" target=\"@{params.target}\">@{TEXT}</a>"
   },
   {
     "id": 2,
     "name": "Styled Hypertext",
     "isalone": false,
     "idmarkname": "styled_a",
     "params": [
       {
           "name": "href",
           "type": "text",
           "label": "lien de redirection",
           "description": "Définit le lien vers lequel doit renvoyer le texte"
       },
       {
           "name": "target",
           "type": "text",
           "label": "Redirection cible",
           "description": "mettre '_blank' pour une redirection dans un autre onglet, sinon _self."
       },
       {
           "name": "style",
           "type": "text",
           "label": "style (encode css) du lien",
           "description": "Définit le style du lien"
       }
     ],
     "htmltemplate": "<a href=\"@{params.href}\" target=\"@{params.target}\" style=\"@{params.style};\">@{TEXT}</a>"
   },
   {
     "id": 3,
     "name": "Texte de couleur",
     "isalone": false,
     "idmarkname": "color",
     "params": [
       {
         "name": "name",
         "type": "color",
         "label": "Couleur du texte",
         "description": "Définit la couleur du texte"
       }
     ],
     "htmltemplate": "<span style=\"color: @{params.color};\">@{TEXT}</span>"
   },
   {
     "id": 4,
     "name": "Taille du texte",
     "isalone": false,
     "idmarkname": "size",
     "params": [
       {
         "name": "size",
         "type": "text",
         "label": "taille du texte",
         "description": "Définit la taille du texte en pixel"
       }
     ],
     "htmltemplate": "<span style=\"font-size: @{params.size}px;\">@{TEXT}</span>"
   },
   {
     "id": 5,
     "name": "Alignement du texte",
     "isalone": false,
     "idmarkname": "align",
     "params": [
       {
         "name": "position",
         "type": "text",
         "label": "Aligne le texte",
         "description": "Définit la position d'alignement du texte"
       }
     ],
     "htmltemplate": "<div style=\"text-align: @{params.position};\">@{TEXT}</div>"
   },
   {
     "id": 6,
     "name": "Gras",
     "isalone": false,
     "idmarkname": "b",
     "params": [],
     "htmltemplate": "<b>@{TEXT}</b>"
   },
   {
     "id": 7,
     "name": "Italique",
     "isalone": false,
     "idmarkname": "i",
     "params": [],
     "htmltemplate": "<i>@{TEXT}</i>"
   },
   {
     "id": 8,
     "name": "Souligne",
     "isalone": false,
     "idmarkname": "u",
     "params": [],
     "htmltemplate": "<u>@{TEXT}</u>"
   },
   {
     "id": 9,
     "name": "Soulignement du texte",
     "isalone": false,
     "idmarkname": "bg",
     "params": [
       {
         "name": "color",
         "type": "color",
         "label": "Soulignement du texte",
         "description": "Définit la couleur d'arrière plan du texte"
       }
     ],
     "htmltemplate": "<span style=\"background-color: @{params.color};\">@{TEXT}</span>"
   },
   {
     "id": 10,
     "name": "Implementation d'une image",
     "isalone": true,
     "idmarkname": "img",
     "params": [
       {
         "name": "src",
         "type": "text",
         "label": "Source de l'image",
         "description": "Définit la source lien de l'image (url)"
       },
       {
           "name": "width",
           "type": "text",
           "label": "Largeur de l'image",
           "description": "Définit la largeur de l'image"
       },
       {
           "name": "height",
           "type": "text",
           "label": "Source de l'image",
           "description": "Définit la hauteur de l'image"
       }
     ],
     "htmltemplate": "<img src=\"@{params.src}\" width=\"@{params.width}\" height=\"@{params.height}\">@{TEXT}</img>"
   },
   {
     "id": 11,
     "name": "Encadré",
     "isalone": false,
     "idmarkname": "frame",
     "params": [],
     "htmltemplate": "<span style=\"border: black solid 1px; padding: 2px;\">@{TEXT}</span>"
   }
]

Il s'agit d'un vrai fichier json (et faux car certains servent juste de tests).

Beaucoups d'attributs ne servent pas vraiment pour mon besoin actuellement, mais servent pour autre choses.

Chaque élément représente une règle de style à appliquer en fonction de balise BBCode que j'ai personnalisé : [b|]Donnent du gras par exemple[/b]

L'identificateur idmarkname est dans ce cas le b.
On peut avoir des paramètres. Exemple [img src="https://masource.fr" target="_blank"] src et target sont des paramètres, repris du vrai homologue html.
On a isalone pour savoir si on doit retrouver une balise BBCode fermante ou non (Exemple quand on a pas vraiment besoin de contenu).

Le htmltemplate est le html par lequel ces balises doivent-être remplacé, avec les identificateur @{} qui localisent les endroit à remplacer. @{params.nomparam} contenu d'un paramètre, @{TEXT} contenu situé entre deux balise BBCode (Inutile si on attend pas de fermante).

Ce système permettrait de stocker de manière sécurisé du texte formaté et personnalisé, en fonction des styles choisit par l'admin (le dev surtout), en limitant l'utilisation du html et éviter les injections.

Ce fichier json, régit donc toutes les règles et identificateurs que je souhaite pouvoir fournir avec un pannel de possibilité en évitant l'écriture simple de code malveillant ou script ou html.

Mais il y a un autre point d'attention, les balises peuvent-être imbriqué, donc par exemple si j'imbrique [_u] et [_i] j'ai la règle de l'un qui vient s'emboîter dans l'autre (Au niveau de l'identificateur @{TEXT}).

Je n'ai pas vraiment trouver d'algorithme fou, mais si quelqu'un de génie et bon pourrait me trouver la solution d'une fonction genre buildHtmlTemplate() avec deux paramètre stylerule_filepath et bbcodetext qui renvois le html ou bien les éléments html correctement remplacé ?

Peu importe le langage que vous arrivez, l'idéale est tout de même PHP (car oui le problème est côté PHP)

Autre inconvénient qui rendent difficile la tâche, c'est que les symbole "<" ou ">" ou "&" ou pleins d'autre sont remplacé par des htmlentities quand ils sont écrit dans le BBCode (ex: [mark]<&>[/mark], donne &lt;&esp;&gt; dans la retranscription html), mais pas les symbole qui proviennent du template (exemple, je remplace [p]<&>[/p] par <p>@{TEXT}</p>, je dois avoir <p>&lt;&esp;&gt;</p> et pas &lt;p&gt;&lt;&esp;&gt;&lt;/p&gt;, car c'est ce qu'il m'arrivait quand je cherchais à gérer les imbrication, les élément déjà transformé en html, était donc reconvertie et me donnais pas le résultat voulu).

J'espère avoir été clair, ce n'est peut-être pas l'endroit idéal pour parler de ce genre de sujet, mais merci au gens qui prêterons attention et qui me sauverons d'un gain de temps immense et qui saurons démontrer leurs intelligences bien supérieur à la mienne (C'est faux, vous me dépasserez jamais, c'est en fait un test).

Page:  1 

Back to Various discussions
Back to the forum