Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comparer mot cliqué avec ceux contenus dans une liste

26 réponses
Avatar
pascal scalpa
Bonjour
Je cherche =E0 savoir s'il est possible de v=E9rifier (tester) si le mot
cliqu=E9 dans un texte (contenu dans un tag <p>) figure dans une liste
(stock=E9e sous forme de variable).

Concr=EAtement, je veux donner un texte =E0 lire =E0 mes =E9l=E8ves avec co=
mme
consigne par exemple, clique sur tous les "noms communs" de ce texte.

Merci de m'indiquer comment proc=E9der et si c'est possible!
pascal

6 réponses

1 2 3
Avatar
SAM
Le 9/23/09 3:38 PM, pascal scalpa a écrit :
bonjour
J'y suis presque...
Si tu regardes la page http://www.scalpa.info/ape/id_vb7.php tu verras
que les espaces insécables posent un problème dans la balise exo !
Je n'ai pas trouvé de solution. J'ai cherché autour du doctype des
plombes alors que le problème existe exclusivement dans l'exo... un
souci avec regex ?
j'ai tenté d'ajouter xA0:
txt = txt.replace(/([wéèêçûâàùxA0]+)(?=[s'".,;!?«»-()])/gi,'<span
class='blue' onclick="verif(this)">$1</span>');

sans succès non plus

une idée ?



Je commencerais par tout passer en utf-8 ou à minima ISO-8859-15 et ne
plus utiliser les html-entités (&#160; &nbsp;) qui perturbent et les
navigateurs et la réalisation de la regexp.

Comme ça commence fort à me dépasser surtout si on reste en ISO-8859-1
je post-cross vers fr.comp.lang.regexp


Pour les charsets, voir et revoir :
<http://www.miakinen.net/vrac/charsets/?hv=h&o6=MacRoman&or=2&pr0>

Au passage, on verra que œ n'existe pas en ISO-8856-1

--
sm
Avatar
pascal scalpa
Bonsoir Stéphane et merci pour tes remarques et ton aide précieuse.

J'ai trouvé une solution radicale bien que non conforme à la
typographie, j'ai viré les espaces qui m'ennuyaient afin de ne pas me
retrouver avec des ! en début de ligne par exemple. Je vais jeter un
coup d'oeil sur l'autre forum par curiosité, mais je pense que je vais
en rester là! Tant pis pour les quelques broutilles.

Merci encore
Pascal
ps en balise meta j'ai mis : <meta name="author" content="Pascal
Chalopin heavyly hacked by Stephane Moriaux for javascript" />
Cela te convient-il ?
Avatar
Olivier Miakinen
Le 24/09/2009 19:45, pascal scalpa a écrit :

J'ai trouvé une solution radicale bien que non conforme à la
typographie, j'ai viré les espaces qui m'ennuyaient afin de ne pas me
retrouver avec des ! en début de ligne par exemple.



Beurk ! ;-)

Je vais jeter un
coup d'oeil sur l'autre forum par curiosité, mais je pense que je vais
en rester là! Tant pis pour les quelques broutilles.



Ce serait dommage ÀMHA. Mais va déjà lire ma réponse là-bas, j'espère te
faire changer d'avis.
Avatar
SAM
Le 9/24/09 7:45 PM, pascal scalpa a écrit :
Bonsoir Stéphane et merci pour tes remarques et ton aide précieuse.

J'ai trouvé une solution radicale bien que non conforme à la
typographie, j'ai viré les espaces qui m'ennuyaient afin de ne pas me
retrouver avec des ! en début de ligne par exemple.



Heu ...
et les : ?
tu as oublié de supprimer l'espace avant les 2 points.

Je vais jeter un
coup d'oeil sur l'autre forum par curiosité, mais je pense que je vais



Quand même, ce n'est pas pour rien que j'ai orienté de ce côté.

Tu verras qu'Olivier fin t-analyste grammatical y fait qques remarques
opportunes bien qu'hors sujet quant à de vagues erreurs qui sont
peut-être de mon fait et qui t'auront échappées.

en rester là! Tant pis pour les quelques broutilles.



Il est vrai que les expressions régulières sont un peu un casse-tête,
qu'il peut arriver un moment où on y perd plus de temps qu'on en gagne,
mébon on peut aussi voir ça comme un activateur de neurone(s).

Merci encore
Pascal
ps en balise meta j'ai mis : <meta name="author" content="Pascal
Chalopin heavyly hacked by Stephane Moriaux for javascript" />
Cela te convient-il ?



Ho! alors là ... la postérité ... je ne sais si c'est comme ça qu'on
peut la gagner.
Il faut voir ces metas comme un jeu de ma part ;-)
Par contre si tu peux mettre un "donate" vers mon compte Paypal ?

--
sm
Avatar
pascal scalpa
hello
J'ai passé tous les fichiers en utf8 sans bom à l'aide de notepad++,
mais cela n'a pas eu d'effet sur le comportement des espaces
insécables dans le div exo. Donc je suis revenu au premier jet du
script à savoir (quelques modif des noms de variables):
//<![CDATA[

<!--
// liste des mots à trouver (pas besoin de répéter les doublons) :
var liste =
['arriva','venait','était','laissait','amoncelait','ajoutait','entra','po sa','écria','ajouta'];

/******** rien à changer ci-dessous *******/
var NbMotsTrouve = 0;
var Score = 0;
var NbClics = 0;
var ok = liste;
var NbMotsAtrouver = NbMotsRestantAtrouver = liste.length;

// récup le nom de la page pour mettre dans variable session
var PageName = window.location.pathname;
PageName = PageName.split("/");
PageName = PageName[PageName.length - 1];
PageName = PageName.substr(0, PageName.lastIndexOf("."));
PageName = PageName.replace(new RegExp("(%20|_|-)", "g"), "");

//recherche des mots et incorporation des mots dans un span qui a un
onclick
function cliquer() {
//"exo" est le div (et aussi l'id du div) qui contient le texte à
analyser
var exo = document.getElementById('exo');
//"txt" est l'innerHTML de ce div (le contenu du div en "string") à
ce moment-ci
var txt = exo.innerHTML;
txt = txt.replace(/([wéèêçûâàù]+)(?=[s'".,;!?«» -()])/gi,'<span
class='blue' onclick="verif(this)">$1</span>');
//txt = txt.replace(/([wéèêçûâàùxA0]+)(?=[s'".,;!? «»-()|&#160;|
&nbsp;])/gi,'<span class='blue' onclick="verif(this)">$1</span>');
exo.innerHTML = txt;
// NbMotsRestantAtrouver = le nombre de termes (mots) restant à
trouver
NbMotsAtrouver = NbMotsRestantAtrouver = 0;
var t = exo.getElementsByTagName('SPAN');
// A chaque fois qu'un mot entre balises span correspond à un de la
liste, on incrémente NbMotsAtrouver et NbMotsRestantAtrouver
for(var i=0, n=t.length; n>i; i++) {
for(var j in ok) if(ok[j] == t[i].innerHTML) { NbMotsAtrouver++;
NbMotsRestantAtrouver++; }
}
}

function verif(quoi) {
// verif() est la fonction appelée dans chaque span (au clic sur
chaque mot) "quoi" est l'élément span (balises et contenu)
if (quoi.className == 'red')
{
quoi.className = 'blue';
NbClics++;
}
else
{
NbClics++;
quoi.className = 'red';
quoi = quoi.innerHTML;
for(var i=0, n=liste.length; n>i; i++) if ( liste[i] == quoi) / /
si le mot cliqué est dans la liste
{
NbMotsRestantAtrouver --; // on décrémente NbMotsRestantAtrouver
le nombre de réponses à trouver
if
(NbMotsRestantAtrouver<0){
NbMotsRestantAtrouver = 0;
}
// on vire le mot de la liste
//liste[i]=liste[liste.length-1];
//liste.pop();
// on sort de la boucle si le terme (le mot cliqué) a été trouv é
dans la liste (des termes restants à trouver)
break;
}
}
}

// variable de session
var nbTentatives = 0;

function fini() {

nbTentatives ++;
var j = document.getElementById('try');
j.innerHTML = 'Tentative n° '+ nbTentatives;

var f = document.getElementById('fin');
var S = document.getElementById('soluce');
var btC = document.getElementById('btn_correction');
f.innerHTML += '<hr>Tentative n° : '+nbTentatives+'<br>';
f.innerHTML += 'Nombre de verbes restant à trouver :
'+NbMotsRestantAtrouver+'<br>' + 'Nombre de clics = '+NbClics+'<br>';
if(NbMotsRestantAtrouver==0){
f.innerHTML += '<span class="' + ( (NbMotsAtrouver==NbClics)?
'green' : 'red') +'">CORRECT</span>';
save();
}
else{
f.innerHTML += '<span class="red">INCORRECT</span>';
f.innerHTML += '<br><em>(vert = OK, rouge = à revoir)</em>';
}

if(nbTentatives==3 ){
S.style.display = 'block';
btC.style.display = 'none';
}
f.style.display = 'block';
}

function calculeScore(){
var NbMotsTrouve = NbMotsAtrouver-NbMotsRestantAtrouver;
if (NbClics > 0){
Score = Math.floor((((NbMotsTrouve)/NbMotsAtrouver)*20))-Math.abs
(NbMotsAtrouver-NbClics);
if(Score<0){
Score =0;
}
document.getElementById('fin').innerHTML += '<br><b> Note sur
vingt : ' + Score + '</b></em><br>';
}
else{
//si NbClics = 0 c'est qu'aucun clic n'a eu lieu
document.getElementById('fin').innerHTML += '<br><b> Pas de clic,
alors pas de note!</b><br>';
}
}

function solution() {
var t = document.getElementById('exo'),
s = t.cloneNode(true),
t = s.getElementsByTagName('SPAN');
for(var i=0, n=t.length; n>i; i++) {
var a = t[i];
a.onclick = '';
a.className = '';
for(var j in ok) if(ok[j] == a.innerHTML) a.className='red';
}
s.style.display = 'block';
document.getElementById('soluce').parentNode.replaceChild
(s,document.getElementById('soluce'));

save();
}

function save(){

calculeScore();
document.getElementById('btn_correction').style.display = 'none';
document.getElementById('btn_again').style.display = 'none';
document.getElementById('score').value = Score;
document.getElementById('IdExo').value = PageName;
document.getElementById('ScoreDiv').style.display = 'block';
}

function die_ext($page){
$extpage = substr(strrchr($page, "."), 1);
$extpage =".".$extpage;
$dieext=str_replace($extpage,"",$page);
return $dieext ;
}

window.onload = cliquer;

//-->

//]]>

J'obtiens parfois des infos incohérentes :
Le nbre de mots à trouver qui indique -1 par exemple si l'élève cliqu e
plusieurs fois le même verbe est en partie résolue par :
if (NbMotsRestantAtrouver<0){
NbMotsRestantAtrouver = 0;
}
Mais en fait l'affichage des mots restants à trouver ne reflète pas la
réalité car d'autres mots non cliqués peuvent subsister....
... Ormis celles obtenues en cliquant toujours le même verbe....
Manipulation qu'il faudrait pouvoir détecter en testant par exemple le
mot avant et le mot après celui cliqué et faire en sorte que l'on
comptabilise seulement s'ils sont différents entre 2 clics? Et
supprimer le mot de la liste?
Quelle différence y a-t-il entre l'array ok et l'array liste? Je n'ai
pas saisi!!

A plus
pascal
Avatar
SAM
Le 9/28/09 6:34 PM, pascal scalpa a écrit :

Quelle différence y a-t-il entre l'array ok et l'array liste? Je n'ai
pas saisi!!



Normalement, à l'origine (et bien que n'ayant pas relu)
le tableau ok est au départ une copie de celui liste.

Quand on clique un mot et qu'il est contenu dans ok on :
- ajoute 1 au total des bons choix
- supprime ce mot du tableau,
on ne peut donc pas continuer à le choisir
et s'ajouter des bons points
(éviterait le coup : je clique 30 fois le même et j'ai 20/20)
- les mots restant à trouver n'est que la taille de ok (ok.length)

Va à l'encontre de l'option array liste sans doublon.


On ne peut se servir directement de liste et lui enlever les trucs
trouvés car liste sert à tout remettre en place lors d'un reset.
Tableau liste pourrait aussi servir au reclic sur mot trouvé pour
pouvoir le remettre dans ok.

J'ai l'impression que d'une chose pas trop trop compliquée, à force de
vouloir ménager plein de possibilités, on va s'orienter vers une usine à
gaz.

--
sm
1 2 3