polyhoraire 1.0

Sign up to get free protection for your applications and to get access to all the features.
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>