Projet

Général

Profil

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

Redmine Appliance - Powered by TurnKey Linux