Nous sommes en train de mettre en place un test. Tout va bien sauf pour les questions au format cloze : nous nous heurtons aux problèmes suivants : parfois,non interprétation du code cloze ( affiché tel quel) , non prise en compte des modifications voire erreur php ( hélas, je n'ai pas conservé le message et je n'arriva pas à le reproduire).
Version Moodle utilisée : dernière version 1.6
Est-ce que vous vous confrontez aux mêmes problèmes ?
Bonjour Etienne,
Le format de questions Cloze (dans l'activité Test/Quiz) de Moodle est extrêmement chatouilleux. Une source fréquente d'erreurs (non-interprétation du code) est la présence de sauts de ligne invisibles dans le texte de la question. Il ne faut jamais faire de copier-coller depuis un traitement de texte vers le texte de la question Cloze en mode édition. En cas de problème Il faut vérifier en mode "code HTML" qu'il n'y a aucun caractère ni saut de ligne parasite.
Si tu as encore des problèmes le mieux est de poster ici le code intégral d'une question Cloze qui pose problème, pour diagnostic.
Joseph
Il me semble même que le problème vient de cette ligne de code :
(ligne 592 du fichier : question/type/multianswer/questiontype.php )
define("ANSWER_ALTERNATIVE_FEEDBACK_REGEX",
'.*?(?<!\\\\)(?=[~}]|$)');
Mais je n'en suis pas sur....
Et je ne suis pas sur de comprendre bien la syntaxe surtout de la partie (?<!\\\\)
Globalement je comprends : un certain nombre de caractère ( au moins un) non suivi de \\ et suivi de ~ ou } ou fin de chaine...
Bref je ne suis pas plus avancé !!!
Où peut-on trouver une description du format cloze ?
Le format multianswer (cloze) est tellement compliqué que Tim Hunt, qui est l'actuel responsable du module Test/Quiz, refuse d'y mettre le nez... Je ne comprends pas grand-chose non plus à la syntaxe que tu signales.
Mais pas besoin de modifier quoi que ce soit dans le code php. Il faut juste faire très attention aux sauts de ligne cachés. A partir de là, plus de pb. J'utilise très régulièrement ce type de question.
Pour la description du format cloze, le mieux est de regarder l'exemple fourni par l'aide en ligne lorsqu'on est en mode édition de ce type de question. Et aussi la documentation sur MoodleDocs (en anglais).
Bon courage
Joseph
Je pense que le (?<!\\\\) a à voir avec l'utilisation de \ pour "échapper" les caractères réservés dans les réponses et les feedbacks...
Mais pourquoi les saut de lignes poses problèmes... c'est encore un mystère...
C'est sur qu'il faut donc faire attention aux sauts de ligne... mais bon ...
Bonjour Etienne,
moi aussi j'ai quelques soucis avec Cloze (balises qui sautent complètement, des erreurs php si il n'y a aucune balise dans le texte). Je vais y mettre le nez après avoir testé les patches proposés.
Pour info, j'ai fait une petite traduction des spec REGEX* pour les look-ahead et les look-behind (c'est une définition POSIX des "ectended regex", donc en principe celle qui est implémentée aussi dans php)
origine : la documentation du Perl qui est excellente, mais ardue.
(?:pattern)
(?imsx-imsx:pattern)
Pour grouper des séquences caractères, sans capturer ; les expressions sont regroupées comme dans des parenthèses normales '()', mais ne produisent pas des sous-motifs comme le fait '()' does. Donc
(?=pattern)
Une assertion de largeur nulle en "look-ahead" (test sur ce qui suit). Par exemple, preg_match("/\w+(?=\t)/", $var, $matches) trouve un mot SUIVI PAR une tabulation, mais sans prendre en compte la tabulation dans le motif $matches[0].
(?!pattern)
La négation de la prcédente. Par exemple preg_match("/foo(?!bar)/", $var, $matches) trouve toute occurrence de 'foo' qui n'EST PAS SUIVI PAR 'bar'. Notez que "look-ahead" et "look-behind" ne sont PAS identiques. Vous ne pouvez utiliser cette forme pour du "look-behind" : Si vous cherchez 'bar' non précédé par 'foo', /(?!foo)bar/ ne fera pas ce que vous pensez. La forme (?!foo) dit juste que "ce qui suit ne doit pas être 'foo'" -- mais ne dit pas, c'est 'bar', et donc 'foobar' sera détecté. Vous devrez écrire plutôt quelque chose comme /(?!foo)...bar/ pour ce type de détection.
(?<=pattern)
Une assertion de largeur nulle en "look-behind" (test sur ce qui précède). Par exemple, preg_match("/(?<=\t)\w+/", $var, $matches) le mot QUI SUIT une tabulation, sans inclure la tabulation dans le motif résultat. Ne fonctionne que pour un motif "look-behind" de largeur fixe.
(?<!pattern)
L'inversion de la précédente. Par exemple pregmatch("/(?<!bar)foo/", $var, $matches) trouve toute occurrence de 'foo' QUI NE SUIT PAS 'bar'. Ne fonctionne que pour un motif "look-behind" de largeur fixe.
à placer dans le fichier question/type/multianswer/questiontype.php à partir de la ligne 680
Si des téméraires pouvaient tester...
// not a beautiful hack to eliminate the end of line problem
$toreplace = array("\n","<br />","<br>");
$tab = split('[{}]',$text);
$l= count($tab);
for ($i=0;$i<$l-1;$i=$i+2) {
$lachaine.=$tab[$i].'{'.str_replace($toreplace,'',$tab[$i+1]).'}';
}
$text =$lachaine.$tab[$i];
Je viens de tester ton "not beautiful hack" et ça m'a l'air de bien fonctionner. Au fait, tu l'as testé avec tes questions rebelles, et ça marchait?
On pourrait le proposer dans le bug tracker, mais je doute que Tim Hunt fasse quoi que ce soit.
Bon w-end,
Joseph