La tambouille des râleuses
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-39%
Le deal à ne pas rater :
Pack Home Cinéma Magnat Monitor : Ampli DENON AVR-X2800H, Enceinte ...
1190 € 1950 €
Voir le deal

Aller en bas
Pêpêche
Pêpêche
Mascotte
Messages : 4428

Compteur de mots & de caractères Empty Compteur de mots & de caractères

Lun 1 Avr 2019 - 14:55

Toutes versions

Compteur de mots & de caractères


Bonjour bonjour Smile

Si tu es ici, c'est probablement parce que tu as un forum RPG, ou, tout simplement, parce que tu aimerais ajouter un compteur de mot sur ton forum.

Nous allons voir ici comment procéder ^^

Idea Pré-requis :
• Avoir accès aux codes javascript du forum ;
• Ce tutoriel peut s'adapter à toutes les versions.

Exclamation Le tutoriel ne fonctionne pas pour la réponse rapide en version "AwesomeBBB"

Notre but va donc de faire ça :
Compteur de mots & de caractères Tuto-cpt_zpseildoo2r

Comme tu peux le voir, la zone de texte indique Nombre de caractères : 50 ; Nombre de mots : 14. Mais si tu regardes bien l'image, nous avons en réalité bien plus de caractères et de mots ! Ici, nous allons voir comment faire en sorte que les mots de deux lettres ou moins ne soient pas considérer comme "des mots" et que tout ce qui se trouvent entre crochets (pour le BBcode) ou entre "flèches" (pour le html) ne soient pas comptabilisés.

Au boulot !

Une fonction à ne faire que dans certains cas

Pour que notre javascript fonctionne, nous allons devoir l'appeler sur toutes les pages du forum (nous y reviendrons en le mettant en place ^^). Cela dit, il va être inutile de l'exécuter sur la page d'index ou dans les sous-forum, bref, là où il n'y a pas d'éditeur de texte.

On va donc commencer par lancer une fonction javascript une fois la page chargée :
Code:
$( function(){

});
Si tu as déjà fait un peu de javascript, tu as peut-être déjà croisé ceci :
Code:
$(document).ready( function(){
 
});
Eh bien sache que le code fourni juste au-dessus et une version raccourcie du "ready()" Smile

Une fois la page chargée, on regarde s'il y a un éditeur de texte :
Code:
$('#text_editor_textarea').length

S'il n'y en a pas, on ne lit pas la suite du script. Pour cela, on va utiliser "return" qui signifie : tu t'arrêtes là, ne lis pas la suite.
Code:
if(!$('#text_editor_textarea').length){
 return ;
 }

En revanche, s'il y a une zone de saisi de texte, on va continuer à lire. Dans ce cas, on va entrer dans une nouvelle fonction :
Code:
$( function(){
 // si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){

 });

)};

Ici, on va récupérer la zone "éditeur de texte" et on va stocker cette information dans une variable (une variable est une sorte de case mémoire ^^).
Code:
var champs_msg = $('#text_editor_textarea').sceditor('instance');

Et on va tester si cette information existe ou pas. Si elle n'existe pas, inutile de continuer, cela signifie que l'éditeur de texte n'existe pas :
Code:
if(!champs_msg){
 return ;
 }

Idea Lorsque l'on indique ! cela signifie que l'on prend le contraire de l'information. Autrement dit : champs_msg veut dire "la zone existe" et donc !champs_msg veut dire "la zone n'existe pas".

Pour le moment, nous avons donc ce bout de code :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){

 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }
 });

});

Une zone d'affichage

Bon ! Continuons un peu notre travail. Pour pouvoir afficher le nombre de caractères et de mots, il va falloir que l'on crée une nouvelle zone. Impossible d'éditer un template pour ça, il va falloir gérer cet affichage et ajout en javascript.

Tout d'abord, on crée une variable qui va contenir une div :
Code:
var champs_infos = document.createElement('div');

On va ajouter à cet élement un id afin de pouvoir le styliser plus tard avec un peu de CSS (cependant, nous n'en parlerons pas dans ce tutoriel) :
Code:
champs_infos.setAttribute('id', 'compteur-mots');

Et finalement, on injecte cette div dans la zone de l'éditeur de texte :
Code:
$(champs_infos).appendTo('.sceditor-container');

Notre code avance, nous en sommes ici :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){

 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }

 // On crée une zone pour afficher le nombre de mots et de caractères
 var champs_infos = document.createElement('div');
 champs_infos.setAttribute('id', 'compteur-mots');
 $(champs_infos).appendTo('.sceditor-container');
 });

});

Notre fonction

Ahhh ! Attaquons le point essentiel de notre javascript : la petite fonction qui va compter pour nous ^^ Première étape : déclarer la variable :
Code:
function compteur(champs_msg){

}

Tout d'abord, on va stocker dans une nouvelle variable le contenu de notre champs texte :
Code:
var nb = champs_msg.val() ;

Idea val() permet de récupérer le contenu de l'attribut value d'une balise html.

Problème : si on ne fait que ça, il va également compter les balises bbcode et html. Or, nous ne voulons ni les crochets, ni les "flèches", ni ce qui se trouvent entre les 2. On va donc remplacer ces caractères et contenus par du vide Smile
Code:
var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');
Idea replace(/\[.*?\]/g,' ') signifie "on remplace les crochets et ce qu'ils contiennent par du vide"
replace(/<.*?>/g,' ') signifie "on remplace les "flèches" et ce qu'elles contiennent par du vide"

Cette fois, on a donc bien uniquement le texte et pas de BBcode ou HTML.

Ensuite, dans ce champ, on va regarder les caractères et les compter :
Code:
var nb_carac = (nb.match(/\S/g)||[]).length;
Idea la méthode match() nous permet de ne prendre en compte que les caractères (et caractères spéciaux) mais pas les espaces vides ou retour à la ligne Smile

Puis, on va compter le nombre de mots d'au minimum 3 caractères :
Code:
var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;
Idea {3, } signifie "élements de 3 caractères au moins".

On a nos deux informations, il ne reste plus qu'à les afficher dans notre champs_infos
Code:
champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

Au final, notre fonction ressemble à ça :
Code:
function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 }

Et on va la placer au début du javascript (après les tests) :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){
 
 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }

 function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 }
 

 // On crée une zone pour afficher le nombre de mots et de caractères
 var champs_infos = document.createElement('div');
 champs_infos.setAttribute('id', 'compteur-mots');
 $(champs_infos).appendTo('.sceditor-container');
 
 });

 });
 
});

Et si on comptait ?

On a quasi terminé ; cela dit, tu ne penses pas qu'il manque le plus important : quand compter ? Eh bien, nous allons executer la fonction à chaque fois qu'on a cliqué sur une touche.
Code:
$('body').on('keyup', '.sceditor-container', function(){
 compteur(champs_msg) ;
}
On a donc ce code :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){
 
 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }

 function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 }
 

 // On crée une zone pour afficher le nombre de mots et de caractères
 var champs_infos = document.createElement('div');
 champs_infos.setAttribute('id', 'compteur-mots');
 $(champs_infos).appendTo('.sceditor-container');
 
 // Quand on a appuyé sur un bouton du clavier dans la zone de saisi,
 // on fait une fonction.
 $('body').on('keyup', '.sceditor-container', function(){
 compteur(champs_msg) ;
 }

 });

 });
 
});

Exclamation Pour économiser des ressources, on peut aussi à ajouter un timer et n'exécuter la fonction que toutes les N secondes Smile

Pour cela, il suffit :
- de déclarer une variable "compte" au debut de la fonction et de lui donner la valeur "false"
Code:
var compte = false ;
- de la passer également à "false" une fois qu'on a compté :
Code:
function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 compte = false ;
 }
- de faire un test dès qu'on clique sur une touche du clavier dans la zone de saisie afin de vérifier s'il faut ou non compter Smile :
Code:
$('body').on('keyup', '.sceditor-container', function(){
 if(compte){
 return ;
 }else{
 compte = true ;
 // On compte toutes les 20 secondes
 setTimeout(
 function(){
 compteur(champs_msg)
 }, 2000
 );
 
 }
 });

Idea 2000 est le temps en milliseconde entre le moment où l'on clique et le moment où l'on calcule.
et voilà le code final avec le timer :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){
 
 var compte = false ;

 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }

 function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 compte = false ;
 }
 
 // On crée une zone pour afficher le nombre de mots et de caractères
 var champs_infos = document.createElement('div');
 champs_infos.setAttribute('id', 'compteur-mots');
 $(champs_infos).appendTo('.sceditor-container');

 // Quand on a appuyé sur un bouton du clavier dans la zone de saisi,
 // on fait une fonction.
 $('body').on('keyup', '.sceditor-container', function(){
 if(compte){
 return ;
 }else{
 compte = true ;
 // On compte toutes les 20 secondes
 setTimeout(
 function(){
 compteur(champs_msg)
 }, 2000
 );
 
 }
 });

 });
 
});

Edition d'un message ou nouveau message ?

Si on laisse comme ça, notre champs n'apparait pas au chargement de la page. On va donc l'initialiser en lui indiquant :
Code:
champs_infos.innerHTML = "Nombre de caractères : 0 ; Nombre de mots : 0 ";
Cependant, si on s'arrête là, même à l'édition d'un message, on va afficher :
Nombre de caractères : 0 ; Nombre de mots : 0
Ce n'est pas ce qu'on veut ^^

On va donc tester si la zone de texte est vide (= cas d'un nouveau message) : dans ce cas, on initialise la div ; sinon, on compte pour mettre à jour les infos :

Ce qui nous donne pour le test :
Code:
// On teste si on édite un message ou si on en écrit un nouveau
 // Si nouveau message : on met les infos à "0"
 if(champs_msg.val() == ""){
 champs_infos.innerHTML = "Nombre de caractères : 0 ; Nombre de mots : 0 ";
 }else{
 // Sinon, on compte ^^
 compteur(champs_msg);
 }

Le code final

Au final, voilà le code de notre javascript :
Code:
$( function(){
 /// si pas de champs texte, on arrête la lecture du script
 if(!$('#text_editor_textarea').length){
 return ;
 }

 // Il y a un champs texte
 $(function(){
 
 var compte = false ;

 var champs_msg = $('#text_editor_textarea').sceditor('instance');

 // Si on ne trouve pas l'éditeur de texte, on arrete la lecture du script
 if(!champs_msg){
 return ;
 }

 function compteur(champs_msg){
 // On ne prend pas en compte les mots entre [] ou <>
 var nb = champs_msg.val().replace(/\[.*?\]/g,' ').replace(/<.*?>/g,' ');

 // On compte le nombre de caractères, sans les espaces
 var nb_carac = (nb.match(/\S/g)||[]).length;

 // On compte le nombre de mot de 3 lettres ou plus
 var nb_mots = (nb.match(/\S{3,}/g)||[]).length ;

 // On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ";

 compte = false ;
 }
 
 // On crée une zone pour afficher le nombre de mots et de caractères
 var champs_infos = document.createElement('div');
 champs_infos.setAttribute('id', 'compteur-mots');
 $(champs_infos).appendTo('.sceditor-container');

 // On teste si on édite un message ou si on en écrit un nouveau
 // Si nouveau message : on met les infos à "0"
 if(champs_msg.val() == ""){
 champs_infos.innerHTML = "Nombre de caractères : 0 ; Nombre de mots : 0 ";
 }else{
 // Sinon, on compte ^^
 compteur(champs_msg);
 }
 
 // Quand on a appuyé sur un bouton du clavier dans la zone de saisi,
 // on fait une fonction.
 $('body').on('keyup', '.sceditor-container', function(){
 if(compte){
 return ;
 }else{
 compte = true ;
 // On compte toutes les 20 secondes
 setTimeout(
 function(){
 compteur(champs_msg)
 }, 2000
 );
 
 }
 });

 });
 
});

L'installation

Tout est prêt, il n'y a plus qu'à installer notre compteur ^^

Pour cela, il te suffit d'aller dans : Panneau d'administration > Modules > HTML & javascript > Gestion des codes javascript, de créer un nouveau js et de l'afficher sur toutes les pages.

Compteur de mots & de caractères Tuto-cpt2_zpsgvhyrrt9

Et zioup ! Le tour est joué, ton forum possède désormais un compteur de mots qu'il ne te reste plus qu'à styliser dans la CSS Smile
Exemple:


Aethon
Aethon
Pseudo Discord : Aethon
Messages : 128
https://rpgsaintseiya.forumactif.com

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Lun 4 Jan 2021 - 1:26
Bonsoir,

Petite question sur le compteur : peut-il aussi compter les lignes d'un message ?
Miettes
Miettes
Râleuse (Admin)
Informations :
► Présente en semaine (09h00 - 18h00)
----
Idea Viens papoter avec nous sur le discord
Pseudo Discord : Miettes
Messages : 2203
https://lectures-miettes.fr/

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Lun 4 Jan 2021 - 15:54
Coucou Smile

Quel serait l'intérêt ? En fonction de la taille de la fenêtre de ton navigateur, de ton zoom, etc. Le nombre de ligne change Smile D'ailleurs, pour les RPG, j'ai toujours trouvé cette règle du nombre de ligne totalement ridicule :/
Aethon
Aethon
Pseudo Discord : Aethon
Messages : 128
https://rpgsaintseiya.forumactif.com

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Lun 4 Jan 2021 - 15:57
Oui sur navigateur c'est pas utile pas faux

Chez nous la règle est de minimum 20 ligne sur word en times news romant police 12

Et si on disait au code : 1 ligne c'est n caractères, comptabilise moi les caractères et divise par n ?
Miettes
Miettes
Râleuse (Admin)
Informations :
► Présente en semaine (09h00 - 18h00)
----
Idea Viens papoter avec nous sur le discord
Pseudo Discord : Miettes
Messages : 2203
https://lectures-miettes.fr/

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Lun 4 Jan 2021 - 16:35
En soit, c'est faisable, mais encore une fois, est-ce judicieux et utile ? (au passage, est-ce que c'est vraiment nécessaire d'imposer un nombre de ligne sur les RP ? Là encore, le débat pourrait s'ouvrir...)

Ici, j'imagine qu'il faudrait faire :
Code:
// On compte le nombre de caractères, sans les espaces
var nb_carac = (nb.match(/\S/g)||[]).length;

// On remplace en nombre de ligne
var nb_lignes = nb_carac / 10; // 10 = le nombre de caractères sur une ligne

// On affiche les infos
 champs_infos.innerHTML = "Nombre de caractères : "+nb_carac+" ; Nombre de mots : "+nb_mots+" ; Nombre de ligne : "+ nb_lignes +"";

Idea Je n'ai pas testé Embarassed
Aethon
Aethon
Pseudo Discord : Aethon
Messages : 128
https://rpgsaintseiya.forumactif.com

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Lun 4 Jan 2021 - 16:56
Je verrais pour tester Smile

Le seul intérêt du minimum de lignes est au niveau des récompenses : on ne peut pas donner la même chose à un membre qui pond 5 lignes et a un qui en fait 50.

Miettes aime ce message

Aethon
Aethon
Pseudo Discord : Aethon
Messages : 128
https://rpgsaintseiya.forumactif.com

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Jeu 7 Jan 2021 - 4:50
Donc ça fonctionne Smile

Du coup question annexe : il y aurait moyen de faire en sorte que ce compte apparaisse à un endroit du message envoyé ?
Miettes
Miettes
Râleuse (Admin)
Informations :
► Présente en semaine (09h00 - 18h00)
----
Idea Viens papoter avec nous sur le discord
Pseudo Discord : Miettes
Messages : 2203
https://lectures-miettes.fr/

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Sam 9 Jan 2021 - 15:11
une fois le message postée tu veux dire ?

Il faudrait combiner ce tuto avec celui-ci pour envoyer en même temps que le message un span avec une class particulière qui contiendra l'info et ensuite jouer en CSS pour le faire. Mais du coup, ça n'a plus rien à voir avec ce tuto et donc rien à faire dans les réponses. Après, une fois encore, est-ce que c'est nécessaire d'alourdir une page en JS juste pour vérifier le nombre de ligne dans le message ? La quantité est-elle vraiment plus importante que la qualité ? est-ce que le staff n'est pas capable de lui-même de juger si le joueur mérite ou non telle ou telle récompense en fonction de la qualité de ses RP plutot que de la longueur ? (personnellement, je peux broder et baratinée des lignes et des lignes, pondre des messages de 200 lignes s'il le faut, mais ils n'apporteront rien à la partie ; pourtant, un message de 10 lignes peut tout faire changer...)
Contenu sponsorisé

Compteur de mots & de caractères Empty Re: Compteur de mots & de caractères

Revenir en haut
Permission de ce forum:
Vous pouvez répondre aux sujets dans ce forum
Les coups de ♥ des Râleuses

Post-It des Râleuses