diff --git a/tetras_extraction/macao_12/result/macao_content.ttl b/tetras_extraction/macao_12/result/macao_content.ttl index 173cf3dbb63815fcce5108369546dd9d3fa29ec1..c1313694b498e9caf30447e53fb58470a63b1858 100644 --- a/tetras_extraction/macao_12/result/macao_content.ttl +++ b/tetras_extraction/macao_12/result/macao_content.ttl @@ -16,15 +16,18 @@ :titre "Présentation" ; rdfs:subClassOf :MacaoRoot . -:pg10 a :Page, +:pg10 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (10)" ; :__protege_display_name "09 | pg10 | Les symboles phonétiques (10)" ; + :id "pg10" ; :index 9 ; :titre "Les symboles phonétiques (10)" ; rdfs:subClassOf :MosEtp171 . -:pg1000 a :Page, +:pg1000 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (9)" ; :__protege_display_name "18 | pg1000 | Choisir une transcription (9)" ; @@ -76,19 +79,23 @@ </table> </div> """ ; + :id "pg1000" ; :index 18 ; :titre "Choisir une transcription (9)" ; rdfs:subClassOf :MosEtp644 . -:pg101 a :Page, +:pg101 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Repérer l'accent primaire et l'accent secondaire" ; :__protege_display_name "02 | pg101 | Repérer l'accent primaire et l'accent secondaire" ; + :id "pg101" ; :index 2 ; :titre "Repérer l'accent primaire et l'accent secondaire" ; rdfs:subClassOf :MosEtp369 . -:pg108 a :Page, +:pg108 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une prononciation (3)" ; :__protege_display_name "09 | pg108 | Choisir une prononciation (3)" ; @@ -99,11 +106,13 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous trompez, la transcription correspond au premier mot entendu : <i>thing</i>.<br><br><br><br> </p></div> """ ; + :id "pg108" ; :index 9 ; :titre "Choisir une prononciation (3)" ; rdfs:subClassOf :MosEtp644 . -:pg112 a :Page, +:pg112 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (2)" ; :__protege_display_name "08 | pg112 | Choisir l'accentuation adéquate (2)" ; @@ -126,11 +135,13 @@ <p align=""><font color="#a60a69"><br></font> <br><br><br><br><br><br><br><br><br><font color="#a60a69"><span style="FONT-SIZE: 90%"><font color="#a60a69">Voici le corrigé :<br><br>The soldier decided<br>to <i><b>desert</b></i> before reaching the <i><b>desert</b></i>.<br></font></span><br> <img align="center" border="0" src="../media/phon_desert_2.png" id="MosImg1655" style="visibility:hidden"> <img align="center" border="0" src="../media/phon_desert_1.png" id="MosImg2193" style="visibility:hidden"></font></p></div> """ ; + :id "pg112" ; :index 8 ; :titre "Choisir l'accentuation adéquate (2)" ; rdfs:subClassOf :MosEtp746 . -:pg149 a :Page, +:pg149 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir entre deux mots (1)" ; :__protege_display_name "12 | pg149 | Choisir entre deux mots (1)" ; @@ -182,11 +193,13 @@ </table> </div> """ ; + :id "pg149" ; :index 12 ; :titre "Choisir entre deux mots (1)" ; rdfs:subClassOf :MosEtp644 . -:pg155 a :Page, +:pg155 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Distinguer d'éventuelles variantes (4)" ; :__protege_display_name "07 | pg155 | Distinguer d'éventuelles variantes (4)" ; @@ -212,51 +225,63 @@ <p align=""><i>In </i>est prononcé dans les deux énoncés sans différence notable. Prenez le temps de réécouter chaque énoncé en cliquant sur le bouton.</p></div> """ ; + :id "pg155" ; :index 7 ; :titre "Distinguer d'éventuelles variantes (4)" ; rdfs:subClassOf :MosEtp335 . -:pg156 a :Page, +:pg156 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'accentuation des syllabes (1)" ; :__protege_display_name "00 | pg156 | L'accentuation des syllabes (1)" ; + :id "pg156" ; :index 0 ; :titre "L'accentuation des syllabes (1)" ; rdfs:subClassOf :MosEtp777 . -:pg162 a :Page, +:pg162 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire BE (1)" ; :__protege_display_name "14 | pg162 | L'auxiliaire BE (1)" ; + :id "pg162" ; :index 14 ; :titre "L'auxiliaire BE (1)" ; rdfs:subClassOf :MosEtp210 . -:pg170 a :Page, +:pg170 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (3)" ; :__protege_display_name "02 | pg170 | Les symboles phonétiques (3)" ; + :id "pg170" ; :index 2 ; :titre "Les symboles phonétiques (3)" ; rdfs:subClassOf :MosEtp171 . -:pg175 a :Page, +:pg175 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : liste des phonèmes" ; :__protege_display_name "13 | pg175 | Mémento : liste des phonèmes" ; + :id "pg175" ; :index 13 ; :titre "Mémento : liste des phonèmes" ; rdfs:subClassOf :MosEtp171 . -:pg182 a :Page, +:pg182 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Désigner la syllabe la plus accentuée (2)" ; :__protege_display_name "01 | pg182 | Désigner la syllabe la plus accentuée (2)" ; + :id "pg182" ; :index 1 ; :titre "Désigner la syllabe la plus accentuée (2)" ; rdfs:subClassOf :MosEtp369 . -:pg20 a :Page, +:pg20 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Ecoutez et complétez (2)" ; :__protege_display_name "02 | pg20 | Ecoutez et complétez (2)" ; @@ -271,11 +296,13 @@ until they are ripe and rosy, and then we shall pick them and put them quite away <b>for the</b> winter-time'.</p></div> """ ; + :id "pg20" ; :index 2 ; :titre "Ecoutez et complétez (2)" ; rdfs:subClassOf :MosEtp558 . -:pg205 a :Page, +:pg205 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (7)" ; :__protege_display_name "06 | pg205 | Choisir une transcription (7)" ; @@ -287,11 +314,13 @@ </p> <p align=""><br><br><br><br> </p></div> """ ; + :id "pg205" ; :index 6 ; :titre "Choisir une transcription (7)" ; rdfs:subClassOf :MosEtp644 . -:pg2051 a :Page, +:pg2051 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (11)" ; :__protege_display_name "20 | pg2051 | Choisir une transcription (11)" ; @@ -347,11 +376,13 @@ </table> </div> """ ; + :id "pg2051" ; :index 20 ; :titre "Choisir une transcription (11)" ; rdfs:subClassOf :MosEtp644 . -:pg217 a :Page, +:pg217 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (1)" ; :__protege_display_name "00 | pg217 | Choisir une transcription (1)" ; @@ -361,11 +392,13 @@ <br><br><img src="../media/phon_thin.png" id="MosImg34" border="0" align="center" style="visibility:hidden"> </div> """ ; + :id "pg217" ; :index 0 ; :titre "Choisir une transcription (1)" ; rdfs:subClassOf :MosEtp644 . -:pg220 a :Page, +:pg220 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (3)" ; :__protege_display_name "16 | pg220 | Spécificité des voyelles (3)" ; @@ -375,11 +408,13 @@ sons mais ils ne sont pas prononcés de manière égale. Réécoutez le mot. </div> """ ; + :id "pg220" ; :index 16 ; :titre "Spécificité des voyelles (3)" ; rdfs:subClassOf :MosEtp171 . -:pg226 a :Page, +:pg226 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (5)" ; :__protege_display_name "19 | pg226 | Spécificité des voyelles (5)" ; @@ -389,11 +424,13 @@ mots. </div> """ ; + :id "pg226" ; :index 19 ; :titre "Spécificité des voyelles (5)" ; rdfs:subClassOf :MosEtp171 . -:pg228 a :Page, +:pg228 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (4)" ; :__protege_display_name "10 | pg228 | Choisir l'accentuation adéquate (4)" ; @@ -410,19 +447,23 @@ """<div id="divSugg4" onclick="SPE_clicDansBulle(event,'divSugg4')"><font color="#a60a69"><span style="FONT-SIZE: 90%"><font color="#a60a69"><br><br><br><br><br><br><br><br><br><br><br>Voici le corrigé : <br><br>How can <br>I <i><b>intimate </b></i>this to my most <i><b>intimate</b></i> friend ?</font></span><br></font><br><font color="#a60a69"> <img align="center" border="0" src="../media/phon_intimate_1.png" id="MosImg84443" style="visibility:hidden"> </font><img align="center" border="0" src="../media/phon_intimate_2.png" id="MosImg649542" style="visibility:hidden"><br> </div> """ ; + :id "pg228" ; :index 10 ; :titre "Choisir l'accentuation adéquate (4)" ; rdfs:subClassOf :MosEtp746 . -:pg239 a :Page, +:pg239 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Syllabe orale" ; :__protege_display_name "03 | pg239 | Syllabe orale" ; + :id "pg239" ; :index 3 ; :titre "Syllabe orale" ; rdfs:subClassOf :MosEtp555 . -:pg262 a :Page, +:pg262 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Compter les syllabes orales (1)" ; :__protege_display_name "04 | pg262 | Compter les syllabes orales (1)" ; @@ -439,19 +480,23 @@ <p align=""><br>average: 2 syllabes.</p> <p align=""><br>interested: 3 syllabes.</p></div> """ ; + :id "pg262" ; :index 4 ; :titre "Compter les syllabes orales (1)" ; rdfs:subClassOf :MosEtp129 . -:pg278 a :Page, +:pg278 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (12)" ; :__protege_display_name "11 | pg278 | Les symboles phonétiques (12)" ; + :id "pg278" ; :index 11 ; :titre "Les symboles phonétiques (12)" ; rdfs:subClassOf :MosEtp171 . -:pg288 a :Page, +:pg288 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : l'accentuation des syllabes (2)" ; :__protege_display_name "12 | pg288 | Mémento : l'accentuation des syllabes (2)" ; @@ -477,11 +522,13 @@ comportant une et une seule voyelle à laquelle peuvent s'adjoindre une ou plusieurs consonnes. </p> <p align=""> </p></div> """ ; + :id "pg288" ; :index 12 ; :titre "Mémento : l'accentuation des syllabes (2)" ; rdfs:subClassOf :MosEtp129 . -:pg293 a :Page, +:pg293 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (5)" ; :__protege_display_name "11 | pg293 | Choisir l'accentuation adéquate (5)" ; @@ -505,37 +552,45 @@ <p align=""><font color="#a60a69"><br></font> <br><br><br><br><br><br><br><br></p><font color="#a60a69"><font color="#a60a69"><p align=""><font color="#a60a69"><span style="FONT-SIZE: 90%"><font color="#a60a69">Voici le corrigé :<br><br>The Beatles wanted the technicians to <i><b>record</b></i> their music on a colour <i><b>record</b></i></font><font color="#a60a69">? </font></span></font><font color="#a60a69"><br><br><img align="center" border="0" src="../media/phon_record_1.png" id="MosImg83103" style="visibility:hidden"> <img align="center" border="0" src="../media/phon_record_2.png" id="MosImg31934" style="visibility:hidden"></font></p></font></font></div> """ ; + :id "pg293" ; :index 11 ; :titre "Choisir l'accentuation adéquate (5)" ; rdfs:subClassOf :MosEtp746 . -:pg299 a :Page, +:pg299 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : longueur de la voyelle" ; :__protege_display_name "21 | pg299 | Mémento : longueur de la voyelle" ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg299" ; :index 21 ; :titre "Mémento : longueur de la voyelle" ; rdfs:subClassOf :MosEtp171 . -:pg2991 a :Page, +:pg2991 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Voyelle réduite" ; :__protege_display_name "02 | pg2991 | Voyelle réduite" ; + :id "pg2991" ; :index 2 ; :titre "Voyelle réduite" ; rdfs:subClassOf :MosEtp555 . -:pg301 a :Page, +:pg301 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Syllabe écrite" ; :__protege_display_name "04 | pg301 | Syllabe écrite" ; + :id "pg301" ; :index 4 ; :titre "Syllabe écrite" ; rdfs:subClassOf :MosEtp555 . -:pg310 a :Page, +:pg310 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Remarquer la syllabe la plus accentuée (1)" ; :__protege_display_name "09 | pg310 | Remarquer la syllabe la plus accentuée (1)" ; @@ -544,11 +599,13 @@ voyelle à laquelle peuvent s'adjoindre une ou plusieurs consonnes.</p> <p align=""> </p></div> """ ; + :id "pg310" ; :index 9 ; :titre "Remarquer la syllabe la plus accentuée (1)" ; rdfs:subClassOf :MosEtp129 . -:pg313 a :Page, +:pg313 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Lire des transcriptions phonétiques (2)" ; :__protege_display_name "14 | pg313 | Lire des transcriptions phonétiques (2)" ; @@ -574,11 +631,13 @@ """ ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg313" ; :index 14 ; :titre "Lire des transcriptions phonétiques (2)" ; rdfs:subClassOf :MosEtp746 . -:pg331 a :Page, +:pg331 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Trouver l'accent secondaire (2)" ; :__protege_display_name "04 | pg331 | Trouver l'accent secondaire (2)" ; @@ -683,11 +742,13 @@ </table> </div> """ ; + :id "pg331" ; :index 4 ; :titre "Trouver l'accent secondaire (2)" ; rdfs:subClassOf :MosEtp369 . -:pg334 a :Page, +:pg334 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Comparer ''syllabes écrites'' et ''syllabes orales''" ; :__protege_display_name "08 | pg334 | Comparer ''syllabes écrites'' et ''syllabes orales''" ; @@ -701,27 +762,33 @@ de l'école primaire où l'on a pu avoir l'habitude d'apprendre à lire en découpant les mots. </div> """ ; + :id "pg334" ; :index 8 ; :titre "Comparer ''syllabes écrites'' et ''syllabes orales''" ; rdfs:subClassOf :MosEtp129 . -:pg359 a :Page, +:pg359 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire MUST (2)" ; :__protege_display_name "01 | pg359 | L'auxiliaire MUST (2)" ; + :id "pg359" ; :index 1 ; :titre "L'auxiliaire MUST (2)" ; rdfs:subClassOf :MosEtp210 . -:pg368 a :Page, +:pg368 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Vérifier la place de l'accent primaire (1)" ; :__protege_display_name "00 | pg368 | Vérifier la place de l'accent primaire (1)" ; + :id "pg368" ; :index 0 ; :titre "Vérifier la place de l'accent primaire (1)" ; rdfs:subClassOf :MosEtp746 . -:pg376 a :Page, +:pg376 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Ecouter les mots d'une syllabe" ; :__protege_display_name "03 | pg376 | Ecouter les mots d'une syllabe" ; @@ -730,19 +797,23 @@ laquelle peuvent s'adjoindre une ou plusieurs consonnes. </div> """ ; + :id "pg376" ; :index 3 ; :titre "Ecouter les mots d'une syllabe" ; rdfs:subClassOf :MosEtp129 . -:pg379 a :Page, +:pg379 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire WILL (3)" ; :__protege_display_name "04 | pg379 | L'auxiliaire WILL (3)" ; + :id "pg379" ; :index 4 ; :titre "L'auxiliaire WILL (3)" ; rdfs:subClassOf :MosEtp210 . -:pg381 a :Page, +:pg381 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire MUST (1)" ; :__protege_display_name "00 | pg381 | L'auxiliaire MUST (1)" ; @@ -758,11 +829,13 @@ de la <b><a class="STY_lienDansZoneComt" href="javascript:parent.SCO_ouvrirDoc('voyelle','htm')">voyelle</a></b>. Vous pouvez réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg381" ; :index 0 ; :titre "L'auxiliaire MUST (1)" ; rdfs:subClassOf :MosEtp210 . -:pg386 a :Page, +:pg386 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une prononciation (2)" ; :__protege_display_name "08 | pg386 | Choisir une prononciation (2)" ; @@ -773,11 +846,13 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous trompez, la transcription correspond au second mot entendu : <i>ear</i>.<br><br><br><br> </p></div> """ ; + :id "pg386" ; :index 8 ; :titre "Choisir une prononciation (2)" ; rdfs:subClassOf :MosEtp644 . -:pg396 a :Page, +:pg396 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Compter les syllabes orales (2)" ; :__protege_display_name "05 | pg396 | Compter les syllabes orales (2)" ; @@ -796,21 +871,25 @@ <p align=""><br>precise : 2 syllabes.</p> <p align=""><br><br>differently : 3 syllabes.</p></div> """ ; + :id "pg396" ; :index 5 ; :titre "Compter les syllabes orales (2)" ; rdfs:subClassOf :MosEtp129 . -:pg397 a :Page, +:pg397 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Longueur de la voyelle" ; :__protege_display_name "00 | pg397 | Longueur de la voyelle" ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg397" ; :index 0 ; :titre "Longueur de la voyelle" ; rdfs:subClassOf :MosEtp690 . -:pg400 a :Page, +:pg400 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Lire des transcriptions phonétiques (1)" ; :__protege_display_name "13 | pg400 | Lire des transcriptions phonétiques (1)" ; @@ -835,11 +914,13 @@ """ ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg400" ; :index 13 ; :titre "Lire des transcriptions phonétiques (1)" ; rdfs:subClassOf :MosEtp746 . -:pg401 a :Page, +:pg401 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire BE (2)" ; :__protege_display_name "15 | pg401 | L'auxiliaire BE (2)" ; @@ -855,19 +936,23 @@ de la voyelle</a></b> de chacun des auxiliaires. On entend une voyelle plus réduite dans le premier énoncé que dans le second. Vous pouvez réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg401" ; :index 15 ; :titre "L'auxiliaire BE (2)" ; rdfs:subClassOf :MosEtp210 . -:pg409 a :Page, +:pg409 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (13)" ; :__protege_display_name "12 | pg409 | Les symboles phonétiques (13)" ; + :id "pg409" ; :index 12 ; :titre "Les symboles phonétiques (13)" ; rdfs:subClassOf :MosEtp171 . -:pg41 a :Page, +:pg41 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (4)" ; :__protege_display_name "17 | pg41 | Spécificité des voyelles (4)" ; @@ -877,19 +962,23 @@ sons mais ils ne sont pas prononcés de manière égale. Réécoutez le mot. </div> """ ; + :id "pg41" ; :index 17 ; :titre "Spécificité des voyelles (4)" ; rdfs:subClassOf :MosEtp171 . -:pg435 a :Page, +:pg435 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Consonne" ; :__protege_display_name "01 | pg435 | Consonne" ; + :id "pg435" ; :index 1 ; :titre "Consonne" ; rdfs:subClassOf :MosEtp555 . -:pg436 a :Page, +:pg436 a :ExerciceGD, + :Page, owl:NamedIndividual ; rdfs:label "Placer les accents primaire et secondaire (3)" ; :__protege_display_name "06 | pg436 | Placer les accents primaire et secondaire (3)" ; @@ -904,29 +993,35 @@ """<div id="divSugg3" onclick="SPE_clicDansBulle(event,'divSugg3')"><p align=""><font color="#000000"><br><br><br><br><br>Comparez vos réponses au corrigé. Vous pouvez réécouter chaque mot :<br><br><br><br><br></font><br><br><br><img align="center" border="0" src="../media/phon_computer_p57_juste.png" id="MosImg604" style="visibility:hidden"><br><br><br><br><img align="center" border="0" src="../media/phon_identify_p57_juste.png" id="MosImg474" style="visibility:hidden"><br><br><br><img align="center" border="0" src="../media/phon_narrativ_justep57.png" id="MosImg498" style="visibility:hidden"><br><br><font color="#a60a69">Vous pouvez remarquer que l'accent primaire ne porte jamais sur une syllabe ne comportant qu'une voyelle réduite (ici, /<img align="absMiddle" border="0" src="../media/about.png" width="12" height="12" id="MosImg845873" style="visibility:hidden">/ ).</font></p></div> """ ; + :id "pg436" ; :index 6 ; :titre "Placer les accents primaire et secondaire (3)" ; rdfs:subClassOf :MosEtp746 . -:pg437 a :Page, +:pg437 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire CAN (1)" ; :__protege_display_name "10 | pg437 | L'auxiliaire CAN (1)" ; + :id "pg437" ; :index 10 ; :titre "L'auxiliaire CAN (1)" ; rdfs:subClassOf :MosEtp210 . -:pg44 a :Page, +:pg44 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : voyelles lâches et voyelles tendues" ; :__protege_display_name "18 | pg44 | Mémento : voyelles lâches et voyelles tendues" ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg44" ; :index 18 ; :titre "Mémento : voyelles lâches et voyelles tendues" ; rdfs:subClassOf :MosEtp171 . -:pg444 a :Page, +:pg444 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Reconnaître le mot commun (5)" ; :__protege_display_name "08 | pg444 | Reconnaître le mot commun (5)" ; @@ -936,19 +1031,23 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Non. </p> <p align="">FOR est le seul mot commun aux deux énoncés. Vous pouvez réécouter les énoncés.</p></div> """ ; + :id "pg444" ; :index 8 ; :titre "Reconnaître le mot commun (5)" ; rdfs:subClassOf :MosEtp335 . -:pg448 a :Page, +:pg448 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire CAN (4)" ; :__protege_display_name "13 | pg448 | L'auxiliaire CAN (4)" ; + :id "pg448" ; :index 13 ; :titre "L'auxiliaire CAN (4)" ; rdfs:subClassOf :MosEtp210 . -:pg449 a :Page, +:pg449 a :ExerciceGD, + :Page, owl:NamedIndividual ; rdfs:label "Placer les accents primaire et secondaire (2)" ; :__protege_display_name "05 | pg449 | Placer les accents primaire et secondaire (2)" ; @@ -972,19 +1071,23 @@ """<div id="divSugg6" onclick="SPE_clicDansBulle(event,'divSugg6')"><p align=""><font color="#000000"><br><br><br><br><br>Comparez vos réponses au corrigé. Vous pouvez réécouter chaque mot :<br><br><br><br><br><br></font><br><br><img align="center" border="0" src="../media/phon_theoretician_p54_just.png" id="MosImg549" style="visibility:hidden"><br><br><br><br><img align="center" border="0" src="../media/phon_university__p54_juste.png" id="MosImg7745" style="visibility:hidden"><br><br><br><img align="center" border="0" src="../media/phon_recognition_54_juste.png" id="MosImg1" style="visibility:hidden"><br><br><font color="#a60a69">Vous pouvez remarquer que l'accent primaire ne porte jamais sur une syllabe ne comportant qu'une voyelle réduite (ici, /<img align="absMiddle" border="0" src="../media/about.png" width="12" height="12" id="MosImg845873" style="visibility:hidden">/ ).</font></p></div> """ ; + :id "pg449" ; :index 5 ; :titre "Placer les accents primaire et secondaire (2)" ; rdfs:subClassOf :MosEtp746 . -:pg455 a :Page, +:pg455 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Désigner la syllabe la plus accentuée (1)" ; :__protege_display_name "00 | pg455 | Désigner la syllabe la plus accentuée (1)" ; + :id "pg455" ; :index 0 ; :titre "Désigner la syllabe la plus accentuée (1)" ; rdfs:subClassOf :MosEtp369 . -:pg491 a :Page, +:pg491 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (4)" ; :__protege_display_name "03 | pg491 | Choisir une transcription (4)" ; @@ -994,19 +1097,23 @@ <br><br><img src="../media/phon_dark.png" id="MosImg78" border="0" align="center" style="visibility:hidden"> </div> """ ; + :id "pg491" ; :index 3 ; :titre "Choisir une transcription (4)" ; rdfs:subClassOf :MosEtp644 . -:pg496 a :Page, +:pg496 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "crédits et licence" ; :__protege_display_name "00 | pg496 | crédits et licence" ; + :id "pg496" ; :index 0 ; :titre "crédits et licence" ; rdfs:subClassOf :MosEtp342 . -:pg503 a :Page, +:pg503 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Ecoutez et complétez (3)" ; :__protege_display_name "03 | pg503 | Ecoutez et complétez (3)" ; @@ -1019,43 +1126,53 @@ grass</b>, so, one day, my little sister looked <b>under the tree</b> and found <b>a nice big windfall</b> on the grass and she took it in for my mother to wash.<br></p></div> """ ; + :id "pg503" ; :index 3 ; :titre "Ecoutez et complétez (3)" ; rdfs:subClassOf :MosEtp558 . -:pg512 a :Page, +:pg512 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "La prononciation des prépositions : mémento" ; :__protege_display_name "10 | pg512 | La prononciation des prépositions : mémento" ; + :id "pg512" ; :index 10 ; :titre "La prononciation des prépositions : mémento" ; rdfs:subClassOf :MosEtp335 . -:pg5121 a :Page, +:pg5121 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "La prononciation des déterminants : mémento" ; :__protege_display_name "04 | pg5121 | La prononciation des déterminants : mémento" ; + :id "pg5121" ; :index 4 ; :titre "La prononciation des déterminants : mémento" ; rdfs:subClassOf :MosEtp558 . -:pg5122 a :Page, +:pg5122 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'accentuation des auxiliaires : mémento (1)" ; :__protege_display_name "16 | pg5122 | L'accentuation des auxiliaires : mémento (1)" ; + :id "pg5122" ; :index 16 ; :titre "L'accentuation des auxiliaires : mémento (1)" ; rdfs:subClassOf :MosEtp210 . -:pg519 a :Page, +:pg519 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'accentuation des syllabes (2)" ; :__protege_display_name "01 | pg519 | L'accentuation des syllabes (2)" ; + :id "pg519" ; :index 1 ; :titre "L'accentuation des syllabes (2)" ; rdfs:subClassOf :MosEtp777 . -:pg52 a :Page, +:pg52 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Reconnaître le mot commun (3)" ; :__protege_display_name "04 | pg52 | Reconnaître le mot commun (3)" ; @@ -1065,19 +1182,23 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous êtes trompé.</p> <p align="">TO est le seul mot commun aux deux énoncés. Vous pouvez réécouter les énoncés.</p></div> """ ; + :id "pg52" ; :index 4 ; :titre "Reconnaître le mot commun (3)" ; rdfs:subClassOf :MosEtp335 . -:pg525 a :Page, +:pg525 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (8)" ; :__protege_display_name "07 | pg525 | Les symboles phonétiques (8)" ; + :id "pg525" ; :index 7 ; :titre "Les symboles phonétiques (8)" ; rdfs:subClassOf :MosEtp171 . -:pg531 a :Page, +:pg531 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire CAN (2)" ; :__protege_display_name "11 | pg531 | L'auxiliaire CAN (2)" ; @@ -1092,27 +1213,33 @@ ; ce n'est pas le cas du deuxième énoncé. Vous pouvez réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg531" ; :index 11 ; :titre "L'auxiliaire CAN (2)" ; rdfs:subClassOf :MosEtp210 . -:pg542 a :Page, +:pg542 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'accentuation des auxiliaires : mémento (2)" ; :__protege_display_name "17 | pg542 | L'accentuation des auxiliaires : mémento (2)" ; + :id "pg542" ; :index 17 ; :titre "L'accentuation des auxiliaires : mémento (2)" ; rdfs:subClassOf :MosEtp210 . -:pg543 a :Page, +:pg543 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire HAVE (4)" ; :__protege_display_name "09 | pg543 | L'auxiliaire HAVE (4)" ; + :id "pg543" ; :index 9 ; :titre "L'auxiliaire HAVE (4)" ; rdfs:subClassOf :MosEtp210 . -:pg545 a :Page, +:pg545 a :ExerciceGD, + :Page, owl:NamedIndividual ; rdfs:label "Compléter une transcription (1) " ; :__protege_display_name "21 | pg545 | Compléter une transcription (1) " ; @@ -1132,19 +1259,23 @@ <p align="">Voici la transcription appropriée : </p> <p align=""><img src="../media/phon_p37_agree_right.png" id="MosImg9" border="0" align="center" style="visibility:hidden"> et <img src="../media/phon_p37_shaking_right1.png" id="MosImg87" border="0" align="center" style="visibility:hidden"></p></div> """ ; + :id "pg545" ; :index 21 ; :titre "Compléter une transcription (1) " ; rdfs:subClassOf :MosEtp644 . -:pg549 a :Page, +:pg549 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Phonèmes liste" ; :__protege_display_name "00 | pg549 | Phonèmes liste" ; + :id "pg549" ; :index 0 ; :titre "Phonèmes liste" ; rdfs:subClassOf :MosEtp918 . -:pg558 a :Page, +:pg558 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Reconnaître le mot commun (2)" ; :__protege_display_name "02 | pg558 | Reconnaître le mot commun (2)" ; @@ -1154,11 +1285,13 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous êtes trompé.</p> <p align="">AT est le seul mot commun aux deux énoncés. Vous pouvez réécouter les énoncés.</p></div> """ ; + :id "pg558" ; :index 2 ; :titre "Reconnaître le mot commun (2)" ; rdfs:subClassOf :MosEtp335 . -:pg561 a :Page, +:pg561 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir entre deux mots (5)" ; :__protege_display_name "16 | pg561 | Choisir entre deux mots (5)" ; @@ -1210,11 +1343,13 @@ </table> </div> """ ; + :id "pg561" ; :index 16 ; :titre "Choisir entre deux mots (5)" ; rdfs:subClassOf :MosEtp644 . -:pg576 a :Page, +:pg576 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une prononciation (1)" ; :__protege_display_name "07 | pg576 | Choisir une prononciation (1)" ; @@ -1225,43 +1360,53 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous trompez, la transcription correspond au premier mot entendu : <i>test</i>.<br><br><br><br> </p></div> """ ; + :id "pg576" ; :index 7 ; :titre "Choisir une prononciation (1)" ; rdfs:subClassOf :MosEtp644 . -:pg578 a :Page, +:pg578 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Utiliser les mémentos" ; :__protege_display_name "00 | pg578 | Utiliser les mémentos" ; + :id "pg578" ; :index 0 ; :titre "Utiliser les mémentos" ; rdfs:subClassOf :MosEtp435 . -:pg584 a :Page, +:pg584 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (6)" ; :__protege_display_name "05 | pg584 | Les symboles phonétiques (6)" ; + :id "pg584" ; :index 5 ; :titre "Les symboles phonétiques (6)" ; rdfs:subClassOf :MosEtp171 . -:pg594 a :Page, +:pg594 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Phonème" ; :__protege_display_name "05 | pg594 | Phonème" ; + :id "pg594" ; :index 5 ; :titre "Phonème" ; rdfs:subClassOf :MosEtp555 . -:pg5981 a :Page, +:pg5981 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (7)" ; :__protege_display_name "06 | pg5981 | Les symboles phonétiques (7)" ; + :id "pg5981" ; :index 6 ; :titre "Les symboles phonétiques (7)" ; rdfs:subClassOf :MosEtp171 . -:pg60 a :Page, +:pg60 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Repérer les syllabes écrites" ; :__protege_display_name "01 | pg60 | Repérer les syllabes écrites" ; @@ -1279,11 +1424,13 @@ <p align=""><br>interesting: 4 "syllabes écrites".</p> <p align=""><br>dangerous: 3 "syllabes écrites".</p></div> """ ; + :id "pg60" ; :index 1 ; :titre "Repérer les syllabes écrites" ; rdfs:subClassOf :MosEtp129 . -:pg608 a :Page, +:pg608 a :ExerciceGD, + :Page, owl:NamedIndividual ; rdfs:label "Compléter une transcription (2) " ; :__protege_display_name "22 | pg608 | Compléter une transcription (2) " ; @@ -1304,11 +1451,13 @@ <p align="">Voici la transcription appropriée : </p> <p align=""> <img align="center" border="0" src="../media/phon_to_right.png" id="MosImg35" style="visibility:hidden"> et <img align="center" border="0" src="../media/phon_about_right.png" id="MosImg88" style="visibility:hidden"></p></div> """ ; + :id "pg608" ; :index 22 ; :titre "Compléter une transcription (2) " ; rdfs:subClassOf :MosEtp644 . -:pg6121 a :Page, +:pg6121 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Vérifier la place de l'accent primaire (4) " ; :__protege_display_name "03 | pg6121 | Vérifier la place de l'accent primaire (4) " ; @@ -1336,11 +1485,13 @@ <p align=""><a class="STY_lienDansZoneComt" href="javascript:parent.SCO_ouvrirDoc('pgd661','PAGE')">Mémento "l'accentuation des syllabes"</a></p></div> """ ; + :id "pg6121" ; :index 3 ; :titre "Vérifier la place de l'accent primaire (4) " ; rdfs:subClassOf :MosEtp746 . -:pg624 a :Page, +:pg624 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Reconnaître le mot commun (1)" ; :__protege_display_name "00 | pg624 | Reconnaître le mot commun (1)" ; @@ -1350,11 +1501,13 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous êtes trompé.</p> <p align="">OF est le seul mot commun aux deux énoncés. Vous pouvez réécouter les énoncés.</p></div> """ ; + :id "pg624" ; :index 0 ; :titre "Reconnaître le mot commun (1)" ; rdfs:subClassOf :MosEtp335 . -:pg6241 a :Page, +:pg6241 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Ecoutez et complétez (1)" ; :__protege_display_name "01 | pg6241 | Ecoutez et complétez (1)" ; @@ -1368,11 +1521,13 @@ sometimes my naughty little sister used to pick <b>some apples</b> and eat them. It <b>was a</b> very easy thing to do because <b>the branches</b> were so low.<br></p></div> """ ; + :id "pg6241" ; :index 1 ; :titre "Ecoutez et complétez (1)" ; rdfs:subClassOf :MosEtp558 . -:pg636 a :Page, +:pg636 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Commentaire" ; :__protege_display_name "02 | pg636 | Commentaire" ; @@ -1386,11 +1541,13 @@ l'école primaire où l'on a pu avoir l'habitude d'apprendre à lire en découpant les mots. </div> """ ; + :id "pg636" ; :index 2 ; :titre "Commentaire" ; rdfs:subClassOf :MosEtp129 . -:pg6361 a :Page, +:pg6361 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir entre deux mots (3)" ; :__protege_display_name "14 | pg6361 | Choisir entre deux mots (3)" ; @@ -1442,11 +1599,13 @@ </table> </div> """ ; + :id "pg6361" ; :index 14 ; :titre "Choisir entre deux mots (3)" ; rdfs:subClassOf :MosEtp644 . -:pg639 a :Page, +:pg639 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (2)" ; :__protege_display_name "15 | pg639 | Spécificité des voyelles (2)" ; @@ -1456,27 +1615,33 @@ 2 sons. Réécoutez le mot. </div> """ ; + :id "pg639" ; :index 15 ; :titre "Spécificité des voyelles (2)" ; rdfs:subClassOf :MosEtp171 . -:pg643 a :Page, +:pg643 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Ecoutez..." ; :__protege_display_name "00 | pg643 | Ecoutez..." ; + :id "pg643" ; :index 0 ; :titre "Ecoutez..." ; rdfs:subClassOf :MosEtp558 . -:pg651 a :Page, +:pg651 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (5)" ; :__protege_display_name "04 | pg651 | Les symboles phonétiques (5)" ; + :id "pg651" ; :index 4 ; :titre "Les symboles phonétiques (5)" ; rdfs:subClassOf :MosEtp171 . -:pg665 a :Page, +:pg665 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (1)" ; :__protege_display_name "07 | pg665 | Choisir l'accentuation adéquate (1)" ; @@ -1503,27 +1668,33 @@ :<br><br><font color="#a60a69">The farmer refused<br>to <b><i>produce </i></b>organic <i><b>produce</b></i>.<br></font><br> <img align="center" border="0" src="../media/phon_produce_12.png" id="MosImg307831" style="visibility:hidden"> <img align="center" border="0" src="../media/phon_produce_2.png" id="MosImg5601539" style="visibility:hidden"></font></p> </div> """ ; + :id "pg665" ; :index 7 ; :titre "Choisir l'accentuation adéquate (1)" ; rdfs:subClassOf :MosEtp746 . -:pg672 a :Page, +:pg672 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : l'accentuation des syllabes" ; :__protege_display_name "05 | pg672 | Mémento : l'accentuation des syllabes" ; + :id "pg672" ; :index 5 ; :titre "Mémento : l'accentuation des syllabes" ; rdfs:subClassOf :MosEtp369 . -:pg673 a :Page, +:pg673 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (2)" ; :__protege_display_name "01 | pg673 | Les symboles phonétiques (2)" ; + :id "pg673" ; :index 1 ; :titre "Les symboles phonétiques (2)" ; rdfs:subClassOf :MosEtp171 . -:pg6811 a :Page, +:pg6811 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Vérifier la place de l'accent primaire (2) " ; :__protege_display_name "01 | pg6811 | Vérifier la place de l'accent primaire (2) " ; @@ -1549,19 +1720,23 @@ <p align=""><a class="STY_lienDansZoneComt" href="javascript:parent.SCO_ouvrirDoc('pgd661','PAGE')">Mémento : l'accentuation des syllabes</a></p></div> """ ; + :id "pg6811" ; :index 1 ; :titre "Vérifier la place de l'accent primaire (2) " ; rdfs:subClassOf :MosEtp746 . -:pg686 a :Page, +:pg686 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'accentuation des auxiliaires" ; :__protege_display_name "00 | pg686 | L'accentuation des auxiliaires" ; + :id "pg686" ; :index 0 ; :titre "L'accentuation des auxiliaires" ; rdfs:subClassOf :MosEtp252 . -:pg699 a :Page, +:pg699 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir entre deux mots (4)" ; :__protege_display_name "15 | pg699 | Choisir entre deux mots (4)" ; @@ -1613,11 +1788,13 @@ </table> </div> """ ; + :id "pg699" ; :index 15 ; :titre "Choisir entre deux mots (4)" ; rdfs:subClassOf :MosEtp644 . -:pg71 a :Page, +:pg71 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (6)" ; :__protege_display_name "12 | pg71 | Choisir l'accentuation adéquate (6)" ; @@ -1639,11 +1816,13 @@ <p align=""><font color="#a60a69"><br></font> <br><br><br><br><br><br><br><font color="#a60a69"><font color="#a60a69"><font color="#a60a69"><font color="#a60a69"><span style="FONT-SIZE: 90%"><font color="#a60a69"><br>Voici le corrigé :<br><br>The<br><i><b>content</b></i> of her letter gave me <i><b>content</b></i> and joy.</font></span><br></font><font color="#a60a69"><br><img align="center" border="0" src="../media/phon_content_1.png" id="MosImg5772" style="visibility:hidden"> <img align="center" border="0" src="../media/phon_content_2.png" id="MosImg52822" style="visibility:hidden"></font></font></font></font> </p></div> """ ; + :id "pg71" ; :index 12 ; :titre "Choisir l'accentuation adéquate (6)" ; rdfs:subClassOf :MosEtp746 . -:pg713 a :Page, +:pg713 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (6)" ; :__protege_display_name "20 | pg713 | Spécificité des voyelles (6)" ; @@ -1653,11 +1832,13 @@ mots. </div> """ ; + :id "pg713" ; :index 20 ; :titre "Spécificité des voyelles (6)" ; rdfs:subClassOf :MosEtp171 . -:pg717 a :Page, +:pg717 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Remarquer la syllabe la plus accentuée (2)" ; :__protege_display_name "10 | pg717 | Remarquer la syllabe la plus accentuée (2)" ; @@ -1666,19 +1847,23 @@ laquelle peuvent s'adjoindre une ou plusieurs consonnes. </div> """ ; + :id "pg717" ; :index 10 ; :titre "Remarquer la syllabe la plus accentuée (2)" ; rdfs:subClassOf :MosEtp129 . -:pg729 a :Page, +:pg729 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (11)" ; :__protege_display_name "10 | pg729 | Les symboles phonétiques (11)" ; + :id "pg729" ; :index 10 ; :titre "Les symboles phonétiques (11)" ; rdfs:subClassOf :MosEtp171 . -:pg740 a :Page, +:pg740 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Choisir l'accentuation adéquate (3)" ; :__protege_display_name "09 | pg740 | Choisir l'accentuation adéquate (3)" ; @@ -1705,11 +1890,13 @@ series of tests.<br><br> <img align="center" border="0" src="../media/phon_subject_1.png" id="MosImg528" style="visibility:hidden"> <img align="center" border="0" src="../media/phon_subject_2.png" id="MosImg689" style="visibility:hidden"></font></font> </p></div> """ ; + :id "pg740" ; :index 9 ; :titre "Choisir l'accentuation adéquate (3)" ; rdfs:subClassOf :MosEtp746 . -:pg758 a :Page, +:pg758 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir entre deux mots (2)" ; :__protege_display_name "13 | pg758 | Choisir entre deux mots (2)" ; @@ -1761,11 +1948,13 @@ </table> </div> """ ; + :id "pg758" ; :index 13 ; :titre "Choisir entre deux mots (2)" ; rdfs:subClassOf :MosEtp644 . -:pg76 a :Page, +:pg76 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une prononciation (4)" ; :__protege_display_name "10 | pg76 | Choisir une prononciation (4)" ; @@ -1776,19 +1965,23 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous trompez, la transcription correspond au premier mot entendu : <i>cat</i>.<br><br><br><br> </p></div> """ ; + :id "pg76" ; :index 10 ; :titre "Choisir une prononciation (4)" ; rdfs:subClassOf :MosEtp644 . -:pg763 a :Page, +:pg763 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire WILL (1)" ; :__protege_display_name "02 | pg763 | L'auxiliaire WILL (1)" ; + :id "pg763" ; :index 2 ; :titre "L'auxiliaire WILL (1)" ; rdfs:subClassOf :MosEtp210 . -:pg769 a :Page, +:pg769 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Distinguer d'éventuelles variantes (3)" ; :__protege_display_name "05 | pg769 | Distinguer d'éventuelles variantes (3)" ; @@ -1820,11 +2013,13 @@ réduite</b></a>, donc peu audible. Prenez le temps de réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg769" ; :index 5 ; :titre "Distinguer d'éventuelles variantes (3)" ; rdfs:subClassOf :MosEtp335 . -:pg7691 a :Page, +:pg7691 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (3)" ; :__protege_display_name "02 | pg7691 | Choisir une transcription (3)" ; @@ -1834,11 +2029,13 @@ <br><br><img src="../media/phon_bring.png" id="MosImg51" border="0" align="center" style="visibility:hidden"> </div> """ ; + :id "pg7691" ; :index 2 ; :titre "Choisir une transcription (3)" ; rdfs:subClassOf :MosEtp644 . -:pg785 a :Page, +:pg785 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Mémento : l'accentuation des syllabes (1)" ; :__protege_display_name "11 | pg785 | Mémento : l'accentuation des syllabes (1)" ; @@ -1851,19 +2048,23 @@ </p> <p align=""> </p></div> """ ; + :id "pg785" ; :index 11 ; :titre "Mémento : l'accentuation des syllabes (1)" ; rdfs:subClassOf :MosEtp129 . -:pg7851 a :Page, +:pg7851 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire WILL (4)" ; :__protege_display_name "05 | pg7851 | L'auxiliaire WILL (4)" ; + :id "pg7851" ; :index 5 ; :titre "L'auxiliaire WILL (4)" ; rdfs:subClassOf :MosEtp210 . -:pg81 a :Page, +:pg81 a :ExerciceGD, + :Page, owl:NamedIndividual ; rdfs:label "Compléter une transcription (3) " ; :__protege_display_name "23 | pg81 | Compléter une transcription (3) " ; @@ -1884,11 +2085,13 @@ <p align="">Voici la transcription appropriée : </p> <p align=""> <img src="../media/phon_pats_right.png" id="MosImg41" border="0" align="center" style="visibility:hidden"> et <img align="center" border="0" src="../media/phon_shes_right.png" id="MosImg92" style="visibility:hidden"></p></div> """ ; + :id "pg81" ; :index 23 ; :titre "Compléter une transcription (3) " ; rdfs:subClassOf :MosEtp644 . -:pg813 a :Page, +:pg813 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Distinguer d'éventuelles variantes (5)" ; :__protege_display_name "09 | pg813 | Distinguer d'éventuelles variantes (5)" ; @@ -1919,11 +2122,13 @@ est inaccentué et comporte une voyelle réduite : donc <i>for</i> est peu audible. Prenez le temps de réécouter chaque énoncé en cliquant sur le bouton.</p></div> """ ; + :id "pg813" ; :index 9 ; :titre "Distinguer d'éventuelles variantes (5)" ; rdfs:subClassOf :MosEtp335 . -:pg825 a :Page, +:pg825 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Distinguer d'éventuelles variantes (1)" ; :__protege_display_name "01 | pg825 | Distinguer d'éventuelles variantes (1)" ; @@ -1952,11 +2157,13 @@ de <i>of</i> ne peut pas alors être réduite. C'est pourquoi on l'entend mieux. Prenez le temps de réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg825" ; :index 1 ; :titre "Distinguer d'éventuelles variantes (1)" ; rdfs:subClassOf :MosEtp335 . -:pg8251 a :Page, +:pg8251 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire WILL (2)" ; :__protege_display_name "03 | pg8251 | L'auxiliaire WILL (2)" ; @@ -1971,35 +2178,43 @@ ; ce n'est pas le cas de la deuxième réponse. Vous pouvez réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg8251" ; :index 3 ; :titre "L'auxiliaire WILL (2)" ; rdfs:subClassOf :MosEtp210 . -:pg8252 a :Page, +:pg8252 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Spécificité des voyelles (1)" ; :__protege_display_name "14 | pg8252 | Spécificité des voyelles (1)" ; + :id "pg8252" ; :index 14 ; :titre "Spécificité des voyelles (1)" ; rdfs:subClassOf :MosEtp171 . -:pg83 a :Page, +:pg83 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (9)" ; :__protege_display_name "08 | pg83 | Les symboles phonétiques (9)" ; + :id "pg83" ; :index 8 ; :titre "Les symboles phonétiques (9)" ; rdfs:subClassOf :MosEtp171 . -:pg841 a :Page, +:pg841 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Placer les accents primaire et secondaire (1)" ; :__protege_display_name "04 | pg841 | Placer les accents primaire et secondaire (1)" ; + :id "pg841" ; :index 4 ; :titre "Placer les accents primaire et secondaire (1)" ; rdfs:subClassOf :MosEtp746 . -:pg8412 a :Page, +:pg8412 a :ExerciceQC_QCM, + :Page, owl:NamedIndividual ; rdfs:label "Vérifier la place de l'accent primaire (3) " ; :__protege_display_name "02 | pg8412 | Vérifier la place de l'accent primaire (3) " ; @@ -2028,11 +2243,13 @@ <p align=""><a class="STY_lienDansZoneComt" href="javascript:parent.SCO_ouvrirDoc('pgd661','PAGE')"> Mémento "l'accentuation des syllabes"</a></p></div> """ ; + :id "pg8412" ; :index 2 ; :titre "Vérifier la place de l'accent primaire (3) " ; rdfs:subClassOf :MosEtp746 . -:pg85 a :Page, +:pg85 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Compter les syllabes orales (3)" ; :__protege_display_name "06 | pg85 | Compter les syllabes orales (3)" ; @@ -2057,19 +2274,23 @@ <p align=""><br><br>oranges: 3 syllabes.</p> <p align=""><br>different: 2 syllabes.</p></div> """ ; + :id "pg85" ; :index 6 ; :titre "Compter les syllabes orales (3)" ; rdfs:subClassOf :MosEtp129 . -:pg855 a :Page, +:pg855 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (1)" ; :__protege_display_name "00 | pg855 | Les symboles phonétiques (1)" ; + :id "pg855" ; :index 0 ; :titre "Les symboles phonétiques (1)" ; rdfs:subClassOf :MosEtp171 . -:pg860 a :Page, +:pg860 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Trouver l'accent secondaire (1)" ; :__protege_display_name "03 | pg860 | Trouver l'accent secondaire (1)" ; @@ -2235,11 +2456,13 @@ </table> </div> """ ; + :id "pg860" ; :index 3 ; :titre "Trouver l'accent secondaire (1)" ; rdfs:subClassOf :MosEtp369 . -:pg861 a :Page, +:pg861 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Repérer les syllabes orales" ; :__protege_display_name "00 | pg861 | Repérer les syllabes orales" ; @@ -2258,19 +2481,23 @@ <p align=""><br>interesting: 3 syllabes</p> <p align=""><br>dangerous: 2 syllabes</p></div> """ ; + :id "pg861" ; :index 0 ; :titre "Repérer les syllabes orales" ; rdfs:subClassOf :MosEtp129 . -:pg875 a :Page, +:pg875 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire CAN (3)" ; :__protege_display_name "12 | pg875 | L'auxiliaire CAN (3)" ; + :id "pg875" ; :index 12 ; :titre "L'auxiliaire CAN (3)" ; rdfs:subClassOf :MosEtp210 . -:pg879 a :Page, +:pg879 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire HAVE (2)" ; :__protege_display_name "07 | pg879 | L'auxiliaire HAVE (2)" ; @@ -2285,11 +2512,13 @@ ; ce n'est pas le cas de le deuxième énoncé. Vous pouvez réécouter chaque énoncé en cliquant sur le haut-parleur.</p></div> """ ; + :id "pg879" ; :index 7 ; :titre "L'auxiliaire HAVE (2)" ; rdfs:subClassOf :MosEtp210 . -:pg88 a :Page, +:pg88 a :ExerciceQM, + :Page, owl:NamedIndividual ; rdfs:label "Compter les syllabes orales (4)" ; :__protege_display_name "07 | pg88 | Compter les syllabes orales (4)" ; @@ -2316,29 +2545,35 @@ <p align=""><i>On remarque que les mots entendus ne présentent pas le même nombre de syllabes orales et de "</i><i><font color="#000000">syllabes écrites</font></i><i><font color="#000000">":</font> par exemple , <b>chocolate</b>, qui s'écrit avec 4 syllabes, se prononce en 2 syllabes.</i></p></div> """ ; + :id "pg88" ; :index 7 ; :titre "Compter les syllabes orales (4)" ; rdfs:subClassOf :MosEtp129 . -:pg881 a :Page, +:pg881 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "La prononciation des déterminants" ; :__protege_display_name "00 | pg881 | La prononciation des déterminants" ; + :id "pg881" ; :index 0 ; :titre "La prononciation des déterminants" ; rdfs:subClassOf :MosEtp385 . -:pg888 a :Page, +:pg888 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Voyelles lâches et voyelles tendues" ; :__protege_display_name "00 | pg888 | Voyelles lâches et voyelles tendues" ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg888" ; :index 0 ; :titre "Voyelles lâches et voyelles tendues" ; rdfs:subClassOf :MosEtp940 . -:pg890 a :Page, +:pg890 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Distinguer d'éventuelles variantes (2)" ; :__protege_display_name "03 | pg890 | Distinguer d'éventuelles variantes (2)" ; @@ -2372,11 +2607,13 @@ ne peut pas être réduite. Prenez le temps de réécouter chaque énoncé en cliquant sur le haut-parleur.</p> </div> """ ; + :id "pg890" ; :index 3 ; :titre "Distinguer d'éventuelles variantes (2)" ; rdfs:subClassOf :MosEtp335 . -:pg893 a :Page, +:pg893 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (6)" ; :__protege_display_name "05 | pg893 | Choisir une transcription (6)" ; @@ -2386,11 +2623,13 @@ transcription est </p> <p align=""><img src="../media/phon_shine.png" id="MosImg73" border="0" align="center" style="visibility:hidden"><br><br><br><br></p></div> """ ; + :id "pg893" ; :index 5 ; :titre "Choisir une transcription (6)" ; rdfs:subClassOf :MosEtp644 . -:pg894 a :Page, +:pg894 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (8)" ; :__protege_display_name "17 | pg894 | Choisir une transcription (8)" ; @@ -2444,43 +2683,53 @@ </table> </div> """ ; + :id "pg894" ; :index 17 ; :titre "Choisir une transcription (8)" ; rdfs:subClassOf :MosEtp644 . -:pg896 a :Page, +:pg896 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Les symboles phonétiques (4)" ; :__protege_display_name "03 | pg896 | Les symboles phonétiques (4)" ; + :id "pg896" ; :index 3 ; :titre "Les symboles phonétiques (4)" ; rdfs:subClassOf :MosEtp171 . -:pg900 a :Page, +:pg900 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire HAVE (3)" ; :__protege_display_name "08 | pg900 | L'auxiliaire HAVE (3)" ; + :id "pg900" ; :index 8 ; :titre "L'auxiliaire HAVE (3)" ; rdfs:subClassOf :MosEtp210 . -:pg903 a :Page, +:pg903 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "L'auxiliaire HAVE (1)" ; :__protege_display_name "06 | pg903 | L'auxiliaire HAVE (1)" ; + :id "pg903" ; :index 6 ; :titre "L'auxiliaire HAVE (1)" ; rdfs:subClassOf :MosEtp210 . -:pg926 a :Page, +:pg926 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "La prononciation des prépositions" ; :__protege_display_name "00 | pg926 | La prononciation des prépositions" ; + :id "pg926" ; :index 0 ; :titre "La prononciation des prépositions" ; rdfs:subClassOf :MosEtp534 . -:pg93 a :Page, +:pg93 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (10)" ; :__protege_display_name "19 | pg93 | Choisir une transcription (10)" ; @@ -2537,11 +2786,13 @@ </table> </div> """ ; + :id "pg93" ; :index 19 ; :titre "Choisir une transcription (10)" ; rdfs:subClassOf :MosEtp644 . -:pg933 a :Page, +:pg933 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une prononciation (5)" ; :__protege_display_name "11 | pg933 | Choisir une prononciation (5)" ; @@ -2552,27 +2803,33 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous trompez, la transcription correspond au second mot entendu : <i>green</i>.<br><br><br><br> </p></div> """ ; + :id "pg933" ; :index 11 ; :titre "Choisir une prononciation (5)" ; rdfs:subClassOf :MosEtp644 . -:pg938 a :Page, +:pg938 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Voyelle" ; :__protege_display_name "00 | pg938 | Voyelle" ; + :id "pg938" ; :index 0 ; :titre "Voyelle" ; rdfs:subClassOf :MosEtp555 . -:pg940 a :Page, +:pg940 a :Cours, + :Page, owl:NamedIndividual ; rdfs:label "Point d'articulation" ; :__protege_display_name "06 | pg940 | Point d'articulation" ; + :id "pg940" ; :index 6 ; :titre "Point d'articulation" ; rdfs:subClassOf :MosEtp555 . -:pg948 a :Page, +:pg948 a :ExerciceTAT, + :Page, owl:NamedIndividual ; rdfs:label "Reconnaître le mot commun (4)" ; :__protege_display_name "06 | pg948 | Reconnaître le mot commun (4)" ; @@ -2582,11 +2839,13 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')"><p align="">Vous vous êtes trompé.</p> <p align="">IN est le seul mot commun aux deux énoncés. Vous pouvez réécouter les énoncés.</p></div> """ ; + :id "pg948" ; :index 6 ; :titre "Reconnaître le mot commun (4)" ; rdfs:subClassOf :MosEtp335 . -:pg965 a :Page, +:pg965 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (2)" ; :__protege_display_name "01 | pg965 | Choisir une transcription (2)" ; @@ -2596,11 +2855,13 @@ transcription est</p> <p align=""> <img src="../media/phon_then.png" id="MosImg51" border="0" align="center" style="visibility:hidden"></p></div> """ ; + :id "pg965" ; :index 1 ; :titre "Choisir une transcription (2)" ; rdfs:subClassOf :MosEtp644 . -:pg966 a :Page, +:pg966 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Lire des transcriptions phonétiques (3)" ; :__protege_display_name "15 | pg966 | Lire des transcriptions phonétiques (3)" ; @@ -2629,11 +2890,13 @@ """ ; :commentaireSucces """<div id="divCmtSucces" onclick="SPE_clicDansBulle(event,'divCmtSucces')"></div> """ ; + :id "pg966" ; :index 15 ; :titre "Lire des transcriptions phonétiques (3)" ; rdfs:subClassOf :MosEtp746 . -:pg98 a :Page, +:pg98 a :ExerciceQC_QCU, + :Page, owl:NamedIndividual ; rdfs:label "Choisir une transcription (5)" ; :__protege_display_name "04 | pg98 | Choisir une transcription (5)" ; @@ -2642,6 +2905,7 @@ :commentaireSugg """<div id="divSugg1" onclick="SPE_clicDansBulle(event,'divSugg1')">Vous vous êtes trompé. La bonne transcription est <br><br><img src="../media/phon_measure.png" id="MosImg42" border="0" align="center" style="visibility:hidden"><br><br></div> """ ; + :id "pg98" ; :index 4 ; :titre "Choisir une transcription (5)" ; rdfs:subClassOf :MosEtp644 . diff --git a/tetras_extraction/macao_12/script/common.py b/tetras_extraction/macao_12/script/common.py index 55929d444f87b76ec47b6c5da364911ec253c1c5..2a20499da028b1f67efcaf4030747ac23a14d263 100644 --- a/tetras_extraction/macao_12/script/common.py +++ b/tetras_extraction/macao_12/script/common.py @@ -1,4 +1,5 @@ from sys import stderr +from typing import Any, Optional from rdflib import RDFS, Graph, Literal, URIRef from rdflib import Namespace from os import path, environ @@ -39,6 +40,19 @@ def eprint(*args, **kwargs): print(*args, file=stderr, **kwargs) +def insert_grow(l: list, index: int, value: Any, fill_value: Optional[Any] = None): + """Insert at a given position in a list, growing it if necessary + + :param l: list + :param index: The position where the value is inserted + :param value: The value to insert + :param fill_value: The value used for elements created automatically when growing, defaults to None + """ + for _ in range(len(l), index + 1): + l.append(fill_value) + l[index] = value + + def add_title(g: Graph, subject: URIRef, title: str): """Add triples to define the `subject`'s title and label""" g.add((subject, RDFS.label, Literal(title))) diff --git a/tetras_extraction/macao_12/script/extract_page.py b/tetras_extraction/macao_12/script/extract_page.py index 2b49415caa2a74afd9018fc2416d889d2add61db..eec6b199f7fc451d7d1340432f2b2a5df51de583 100644 --- a/tetras_extraction/macao_12/script/extract_page.py +++ b/tetras_extraction/macao_12/script/extract_page.py @@ -1,10 +1,12 @@ import re +import sys from pprint import pprint -from typing import Any, List +from typing import Any, List, Optional -from lxml import html +import esprima as es +from lxml import etree, html from lxml.etree import _Element -from rdflib import Graph, Literal +from rdflib import RDF, Graph, Literal from common import * @@ -36,6 +38,206 @@ class Page: return str(self.__dict__) +class ParseError(Exception): + pass + + +class XpathParser: + """A parser for the JS portion of an activity, that uses XPath to query + an XML representation of Esprima's abstract syntax tree (AST)""" + + # XPath requests pre-compiled as functions + request_function = etree.XPath( + '//FunctionDeclaration[id/Identifier[@name="entrerDonnees"]]' + ) + request_index_and_values = etree.XPath( + '*//VariableDeclarator[id//*[@name="nr"]]/init/Literal | *//AssignmentExpression[*//Identifier[@name="CODE_V"]]' + ) + request_constructor_id = etree.XPath( + '*//NewExpression/callee/Identifier[@name="Cours" or starts-with(@name, "Exercice")]' + ) + + def __init__(self): + pass + + def parse(self, js, output=sys.stdout): + jstree = es.parseScript(js, None) + # Convert Esprima object tree to XML etree + xml = self.to_xml(jstree.toDict(), "jstree") + try: + self.fun = self.request_function(xml)[0] + print(self._parse_activity_type(), file=output) + # self._parse_qcu_choices() + except Exception as e: + raise ParseError(e) + + def _parse_activity_type(self) -> str: + constructor_id = self.request_constructor_id(self.fun)[0] + match constructor_id.get("name"): + case "ExerciceQC": + arg = constructor_id.xpath("../../arguments/Literal/@value")[0] + if arg not in ["QCU", "QCM"]: + raise ParseError(f"ExerciceQC: invalid argument '{arg}'") + return f"ExerciceQC_{arg}" + case other: + return other + + def _parse_qcu_choices(self): + indexes_and_values = self.request_index_and_values(self.fun) + correct_choices = [] + for e in indexes_and_values: + value = e.xpath("@value") + if len(value) != 0: + # "index line" + index = value[0] + else: + # "true line" + insert_grow(correct_choices, index, True, fill_value=False) + print(correct_choices) + + def to_xml(self, obj, tag_name: Optional[str] = None): + """Recursively convert an object structure to an XML `ElementTree`. + Structures are expected to be Python dictionaries. + Converting a dictionary produces a tag named after the "type" attribute (if present). + - A primitive attribute (i.e. not list nor dict) becomes a tag attribute. + - A list attribute becomes a tag with its contents as sub-tags. + - A dictionary attribute becomes a tag (named like the attribute's key) + containing a sub-tag for the dictionary itself + """ + if isinstance(obj, dict): + # Dictionary (or object): + # - if it has a "type" key, the dict represents an object -> use its value as the tag name + # - if a tag_name is specified as well, it's probably important (like an attribute name), + # so we keep both, as 2 nested tags (tag_name for the outer tag, type for the inner tag) + inner_tag = None + outer_tag = None + has_inner = "type" in obj.keys() + if has_inner: + inner_tag = etree.Element(obj["type"], None, None) + else: + inner_tag = etree.Element("_dict", None, None) + + if tag_name is not None: + outer_tag = etree.Element(tag_name) + if has_inner: + outer_tag.append(inner_tag) + else: + inner_tag = outer_tag + else: + outer_tag = inner_tag + # Recurse on dictionary items + for key, val in obj.items(): + if key != "type": # exception for 'type', handled as attribute + if isinstance(val, (list, dict)): + # Structured attributes become child tags + inner_tag.append(self.to_xml(val, key)) + else: + # Primitive attributes become tag attributes + inner_tag.set(key, str(val)) + return outer_tag + + elif isinstance(obj, list): + tag_name = tag_name or "_list" + list_tag = etree.Element(tag_name) + for e in obj: + list_tag.append(self.to_xml(e)) + return list_tag + + else: + tag_name = tag_name or "_literal" + leaf_tag = etree.Element(tag_name) + leaf_tag.text = str(obj) + return leaf_tag + + def __str__(self) -> str: + return "XpathParser" + + +class MatchParser: + """A parser for the JS portion of an activity, that uses Python match statements + to navigate the abstract syntax tree (AST) produced by Esprima""" + + def __init__(self, graph: Graph, act_id: str) -> None: + self.graph = graph + self.act_id = act_id + + def parse(self, js, output=sys.stdout): + self.output = output + jstree = es.parseScript(js, None) + # Try to match our template with one of the top-level statements + for statement in jstree.body: + self.match_function(statement.toDict()) + + def match_constructor_call(self, new_expr: dict): + match new_expr: + case { + "type": "NewExpression", + "callee": { + "type": "Identifier", + "name": typ, + }, + "arguments": [*args], + }: + match typ: + case "Cours" | "ExerciceQM" | "ExerciceTAT" | "ExerciceGD": + self.print(typ) + self.graph.add((NS[self.act_id], RDF.type, NS[typ])) + case "ExerciceQC": + match args: + case [{"type": "Literal", "value": "QCU"}, *_]: + typ += "_QCU" + case [{"type": "Literal", "value": "QCM"}, *_]: + typ += "_QCM" + case _: + raise ParseError( + f"ExerciceQC: Invalid argument '{args}'" + ) + self.print(typ) + self.graph.add((NS[self.act_id], RDF.type, NS[typ])) + case _: + raise ParseError(f"Unknown activity type '{typ}'") + case _: + pass + + def print(self, s: str): + print(s, file=self.output) + + def match_function(self, func: dict): + """Checks if `func` matches a function declaration named `entrerDonnees`, + and search its body if successful + """ + + match func: + case { + "type": "FunctionDeclaration", + "id": {"name": "entrerDonnees"}, + "body": {"type": "BlockStatement", "body": body}, + }: + # Matched a function declaration and captured its `body` attr + for statement in body: + # Find constructor calls (e.g. `new Thing()`) recursively + recurse_prefix(statement, self.match_constructor_call) + + def __str__(self) -> str: + return "MatchParser" + + +def recurse_prefix(t, f): + """Depth-first prefixed recursion: calls a function on an object, then on + all its children (if it's a list or dictionary) recursively + + :param t: The object + :param f: The function to call + """ + f(t) + if isinstance(t, list): + for e in t: + recurse_prefix(e, f) + elif isinstance(t, dict): + for e in t.values(): + recurse_prefix(e, f) + + # Regex to separate non-digits and digits regex_comment = re.compile(r"(\D*)(\d*)") @@ -46,6 +248,26 @@ def parse_page(graph: Graph, filepath: str, id: str): tree = html.parse(filepath) root = tree.getroot() + # Collect all inline scripts (no external 'src') and join them in a + # block of JS code + # scripts = root.cssselect('script[type="text/javascript"]:not([src])') + scripts: List[_Element] = root.xpath( + '/html/head/script[@type="text/javascript" and not(@src)]' + ) + js = "\n".join((s.text_content() for s in scripts)) + + # Try different parsers, each writing to a different file to compare their results + for parser in [ + XpathParser(), + MatchParser(graph, id), + ]: + with open(f"/tmp/{str(parser)}.txt", "a") as f: + print(f"{id:8}", end="", file=f) + try: + parser.parse(js, output=f) + except ParseError as e: + print(f"{parser} -> {id}: Parsing error: {e}", file=sys.stderr) + # Parse comments zi = root.get_element_by_id("zoneInvisible") for cmt_div in zi: @@ -53,25 +275,22 @@ def parse_page(graph: Graph, filepath: str, id: str): comment.text = cmt_div.text_content() comment.html = html.tostring(cmt_div, encoding="unicode") comment.elem = cmt_div - comment.id = cmt_div.get("id") + comment.id = cmt_div.get("id") or "" # Split id in two parts (non-digits and digits), then match on these parts m = regex_comment.match(comment.id) if m is not None: match m.groups(): case ["divCmt", num]: - print(f"Comment, num={num}") comment.num = int(num) page.comments_misc.append(comment) graph.add((NS[id], NS["commentaireInfo"], Literal(comment.html))) case ["divSugg", num]: - print(f"Suggestion, num={num}") comment.num = int(num) page.comments_sugg.append(comment) graph.add((NS[id], NS["commentaireSugg"], Literal(comment.html))) case ["divCmtSucces", _]: - print(f"Succès") page.comment_success = comment graph.add((NS[id], NS["commentaireSucces"], Literal(comment.html))) case [other, _]: - print(f"other: {other}") + pass # pprint(page) diff --git a/tetras_extraction/macao_12/script/requirements.txt b/tetras_extraction/macao_12/script/requirements.txt index 120dd83484181e683316dafe4ba96853c8eb9380..4f6f3a2638bc502c75575819cb82d49f7fc61dde 100644 --- a/tetras_extraction/macao_12/script/requirements.txt +++ b/tetras_extraction/macao_12/script/requirements.txt @@ -1,5 +1,11 @@ +cssselect==1.2.0 +esprima==4.0.1 isodate==0.6.1 lxml==5.2.2 pyparsing==3.1.2 rdflib==7.0.0 six==1.16.0 +types-beautifulsoup4==4.12.0.20240511 +types-html5lib==1.1.11.20240228 +types-lxml==2024.4.14 +typing_extensions==4.12.1