vobject 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +1 -1
- data/lib/c.rb +19 -19
- data/lib/vobject/vcalendar/grammar.rb +62 -62
- data/lib/vobject/vcalendar/typegrammars.rb +44 -44
- data/lib/vobject/vcard/v3_0/grammar.rb +20 -20
- data/lib/vobject/vcard/v3_0/typegrammars.rb +30 -30
- data/lib/vobject/vcard/v4_0/grammar.rb +30 -30
- data/lib/vobject/vcard/v4_0/typegrammars.rb +59 -59
- data/lib/vobject/version.rb +1 -1
- data/vobject.gemspec +2 -2
- metadata +19 -5
@@ -19,66 +19,66 @@ module Vobject::Vcalendar
|
|
19
19
|
/WEEKLY/i.r | /MONTHLY/i.r | /YEARLY/i.r
|
20
20
|
enddate = C::DATE_TIME | C::DATE
|
21
21
|
seconds = /[0-9]{1,2}/.r
|
22
|
-
byseclist = seq(seconds << ",".r, lazy { byseclist }) do |s, l|
|
22
|
+
byseclist = seq(seconds << ",".r, lazy { byseclist }) do |(s, l)|
|
23
23
|
[s, l].flatten
|
24
24
|
end | seconds.map { |s| [s] }
|
25
25
|
minutes = /[0-9]{1,2}/.r
|
26
|
-
byminlist = seq(minutes << ",".r, lazy { byminlist }) do |m, l|
|
26
|
+
byminlist = seq(minutes << ",".r, lazy { byminlist }) do |(m, l)|
|
27
27
|
[m, l].flatten
|
28
28
|
end | minutes.map { |m| [m] }
|
29
29
|
hours = /[0-9]{1,2}/.r
|
30
|
-
byhrlist = seq(hours << ",".r, lazy { byhrlist }) do |h, l|
|
30
|
+
byhrlist = seq(hours << ",".r, lazy { byhrlist }) do |(h, l)|
|
31
31
|
[h, l].flatten
|
32
32
|
end | hours.map { |h| [h] }
|
33
33
|
ordwk = /[0-9]{1,2}/.r
|
34
34
|
weekday = /SU/i.r | /MO/i.r | /TU/i.r | /WE/i.r | /TH/i.r | /FR/i.r | /SA/i.r
|
35
|
-
weekdaynum1 = seq(C::SIGN._?, ordwk) do |s, o|
|
35
|
+
weekdaynum1 = seq(C::SIGN._?, ordwk) do |(s, o)|
|
36
36
|
h = { ordwk: o }
|
37
37
|
h[:sign] = s[0] unless s.empty?
|
38
38
|
h
|
39
39
|
end
|
40
|
-
weekdaynum = seq(weekdaynum1._?, weekday) do |a, b|
|
40
|
+
weekdaynum = seq(weekdaynum1._?, weekday) do |(a, b)|
|
41
41
|
h = { weekday: b }
|
42
42
|
h = h.merge a[0] unless a.empty?
|
43
43
|
h
|
44
44
|
end
|
45
|
-
bywdaylist = seq(weekdaynum << ",".r, lazy { bywdaylist }) do |w, l|
|
45
|
+
bywdaylist = seq(weekdaynum << ",".r, lazy { bywdaylist }) do |(w, l)|
|
46
46
|
[w, l].flatten
|
47
47
|
end | weekdaynum.map { |w| [w] }
|
48
48
|
ordmoday = /[0-9]{1,2}/.r
|
49
|
-
monthdaynum = seq(C::SIGN._?, ordmoday) do |s, o|
|
49
|
+
monthdaynum = seq(C::SIGN._?, ordmoday) do |(s, o)|
|
50
50
|
h = { ordmoday: o }
|
51
51
|
h[:sign] = s[0] unless s.empty?
|
52
52
|
h
|
53
53
|
end
|
54
|
-
bymodaylist = seq(monthdaynum << ",".r, lazy { bymodaylist }) do |m, l|
|
54
|
+
bymodaylist = seq(monthdaynum << ",".r, lazy { bymodaylist }) do |(m, l)|
|
55
55
|
[m, l].flatten
|
56
56
|
end | monthdaynum.map { |m| [m] }
|
57
57
|
ordyrday = /[0-9]{1,3}/.r
|
58
|
-
yeardaynum = seq(C::SIGN._?, ordyrday) do |s, o|
|
58
|
+
yeardaynum = seq(C::SIGN._?, ordyrday) do |(s, o)|
|
59
59
|
h = { ordyrday: o }
|
60
60
|
h[:sign] = s[0] unless s.empty?
|
61
61
|
h
|
62
62
|
end
|
63
|
-
byyrdaylist = seq(yeardaynum << ",".r, lazy { byyrdaylist }) do |y, l|
|
63
|
+
byyrdaylist = seq(yeardaynum << ",".r, lazy { byyrdaylist }) do |(y, l)|
|
64
64
|
[y, l].flatten
|
65
65
|
end | yeardaynum.map { |y| [y] }
|
66
|
-
weeknum = seq(C::SIGN._?, ordwk) do |s, o|
|
66
|
+
weeknum = seq(C::SIGN._?, ordwk) do |(s, o)|
|
67
67
|
h = { ordwk: o }
|
68
68
|
h[:sign] = s[0] unless s.empty?
|
69
69
|
h
|
70
70
|
end
|
71
|
-
bywknolist = seq(weeknum << ",".r, lazy { bywknolist }) do |w, l|
|
71
|
+
bywknolist = seq(weeknum << ",".r, lazy { bywknolist }) do |(w, l)|
|
72
72
|
[w, l].flatten
|
73
73
|
end | weeknum.map { |w| [w] }
|
74
74
|
# monthnum = /[0-9]{1,2}/.r
|
75
75
|
# RFC 7529 add leap month indicator
|
76
76
|
monthnum = /[0-9]{1,2}L?/i.r
|
77
|
-
bymolist = seq(monthnum << ",".r, lazy { bymolist }) do |m, l|
|
77
|
+
bymolist = seq(monthnum << ",".r, lazy { bymolist }) do |(m, l)|
|
78
78
|
[m, l].flatten
|
79
79
|
end | monthnum.map { |m| [m] }
|
80
80
|
setposday = yeardaynum
|
81
|
-
bysplist = seq(setposday << ",".r, lazy { bysplist }) do |s, l|
|
81
|
+
bysplist = seq(setposday << ",".r, lazy { bysplist }) do |(s, l)|
|
82
82
|
[s, l].flatten
|
83
83
|
end | setposday.map { |s| [s] }
|
84
84
|
# http://www.unicode.org/repos/cldr/tags/latest/common/bcp47/calendar.xml
|
@@ -89,24 +89,24 @@ module Vobject::Vcalendar
|
|
89
89
|
/islamic-rgsa/i.r | /iso8601/i.r | /japanese/i.r | /persian/i.r |
|
90
90
|
/roc/i.r | /islamicc/i.r | /gregorian/i.r
|
91
91
|
skip = /OMIT/i.r | /BACKWARD/i.r | /FORWARD/i.r
|
92
|
-
recur_rule_part = seq(/FREQ/i.r << "=".r, freq) { |_k, v| { freq: v } } |
|
93
|
-
seq(/UNTIL/i.r << "=".r, enddate) { |_k, v| { until: v } } |
|
94
|
-
seq(/COUNT/i.r << "=".r, /[0-9]+/i.r) { |_k, v| { count: v } } |
|
95
|
-
seq(/INTERVAL/i.r << "=".r, /[0-9]+/i.r) { |_k, v| { interval: v } } |
|
96
|
-
seq(/BYSECOND/i.r << "=".r, byseclist) { |_k, v| { bysecond: v } } |
|
97
|
-
seq(/BYMINUTE/i.r << "=".r, byminlist) { |_k, v| { byminute: v } } |
|
98
|
-
seq(/BYHOUR/i.r << "=".r, byhrlist) { |_k, v| { byhour: v } } |
|
99
|
-
seq(/BYDAY/i.r << "=".r, bywdaylist) { |_k, v| { byday: v } } |
|
100
|
-
seq(/BYMONTHDAY/i.r << "=".r, bymodaylist) { |_k, v| { bymonthday: v } } |
|
101
|
-
seq(/BYYEARDAY/i.r << "=".r, byyrdaylist) { |_k, v| { byyearday: v } } |
|
102
|
-
seq(/BYWEEKNO/i.r << "=".r, bywknolist) { |_k, v| { byweekno: v } } |
|
103
|
-
seq(/BYMONTH/i.r << "=".r, bymolist) { |_k, v| { bymonth: v } } |
|
104
|
-
seq(/BYSETPOS/i.r << "=".r, bysplist) { |_k, v| { bysetpos: v } } |
|
105
|
-
seq(/WKST/i.r << "=".r, weekday) { |_k, v| { wkst: v } } |
|
92
|
+
recur_rule_part = seq(/FREQ/i.r << "=".r, freq) { |(_k, v)| { freq: v } } |
|
93
|
+
seq(/UNTIL/i.r << "=".r, enddate) { |(_k, v)| { until: v } } |
|
94
|
+
seq(/COUNT/i.r << "=".r, /[0-9]+/i.r) { |(_k, v)| { count: v } } |
|
95
|
+
seq(/INTERVAL/i.r << "=".r, /[0-9]+/i.r) { |(_k, v)| { interval: v } } |
|
96
|
+
seq(/BYSECOND/i.r << "=".r, byseclist) { |(_k, v)| { bysecond: v } } |
|
97
|
+
seq(/BYMINUTE/i.r << "=".r, byminlist) { |(_k, v)| { byminute: v } } |
|
98
|
+
seq(/BYHOUR/i.r << "=".r, byhrlist) { |(_k, v)| { byhour: v } } |
|
99
|
+
seq(/BYDAY/i.r << "=".r, bywdaylist) { |(_k, v)| { byday: v } } |
|
100
|
+
seq(/BYMONTHDAY/i.r << "=".r, bymodaylist) { |(_k, v)| { bymonthday: v } } |
|
101
|
+
seq(/BYYEARDAY/i.r << "=".r, byyrdaylist) { |(_k, v)| { byyearday: v } } |
|
102
|
+
seq(/BYWEEKNO/i.r << "=".r, bywknolist) { |(_k, v)| { byweekno: v } } |
|
103
|
+
seq(/BYMONTH/i.r << "=".r, bymolist) { |(_k, v)| { bymonth: v } } |
|
104
|
+
seq(/BYSETPOS/i.r << "=".r, bysplist) { |(_k, v)| { bysetpos: v } } |
|
105
|
+
seq(/WKST/i.r << "=".r, weekday) { |(_k, v)| { wkst: v } } |
|
106
106
|
# RFC 7529
|
107
|
-
seq(/RSCALE/i.r << "=".r, rscale) { |_k, v| { rscale: v } } |
|
108
|
-
seq(/SKIP/i.r << "=".r, skip) { |_k, v| { skip: v } }
|
109
|
-
recur1 = seq(recur_rule_part, ";", lazy { recur1 }) { |h, _, r| h.merge r } |
|
107
|
+
seq(/RSCALE/i.r << "=".r, rscale) { |(_k, v)| { rscale: v } } |
|
108
|
+
seq(/SKIP/i.r << "=".r, skip) { |(_k, v)| { skip: v } }
|
109
|
+
recur1 = seq(recur_rule_part, ";", lazy { recur1 }) { |(h, _, r)| h.merge r } |
|
110
110
|
recur_rule_part
|
111
111
|
recur = recur1.map { |r| PropertyValue::Recur.new r }
|
112
112
|
recur.eof
|
@@ -151,7 +151,7 @@ module Vobject::Vcalendar
|
|
151
151
|
|
152
152
|
def geovalue
|
153
153
|
float = prim(:double)
|
154
|
-
geovalue = seq(float << ";".r, float) do |a, b|
|
154
|
+
geovalue = seq(float << ";".r, float) do |(a, b)|
|
155
155
|
if a <= 180.0 && a >= -180.0 && b <= 180 && b > -180
|
156
156
|
PropertyValue::Geovalue.new(lat: a, long: b)
|
157
157
|
else
|
@@ -173,7 +173,7 @@ module Vobject::Vcalendar
|
|
173
173
|
|
174
174
|
def versionvalue
|
175
175
|
versionvalue = seq(prim(:double) << ";".r,
|
176
|
-
prim(:double)) do |x, y|
|
176
|
+
prim(:double)) do |(x, y)|
|
177
177
|
PropertyValue::Version.new [x, y]
|
178
178
|
end | "2.0".r.map do
|
179
179
|
PropertyValue::Version.new ["2.0"]
|
@@ -184,7 +184,7 @@ module Vobject::Vcalendar
|
|
184
184
|
end
|
185
185
|
|
186
186
|
def binary
|
187
|
-
binary = seq(/[a-zA-Z0-9+\/]*/.r, /={0,2}/.r) do |b, q|
|
187
|
+
binary = seq(/[a-zA-Z0-9+\/]*/.r, /={0,2}/.r) do |(b, q)|
|
188
188
|
if (b.length + q.length) % 4 == 0
|
189
189
|
PropertyValue::Binary.new(b + q)
|
190
190
|
else
|
@@ -212,7 +212,7 @@ module Vobject::Vcalendar
|
|
212
212
|
|
213
213
|
def textlist
|
214
214
|
textlist1 =
|
215
|
-
seq(C::TEXT << ",".r, lazy { textlist1 }) { |a, b| [unescape(a), b].flatten } |
|
215
|
+
seq(C::TEXT << ",".r, lazy { textlist1 }) { |(a, b)| [unescape(a), b].flatten } |
|
216
216
|
C::TEXT.map { |t| [unescape(t)] }
|
217
217
|
textlist = textlist1.map { |m| PropertyValue::Textlist.new m }
|
218
218
|
textlist.eof
|
@@ -220,8 +220,8 @@ module Vobject::Vcalendar
|
|
220
220
|
|
221
221
|
def request_statusvalue
|
222
222
|
@req_status = Set.new %w{2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 4.0 5.0 5.1 5.2 5.3}
|
223
|
-
extdata = seq(";".r, C::TEXT) { |_, t| t }
|
224
|
-
request_statusvalue = seq(/[0-9](\.[0-9]){1,2}/.r << ";".r, C::TEXT, extdata._?) do |n, t1, t2|
|
223
|
+
extdata = seq(";".r, C::TEXT) { |(_, t)| t }
|
224
|
+
request_statusvalue = seq(/[0-9](\.[0-9]){1,2}/.r << ";".r, C::TEXT, extdata._?) do |(n, t1, t2)|
|
225
225
|
return { error: "Invalid request status #{n}" } unless @req_status.include?(n) # RFC 5546
|
226
226
|
hash = { statcode: n, statdesc: t1 }
|
227
227
|
hash[:extdata] = t2[0] unless t2.empty?
|
@@ -264,7 +264,7 @@ module Vobject::Vcalendar
|
|
264
264
|
end
|
265
265
|
|
266
266
|
def datelist
|
267
|
-
datelist1 = seq(C::DATE << ",".r, lazy { datelist1 }) do |d, l|
|
267
|
+
datelist1 = seq(C::DATE << ",".r, lazy { datelist1 }) do |(d, l)|
|
268
268
|
[d, l].flatten
|
269
269
|
end | C::DATE.map { |d| [d] }
|
270
270
|
datelist = datelist1.map { |m| PropertyValue::Datelist.new m }
|
@@ -277,7 +277,7 @@ module Vobject::Vcalendar
|
|
277
277
|
|
278
278
|
def date_timelist
|
279
279
|
date_timelist1 = seq(C::DATE_TIME << ",".r,
|
280
|
-
lazy { date_timelist1 }) do |d, l|
|
280
|
+
lazy { date_timelist1 }) do |(d, l)|
|
281
281
|
[d, l].flatten
|
282
282
|
end | C::DATE_TIME.map { |d| [d] }
|
283
283
|
date_timelist = date_timelist1.map do |m|
|
@@ -292,7 +292,7 @@ module Vobject::Vcalendar
|
|
292
292
|
end
|
293
293
|
|
294
294
|
def date_time_utclist
|
295
|
-
date_time_utclist1 = seq(C::DATE_TIME_UTC << ",".r, lazy { date_time_utclist1 }) do |d, l|
|
295
|
+
date_time_utclist1 = seq(C::DATE_TIME_UTC << ",".r, lazy { date_time_utclist1 }) do |(d, l)|
|
296
296
|
[d, l].flatten
|
297
297
|
end | C::DATE_TIME_UTC.map { |d| [d] }
|
298
298
|
date_time_utclist = date_time_utclist1.map do |m|
|
@@ -307,14 +307,14 @@ module Vobject::Vcalendar
|
|
307
307
|
end
|
308
308
|
|
309
309
|
def periodlist
|
310
|
-
period_explicit = seq(C::DATE_TIME << "/".r, C::DATE_TIME) do |s, e|
|
310
|
+
period_explicit = seq(C::DATE_TIME << "/".r, C::DATE_TIME) do |(s, e)|
|
311
311
|
{ start: s, end: e }
|
312
312
|
end
|
313
|
-
period_start = seq(C::DATE_TIME << "/".r, C::DURATION) do |s, d|
|
313
|
+
period_start = seq(C::DATE_TIME << "/".r, C::DURATION) do |(s, d)|
|
314
314
|
{ start: s, duration: PropertyValue::Duration.new(d) }
|
315
315
|
end
|
316
316
|
period = period_explicit | period_start
|
317
|
-
periodlist1 = seq(period << ",".r, lazy { periodlist1 }) do |p, l|
|
317
|
+
periodlist1 = seq(period << ",".r, lazy { periodlist1 }) do |(p, l)|
|
318
318
|
[p, l].flatten
|
319
319
|
end | period.map { |p| [p] }
|
320
320
|
periodlist = periodlist1.map { |m| PropertyValue::Periodlist.new m }
|
@@ -330,7 +330,7 @@ module Vobject::Vcalendar
|
|
330
330
|
|
331
331
|
def utc_offset
|
332
332
|
utc_offset = seq(C::SIGN, /[0-9]{2}/.r, /[0-9]{2}/.r,
|
333
|
-
/[0-9]{2}/.r._?) do |sign, h, m, sec|
|
333
|
+
/[0-9]{2}/.r._?) do |(sign, h, m, sec)|
|
334
334
|
hash = { sign: sign, hr: h, min: m }
|
335
335
|
hash[:sec] = sec[0] unless sec.empty?
|
336
336
|
PropertyValue::Utcoffset.new hash
|
@@ -32,66 +32,66 @@ module Vcard::V3_0
|
|
32
32
|
# parameters && parameter types
|
33
33
|
paramname = /ENCODING/i.r | /LANGUAGE/i.r | /CONTEXT/i.r | /TYPE/i.r | /VALUE/i.r | /PREF/i.r
|
34
34
|
otherparamname = C::NAME_VCARD ^ paramname
|
35
|
-
paramvalue = C::QUOTEDSTRING_VCARD.map { |s| s } | C::PTEXT_VCARD.map
|
35
|
+
paramvalue = C::QUOTEDSTRING_VCARD.map { |s| s } | C::PTEXT_VCARD.map { |x, _| x.upcase }
|
36
36
|
|
37
37
|
# prefvalue = /[0-9]{1,2}/i.r | "100".r
|
38
38
|
valuetype = /URI/i.r | /DATE/i.r | /DATE-TIME/i.r | /BINARY/i.r | /PTEXT/i.r
|
39
39
|
# mediaattr = /[!\"#$%&'*+.^A-Z0-9a-z_`i{}|~-]+/.r
|
40
40
|
# mediavalue1 = mediaattr | C::QUOTEDSTRING_VCARD
|
41
|
-
# mediatail = seq(";".r >> mediaattr, "=".r << mediavalue1).map do |a, v|
|
41
|
+
# mediatail = seq(";".r >> mediaattr, "=".r << mediavalue1).map do |(a, v)|
|
42
42
|
# ";#{a}=#{v}"
|
43
43
|
# end
|
44
44
|
# rfc4288regname = /[A-Za-z0-9!#$&.+^+-]{1,127}/.r
|
45
45
|
# rfc4288typename = rfc4288regname
|
46
46
|
# rfc4288subtypename = rfc4288regname
|
47
|
-
# mediavalue = seq(rfc4288typename << "/".r, rfc4288subtypename, # mediatail.star).map do |t, s, tail|
|
47
|
+
# mediavalue = seq(rfc4288typename << "/".r, rfc4288subtypename, # mediatail.star).map do |(t, s, tail)|
|
48
48
|
# ret = "#{t}/#{s}"
|
49
49
|
# ret = ret . tail[0] unless tail.empty?
|
50
50
|
# ret
|
51
51
|
# end
|
52
|
-
pvalue_list = (seq(paramvalue << ",".r, lazy { pvalue_list }) & /[;:]/.r).map do |e, list|
|
52
|
+
pvalue_list = (seq(paramvalue << ",".r, lazy { pvalue_list }) & /[;:]/.r).map do |(e, list)|
|
53
53
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n"), list].flatten
|
54
54
|
end | (paramvalue & /[;:]/.r).map do |e|
|
55
55
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n")]
|
56
56
|
end
|
57
|
-
typevaluelist = seq(C::IANATOKEN, ",".r >> lazy { typevaluelist }).map do |t, l|
|
57
|
+
typevaluelist = seq(C::IANATOKEN, ",".r >> lazy { typevaluelist }).map do |(t, l)|
|
58
58
|
[t.upcase, l].flatten
|
59
59
|
end | C::IANATOKEN.map { |t| [t.upcase] }
|
60
|
-
quoted_string_list = (seq(C::QUOTEDSTRING_VCARD << ",".r, lazy { quoted_string_list }) & /[;:]/.r).map do |e, list|
|
60
|
+
quoted_string_list = (seq(C::QUOTEDSTRING_VCARD << ",".r, lazy { quoted_string_list }) & /[;:]/.r).map do |(e, list)|
|
61
61
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n"), list].flatten
|
62
62
|
end | (C::QUOTEDSTRING_VCARD & /[;:]/.r).map do |e|
|
63
63
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n")]
|
64
64
|
end
|
65
65
|
|
66
|
-
# fmttypevalue = seq(rfc4288typename, "/", rfc4288subtypename).map
|
66
|
+
# fmttypevalue = seq(rfc4288typename, "/", rfc4288subtypename).map {|x, _| x.join }
|
67
67
|
rfc1766primarytag = /[A-Za-z]{1,8}/.r
|
68
|
-
rfc1766subtag = seq("-", /[A-Za-z]{1,8}/.r) { |a, b| a + b }
|
69
|
-
rfc1766language = seq(rfc1766primarytag, rfc1766subtag.star) do |a, b|
|
68
|
+
rfc1766subtag = seq("-", /[A-Za-z]{1,8}/.r) { |(a, b)| a + b }
|
69
|
+
rfc1766language = seq(rfc1766primarytag, rfc1766subtag.star) do |(a, b)|
|
70
70
|
a += b[0] unless b.empty?
|
71
71
|
a
|
72
72
|
end
|
73
73
|
|
74
|
-
param = seq(/ENCODING/i.r, "=", /b/.r) do |name, _, val|
|
74
|
+
param = seq(/ENCODING/i.r, "=", /b/.r) do |(name, _, val)|
|
75
75
|
{ name.upcase.tr("-", "_").to_sym => val }
|
76
|
-
end | seq(/LANGUAGE/i.r, "=", rfc1766language) do |name, _, val|
|
76
|
+
end | seq(/LANGUAGE/i.r, "=", rfc1766language) do |(name, _, val)|
|
77
77
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
78
|
-
end | seq(/CONTEXT/i.r, "=", /word/.r) do |name, _, val|
|
78
|
+
end | seq(/CONTEXT/i.r, "=", /word/.r) do |(name, _, val)|
|
79
79
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
80
|
-
end | seq(/TYPE/i.r, "=", typevaluelist) do |name, _, val|
|
80
|
+
end | seq(/TYPE/i.r, "=", typevaluelist) do |(name, _, val)|
|
81
81
|
{ name.upcase.tr("-", "_").to_sym => val }
|
82
|
-
end | seq(/VALUE/i.r, "=", valuetype) do |name, _, val|
|
82
|
+
end | seq(/VALUE/i.r, "=", valuetype) do |(name, _, val)|
|
83
83
|
{ name.upcase.tr("-", "_").to_sym => val }
|
84
84
|
end | /PREF/i.r.map do |_name|
|
85
85
|
# this is likely erroneous use of VCARD 2.1 convention in RFC2739; converting to canonical TYPE=PREF
|
86
86
|
{ TYPE: ["PREF"] }
|
87
|
-
end | seq(otherparamname, "=", pvalue_list) do |name, _, val|
|
87
|
+
end | seq(otherparamname, "=", pvalue_list) do |(name, _, val)|
|
88
88
|
val = val[0] if val.length == 1
|
89
89
|
{ name.upcase.tr("-", "_").to_sym => val }
|
90
|
-
end | seq(paramname, "=", pvalue_list) do |name, _, val|
|
90
|
+
end | seq(paramname, "=", pvalue_list) do |(name, _, val)|
|
91
91
|
parse_err("Violated format of parameter value #{name} = #{val}")
|
92
92
|
end
|
93
93
|
|
94
|
-
params = seq(";".r >> param & ";", lazy { params }) do |p, ps|
|
94
|
+
params = seq(";".r >> param & ";", lazy { params }) do |(p, ps)|
|
95
95
|
p.merge(ps) do |key, old, new|
|
96
96
|
if @cardinality1[:PARAM].include?(key)
|
97
97
|
parse_err("Violated cardinality of parameter #{key}")
|
@@ -102,7 +102,7 @@ module Vcard::V3_0
|
|
102
102
|
end | seq(";".r >> param).map { |e| e[0] }
|
103
103
|
|
104
104
|
contentline = seq(linegroup._?, C::NAME_VCARD, params._? << ":".r,
|
105
|
-
C::VALUE, /(\r|\n|\r\n)/) do |g, name, p, value, _|
|
105
|
+
C::VALUE, /(\r|\n|\r\n)/) do |(g, name, p, value, _)|
|
106
106
|
key = name.upcase.tr("-", "_").to_sym
|
107
107
|
hash = { key => {} }
|
108
108
|
hash[key][:value], errors1 = Typegrammars.typematch(strict, key, p[0], :GENERIC, value, @ctx)
|
@@ -112,7 +112,7 @@ module Vcard::V3_0
|
|
112
112
|
hash[key][:params] = p[0] unless p.empty?
|
113
113
|
hash
|
114
114
|
end
|
115
|
-
props = seq(contentline, lazy { props }) do |c, rest|
|
115
|
+
props = seq(contentline, lazy { props }) do |(c, rest)|
|
116
116
|
c.merge(rest) do |key, old, new|
|
117
117
|
if @cardinality1[:PROP].include?(key.upcase)
|
118
118
|
parse_err("Violated cardinality of property #{key}")
|
@@ -123,7 +123,7 @@ module Vcard::V3_0
|
|
123
123
|
end | ("".r & beginend).map { {} }
|
124
124
|
|
125
125
|
calpropname = /VERSION/i.r
|
126
|
-
calprop = seq(linegroup._?, calpropname << ":".r, C::VALUE, /[\r\n]/) do |g, key, value, _|
|
126
|
+
calprop = seq(linegroup._?, calpropname << ":".r, C::VALUE, /[\r\n]/) do |(g, key, value, _)|
|
127
127
|
key = key.upcase.tr("-", "_").to_sym
|
128
128
|
hash = { key => {} }
|
129
129
|
hash[key][:value], errors1 = Typegrammars.typematch(strict, key, nil, :VCARD, value, @ctx)
|
@@ -12,7 +12,7 @@ module Vcard::V3_0
|
|
12
12
|
# property value types, each defining their own parser
|
13
13
|
|
14
14
|
def binary
|
15
|
-
binary = seq(/[a-zA-Z0-9+\/]*/.r, /={0,2}/.r) do |b, q|
|
15
|
+
binary = seq(/[a-zA-Z0-9+\/]*/.r, /={0,2}/.r) do |(b, q)|
|
16
16
|
if (b.length + q.length) % 4 == 0
|
17
17
|
PropertyValue::Binary.new(b + q)
|
18
18
|
else
|
@@ -31,7 +31,7 @@ module Vcard::V3_0
|
|
31
31
|
|
32
32
|
def geovalue
|
33
33
|
float = prim(:double)
|
34
|
-
geovalue = seq(float << ";".r, float) do |a, b|
|
34
|
+
geovalue = seq(float << ";".r, float) do |(a, b)|
|
35
35
|
if a <= 180.0 && a >= -180.0 && b <= 180 && b > -180
|
36
36
|
PropertyValue::Geovalue.new(lat: a, long: b)
|
37
37
|
else
|
@@ -43,7 +43,7 @@ module Vcard::V3_0
|
|
43
43
|
|
44
44
|
def classvalue
|
45
45
|
iana_token = /[a-zA-Z\d\-]+/.r
|
46
|
-
xname = seq(/[xX]-/, /[a-zA-Z0-9-]+/.r).map
|
46
|
+
xname = seq(/[xX]-/, /[a-zA-Z0-9-]+/.r).map {|x, _| x.join }
|
47
47
|
classvalue = (/PUBLIC/i.r | /PRIVATE/i.r | /CONFIDENTIAL/i.r | iana_token | xname).map do |m|
|
48
48
|
PropertyValue::ClassValue.new m
|
49
49
|
end
|
@@ -94,7 +94,7 @@ module Vcard::V3_0
|
|
94
94
|
def textlist
|
95
95
|
text = C::TEXT3
|
96
96
|
textlist1 =
|
97
|
-
seq(text << ",".r, lazy { textlist1 }) { |a, b| [unescape(a), b].flatten } |
|
97
|
+
seq(text << ",".r, lazy { textlist1 }) { |(a, b)| [unescape(a), b].flatten } |
|
98
98
|
text.map { |t| [unescape(t)] }
|
99
99
|
textlist = textlist1.map { |m| PropertyValue::Textlist.new m }
|
100
100
|
textlist.eof
|
@@ -103,21 +103,21 @@ module Vcard::V3_0
|
|
103
103
|
def org
|
104
104
|
text = C::TEXT3
|
105
105
|
org1 =
|
106
|
-
seq(text << ";".r, lazy { org1 }) { |a, b| [unescape(a), b].flatten } |
|
106
|
+
seq(text << ";".r, lazy { org1 }) { |(a, b)| [unescape(a), b].flatten } |
|
107
107
|
text.map { |t| [unescape(t)] }
|
108
108
|
org = org1.map { |o| PropertyValue::Org.new o }
|
109
109
|
org.eof
|
110
110
|
end
|
111
111
|
|
112
112
|
def date_t
|
113
|
-
date_t = seq(/[0-9]{4}/.r, /-/.r._? >> /[0-9]{2}/.r, /-/.r._? >> /[0-9]{2}/.r) do |yy, mm, dd|
|
113
|
+
date_t = seq(/[0-9]{4}/.r, /-/.r._? >> /[0-9]{2}/.r, /-/.r._? >> /[0-9]{2}/.r) do |(yy, mm, dd)|
|
114
114
|
PropertyValue::Date.new(year: yy, month: mm, day: dd)
|
115
115
|
end
|
116
116
|
date_t.eof
|
117
117
|
end
|
118
118
|
|
119
119
|
def time_t
|
120
|
-
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |s, h, m|
|
120
|
+
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |(s, h, m)|
|
121
121
|
{ sign: s, hour: h, min: m }
|
122
122
|
end
|
123
123
|
zone = utc_offset.map { |u| u } |
|
@@ -126,7 +126,7 @@ module Vcard::V3_0
|
|
126
126
|
minute = /[0-9]{2}/.r
|
127
127
|
second = /[0-9]{2}/.r
|
128
128
|
secfrac = seq(",".r >> /[0-9]+/)
|
129
|
-
time_t = seq(hour << /:/._?, minute << /:/._?, second, secfrac._?, zone._?) do |h, m, s, f, z|
|
129
|
+
time_t = seq(hour << /:/._?, minute << /:/._?, second, secfrac._?, zone._?) do |(h, m, s, f, z)|
|
130
130
|
h = { hour: h, min: m, sec: s }
|
131
131
|
h[:zone] = z[0] unless z.empty?
|
132
132
|
h[:secfrac] = f[0] unless f.empty?
|
@@ -136,7 +136,7 @@ module Vcard::V3_0
|
|
136
136
|
end
|
137
137
|
|
138
138
|
def date_time
|
139
|
-
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |s, h, m|
|
139
|
+
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |(s, h, m)|
|
140
140
|
{ sign: s, hour: h, min: m }
|
141
141
|
end
|
142
142
|
zone = utc_offset.map { |u| u } |
|
@@ -145,10 +145,10 @@ module Vcard::V3_0
|
|
145
145
|
minute = /[0-9]{2}/.r
|
146
146
|
second = /[0-9]{2}/.r
|
147
147
|
secfrac = seq(",".r >> /[0-9]+/)
|
148
|
-
date = seq(/[0-9]{4}/.r, /-/.r._?, /[0-9]{2}/.r, /-/.r._?, /[0-9]{2}/.r) do |yy, _, mm, _, dd|
|
148
|
+
date = seq(/[0-9]{4}/.r, /-/.r._?, /[0-9]{2}/.r, /-/.r._?, /[0-9]{2}/.r) do |(yy, _, mm, _, dd)|
|
149
149
|
{ year: yy, month: mm, day: dd }
|
150
150
|
end
|
151
|
-
time = seq(hour << /:/.r._?, minute << /:/.r._?, second, secfrac._?, zone._?) do |h, m, s, f, z|
|
151
|
+
time = seq(hour << /:/.r._?, minute << /:/.r._?, second, secfrac._?, zone._?) do |(h, m, s, f, z)|
|
152
152
|
h = { hour: h, min: m, sec: s }
|
153
153
|
h[:zone] = if z.empty?
|
154
154
|
""
|
@@ -158,14 +158,14 @@ module Vcard::V3_0
|
|
158
158
|
h[:secfrac] = f[0] unless f.empty?
|
159
159
|
h
|
160
160
|
end
|
161
|
-
date_time = seq(date << "T".r, time) do |d, t|
|
161
|
+
date_time = seq(date << "T".r, time) do |(d, t)|
|
162
162
|
PropertyValue::DateTimeLocal.new(d.merge(t))
|
163
163
|
end
|
164
164
|
date_time.eof
|
165
165
|
end
|
166
166
|
|
167
167
|
def date_or_date_time
|
168
|
-
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |s, h, m|
|
168
|
+
utc_offset = seq(C::SIGN, /[0-9]{2}/.r << /:/.r._?, /[0-9]{2}/.r) do |(s, h, m)|
|
169
169
|
{ sign: s, hour: h, min: m }
|
170
170
|
end
|
171
171
|
zone = utc_offset.map { |u| u } |
|
@@ -174,23 +174,23 @@ module Vcard::V3_0
|
|
174
174
|
minute = /[0-9]{2}/.r
|
175
175
|
second = /[0-9]{2}/.r
|
176
176
|
secfrac = seq(",".r >> /[0-9]+/)
|
177
|
-
date = seq(/[0-9]{4}/.r << /-/.r._?, /[0-9]{2}/.r << /-/.r._?, /[0-9]{2}/.r) do |yy, mm, dd|
|
177
|
+
date = seq(/[0-9]{4}/.r << /-/.r._?, /[0-9]{2}/.r << /-/.r._?, /[0-9]{2}/.r) do |(yy, mm, dd)|
|
178
178
|
{ year: yy, month: mm, day: dd }
|
179
179
|
end
|
180
|
-
time = seq(hour << /:/.r._?, minute << /:/.r._?, second, secfrac._?, zone._?) do |h, m, s, f, z|
|
180
|
+
time = seq(hour << /:/.r._?, minute << /:/.r._?, second, secfrac._?, zone._?) do |(h, m, s, f, z)|
|
181
181
|
h = { hour: h, min: m, sec: s }
|
182
182
|
h[:zone] = z[0] unless z.empty?
|
183
183
|
h[:secfrac] = f[0] unless f.empty?
|
184
184
|
h
|
185
185
|
end
|
186
|
-
date_or_date_time = seq(date << "T".r, time) do |d, t|
|
186
|
+
date_or_date_time = seq(date << "T".r, time) do |(d, t)|
|
187
187
|
PropertyValue::DateTimeLocal.new(d.merge(t))
|
188
188
|
end | date.map { |d| PropertyValue::Date.new(d) }
|
189
189
|
date_or_date_time.eof
|
190
190
|
end
|
191
191
|
|
192
192
|
def utc_offset
|
193
|
-
utc_offset = seq(C::SIGN, /[0-9]{2}/.r, /:/.r._?, /[0-9]{2}/.r) do |s, h, _, m|
|
193
|
+
utc_offset = seq(C::SIGN, /[0-9]{2}/.r, /:/.r._?, /[0-9]{2}/.r) do |(s, h, _, m)|
|
194
194
|
PropertyValue::Utcoffset.new(sign: s, hour: h, min: m)
|
195
195
|
end
|
196
196
|
utc_offset.eof
|
@@ -198,7 +198,7 @@ module Vcard::V3_0
|
|
198
198
|
|
199
199
|
def kindvalue
|
200
200
|
iana_token = /[a-zA-Z\d\-]+/.r
|
201
|
-
xname = seq(/[xX]-/, /[a-zA-Z0-9-]+/.r).map
|
201
|
+
xname = seq(/[xX]-/, /[a-zA-Z0-9-]+/.r).map {|x, _| x.join }
|
202
202
|
kindvalue = (/individual/i.r | /group/i.r | /org/i.r | /location/i.r |
|
203
203
|
iana_token | xname).map do |k|
|
204
204
|
PropertyValue::Kindvalue.new(k)
|
@@ -208,29 +208,29 @@ module Vcard::V3_0
|
|
208
208
|
|
209
209
|
def fivepartname
|
210
210
|
text = C::TEXT3
|
211
|
-
component = seq(text << ",".r, lazy { component }) do |a, b|
|
211
|
+
component = seq(text << ",".r, lazy { component }) do |(a, b)|
|
212
212
|
[unescape(a), b].flatten
|
213
213
|
end | text.map { |t| [unescape(t)] }
|
214
214
|
fivepartname1 = seq(component << ";".r, component << ";".r, component << ";".r,
|
215
|
-
component << ";".r, component) do |a, b, c, d, e|
|
215
|
+
component << ";".r, component) do |(a, b, c, d, e)|
|
216
216
|
a = a[0] if a.length == 1
|
217
217
|
b = b[0] if b.length == 1
|
218
218
|
c = c[0] if c.length == 1
|
219
219
|
d = d[0] if d.length == 1
|
220
220
|
e = e[0] if e.length == 1
|
221
221
|
{ surname: a, givenname: b, middlename: c, honprefix: d, honsuffix: e }
|
222
|
-
end | seq(component << ";".r, component << ";".r, component << ";".r, component) do |a, b, c, d|
|
222
|
+
end | seq(component << ";".r, component << ";".r, component << ";".r, component) do |(a, b, c, d)|
|
223
223
|
a = a[0] if a.length == 1
|
224
224
|
b = b[0] if b.length == 1
|
225
225
|
c = c[0] if c.length == 1
|
226
226
|
d = d[0] if d.length == 1
|
227
227
|
{ surname: a, givenname: b, middlename: c, honprefix: d, honsuffix: "" }
|
228
|
-
end | seq(component << ";".r, component << ";".r, component) do |a, b, c|
|
228
|
+
end | seq(component << ";".r, component << ";".r, component) do |(a, b, c)|
|
229
229
|
a = a[0] if a.length == 1
|
230
230
|
b = b[0] if b.length == 1
|
231
231
|
c = c[0] if c.length == 1
|
232
232
|
{ surname: a, givenname: b, middlename: c, honprefix: "", honsuffix: "" }
|
233
|
-
end | seq(component << ";".r, component) do |a, b|
|
233
|
+
end | seq(component << ";".r, component) do |(a, b)|
|
234
234
|
a = a[0] if a.length == 1
|
235
235
|
b = b[0] if b.length == 1
|
236
236
|
{ surname: a, givenname: b, middlename: "", honprefix: "", honsuffix: "" }
|
@@ -244,11 +244,11 @@ module Vcard::V3_0
|
|
244
244
|
|
245
245
|
def address
|
246
246
|
text = C::TEXT3
|
247
|
-
component = seq(text << ",".r, lazy { component }) do |a, b|
|
247
|
+
component = seq(text << ",".r, lazy { component }) do |(a, b)|
|
248
248
|
[unescape(a), b].flatten
|
249
249
|
end | text.map { |t| [unescape(t)] }
|
250
250
|
address1 = seq(component << ";".r, component << ";".r, component << ";".r, component << ";".r,
|
251
|
-
component << ";".r, component << ";".r, component) do |a, b, c, d, e, f, g|
|
251
|
+
component << ";".r, component << ";".r, component) do |(a, b, c, d, e, f, g)|
|
252
252
|
a = a[0] if a.length == 1
|
253
253
|
b = b[0] if b.length == 1
|
254
254
|
c = c[0] if c.length == 1
|
@@ -259,7 +259,7 @@ module Vcard::V3_0
|
|
259
259
|
{ pobox: a, ext: b, street: c,
|
260
260
|
locality: d, region: e, code: f, country: g }
|
261
261
|
end | seq(component << ";".r, component << ";".r, component << ";".r, component << ";".r,
|
262
|
-
component << ";".r, component) do |a, b, c, d, e, f|
|
262
|
+
component << ";".r, component) do |(a, b, c, d, e, f)|
|
263
263
|
a = a[0] if a.length == 1
|
264
264
|
b = b[0] if b.length == 1
|
265
265
|
c = c[0] if c.length == 1
|
@@ -269,7 +269,7 @@ module Vcard::V3_0
|
|
269
269
|
{ pobox: a, ext: b, street: c,
|
270
270
|
locality: d, region: e, code: f, country: "" }
|
271
271
|
end | seq(component << ";".r, component << ";".r, component << ";".r,
|
272
|
-
component << ";".r, component) do |a, b, c, d, e|
|
272
|
+
component << ";".r, component) do |(a, b, c, d, e)|
|
273
273
|
a = a[0] if a.length == 1
|
274
274
|
b = b[0] if b.length == 1
|
275
275
|
c = c[0] if c.length == 1
|
@@ -277,20 +277,20 @@ module Vcard::V3_0
|
|
277
277
|
e = e[0] if e.length == 1
|
278
278
|
{ pobox: a, ext: b, street: c,
|
279
279
|
locality: d, region: e, code: "", country: "" }
|
280
|
-
end | seq(component << ";".r, component << ";".r, component << ";".r, component) do |a, b, c, d|
|
280
|
+
end | seq(component << ";".r, component << ";".r, component << ";".r, component) do |(a, b, c, d)|
|
281
281
|
a = a[0] if a.length == 1
|
282
282
|
b = b[0] if b.length == 1
|
283
283
|
c = c[0] if c.length == 1
|
284
284
|
d = d[0] if d.length == 1
|
285
285
|
{ pobox: a, ext: b, street: c,
|
286
286
|
locality: d, region: "", code: "", country: "" }
|
287
|
-
end | seq(component << ";".r, component << ";".r, component) do |a, b, c|
|
287
|
+
end | seq(component << ";".r, component << ";".r, component) do |(a, b, c)|
|
288
288
|
a = a[0] if a.length == 1
|
289
289
|
b = b[0] if b.length == 1
|
290
290
|
c = c[0] if c.length == 1
|
291
291
|
{ pobox: a, ext: b, street: c,
|
292
292
|
locality: "", region: "", code: "", country: "" }
|
293
|
-
end | seq(component << ";".r, component) do |a, b|
|
293
|
+
end | seq(component << ";".r, component) do |(a, b)|
|
294
294
|
a = a[0] if a.length == 1
|
295
295
|
b = b[0] if b.length == 1
|
296
296
|
{ pobox: a, ext: b, street: "",
|