Un module contient une ou plusieurs parties _(ex: "Reconnaître les syllabes")_. Côté code, une partie a la même représentation qu'un module, c'est un élément sans contenu propre, décrit comme un `<item>` MosMod dans [`imsmanifest.xml`](https://gitlab.tetras-libre.fr/macao/macao-legacy/-/blob/main/Basilisk/MACAO/macao_12/imsmanifest.xml)
Un module contient une ou plusieurs parties _(ex: "Reconnaître les syllabes")_. Côté code, une partie a la même représentation qu'un module, c'est un élément sans contenu propre, décrit comme un `<item>` MosMod dans [`imsmanifest.xml`](https://gitlab.tetras-libre.fr/macao/macao-legacy/-/blob/main/Basilisk/MACAO/macao_12/imsmanifest.xml)
<details><summary>Exemple XML</summary>
<details>
<summary>Exemple XML</summary>
```xml
<organization>
...
...
@@ -45,21 +47,28 @@ Un module contient une ou plusieurs parties _(ex: "Reconnaître les syllabes")_.
<!-- ... -->
</organization>
```
</details>
**Données à extraire :**
- [x] ID -> attribut `identifier`
- [x] Titre -> élément `<title>`
- [x] Descendants dans l'arbre -> éléments `<item>`
----
- [x] ID -\> attribut `identifier`
- [x] Titre -\> élément `<title>`
- [x] Descendants dans l'arbre -\> éléments `<item>`
---
## Sous-parties
Les "feuilles" de l'arborescence visible dans le panneau de gauche, éléments non dépliables _(ex: "Reconnaître les syllabes en anglais oral")_. Une sous-partie contient plusieurs **pages**, dont la première est affichée quand on sélectionne la sous-partie. Une sous-partie est décrite dans un fichier `sco/MosEtp###`, qui déclare un objet `MosSCO` pour définir son contenu.
```js
oSco=newMosSCO("MosEtp129","> Reconnaître les syllabes en anglais oral","MACAO","MACAO 1 - S'entraîner à la reconnaissance","","macao_fusion_ss_barre","fr");
```
Peu d'infos utiles : nom du fichier, titre (déjà défini dans le `<title>`), titre du "stage" (constant), titre du module parent (déjà connu grâce au manifest), et quelques champs constants.
Peu d'infos utiles : nom du fichier, titre (déjà défini dans le `<title>`), titre du "stage" (constant), titre du module parent (déjà connu grâce au manifest), et quelques champs constants.\
Ensuite quelques lignes inutiles, puis on passe à la déclaration des pages.
```js
oSco.tabPages[oSco.tabPages.length]=newPageContenu("Repérer les syllabes orales","pg861","exercice","");
...
...
@@ -68,140 +77,166 @@ oSco.tabPages[oSco.tabPages.length] = new PageContenu("Commentaire", "pg636", "c
// ^ titre ^ id ^ type
// [...]
```
Le plus important est l'ID de la page `"pgXXX"`, et éventuellement le type (`"exercice"` ou `"cours"`), le titre de la page étant déclaré aussi dans la page elle-même.
**Données à extraire :**
- Dans le manifest
- [x] ID -> attribut `identifier`
- [x] Titre -> élément `<title>`
- [x] ID -\> attribut `identifier`
- [x] Titre -\> élément `<title>`
- Dans le fichier `MosEtp###.html`
- [~] Titre -> `<title>`
- [x] Liste des pages (titre, ID) -> arguments de `new PageContenu()`
----
- [~] Titre -\>`<title>`
- [x] Liste des pages (titre, ID) -\> arguments de `new PageContenu()`
---
## Pages ou activités
Les "unités de navigation". La section centrale de Macao affiche toujours 1 page, dont le nom est indiqué en haut à droite _(ex: "Repérer les syllabes orales")_. Une page contient une "activité", qui peut être un cours (sans saisie interactive) ou un des 4 types d'exercices (`QC, QM, TAT, GD` dans `MosMtr/scripts/contenu/ClasseExercice___.js` + `ClasseCours.js`) ***[À confirmer: autres types de contenus?]***. Elle est décrite dans un fichier `contenu/pages/pg###.html`, qui déclare un objet `Cours` ou `Exercice___` pour définir son contenu.
Les "unités de navigation". La section centrale de Macao affiche toujours 1 page, dont le nom est indiqué en haut à droite _(ex: "Repérer les syllabes orales")_. Une page contient une "activité", qui peut être un cours (sans saisie interactive) ou un des 4 types d'exercices (`QC, QM, TAT, GD` dans `MosMtr/scripts/contenu/ClasseExercice___.js` + `ClasseCours.js`) **_\[À confirmer: autres types de contenus?\]_**. Elle est décrite dans un fichier `contenu/pages/pg###.html`, qui déclare un objet `Cours` ou `Exercice___` pour définir son contenu.
**Données à extraire (communes à toutes les activités) :**
- [x] Type d'activité -> premier appel de constructeur `new ___()`
-[x] [Commentaires](#commentaires) -> éléments `<div id="divCmt___">` dans `<div id="zoneInvisible">`
- Dans les descriptions, commentaires, blocs HTML divers
Il s'avère que les 9 exercices QCM sont tous dans la même sous-partie, et sont utilisés sémantiquement comme plusieurs QCU : \
Dans cet exemple, on a 3 mots ayant chacun 3 réponses possibles dont 1 bonne, mais l'exercice est implémenté comme un QCM de 9 choix possibles ; on peut tout à fait cocher les 3 choix pour "narrator".
</details>
**Données à extraire :**
- [ ] Consigne -> `<div id="STY_question">`
- [ ] Choix de réponses
- [x] Correction -> dans la fonction `entrerDonnees()`, `exo.tabStylesR[nr] = CODE_V` ou `CODE_F` pour chaque valeur de `nr`
- [x] Commentaires de succès et d'échec -> `divCmtSucces` et `divCmtSugg#`*(cf. commentaires d'activité)*
- [ ] Consigne -\>`<div id="STY_question">`
- [ ] Choix de réponses
- [x] Correction -\> dans la fonction `entrerDonnees()`, `exo.tabStylesR[nr] = CODE_V` ou `CODE_F` pour chaque valeur de `nr`
- [x] Commentaires de succès et d'échec -\>`divCmtSucces` et `divCmtSugg#` _(cf. commentaires d'activité)_
### ExerciceQM
*(Question Multiple?)*
Comme ExerciceQC mais avec plusieurs questions, chacune ayant une seule bonne réponse.
_(Question Multiple?)_\
Comme ExerciceQC mais avec plusieurs questions, chacune ayant une seule bonne réponse.\
- [ ] Choix de réponses -> tableau dans `<div id="STY_texteQM">`, chaque ligne (`<tr>`) est une question, chaque cellule de colonne (`<td>`) est une case à cocher. Son `id` indique aussi ses coordonnées (ex: `id="lienRepImg13"` = ligne 1 choix 3)
- [ ] Correction -> dans la fonction `entrerDonnees()`, `exo.tabStylesR[nr] = '3'` indiquent le numéro du choix correct pour chaque numéro de ligne `nr`
- [x] Commentaires de succès et d'échec -> `divCmtSucces` et `divCmtSugg#`*(cf. commentaires d'activité)*
- [ ] Consigne -\>`<div id="STY_question">`
- [ ] Choix de réponses -\> tableau dans `<div id="STY_texteQM">`, chaque ligne (`<tr>`) est une question, chaque cellule de colonne (`<td>`) est une case à cocher. Son `id` indique aussi ses coordonnées (ex: `id="lienRepImg13"` = ligne 1 choix 3)
- [ ] Correction -\> dans la fonction `entrerDonnees()`, `exo.tabStylesR[nr] = '3'` indiquent le numéro du choix correct pour chaque numéro de ligne `nr`
- [x] Commentaires de succès et d'échec -\>`divCmtSucces` et `divCmtSugg#` _(cf. commentaires d'activité)_
### ExerciceTAT
Un texte à trous, avec pour chaque "trou" une liste déroulante de choix de mots.
Un texte à trous, avec pour chaque "trou" une liste déroulante de choix de mots.\
**Quantité :** 12
<details><summary>Exemple</summary>
<details>
<summary>Exemple</summary>
`pg20.html`, page _"Ecoutez et complétez (2)"_ dans la sous-partie _"> Reconnaître les déterminants"_
`pg20.html`, page _"Ecoutez et complétez (2)"_ dans la sous-partie _"\> Reconnaître les déterminants"_\
- [ ] Éléments à déplacer -> éléments `<div id="exoGDd#">` (le `d` est pour *déplaçable*, et est suivi de son numéro/ID)
- [ ] Cibles de déplacement -> éléments `<div id="exoGDc#">` (le `c` est pour *cible*, suivi aussi de son numéro/ID)
- [ ] Correction -> liste de `new PaireGD(deplacable, cible, correct, decalageX, decalageY)` indiquent pour chaque déplaçable sa cible associée et si il est juste (`ng` = faux, `nw` = juste).
- [ ] Positions de tous les éléments -> offsets CSS `absolute`, sûrement à refaire manuellement.
- [x] Commentaires de succès et d'échec -> `divCmtSucces` et `divCmtSugg#`*(cf. commentaires d'activité)*
- [ ] Consigne -\>`<div id="STY_question">`
- [ ] Éléments à déplacer -\> éléments `<div id="exoGDd#">` (le `d` est pour _déplaçable_, et est suivi de son numéro/ID)
- [ ] Cibles de déplacement -\> éléments `<div id="exoGDc#">` (le `c` est pour _cible_, suivi aussi de son numéro/ID)
- [ ] Correction -\> liste de `new PaireGD(deplacable, cible, correct, decalageX, decalageY)` indiquent pour chaque déplaçable sa cible associée et si il est juste (`ng` = faux, `nw` = juste).
- [ ] Positions de tous les éléments -\> offsets CSS `absolute`, sûrement à refaire manuellement.
- [x] Commentaires de succès et d'échec -\>`divCmtSucces` et `divCmtSugg#` _(cf. commentaires d'activité)_
### Inutilisés
ExerciceCURS, ExerciceEXP, ExerciceSEQ
ExerciceCURS, ExerciceEXP, ExerciceSEQ
---
----
## Pages d'aide ou "docs"
Dans `contenu/pages/`, les fichiers `*.htm` et `pgd###.html` sont des pages d'aide. Au lieu d'être chargées dans la section centrale, elles peuvent être ouvertes dans une nouvelle fenêtre pop-up avec la fonction `SCO_ouvrirDoc()`, souvent appelée depuis un lien `<a>` dans les pages classiques.
```html
cliquez pour voir la définition d'un <ahref="javascript:parent.SCO_ouvrirDoc('pgd171','PAGE')">phonème</a>
```
Ces pages peuvent inclure des objets Flash comme les autres, mais pas d'exercice.
## Contenus des pages
### Commentaires
Certains exercices ont des commentaires, des blocs HTML structurés chargés dans une `<div id="zoneInvisible">`, qui sont déplacés dans la `<div id="STY_zoneCommentaire">` à droite en réponse à certaines actions.
- Commentaire de succès : `<div id="divCmtSucces">`
- Commentaire d'échec : `<div id="divSugg#">`, numérotés à partir de 1
- Autres commentaires : `<div id="divCmt#">`, numérotés à partir de 1, contiennent un petit texte d'aide.
...
...
@@ -209,22 +244,28 @@ Certains exercices ont des commentaires, des blocs HTML structurés chargés dan
:warning: Les commentaires **peuvent contenir de la mise en forme et des objets Flash** (peut-être même des images ?)
### Images
Les images intégrées dans le contenu d'une page sont reconnaissables par un `id="MosImg###`, à la différence de celles utilisées pour l'UI (boutons). Leur chemin est toujours dans `contenu/media/`.
Idem que Macao12 avec `imsmanifest.xml`, mais le nommage devient `seq######`
## Sous-parties
Idem que Macao12, mais le nommage devient `act######`. De même, le fichier `sco/MosEtp###.html` devient `sco/act######.html`.
Idem que Macao12, mais le nommage devient `act######`. De même, le fichier `sco/MosEtp###.html` devient `sco/act######.html`.\
Des fichiers XML `sco/md_act######.xml` font leur apparition pour chaque sous-partie, mais contiennent des métadonnées pour SCORM qui ne nous intéressent pas.
À la fin du `imsmanifest.xml`, un tag `<resource ... identifier="rsrcact######" ...>` décrit les dépendances de la sous-partie, sous la forme d'une liste de fichiers : pages `pg###.html`, images, SWFs... Potentiellement utile, ou bien redondant si on les retrouve dans le contenu HTML des pages.
...
...
@@ -234,9 +275,11 @@ Même format pour le contenu (JavaScript) de la sous-partie, avec `new MosSCO(..
Changements dans le format des réponses, toutes les réponses sont maintenant obfusquées :
Le texte à trous existe maintenant en variante "sélection" (menu déroulant) et "libre" (champ texte), tous les deux des `new ExerciceTAT()`. La différence semble se remarquer avec des lignes de la forme
Heureusement la fonction de décodage `decodeX()` est statique (clé fixe, ne dépend pas d'autres attributs de l'activité) : [source](https://gitlab.tetras-libre.fr/macao/macao-legacy/blob/main/Basilisk/MACAO/macao_3/MosMtr/scripts/contenu/ClasseExerciceTAT.js#L774)
Autre différence, le texte à trous existe en variante "sélection" (menu déroulant) et "libre" (champ texte), tous les deux des `new ExerciceTAT()`. La différence semble se remarquer avec des lignes de la forme
Le 2e paramètre indique à quel champ appartient la réponse. Le troisième indique la correction, mais ce n'est plus simplement `"ng"` pour faux ou `nw` pour juste, mais une valeur numérique. La logique se passe dans la fonction `exo_ajouterReponse(...)` ([source](https://gitlab.tetras-libre.fr/macao/macao-legacy/blob/main/Basilisk/MACAO/macao_3/MosMtr/scripts/contenu/ClasseExerciceTAT.js#L75))