ess 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ess/dtd.rb ADDED
@@ -0,0 +1,491 @@
1
+ require 'ess/postprocessing'
2
+ require 'ess/validation'
3
+
4
+ module ESS
5
+ module DTD
6
+ include ESS::Postprocessing
7
+ include ESS::Validation
8
+
9
+ BASIC_ELEMENT = {
10
+ :validation => [ TextIsNotNull.new ]
11
+ }
12
+
13
+ DESCRIPTION = {
14
+ :postprocessing_text => [ StripSpecificHTMLTags.new ],
15
+ :cdata => true
16
+ }
17
+
18
+ BASIC_TIME = {
19
+ :postprocessing_text => [ ProcessTime.new ]
20
+ }
21
+
22
+ EMAIL = {
23
+ :validation => [ TextIsValidEmail.new ]
24
+ }
25
+
26
+ URL_ELEMENT = {
27
+ :validation => [ TextIsValidURL.new ]
28
+ }
29
+
30
+ LATITUDE = {
31
+ :validation => [ TextIsValidLatitude.new ]
32
+ }
33
+
34
+ LONGITUDE = {
35
+ :validation => [ TextIsValidLongitude.new ]
36
+ }
37
+
38
+ COUNTRY_CODE = {
39
+ :validation => [ TextIsValidCountryCode.new ]
40
+ }
41
+
42
+ CURRENCY = {
43
+ :validation => [ TextIsValidCurrency.new ]
44
+ }
45
+
46
+ TAGS = {
47
+ :tags => { :tag => { :dtd => BASIC_ELEMENT,
48
+ :mandatory => true,
49
+ :max_occurs => :inf }
50
+ }
51
+ }
52
+
53
+ CATEGORY_ITEM = {
54
+ :attributes => { :type => { :mandatory => true,
55
+ :max_occurs => 1,
56
+ :valid_values => [
57
+ 'award',
58
+ 'commemoration',
59
+ 'competition',
60
+ 'conference',
61
+ 'concert',
62
+ 'course',
63
+ 'dinner',
64
+ 'entertainment',
65
+ 'cocktail',
66
+ 'exhibition',
67
+ 'family',
68
+ 'friends',
69
+ 'festival',
70
+ 'meeting',
71
+ 'networking',
72
+ 'party',
73
+ 'seminar',
74
+ 'general'] },
75
+ :priority => { :mandatory => false,
76
+ :max_occurs => 1 } },
77
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
78
+ :mandatory => true,
79
+ :max_occurs => 1 },
80
+ :id => { :dtd => BASIC_ELEMENT,
81
+ :mandatory => false,
82
+ :max_occurs => 1 }
83
+ }
84
+ }
85
+
86
+ CATEGORIES = {
87
+ :tags => { :item => { :dtd => CATEGORY_ITEM,
88
+ :mandatory => true,
89
+ :max_occurs => :inf }
90
+ }
91
+ }
92
+
93
+ DATE_ITEM = {
94
+ :attributes => { :type => { :mandatory => true,
95
+ :max_occurs => 1,
96
+ :valid_values => [
97
+ "standalone",
98
+ "recurrent",
99
+ "permanent" ] },
100
+ :unit => { :mandatory => false,
101
+ :max_occurs => 1,
102
+ :valid_values => [
103
+ 'hour','day','week','month','year'] },
104
+ :limit => { :mandatory => false,
105
+ :max_occurs => 1 },
106
+ :interval => { :mandatory => false,
107
+ :max_occurs => 1 },
108
+ :selected_day => { :mandatory => false,
109
+ :max_occurs => :inf,
110
+ :valid_values => [
111
+ 'number','monday','tuesday',
112
+ 'wednesday','thursday','friday',
113
+ 'saturday','sunday'] },
114
+ :selected_week => { :mandatory => false,
115
+ :max_occurs => :inf,
116
+ :valid_values => [
117
+ 'first','second','third',
118
+ 'fourth','last' ] },
119
+ :priority => { :mandatory => false,
120
+ :max_occurs => 1 } },
121
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
122
+ :mandatory => true,
123
+ :max_occurs => 1 },
124
+ :start => { :dtd => BASIC_TIME,
125
+ :mandatory => true,
126
+ :max_occurs => 1 },
127
+ :duration => { :dtd => BASIC_ELEMENT,
128
+ :mandatory => false,
129
+ :max_occurs => 1 } },
130
+ :validation => [ UnitMandatoryIfRecurrent.new ]
131
+ }
132
+
133
+ DATES = {
134
+ :tags => { :item => { :dtd => DATE_ITEM,
135
+ :mandatory => true,
136
+ :max_occurs => :inf }
137
+ }
138
+ }
139
+
140
+ PLACE_ITEM = {
141
+ :attributes => { :type => { :mandatory => true,
142
+ :max_occurs => 1,
143
+ :valid_values => [
144
+ 'fixed','area','moving','virtual'] },
145
+ :moving_position => { :mandatory => false,
146
+ :max_occurs => 1 },
147
+ :priority => { :mandatory => false,
148
+ :max_occurs => 1 } },
149
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
150
+ :mandatory => true,
151
+ :max_occurs => 1 },
152
+ :country_code => { :dtd => COUNTRY_CODE,
153
+ :mandatory => false,
154
+ :max_occurs => 1 },
155
+ :country => { :dtd => BASIC_ELEMENT,
156
+ :mandatory => false,
157
+ :max_occurs => 1 },
158
+ :latitude => { :dtd => LATITUDE,
159
+ :mandatory => false,
160
+ :max_occurs => 1 },
161
+ :longitude => { :dtd => LONGITUDE,
162
+ :mandatory => false,
163
+ :max_occurs => 1 },
164
+ :address => { :dtd => BASIC_ELEMENT,
165
+ :mandatory => false,
166
+ :max_occurs => 1 },
167
+ :city => { :dtd => BASIC_ELEMENT,
168
+ :mandatory => false,
169
+ :max_occurs => 1 },
170
+ :zip => { :dtd => BASIC_ELEMENT,
171
+ :mandatory => false,
172
+ :max_occurs => 1 },
173
+ :state => { :dtd => BASIC_ELEMENT,
174
+ :mandatory => false,
175
+ :max_occurs => 1 },
176
+ :state_code => { :dtd => BASIC_ELEMENT,
177
+ :mandatory => false,
178
+ :max_occurs => 1 },
179
+ :medium_name => { :dtd => BASIC_ELEMENT,
180
+ :mandatory => false,
181
+ :max_occurs => 1 },
182
+ :medium_type => { :dtd => BASIC_ELEMENT,
183
+ :mandatory => false,
184
+ :max_occurs => 1,
185
+ :valid_values => [
186
+ 'television','radio','internet'] },
187
+ :kml => { :dtd => BASIC_ELEMENT,
188
+ :mandatory => false,
189
+ :max_occurs => 1 }
190
+ }
191
+ }
192
+
193
+ PLACES = {
194
+ :tags => { :item => { :dtd => PLACE_ITEM,
195
+ :mandatory => true,
196
+ :max_occurs => :inf }
197
+ }
198
+ }
199
+
200
+ PRICE_ITEM = {
201
+ :attributes => { :type => { :mandatory => true,
202
+ :max_occurs => 1,
203
+ :valid_values => [
204
+ 'standalone','recurrent'] },
205
+ :mode => { :mandatory => true,
206
+ :max_occurs => 1,
207
+ :valid_values => [
208
+ 'fixed','free','invitation',
209
+ 'renumerated','prepaid'] },
210
+ :unit => { :mandatory => false,
211
+ :max_occurs => 1,
212
+ :valid_values => [
213
+ 'hour','day','week','month','year'] },
214
+ :limit => { :mandatory => false,
215
+ :max_occurs => 1 },
216
+ :interval => { :mandatory => false,
217
+ :max_occurs => 1 },
218
+ :selected_day => { :mandatory => false,
219
+ :max_occurs => :inf,
220
+ :valid_values => [
221
+ 'number','monday','tuesday',
222
+ 'wednesday','thursday','friday',
223
+ 'saturday','sunday'] },
224
+ :selected_week => { :mandatory => false,
225
+ :max_occurs => :inf,
226
+ :valid_values => [
227
+ 'first','second','third',
228
+ 'fourth','last'] },
229
+ :priority => { :mandatory => false,
230
+ :max_occurs => 1 } },
231
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
232
+ :mandatory => true,
233
+ :max_occurs => 1 },
234
+ :value => { :dtd => BASIC_ELEMENT,
235
+ :mandatory => true,
236
+ :max_occurs => 1 },
237
+ :currency => { :dtd => CURRENCY,
238
+ :mandatory => false,
239
+ :max_occurs => 1 },
240
+ :start => { :dtd => BASIC_TIME,
241
+ :mandatory => false,
242
+ :max_occurs => 1 },
243
+ :duration => { :dtd => BASIC_ELEMENT,
244
+ :mandatory => false,
245
+ :max_occurs => 1 },
246
+ :uri => { :dtd => URL_ELEMENT,
247
+ :mandatory => false,
248
+ :max_occurs => 1 } },
249
+ :validation => [ CurrMandatoryIfValueGT0.new,
250
+ UnitMandatoryIfRecurrent.new ]
251
+ }
252
+
253
+ PRICES = {
254
+ :tags => { :item => { :dtd => PRICE_ITEM,
255
+ :mandatory => true,
256
+ :max_occurs => :inf }
257
+ }
258
+ }
259
+
260
+ MEDIA_ITEM = {
261
+ :attributes => { :type => { :mandatory => true,
262
+ :max_occurs => 1,
263
+ :valid_values => [
264
+ 'image','sound','video','website'] },
265
+ :priority => { :mandatory => false,
266
+ :max_occurs => 1 } },
267
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
268
+ :mandatory => true,
269
+ :max_occurs => 1 },
270
+ :uri => { :dtd => URL_ELEMENT,
271
+ :mandatory => true,
272
+ :max_occurs => 1 }
273
+ }
274
+ }
275
+
276
+ MEDIA = {
277
+ :tags => { :item => { :dtd => MEDIA_ITEM,
278
+ :mandatory => true,
279
+ :max_occurs => :inf }
280
+ }
281
+ }
282
+
283
+ PEOPLE_ITEM = {
284
+ :attributes => { :type => { :mandatory => true,
285
+ :max_occurs => 1,
286
+ :valid_values => [
287
+ 'organizer','performer','attendee',
288
+ 'social','author','contributor'] },
289
+ :priority => { :mandatory => false,
290
+ :max_occurs => 1 } },
291
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
292
+ :mandatory => true,
293
+ :max_occurs => 1 },
294
+ :id => { :dtd => BASIC_ELEMENT,
295
+ :mandatory => false,
296
+ :max_occurs => 1 },
297
+ :firstname => { :dtd => BASIC_ELEMENT,
298
+ :mandatory => false,
299
+ :max_occurs => 1 },
300
+ :lastname => { :dtd => BASIC_ELEMENT,
301
+ :mandatory => false,
302
+ :max_occurs => 1 },
303
+ :organization => { :dtd => BASIC_ELEMENT,
304
+ :mandatory => false,
305
+ :max_occurs => 1 },
306
+ :logo => { :dtd => URL_ELEMENT,
307
+ :mandatory => false,
308
+ :max_occurs => 1 },
309
+ :icon => { :dtd => URL_ELEMENT,
310
+ :mandatory => false,
311
+ :max_occurs => 1 },
312
+ :uri => { :dtd => URL_ELEMENT,
313
+ :mandatory => false,
314
+ :max_occurs => 1 },
315
+ :address => { :dtd => BASIC_ELEMENT,
316
+ :mandatory => false,
317
+ :max_occurs => 1 },
318
+ :city => { :dtd => BASIC_ELEMENT,
319
+ :mandatory => false,
320
+ :max_occurs => 1 },
321
+ :zip => { :dtd => BASIC_ELEMENT,
322
+ :mandatory => false,
323
+ :max_occurs => 1 },
324
+ :state => { :dtd => BASIC_ELEMENT,
325
+ :mandatory => false,
326
+ :max_occurs => 1 },
327
+ :state_code => { :dtd => BASIC_ELEMENT,
328
+ :mandatory => false,
329
+ :max_occurs => 1 },
330
+ :country => { :dtd => BASIC_ELEMENT,
331
+ :mandatory => false,
332
+ :max_occurs => 1 },
333
+ :country_code => { :dtd => COUNTRY_CODE,
334
+ :mandatory => false,
335
+ :max_occurs => 1 },
336
+ :email => { :dtd => BASIC_ELEMENT,
337
+ :mandatory => false,
338
+ :max_occurs => 1 },
339
+ :phone => { :dtd => BASIC_ELEMENT,
340
+ :mandatory => false,
341
+ :max_occurs => 1 },
342
+ :minpeople => { :dtd => BASIC_ELEMENT,
343
+ :mandatory => false,
344
+ :max_occurs => 1 },
345
+ :maxpeople => { :dtd => BASIC_ELEMENT,
346
+ :mandatory => false,
347
+ :max_occurs => 1 },
348
+ :minage => { :dtd => BASIC_ELEMENT,
349
+ :mandatory => false,
350
+ :max_occurs => 1 },
351
+ :restriction => { :dtd => BASIC_ELEMENT,
352
+ :mandatory => false,
353
+ :max_occurs => 1 }
354
+ }
355
+ }
356
+
357
+ PEOPLE = {
358
+ :tags => { :item => { :dtd => PEOPLE_ITEM,
359
+ :mandatory => true,
360
+ :max_occurs => :inf }
361
+ }
362
+ }
363
+
364
+ RELATION_ITEM = {
365
+ :attributes => { :type => { :mandatory => true,
366
+ :max_occurs => 1,
367
+ :valid_vlaues => [
368
+ 'alternative','related','enclosure'] },
369
+ :priority => { :mandatory => false,
370
+ :max_occurs => 1 } },
371
+ :tags => { :name => { :dtd => BASIC_ELEMENT,
372
+ :mandatory => true,
373
+ :max_occurs => 1 },
374
+ :uri => { :dtd => URL_ELEMENT,
375
+ :mandatory => true,
376
+ :max_occurs => 1 },
377
+ :id => { :dtd => BASIC_ELEMENT,
378
+ :mandatory => true,
379
+ :max_occurs => 1 }
380
+ }
381
+ }
382
+
383
+ RELATIONS = {
384
+ :tags => { :item => { :dtd => RELATION_ITEM,
385
+ :mandatory => true,
386
+ :max_occurs => :inf }
387
+ }
388
+ }
389
+
390
+ FEED = {
391
+ :tags => { :title => { :dtd => BASIC_ELEMENT,
392
+ :mandatory => true,
393
+ :max_occurs => 1,
394
+ :postprocessing => [ FeedTitle.new ] },
395
+ :id => { :dtd => BASIC_ELEMENT,
396
+ :mandatory => true,
397
+ :max_occurs => 1,
398
+ :postprocessing => [ FeedID.new ] },
399
+ :access => { :dtd => BASIC_ELEMENT,
400
+ :mandatory => true,
401
+ :max_occurs => 1,
402
+ :valid_values => ['PUBLIC','PRIVATE'] },
403
+ :description => { :dtd => DESCRIPTION,
404
+ :mandatory => true,
405
+ :max_occurs => 1 },
406
+ :published => { :dtd => BASIC_TIME,
407
+ :mandatory => true,
408
+ :max_occurs => 1 },
409
+ :uri => { :dtd => URL_ELEMENT,
410
+ :mandatory => false,
411
+ :max_occurs => 1,
412
+ :postprocessing => [ FeedURI.new ] },
413
+ :updated => { :dtd => BASIC_TIME,
414
+ :mandatory => false,
415
+ :max_occurs => 1 },
416
+ :tags => { :dtd => TAGS,
417
+ :mandatory => false,
418
+ :max_occurs => 1 },
419
+ :categories => { :dtd => CATEGORIES,
420
+ :mandatory => true,
421
+ :max_occurs => 1 },
422
+ :dates => { :dtd => DATES,
423
+ :mandatory => true,
424
+ :max_occurs => 1 },
425
+ :places => { :dtd => PLACES,
426
+ :mandatory => true,
427
+ :max_occurs => 1 },
428
+ :prices => { :dtd => PRICES,
429
+ :mandatory => false,
430
+ :max_occurs => 1 },
431
+ :media => { :dtd => MEDIA,
432
+ :mandatory => false,
433
+ :max_occurs => 1 },
434
+ :people => { :dtd => PEOPLE,
435
+ :mandatory => false,
436
+ :max_occurs => 1 },
437
+ :relations => { :dtd => RELATIONS,
438
+ :mandatory => false,
439
+ :max_occurs => 1 }
440
+ }
441
+ }
442
+
443
+ CHANNEL = {
444
+ :tags => { :title => { :dtd => BASIC_ELEMENT,
445
+ :mandatory => true,
446
+ :max_occurs => 1,
447
+ :postprocessing => [ ChannelTitle.new ] },
448
+ :link => { :dtd => URL_ELEMENT,
449
+ :mandatory => true,
450
+ :max_occurs => 1,
451
+ :postprocessing => [ ChannelLink.new ] },
452
+ :id => { :dtd => BASIC_ELEMENT,
453
+ :mandatory => true,
454
+ :max_occurs => 1,
455
+ :postprocessing => [ ChannelID.new ] },
456
+ :published => { :dtd => BASIC_TIME,
457
+ :mandatory => true,
458
+ :max_occurs => 1 },
459
+ :updated => { :dtd => BASIC_TIME,
460
+ :mandatory => false,
461
+ :max_occurs => 1 },
462
+ :generator => { :dtd => BASIC_ELEMENT,
463
+ :mandatory => false,
464
+ :max_occurs => 1 },
465
+ :rights => { :dtd => BASIC_ELEMENT,
466
+ :mandatory => false,
467
+ :max_occurs => 1},
468
+ :feed => { :dtd => FEED,
469
+ :mandatory => true,
470
+ :max_occurs => :inf }
471
+ }
472
+ }
473
+
474
+ ESS = {
475
+ :attributes => { :xmlns => { :mandatory => true,
476
+ :max_occurs => 1},
477
+ :version => { :mandatory => true,
478
+ :max_occurs => 1},
479
+ :lang => { :mandatory => true,
480
+ :max_occurs => 1} },
481
+ :tags => { :channel => { :dtd => CHANNEL,
482
+ :mandatory => true,
483
+ :max_occurs => 1 } },
484
+ :validation => [ LangIsValid.new,
485
+ XmlnsIsValidURL.new ]
486
+ }
487
+
488
+ class InvalidValueError < RuntimeError
489
+ end
490
+ end
491
+ end