Développement du module Texte à trous¶
En attendant d'avoir un éditeur qui permettra de "marquer" les trous à créer dans les exercices on utilisera un "trouteur automatique".
Généralités¶
Dans la mesure où il faut "trouer" le texte n'importe où, on utilisera des étiquettes fournies par https://redmine.ryxeo.com/projects/ryxeo/wiki/AbulEduEtiquetteV1. En effet les labels utilisés dans paragraphes mélangés (par exemple) ne fournissent qu'un numéro d'ordre et ne permettent pas de répondre au problème de ce type d'exercice.
Après avoir regardé le code et les fichiers de configuration de ALLER version TCL/TK j'ai décidé de reprendre la même méthode: les marqueurs des trous sont uniquement des paires d'entier: numéro du caractère depuis le début du texte pour le début du trou et numéro du caractère pour la fin du trou. Cette méthode a l'avantage de permettre de créer des trous contenant... ce qu'on veut : un mot, ou un morceau de mot, plusieurs mots, etc...
Fichier de configuration¶
Au début je m'étais arrêté sur une structure du fichier de configuration, mais Philippe l'a modifié dès que j'ai eu le dos tourné :P
[texteATrous] /* -- Concerne toute la séquence -- */ exerciceActive=bool afficherTexteSequence=bool afficherMotBienPlaces=bool afficherConsigneSequence=bool consigneSequence=QString /* -- Concerne l'exercice 1 -- */ exercice\1\niveauDifficulte=int exercice\1\marqueurDebutTexte=int exercice\1\marqueurFinTexte=int exercice\1\modeManuel=bool exercice\1\listeTrous=QStringList(séparateur ;) exercice\1\nbTrousAafficher=int exercice\1\afficherTexteExercice=true exercice\1\modeIntelligent=bool exercice\1\indexNature=int exercice\1\indexNiveau=int exercice\1\modeAutomatique=bool exercice\1\afficherConsigneExercice=bool exercice\1\consigneExercice=QString /* -- Concerne l'exercice 2 -- */ exercice\2\niveauDifficulte=int exercice\2\marqueurDebutTexte=int exercice\2\marqueurFinTexte=int exercice\2\modeManuel=bool exercice\2\listeTrous=QStringList(séparateur ;) exercice\2\nbTrousAafficher=int exercice\2\afficherTexteExercice=true exercice\2\modeIntelligent=bool exercice\2\indexNature=int exercice\2\indexNiveau=int exercice\2\modeAutomatique=bool exercice\2\afficherConsigneExercice=bool exercice\2\consigneExercice=QString exercice\size=2
Astuce pour savoir si une pièce est bien placée¶
Pour savoir si une pièce est placée sur la bonne cellule, on utilise la propriété "objectName" tout simplement: lors de la construction on créé une cellule qui s'appelle "un" par exemple et si la piece contenue dans la cellule s'appelle aussi "un" c'est que tout est bon. Ça permet au passage de gérer le cas de figure ou plusieurs fois le mot "un" serait une pièce à placer dans le texte. N'importe quel "un" conviendrait et c'est comme ça que ça marche.
Construction du tableau de trous¶
Dans les trois modes possibles, la structure utilisée pour manipuler les trous est une QList< QPair<int,int> >, en clair une liste de couples d'entiers (indexDebut, indexFin), chaque couple correspondant à un trou.
Mode manuel¶
Si l'exercice est prévu pour le mode manuel, on récupère le tableau de trous dans module.conf et on désérialise 2 par 2 (séparateur ";") la QString pour créer la liste de couples d'entiers. On n'a alors aucune contrainte sur les trous : ils peuvent être un morceau de mot, un mot, une suite de mots, bref, n'importe quel extrait du texte compris entre deux index choisis par l'intermédiaire de l'éditeur.
Mode automatique¶
Le tableau de trous est ici créé aléatoirement, mais contiendra exclusivement des mots du texte (1 trou = 1 mot). La structure est créée par tirage dans la liste m_listeSuperMots, qui contient pour chaque mot du texte son numéro d'ordre dans le texte, la chaîne de caractères, les index de début et de fin.
Mode "intelligent"¶
Le tableau de trous est créé en piochant aléatoirement dans m_listeSuperMots, mais uniquement des mots dont on a vérifié qu'ils appartiennent à la liste mot_aller_cycle3.csv, avec la nature et le niveau indiqués par l'intermédiaire de l'éditeur
Parcours du texte pour créer mots et les trous¶
On va balayer les valeurs de l'index du QTextEdit entre deux valeurs décidées pour le début et la fin.
Les mots¶
Si l'index est inférieur à l'index du prochain trou dans la liste, je suis dans un mot à afficher seulement. J'ai un compteur indiceMot qui garde en mémoire où j'en suis.
Dans ce cas, je vais créer uniquement une AbulEduCelluleV1 dont le texte sera la chaîne de caractère contenue dans m_listeSuperMots à l'indice indiceMot
Les trous¶
Si l'index est supérieur à l'index du prochain trou dans la liste, je suis dans un mot à enlever parce que marqué pour être un trou.
Dans ce cas, je vais créer une AbulEduCelluleV1 dont le contour sera une ligne visible mais sans texte, et une AbulEduPieceV1 qui contiendra le texte compris entre les deux index