polyhoraire 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Readme.rdoc ADDED
@@ -0,0 +1,13 @@
1
+ = Setup
2
+
3
+ rake setup
4
+
5
+ == Google API
6
+
7
+ Pour des raisons de sécurité, les identifiants pour accéder au google API ne sont pas inclus. Pour vous en procurer, vous pouvez accéder à la 'Google APIs console' avec le lien ci-desous
8
+
9
+ https://code.google.com/apis/console
10
+
11
+ = Tests
12
+
13
+ rake test
data/bin/polyhoraire ADDED
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding : UTF-8
3
+
4
+ require 'polyhoraire'
5
+ require 'polyhoraire/auth'
6
+ require 'polyhoraire/schedule'
7
+ require 'google_exporter'
8
+ require 'rake'
9
+ require 'optparse'
10
+
11
+ options = {}
12
+
13
+ optparse = OptionParser.new do |opts|
14
+ opts.banner = "Usage: polyhoraire [options]"
15
+
16
+ options[:user] = ''
17
+ opts.on('-u', '--user USER', "Nom d'utilisateur") do |username|
18
+ options[:user] = username
19
+ end
20
+
21
+ options[:passowrd] = ''
22
+ opts.on('-p', '--password PASS', 'Mot de passe') do |password|
23
+ options[:passowrd] = password
24
+ end
25
+
26
+ options[:bday] = ''
27
+ opts.on('-d', '--date DATE', 'Date de fete') do |bday|
28
+ options[:bday] = bday
29
+ end
30
+
31
+ options[:trimester] = ''
32
+ opts.on('-t', '--trimestre TRIM', 'ID du trimester format : AAAAN ou AAAA = année et N = 1,2,3') do |trimester|
33
+ options[:trimester] = trimester
34
+ end
35
+
36
+ options[:calID] = ''
37
+ opts.on('-c', '--calendarID CALID', 'ID du calendrier google') do |calID|
38
+ options[:calID] = calID
39
+ end
40
+
41
+ options[:config] = false
42
+ opts.on('-C','--config','Configurer google API') do
43
+ options[:config] = true
44
+ end
45
+
46
+
47
+ opts.on('-h', '--help',"Afficher l'aide") do
48
+ puts opts
49
+ exit
50
+ end
51
+ end
52
+
53
+ def noConfigFound?
54
+ true unless File.exists?(Poly::userConfDir + '/google-api.yaml')
55
+ end
56
+
57
+ def fetchTrimesters
58
+ require 'open-uri'
59
+ config = open(Poly::userConfDir + '/trimesters.yaml', 'wb')
60
+ gitConf = open('https://raw.github.com/flatzo/polyhoraire/master/conf/trimesters.yaml')
61
+ config.write(gitConf.read)
62
+ config.close
63
+
64
+ end
65
+
66
+ optparse.parse!
67
+ puts options[:user].to_s + options[:passowrd].to_s + options[:bday].to_s
68
+ unless options[:config]
69
+ raise OptionParser::MissingArgument if options[:user] == ''
70
+ raise OptionParser::MissingArgument if options[:passowrd] == ''
71
+ raise OptionParser::MissingArgument if options[:bday] == ''
72
+ raise OptionParser::MissingArgument if options[:trimester] == ''
73
+ raise OptionParser::MissingArgument if options[:calID] == ''
74
+ end
75
+
76
+ Poly::userConfDir = File.expand_path('~/.polyhoraire/conf')
77
+
78
+ if noConfigFound? or options[:config]
79
+ require 'setup'
80
+
81
+ FileUtils.makedirs Poly::userConfDir
82
+
83
+ Setup.google
84
+
85
+ exit if options[:config]
86
+ end
87
+
88
+ fetchTrimesters
89
+
90
+ auth = Poly::Auth.new
91
+
92
+ auth.connect(options[:user].to_s,options[:passowrd].to_s,options[:bday].to_s)
93
+
94
+ schedule = Poly::Schedule.new(auth,options[:trimester].to_i)
95
+
96
+ exporter = GoogleExporter.new
97
+ exporter.send(schedule,options[:calID])
98
+
@@ -0,0 +1,228 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsl:stylesheet version="1.0"
3
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4
+ xmlns = "http://www.w3.org/2005/Atom"
5
+ xmlns:str="http://exslt.org/strings"
6
+ xmlns:gd="http://schemas.google.com/g/2005"
7
+ xmlns:date="http://exslt.org/dates-and-times"
8
+ xmlns:batch="http://schemas.google.com/gdata/batch"
9
+ exclude-result-prefixes="str date" >
10
+ <xsl:param name="debutSession"/>
11
+ <xsl:param name="debutSessionB2"/>
12
+ <xsl:param name="debutRelache"/>
13
+ <xsl:param name="finRelache"/>
14
+ <xsl:param name="finRelacheB2"></xsl:param>
15
+ <xsl:param name="finSession"/>
16
+ <xsl:param name="calendrierCours"/>
17
+ <xsl:param name="calendrierLabs"/>
18
+ <xsl:param name="title"/>
19
+
20
+
21
+ <xsl:template match="/poly">
22
+ <xsl:if test="$debutSession = ''">
23
+ <xsl:message terminate="no">manque la date pour le debut de la session (format 'YYYYMMJJ')</xsl:message>
24
+ </xsl:if>
25
+ <xsl:if test="$debutSessionB2 = ''">
26
+ <xsl:message terminate="no">manque la date pour le debut de la session pour la semaine B2 (format 'YYYYMMJJ')</xsl:message>
27
+ </xsl:if>
28
+ <xsl:if test="$debutRelache = ''">
29
+ <xsl:message terminate="no">manque la date pour le debut de la relache (format 'YYYYMMJJ')</xsl:message>
30
+ </xsl:if>
31
+ <xsl:if test="$finSession = ''">
32
+ <xsl:message terminate="no">manque la date pour la fin de la session (format 'YYYYMMJJ')</xsl:message>
33
+ </xsl:if>
34
+ <xsl:if test="$finRelache = ''">
35
+ <xsl:message terminate="no">manque la date pour la fin de la relache (format 'YYYYMMJJ')</xsl:message>
36
+ </xsl:if>
37
+ <xsl:if test="$finRelacheB2 = 'http://schemas.google.com/g/2005'">
38
+ <xsl:message terminate="no">manque la date pour la fin de la relache pour la semaine B2 (format 'YYYYMMJJ')</xsl:message>
39
+ </xsl:if>
40
+
41
+ <xsl:element name="feed" namespace="http://www.w3.org/2005/Atom">
42
+
43
+ <xsl:element name="title">
44
+ <xsl:attribute name="type">text</xsl:attribute>
45
+ <xsl:value-of select="$title"/>
46
+ </xsl:element>
47
+ <xsl:element name="category">
48
+ <xsl:attribute name="scheme">http://schemas.google.com/g/2005#kind</xsl:attribute>
49
+ <xsl:attribute name="term">http://schemas.google.com/g/2005#event</xsl:attribute>
50
+ </xsl:element>
51
+ <xsl:for-each select="horaire/evenement">
52
+ <xsl:element name="entry">
53
+
54
+ <xsl:element name="batch:id">
55
+ <xsl:value-of select="position()"/>
56
+ </xsl:element>
57
+ <xsl:element name="batch:operation">
58
+ <xsl:attribute name="type">insert</xsl:attribute>
59
+ </xsl:element>
60
+ <xsl:element name="category">
61
+ <xsl:attribute name="scheme">http://schemas.google.com/g/2005#kind</xsl:attribute>
62
+ <xsl:attribute name="term">http://schemas.google.com/g/2005#event</xsl:attribute>
63
+ </xsl:element>
64
+ <xsl:call-template name="event">
65
+ <xsl:with-param name="dateDebutB1" select="$debutSession"/>
66
+ <xsl:with-param name="dateDebutB2" select="$debutSessionB2"/>
67
+ <xsl:with-param name="dateFin" select="$debutRelache"/>
68
+ </xsl:call-template>
69
+ </xsl:element>
70
+ </xsl:for-each>
71
+ </xsl:element>
72
+ </xsl:template>
73
+
74
+ <xsl:template name="jour">
75
+ <xsl:choose>
76
+ <xsl:when test="moment/@jour=1">MO</xsl:when>
77
+ <xsl:when test="moment/@jour=2">TU</xsl:when>
78
+ <xsl:when test="moment/@jour=3">WE</xsl:when>
79
+ <xsl:when test="moment/@jour=4">TH</xsl:when>
80
+ <xsl:when test="moment/@jour=5">FR</xsl:when>
81
+ </xsl:choose>
82
+ </xsl:template>
83
+
84
+ <xsl:template name="interval">
85
+ <xsl:choose>
86
+ <xsl:when test="moment/@semaine = 'B1' or moment/@semaine = 'B2'">2</xsl:when>
87
+ <xsl:otherwise>1</xsl:otherwise>
88
+ </xsl:choose>
89
+ </xsl:template>
90
+
91
+ <xsl:template name="dateDebut">
92
+ <xsl:variable name="duration">P<xsl:value-of select="moment/@jour"/>D</xsl:variable>
93
+ <xsl:choose>
94
+ <xsl:when test="moment/@semaine = 'B2'">
95
+ <xsl:for-each select="str:tokenize(date:add($debutSessionB2,$duration),'-')">
96
+ <xsl:value-of select="."/>
97
+ </xsl:for-each>
98
+ </xsl:when>
99
+ <xsl:otherwise>
100
+ <xsl:for-each select="str:tokenize(date:add($debutSession,$duration),'-')">
101
+ <xsl:value-of select="."/>
102
+ </xsl:for-each>
103
+ </xsl:otherwise>
104
+ </xsl:choose>
105
+ </xsl:template>
106
+ <xsl:template name="dateRetourRelache">
107
+ <xsl:choose>
108
+ <xsl:when test="moment/@semaine = 'B2'"><xsl:value-of select="$debutRelacheB2"/></xsl:when>
109
+ <xsl:otherwise><xsl:value-of select="$debutRelache"/></xsl:otherwise>
110
+ </xsl:choose>
111
+ </xsl:template>
112
+
113
+ <xsl:template name="debut">
114
+ <xsl:call-template name="dateDebut"></xsl:call-template>
115
+ <xsl:text>T</xsl:text> <xsl:if test="str:tokenize(moment/@debut,':')[1] &lt; 10">0</xsl:if>
116
+ <xsl:value-of select="str:tokenize(moment/@debut,':')[1]"/>
117
+ <xsl:value-of select="str:tokenize(moment/@debut,':')[2]"/>
118
+ <xsl:text>00</xsl:text>
119
+ </xsl:template>
120
+
121
+ <xsl:template name="heure">
122
+ <xsl:param name="heure"/>
123
+
124
+ <xsl:if test="str:tokenize($heure,':')[1] &lt; 10">0</xsl:if>
125
+ <xsl:value-of select="str:tokenize($heure,':')[1]"/>
126
+ <xsl:value-of select="str:tokenize($heure,':')[2]"/>
127
+ <xsl:text>00</xsl:text>
128
+ </xsl:template>
129
+
130
+ <xsl:template name="date">
131
+ <xsl:param name="date"/>
132
+ <xsl:param name="jour"/>
133
+
134
+ <xsl:variable name="duration">P<xsl:value-of select="$jour"/>D</xsl:variable>
135
+
136
+ <xsl:for-each select="str:tokenize(date:add($date,$duration),'-')">
137
+ <xsl:value-of select="."/>
138
+ </xsl:for-each>
139
+ </xsl:template>
140
+
141
+ <xsl:template name="dateHeure">
142
+ <xsl:param name="date"/>
143
+ <xsl:param name="jour"/>
144
+ <xsl:param name="heure"/>
145
+
146
+ <xsl:call-template name="date">
147
+ <xsl:with-param name="date" select="$date"/>
148
+ <xsl:with-param name="jour" select="$jour"/>
149
+ </xsl:call-template>
150
+ <xsl:text>T</xsl:text>
151
+ <xsl:call-template name="heure">
152
+ <xsl:with-param name="heure" select="$heure"/>
153
+ </xsl:call-template>
154
+ <xsl:text>Z</xsl:text>
155
+ </xsl:template>
156
+
157
+ <xsl:template name="fin">
158
+ <xsl:call-template name="dateDebut"></xsl:call-template>
159
+ <xsl:text>T</xsl:text> <xsl:if test="str:tokenize(moment/@fin,':')[1] &lt; 10">0</xsl:if>
160
+ <xsl:value-of select="str:tokenize(moment/@fin,':')[1]"/>
161
+ <xsl:value-of select="str:tokenize(moment/@fin,':')[2]"/>
162
+ <xsl:text>00</xsl:text>
163
+ </xsl:template>
164
+
165
+ <xsl:template name="event">
166
+ <xsl:param name="dateDebutB1"/>
167
+ <xsl:param name="dateDebutB2"/>
168
+ <xsl:param name="dateFin"/>
169
+
170
+ <xsl:variable name="sigle" select="./sigle"/>
171
+ <xsl:variable name="duration">P<xsl:value-of select="moment/@jour"/>D</xsl:variable>
172
+ <xsl:variable name="dateDebut">
173
+ <xsl:choose>
174
+ <xsl:when test="moment/@semaine = 'B2'">
175
+ <xsl:value-of select="$dateDebutB2"/>
176
+ </xsl:when>
177
+ <xsl:otherwise>
178
+ <xsl:value-of select="$dateDebutB1"/>
179
+ </xsl:otherwise>
180
+ </xsl:choose>
181
+ </xsl:variable>
182
+
183
+ <title><xsl:value-of select="$sigle"/><xsl:if test="@type != 'cours'"> [Lab]</xsl:if></title>
184
+ <content>
185
+ <xsl:value-of select="//cour[@sigle = $sigle]/nom"/>
186
+ - <xsl:text>Professeur : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/prof"/>
187
+ - <xsl:text>Groupe cour : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/groupeTheorie"/>
188
+ - <xsl:text>Groupe lab : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/groupeLaboratoire"/>
189
+ </content>
190
+ <xsl:element name="gd:transparency">
191
+ <xsl:attribute name="value">http://schemas.google.com/g/2005#event.opaque</xsl:attribute>
192
+ </xsl:element>
193
+ <xsl:element name="gd:eventStatus">
194
+ <xsl:attribute name="value">http://schemas.google.com/g/2005#event.confirmed</xsl:attribute>
195
+ </xsl:element>
196
+ <xsl:element name="gd:where">
197
+ <xsl:attribute name="valueString">
198
+ <xsl:value-of select="./local"/>
199
+ </xsl:attribute>
200
+ </xsl:element>
201
+ <xsl:element name="gd:recurrence">
202
+ <xsl:text>
203
+ DTSTART;TZID=America/Montreal:</xsl:text>
204
+ <xsl:call-template name="dateHeure">
205
+ <xsl:with-param name="date" select="$dateDebut"/>
206
+ <xsl:with-param name="jour" select="moment/@jour"/>
207
+ <xsl:with-param name="heure" select="moment/@debut"/>
208
+ </xsl:call-template>
209
+ <xsl:text>
210
+ DTEND;TZID=America/Montreal:</xsl:text>
211
+ <xsl:call-template name="dateHeure">
212
+ <xsl:with-param name="date" select="$dateDebut"/>
213
+ <xsl:with-param name="jour" select="moment/@jour"/>
214
+ <xsl:with-param name="heure" select="moment/@fin"/>
215
+ </xsl:call-template>
216
+ <xsl:text>
217
+ RRULE:FREQ=WEEKLY;INTERVAL=</xsl:text>
218
+ <xsl:call-template name="interval"/>
219
+ <xsl:text>;BYDAY=</xsl:text> <xsl:call-template name="jour"/>
220
+ <xsl:text>;UNTIL=</xsl:text>
221
+ <xsl:call-template name="dateHeure">
222
+ <xsl:with-param name="date" select="$dateFin"/>
223
+ <xsl:with-param name="jour">0</xsl:with-param>
224
+ <xsl:with-param name="heure">23:59:00</xsl:with-param>
225
+ </xsl:call-template>
226
+ </xsl:element>
227
+ </xsl:template>
228
+ </xsl:stylesheet>
@@ -0,0 +1,189 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsl:stylesheet version="1.0"
3
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4
+ xmlns:str="http://exslt.org/strings"
5
+ xmlns:date="http://exslt.org/dates-and-times"
6
+ exclude-result-prefixes="str date" >
7
+ <xsl:param name="debutB1"/>
8
+ <xsl:param name="debutB2"/>
9
+ <xsl:param name="fin"/>
10
+
11
+ <xsl:template match="/poly">
12
+ <xsl:if test="$debutB1 = ''">
13
+ <xsl:message terminate="no">Manque la date pour le debut de la periode B1 (format 'YYYYMMJJ')</xsl:message>
14
+ </xsl:if>
15
+ <xsl:if test="$debutB2 = ''">
16
+ <xsl:message terminate="no">Manque la date pour le debut de la periode B2 (format 'YYYYMMJJ')</xsl:message>
17
+ </xsl:if>
18
+ <xsl:if test="$fin = ''">
19
+ <xsl:message terminate="no">Manque la date pour la fin de la periode (format 'YYYYMMJJ')</xsl:message>
20
+ </xsl:if>
21
+
22
+ <xsl:element name="events">
23
+ <xsl:for-each select="horaire/evenement">
24
+ <xsl:element name="event">
25
+ <xsl:call-template name="event">
26
+ <xsl:with-param name="dateDebutB1" select="$debutB1"/>
27
+ <xsl:with-param name="dateDebutB2" select="$debutB2"/>
28
+ <xsl:with-param name="dateFin" select="$fin"/>
29
+ </xsl:call-template>
30
+ </xsl:element>
31
+ </xsl:for-each>
32
+ </xsl:element>
33
+ </xsl:template>
34
+
35
+ <xsl:template name="jour">
36
+ <xsl:choose>
37
+ <xsl:when test="moment/@jour=1">MO</xsl:when>
38
+ <xsl:when test="moment/@jour=2">TU</xsl:when>
39
+ <xsl:when test="moment/@jour=3">WE</xsl:when>
40
+ <xsl:when test="moment/@jour=4">TH</xsl:when>
41
+ <xsl:when test="moment/@jour=5">FR</xsl:when>
42
+ </xsl:choose>
43
+ </xsl:template>
44
+
45
+ <xsl:template name="interval">
46
+ <xsl:choose>
47
+ <xsl:when test="moment/@semaine = 'B1' or moment/@semaine = 'B2'">2</xsl:when>
48
+ <xsl:otherwise>1</xsl:otherwise>
49
+ </xsl:choose>
50
+ </xsl:template>
51
+
52
+ <xsl:template name="dateDebut">
53
+ <xsl:variable name="duration">P<xsl:value-of select="moment/@jour"/>D</xsl:variable>
54
+ <xsl:choose>
55
+ <xsl:when test="moment/@semaine = 'B2'">
56
+ <xsl:for-each select="str:tokenize(date:add($debutB2,$duration),'-')">
57
+ <xsl:value-of select="."/>
58
+ </xsl:for-each>
59
+ </xsl:when>
60
+ <xsl:otherwise>
61
+ <xsl:for-each select="str:tokenize(date:add($debutB1,$duration),'-')">
62
+ <xsl:value-of select="."/>
63
+ </xsl:for-each>
64
+ </xsl:otherwise>
65
+ </xsl:choose>
66
+ </xsl:template>
67
+
68
+
69
+ <xsl:template name="debut">
70
+ <xsl:call-template name="dateDebut"></xsl:call-template>
71
+ <xsl:text>T</xsl:text> <xsl:if test="str:tokenize(moment/@debut,':')[1] &lt; 10">0</xsl:if>
72
+ <xsl:value-of select="str:tokenize(moment/@debut,':')[1]"/>
73
+ <xsl:value-of select="str:tokenize(moment/@debut,':')[2]"/>
74
+ <xsl:text>00</xsl:text>
75
+ </xsl:template>
76
+
77
+ <xsl:template name="heure">
78
+ <xsl:param name="heure"/>
79
+
80
+ <xsl:if test="str:tokenize($heure,':')[1] &lt; 10">0</xsl:if>
81
+ <xsl:value-of select="str:tokenize($heure,':')[1]"/>
82
+ <xsl:value-of select="str:tokenize($heure,':')[2]"/>
83
+ <xsl:text>00</xsl:text>
84
+ </xsl:template>
85
+
86
+ <xsl:template name="date">
87
+ <xsl:param name="date"/>
88
+ <xsl:param name="jour"/>
89
+
90
+ <xsl:variable name="duration">P<xsl:value-of select="$jour"/>D</xsl:variable>
91
+
92
+ <xsl:value-of select="date:format-date(date:add($date,$duration),'YYYY-MM-DD')"/>
93
+ </xsl:template>
94
+
95
+ <xsl:template name="dateHeure">
96
+ <xsl:param name="date"/>
97
+ <xsl:param name="jour"/>
98
+ <xsl:param name="heure"/>
99
+
100
+ <xsl:call-template name="date">
101
+ <xsl:with-param name="date" select="$date"/>
102
+ <xsl:with-param name="jour" select="$jour"/>
103
+ </xsl:call-template>
104
+ <xsl:text>T</xsl:text>
105
+ <xsl:call-template name="heure">
106
+ <xsl:with-param name="heure" select="$heure"/>
107
+ </xsl:call-template>
108
+ <xsl:text>Z</xsl:text>
109
+ </xsl:template>
110
+
111
+ <xsl:template name="fin">
112
+ <xsl:call-template name="dateDebut"></xsl:call-template>
113
+ <xsl:text>T</xsl:text> <xsl:if test="str:tokenize(moment/@fin,':')[1] &lt; 10">0</xsl:if>
114
+ <xsl:value-of select="str:tokenize(moment/@fin,':')[1]"/>
115
+ <xsl:value-of select="str:tokenize(moment/@fin,':')[2]"/>
116
+ <xsl:text>00</xsl:text>
117
+ </xsl:template>
118
+
119
+ <xsl:template name="event">
120
+ <xsl:param name="dateDebutB1"/>
121
+ <xsl:param name="dateDebutB2"/>
122
+ <xsl:param name="dateFin"/>
123
+
124
+ <xsl:variable name="sigle" select="./sigle"/>
125
+ <xsl:variable name="duration">P<xsl:value-of select="moment/@jour"/>D</xsl:variable>
126
+ <xsl:variable name="dateDebut">
127
+ <xsl:choose>
128
+ <xsl:when test="moment/@semaine = 'B2'">
129
+ <xsl:value-of select="$dateDebutB2"/>
130
+ </xsl:when>
131
+ <xsl:otherwise>
132
+ <xsl:value-of select="$dateDebutB1"/>
133
+ </xsl:otherwise>
134
+ </xsl:choose>
135
+ </xsl:variable>
136
+
137
+ <summary>
138
+ <xsl:value-of select="$sigle"/>
139
+ <xsl:choose>
140
+ <xsl:when test="@type != 'cours'">
141
+ <xsl:text> (</xsl:text>
142
+ <xsl:value-of select="//cour[@sigle = $sigle]/groupeLaboratoire"/>
143
+ <xsl:text>)</xsl:text>
144
+ <xsl:text> [Lab]</xsl:text>
145
+ </xsl:when>
146
+ <xsl:otherwise>
147
+ <xsl:text> (</xsl:text>
148
+ <xsl:value-of select="//cour[@sigle = $sigle]/groupeTheorie"/>
149
+ <xsl:text>)</xsl:text>
150
+ </xsl:otherwise>
151
+
152
+ </xsl:choose>
153
+ </summary>
154
+ <description>
155
+ <xsl:value-of select="//cour[@sigle = $sigle]/nom"/>
156
+ - <xsl:text>Professeur : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/prof"/>
157
+ - <xsl:text>Groupe cour : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/groupeTheorie"/>
158
+ - <xsl:text>Groupe lab : </xsl:text><xsl:value-of select="//cour[@sigle = $sigle]/groupeLaboratoire"/>
159
+ </description>
160
+ <location>
161
+ <xsl:value-of select="./local"/>
162
+ </location>
163
+ <recurrence>
164
+ <xsl:text>DTSTART;TZID=America/Montreal:</xsl:text>
165
+ <xsl:call-template name="dateHeure">
166
+ <xsl:with-param name="date" select="$dateDebut"/>
167
+ <xsl:with-param name="jour" select="moment/@jour"/>
168
+ <xsl:with-param name="heure" select="moment/@debut"/>
169
+ </xsl:call-template>
170
+ <xsl:text>
171
+ DTEND;TZID=America/Montreal:</xsl:text>
172
+ <xsl:call-template name="dateHeure">
173
+ <xsl:with-param name="date" select="$dateDebut"/>
174
+ <xsl:with-param name="jour" select="moment/@jour"/>
175
+ <xsl:with-param name="heure" select="moment/@fin"/>
176
+ </xsl:call-template>
177
+ <xsl:text>
178
+ RRULE:FREQ=WEEKLY;INTERVAL=</xsl:text>
179
+ <xsl:call-template name="interval"/>
180
+ <xsl:text>;BYDAY=</xsl:text> <xsl:call-template name="jour"/>
181
+ <xsl:text>;UNTIL=</xsl:text>
182
+ <xsl:call-template name="dateHeure">
183
+ <xsl:with-param name="date" select="$dateFin"/>
184
+ <xsl:with-param name="jour">0</xsl:with-param>
185
+ <xsl:with-param name="heure">23:59:00</xsl:with-param>
186
+ </xsl:call-template>
187
+ </recurrence>
188
+ </xsl:template>
189
+ </xsl:stylesheet>