aboutsummaryrefslogtreecommitdiff
path: root/Documentation/dev/xml.rst
blob: a48a3d7d95d653493ec93050852af57acbf1f2c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
==================================
Format des emplois du temps Celcat
==================================

Avant de pouvoir afficher les emplois du temps, il est nécessaire de
parser les fichiers XML générés par Celcat.

On a besoin de plusieurs informations concernant le cours :

 - son nom ;
 - son type ;
 - sa semaine et son jour ;
 - son début et sa fin ;
 - son commentaire ;
 - ses salles ;
 - ses groupes.

Certaines de ces informations sont triviales à récupérer (comme son
nom, son type, son commentaire…), mais d’autres (telles que son jour
précis) est un peu plus délicat.

Parser facilement le XML
========================
Pour récupérer les fichiers à distance, celcatsanitizer utilise la
bibliothèque requests_, et se sert de BeautifulSoup4_ pour parser les
fichiers XML.

.. _BeautifulSoup4:
  https://www.crummy.com/software/BeautifulSoup/bs4/doc/
.. _requests: http://docs.python-requests.org/en/master/

Les semaines
============
La première chose à faire après avoir téléchargé le fichier est de
récupérer la liste des semaines présentes. Les dates sont encodées
d’une manière assez exotique :

.. code:: xml

    <span id="1" date="16/10/2017" rawix="9" rawlen="1">
    <description>Semaine 42, Semaine commençant le 16/10/2017</description>
    <title>42</title>
    <alleventweeks>NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN</alleventweeks>
    <day id="0">
    <name>lundi</name>
    <row id="0" />
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" />
    <row id="6" /></day>
    <day id="1">
    <name>mardi</name>
    <row id="0" />
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" /></day>
    <day id="2">
    <name>mercredi</name>
    <row id="0" />
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" />
    <row id="6" /></day>
    <day id="3">
    <name>jeudi</name>
    <row id="0" />
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" /></day>
    <day id="4">
    <name>vendredi</name>
    <row id="0" />
    <row id="1" />
    <row id="2" />
    <row id="3" />
    <row id="4" />
    <row id="5" /></day></span>

Vous voyez donc la date de début, le numéro de semaine, et la
mystérieuse valeur ``<alleventweeks>``. Il s’agit d’un identifiant de
semaine. La propriété ``id`` du ``<span>`` ne semble pas être
nécessaire pour comprendre le reste du fichier.

.. _ref-week-dict:

On va donc créer un tableau des semaines en se servant des
``<alleventweeks>`` comme clé, et le premier jour de la semaine comme
valeur.

Les cours
=========
Voici un exemple de cours :

.. code:: xml

    <event id="351687" timesort="07450945" colour="BEA7B8" ecs="4" ecc="11" er="0" scb="1">
    <day>1</day>
    <prettytimes>07:45-09:45 COURS/TD</prettytimes>
    <starttime>07:45</starttime>
    <endtime>09:45</endtime>
    <category>COURS/TD</category>
    <prettyweeks></prettyweeks>
    <rawweeks>NNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN</rawweeks>
    <resources>
    <module title="Matière">
    <item>EDINF3F1 - Algorithmique et programmation</item></module>
    <group title="Groupe">
    <item>L2 Info s1 TDA4</item></group>
    <room title="Salle">
    <item>1TP1-B08bis</item></room></resources></event>

Les différents éléments sont :

================= ===================== =============================
Donnée indiquée   Balise correspondante Plusieurs valeurs possibles ?
================= ===================== =============================
Nom du cours      ``<module>``          Oui
Groupes concernés ``<group>``           Oui
Salles            ``<room>``            Oui
Type de cours     ``<category>``        Non
Heure de début    ``<starttime>``       Non
Heure de fin      ``<endtime>``         Non
Jour              ``<day>``             Non
Semaine           ``<rawweeks>``        Non
Remarque          ``<notes>``           Non
================= ===================== =============================

Quand une donnée peut prendre plusieurs valeurs à la fois, les
différentes valeurs se trouvent dans des balises
``<item>``. celcatsanitizer traîte tous les groupes et toutes les
salles, mais ne lis qu’un seul nom de cours.

Dans l’exemple donné plus haut, il n’y a pas de champ remarque.

Pour trouver le jours du cours, on prend la semaine référencée par la
balise ``<rawweeks>``, on retrouve le début de la semaine
correspondante à l’aide du :ref:`dictionnaire des semaines
<ref-week-dict>`, et on ajoute autant de jours qu’indiqué par la
balise ``<day>``.