Responsive Ad Area

Partager cet article

Actu / Site web / Techniques de geek

Créer son système BBCode (partie 1 : côté client)

Créer son système bbcode

Les balises BBCode (Bulletin Board Code) ont été inventées afin d’éviter l’ajout de code malveillant tout en permettant et simplifiant la mise en forme de messages, articles, ou tout autres éléments textuels ou visuels.
On les retrouve essentiellement dans les formulaires des forums de discutions ou dans des CMS du type WordPress ou Prestashop.

Il peut également être utile d’implémenter un système BBCode lors du développement d’un site web pour un client qui souhaiterait pouvoir lui-même ajouter, modifier ou supprimer le contenu de certaines pages de son site depuis le backoffice (ou panneau d’administration), et ce, en toute sécurité et sans avoir de connaissances particulières en HTML.

Dans cet article, nous allons voir pas à pas comment implémenter son propre système BBCode.
Le code présenté ici concerne uniquement le côté « client » du site (HTML/CSS, Javascript/JQuery).
Le code côté « serveur » permettant d’interpréter et de transformer les balises BBCode en balises HTML fera l’objet d’un second article.

Etape 1 : la mise en page du formulaire et des boutons du BBCode

Le code du formulaire

Ici, rien de bien compliqué. On crée juste notre textarea où sera saisi le contenu textuel auquel on ajoute un bouton pour enregistrer le tout.

<form id="form_bbcode" name="form_bbcode" method="post" >
    <textarea id="monContenu" name="monContenu" rows="15" cols="100"></textarea>
    <button type="submit" name="bouton_enregistrer" class="bouton_enregistrer" id="bouton_enregistrer">Enregistrer les modifications</button>				
</form>

Le code des boutons des différentes balises BBCode

Pour chaque bouton, on fera appel à un événement « onclick » qui permettra d’ajouter la balise BBCode en question au sein de notre contenu textuel. Pour le moment notre évènement « onclick » ne contient aucun code. Nous y reviendrons un peu plus loin 😉

<div id="bouton_bbcode">
    <button type="button" class="bbcode_button" onclick="">Sous-titre</button>
    <button type="button" class="bbcode_button" onclick="">Paragraphe</button>
    <button type="button" class="bbcode_button" onclick="">Retour à la ligne</button>
    <button type="button" class="bbcode_button" onclick="">Italique</button>
    <button type="button" class="bbcode_button" onclick="">Gras</button>
    <button type="button" class="bbcode_button" onclick="">Liste</button>
    <button type="button" class="bbcode_button" onclick="">Elément de la liste</button>
</div>

Etape 2 : le code Javascript

Entrons dans le vif du sujet avec l’ajout des fonctions Javascript qui nous permettront d’ajouter les balises BBCode dans notre textarea.
Les éléments à prendre en compte pour l’écriture de notre code :
– nous pouvons avoir deux types de balises : des balises doubles, ouvrantes et fermantes (exemple : [p][/p]) ; ainsi que des balises uniques (exemple : [br])
– les balises doivent pouvoir s’insérer avant ou après le texte, ou bien entre une portion de texte sélectionnée par l’utilisateur

Fonction d’ajout des balises

Il s’agit de la fonction principale. On lui passe trois paramètres : l’id de notre textarea ; la balise BBCode ouvrante ; la balise BBCode fermante (si elle existe).

function addBalises(idTextarea, baliseOpen, baliseClose) {}

Avant d’écrire le code de notre fonction addBalises() nous allons avoir besoin de définir trois autres fonctions qui vont récupérer notre contenu textuel :
– une pour récupérer le texte présent avant la position du curseur
– une pour récupérer le texte présent après la position du curseur
– une pour récupérer le texte présent dans la sélection du curseur (sélection en « surbrillance »)

Fonction permettant de récupérer le texte présent avant la position du curseur

La fonction prend deux paramètres : notre texte en question (celui présent dans le textarea) et la position de notre curseur (nous verrons comment la récupérer un peu plus loin grâce à JQuery).
Quant au code de la fonction, il s’agit d’une simple boucle qui récupère tous les caractères présents avant la position de notre curseur pour nous retourner ensuite le tout 🙂

function getTextBeforeCursor(text, value)
{
    var textBefore = '';
    for (var i = 0 ; i < value ; i++) {
        textBefore += text[i];
    }
    return textBefore;
}

Fonction permettant de récupérer le texte présent après la position du curseur

La fonction prend trois paramètres : notre texte en question ; la position de notre curseur ; le nombre total de caractères de notre texte.
La boucle de notre fonction récupère les caractères présents à partir de la position du curseur jusqu’à la fin de notre texte.

function getTextAfterCursor(text, value, textSize)
{
    var textAfter = '';
    for (var i = value ; i < textSize ; i++) {
        textAfter += text[i];
    }
    return textAfter;
}

Fonction permettant de récupérer le texte présent dans la sélection du curseur

La fonction prend trois paramètres : notre texte en question ; la position de notre curseur au début de la sélection ; la position de notre curseur à la fin de la sélection.
Toujours à l’aide d’une boucle For (ou structure itérative pour les puristes 🙂 ), on récupère le texte présent au sein de la sélection en surbrillance : du premier au dernier caractère de la sélection.

function getTextSelectionCursor(text, startValue, endValue)
{
	var textSelection = '';
	for (var i = startValue ; i < endValue ; i++) {
		textSelection += text[i];
	}
	return textSelection;
}

Revenons à notre fonction principale

Maintenant que nous avons écrit les trois fonctions permettant de récupérer notre contenu textuel, nous allons pouvoir revenir à notre fonction principale : addBalises(idTextarea, baliseOpen, baliseClose).

Comme nous l’avons vu au tout début de la 2nd étape, nous devons pouvoir gérer deux types de balises BBCode : les balises doubles (ouvrantes et fermantes) et les balises uniques.
Nous allons donc définir une première structure conditionnelle au sein de notre fonction pour ces deux cas de figure.

function addBalises(idTextarea, baliseOpen, baliseClose)
{
	// Si baliseClose est différent de NULL, nous avons affaire à une balise double
	if (baliseClose != null) {}
	// Si non, nous avons affaire à une balise unique
	else {}
}

Pour une balise unique

Commençons par écrire le code pour le cas où nous avons à faire à une balise unique :

var textBefore = getTextBeforeCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'));
var textAfter = getTextAfterCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'), $(idTextarea).val().length);		
$(idTextarea).val(textBefore+baliseOpen+textAfter);

Avec la première ligne, on récupère le texte éventuellement présent avant la position du curseur grâce à notre fonction getTextBeforeCursor() en lui passant deux paramètres : le texte présent dans le textarea ; et enfin la position de notre curseur. On récupère cette dernière à l’aide de la fonction prop() de JQuery, qui va nous permettre de lire les propriétés de notre textarea, en lui passant en paramètre selectionStart pour lui demander de nous retourner le nombre de caractères présents avant la position du curseur.

La deuxième ligne nous permet de récupérer le texte éventuellement présent après la position du curseur. La fonction getTextAfterCursor() fait la même chose que getTextBeforeCursor(), à la différence qu’elle prend un troisième paramètre qui est le nombre total de caractères de notre texte.

Enfin, avec la troisième ligne, on modifie le contenu de notre textarea à l’aide d’une simple concaténation : le texte éventuellement présent avant la position du curseur + notre balise BBCode + le texte éventuellement présent après la position du curseur.

Note informative : comme notre fonction ne peut pas savoir s’il y a du texte avant ou après notre contenu textuel (ou pas de texte du tout, si notre textarea est vide !), nous devons tester les deux éventualités. Si aucun contenu textuel n’existe avant et/ou après notre balise BBCode, getTextBeforeCursor() et/ou getTextAfterCursor() nous retournera tout simplement un résultat NULL.

Pour une balise double

Pour une balise BBCode ouvrante et fermante, nous avons deux cas de figure possibles :
– L’ajout de balises sans portion de texte (exemple : [p][/p])
– L’ajout de balises où une portion de texte aurait été sélectionnée par l’utilisateur (exemple : [p]ma portion de texte[/p])

Nous allons donc implémenter une seconde structure conditionnelle :

// Si la position de départ du curseur est identique à la position de fin, cela signifie qu’aucune portion de texte n’a été sélectionnée par l’utilisateur
if ($(idTextarea).prop('selectionStart') == $(idTextarea).prop('selectionEnd')) {}
// Sinon, nous sommes dans le cas où une portion de texte a été sélectionnée par l’utilisateur
} else {}

Cas de figure où aucune portion de texte n’a été sélectionnée

var textBefore = getTextBeforeCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'));
var textAfter = getTextAfterCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'), $(idTextarea).val().length);
$(idTextarea).val(textBefore+baliseOpen+baliseClose+textAfter);

Inutile de détailler le code, il est identique à celui que nous avons vu dans le cadre où nous avons affaire à une balise BBCode unique.
La seule différence se trouve dans la 3e ligne où l’on retrouve une balise ouvrante (« baliseOpen ») et une balise fermante (« baliseClose ») dans notre concaténation.

Cas de figure où une portion de texte a été sélectionnée

var textBefore = getTextBeforeCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'));
var textAfter = getTextAfterCursor($(idTextarea).val(), $(idTextarea).prop('selectionEnd'), $(idTextarea).val().length);
var textSelection = getTextSelectionCursor($(idTextarea).val(), $(idTextarea).prop('selectionStart'), $(idTextarea).prop('selectionEnd'));
$(idTextarea).val(textBefore+baliseOpen+textSelection+baliseClose+textAfter);

Avec les deux premières lignes, nous commençons par récupérer le texte présent avant et après la position du curseur.

La troisième ligne nous permet de récupérer le texte mis en surbrillance par l’utilisateur. La fonction getTextSelectionCursor() prend en paramètres : le texte présente dans le textarea ; la position de départ du curseur (où débute la surbrillance) ; la position de fin du curseur (où s’arrête la surbrillance).

On modifie ensuite le contenu de notre textera toujours à l’aide d’une concaténation de variables : le texte éventuellement présent avant la position du curseur + notre balise BBCode ouvrante + le texte mis en surbrillance par l’utilisateur + notre balise BBCode fermante + le texte éventuellement présent après la position du curseur.

Télécharger le code source

Bien entendu, le code présenté dans cet article ne comporte pas toutes les balises BBCode de mise en forme existantes. Il est tout à fait possible d’en implémenter de nouvelles. Libre à vous donc de modifier le code source selon vos besoins 😉

N’hésitez pas à poster un commentaire et/ou partager cet article s’il vous a aidé ou si vous pensez qu’il pourra aider des personnes de votre entourage.

Pour télécharger le code source complet : Code source (partie 1)

Pour voir la seconde partie du tutoriel : Créer son système BBCode (partie 2 : côté serveur)

Vous cherchez un développeur web pour concevoir vos fonctionnalités ou projets de sites/applications web ? N’hésitez pas à me contacter ! 🙂

Partager cet article

Graphiste & développeur web indépendant, je suis le fondateur de l'agence Tomiris Web. Passionné par les technologies du web et l’art graphique, la créativité est mon moteur. D’un naturel calme et posé, j’aime explorer et m’inspirer de différents univers et suis en quête permanente de nouvelles opportunités et découvertes. Membre de l'équipe rédactionnelle du "Web et la Tortue", je partage mon expérience et mon expertise dans le domaine du web et du graphisme.

Site web : https://www.tomirisweb.fr/

Laisser un commentaire

Votre adresse mail ne sera pas publiée.Les champs obligatoires sont marqués d'un *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

50 − = 43

dolor. libero. sed Curabitur nunc ipsum