vobject 1.0.2 → 1.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.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4225cf5502ffcc41e7f940a822d75f04d480cf4453987116b2214a008d6fdba6
|
4
|
+
data.tar.gz: 894dbf2973bf0b0f532cdcd13b7c88198642298bff87c0750e71007c7ba9c770
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 847fc89ba5243445c5df68cbace4bca077d1a501efc259cff5072e51edcf886b579264d5a608e8414a06f7466ae81f1cb72e13c1fab9abed4be382448279da6c
|
7
|
+
data.tar.gz: 16d2a911fdb256ca5b5e41be778cdbff220b1130a0d787ec60153ca9779d1aed904b2a96d1b315617fd6f3e9c46771c4351c0470d5e2727b3d8e786491221c41
|
data/README.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
== Ruby vObject parser
|
2
2
|
|
3
|
-
image:https://img.shields.io/gem/v/
|
3
|
+
image:https://img.shields.io/gem/v/vobject.svg["Gem Version", link="https://rubygems.org/gems/vobject"]
|
4
4
|
image:https://github.com/riboseinc/ruby-vobject/workflows/macos/badge.svg["Build Status (macOS)", link="https://github.com/riboseinc/ruby-vobject/actions?workflow=macos"]
|
5
5
|
image:https://github.com/riboseinc/ruby-vobject/workflows/ubuntu/badge.svg["Build Status (ubuntu)", link="https://github.com/riboseinc/ruby-vobject/actions?workflow=ubuntu"]
|
6
6
|
image:https://github.com/riboseinc/ruby-vobject/workflows/windows/badge.svg["Build Status (Windows)", link="https://github.com/riboseinc/ruby-vobject/actions?workflow=windows"]
|
data/lib/c.rb
CHANGED
@@ -9,18 +9,18 @@ module C
|
|
9
9
|
BOOLEAN = /TRUE/i.r.map { true } | /FALSE/i.r.map { false }
|
10
10
|
IANATOKEN = /[a-zA-Z\d\-]+/.r
|
11
11
|
vendorid_vcal = /[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]/.r
|
12
|
-
XNAME_VCAL = seq(/[xX]-/, vendorid_vcal, "-", IANATOKEN).map
|
12
|
+
XNAME_VCAL = seq(/[xX]-/, vendorid_vcal, "-", IANATOKEN).map {|x, _| x.join }
|
13
13
|
vendorid_vcard = /[a-zA-Z0-9]+/.r # different from iCal
|
14
|
-
XNAME_VCARD = seq(/[xX]-/, vendorid_vcard, "-", IANATOKEN).map
|
14
|
+
XNAME_VCARD = seq(/[xX]-/, vendorid_vcard, "-", IANATOKEN).map {|x, _| x.join }
|
15
15
|
TEXT = /([ \t\u0021\u0023-\u002b\u002d-\u0039\u003c-\u005b\u005d-\u007e\u0080-\u3ffff:"]|\\[nN;,\\])*/.r
|
16
16
|
TEXT3 = /([ \t\u0021\u0023-\u002b\u002d-\u0039\u003c-\u005b\u005d-\u007e\u0080-\u3ffff:"]|\\[nN;,\\]?)*/.r
|
17
17
|
TEXT4 = /([ \t\u0021\u0023-\u002b\u002d-\u005b\u005d-\u007e\u0080-\u3ffff:"]|\\[nN,\\])*/.r
|
18
18
|
COMPONENT4 = /([ \t\u0021\u0023-\u002b\u002d-\u003a\u003c-\u005b\u005d-\u007e\u0080-\u3ffff:"]|\\[nN,;\\])*/.r
|
19
|
-
DATE = seq(/[0-9]{4}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r) do |yy, mm, dd|
|
19
|
+
DATE = seq(/[0-9]{4}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r) do |(yy, mm, dd)|
|
20
20
|
Vobject::Vcalendar::PropertyValue::Date.new Time.utc(yy, mm, dd)
|
21
21
|
end
|
22
22
|
DATE_TIME = seq(/[0-9]{4}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r << "T".r,
|
23
|
-
/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |yy, mm, dd, h, m, s, z|
|
23
|
+
/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |(yy, mm, dd, h, m, s, z)|
|
24
24
|
if z.empty?
|
25
25
|
#Vobject::Vcalendar::PropertyValue::DateTimeLocal.new(time: Time.local(yy, mm, dd, h, m, s), zone: "")
|
26
26
|
Vobject::Vcalendar::PropertyValue::DateTimeLocal.new(year: yy, month: mm, day: dd, hour: h, min: m, sec: s, zone: "")
|
@@ -30,11 +30,11 @@ module C
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
DATE_TIME_UTC = seq(/[0-9]{4}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r << "T".r,
|
33
|
-
/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |yy, mm, dd, h, m, s, _z|
|
33
|
+
/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |(yy, mm, dd, h, m, s, _z)|
|
34
34
|
#Vobject::Vcalendar::PropertyValue::DateTimeUTC.new(time: Time.utc(yy, mm, dd, h, m, s), zone: "Z")
|
35
35
|
Vobject::Vcalendar::PropertyValue::DateTimeUTC.new(year: yy, month: mm, day: dd, hour: h, min: m, sec: s, zone: "Z")
|
36
36
|
end
|
37
|
-
TIME = seq(/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |h, m, s, z|
|
37
|
+
TIME = seq(/[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r, /Z/i.r._?) do |(h, m, s, z)|
|
38
38
|
hash = { hour: h, min: m, sec: s }
|
39
39
|
hash[:utc] = not(z.empty?)
|
40
40
|
hash
|
@@ -69,27 +69,27 @@ module C
|
|
69
69
|
beginend = /BEGIN/i.r | /END/i.r
|
70
70
|
NAME_VCAL = C::XNAME_VCAL | seq("".r ^ beginend, C::IANATOKEN)[1]
|
71
71
|
NAME_VCARD = C::XNAME_VCARD | seq("".r ^ beginend, C::IANATOKEN)[1]
|
72
|
-
durday = seq(/[0-9]+/.r, "D") { |d, _| { days: d.to_i } }
|
73
|
-
dursecond = seq(/[0-9]+/.r, "S") { |d, _| { seconds: d.to_i } }
|
74
|
-
durminute = seq(/[0-9]+/.r, "M", dursecond._?) do |d, _, s|
|
72
|
+
durday = seq(/[0-9]+/.r, "D") { |(d, _)| { days: d.to_i } }
|
73
|
+
dursecond = seq(/[0-9]+/.r, "S") { |(d, _)| { seconds: d.to_i } }
|
74
|
+
durminute = seq(/[0-9]+/.r, "M", dursecond._?) do |(d, _, s)|
|
75
75
|
hash = { minutes: d.to_i }
|
76
76
|
hash = hash.merge s[0] unless s.empty?
|
77
77
|
hash
|
78
78
|
end
|
79
|
-
durhour = seq(/[0-9]+/.r, "H", durminute._?) do |d, _, m|
|
79
|
+
durhour = seq(/[0-9]+/.r, "H", durminute._?) do |(d, _, m)|
|
80
80
|
hash = { hours: d.to_i }
|
81
81
|
hash = hash.merge m[0] unless m.empty?
|
82
82
|
hash
|
83
83
|
end
|
84
|
-
durweek = seq(/[0-9]+/.r, "W") { |d, _| { weeks: d.to_i } }
|
84
|
+
durweek = seq(/[0-9]+/.r, "W") { |(d, _)| { weeks: d.to_i } }
|
85
85
|
durtime1 = durhour | durminute | dursecond
|
86
|
-
durtime = seq("T", durtime1) { |_, d| d }
|
87
|
-
durdate = seq(durday, durtime._?) do |d, t|
|
86
|
+
durtime = seq("T", durtime1) { |(_, d)| d }
|
87
|
+
durdate = seq(durday, durtime._?) do |(d, t)|
|
88
88
|
d = d.merge t[0] unless t.empty?
|
89
89
|
d
|
90
90
|
end
|
91
91
|
duration1 = durdate | durtime | durweek
|
92
|
-
DURATION = seq(SIGN._?, "P", duration1) do |s, _, d|
|
92
|
+
DURATION = seq(SIGN._?, "P", duration1) do |(s, _, d)|
|
93
93
|
d[:sign] = s[0] unless s.empty?
|
94
94
|
d
|
95
95
|
end
|
@@ -105,11 +105,11 @@ module C
|
|
105
105
|
|
106
106
|
QUOTEDSTRING_VCAL = seq(/"/.r >> q_safe_char_vcal.star <<
|
107
107
|
/"/.r) { |q| q.join("") }
|
108
|
-
PTEXT_VCAL = safe_char_vcal.star.map
|
108
|
+
PTEXT_VCAL = safe_char_vcal.star.map {|x, _| x.join }
|
109
109
|
QUOTEDSTRING_VCARD = seq(/"/.r >> q_safe_char_vcard.star <<
|
110
110
|
/"/.r) { |q| q.join("") }
|
111
|
-
PTEXT_VCARD = safe_char_vcard.star.map
|
112
|
-
VALUE = value_char.star.map
|
111
|
+
PTEXT_VCARD = safe_char_vcard.star.map {|x, _| x.join }
|
112
|
+
VALUE = value_char.star.map {|x, _| x.join }
|
113
113
|
|
114
114
|
rfc5646irregular = /en-GB-oed/i.r | /i-ami/i.r | /i-bnn/i.r | /i-default/i.r | /i-enochian/i.r |
|
115
115
|
/i-hak/i.r | /i-klingon/i.r | /i-lux/i.r | /i-mingo/i.r |
|
@@ -129,7 +129,7 @@ module C
|
|
129
129
|
rfc5646extlang = seq(/[A-Za-z]{3}/.r, /[A-Za-z]{3}/.r._?, /[A-Za-z]{3}/.r._?)
|
130
130
|
rfc5646language = seq(/[A-Za-z]{2,3}/.r, rfc5646extlang._?) | /[A-Za-z]{4}/.r | /[A-Za-z]{5,8}/.r
|
131
131
|
rfc5646langtag = seq(rfc5646language, rfc5646script._?, rfc5646region._?,
|
132
|
-
rfc5646variant.star, rfc5646extension.star, rfc5646privateuse._?) do |a, b, c, d, e, f|
|
132
|
+
rfc5646variant.star, rfc5646extension.star, rfc5646privateuse._?) do |(a, b, c, d, e, f)|
|
133
133
|
[a, b, c, d, e, f].flatten.join("")
|
134
134
|
end
|
135
135
|
RFC5646LANGVALUE = rfc5646langtag | rfc5646privateuse | rfc5646grandfathered
|
@@ -163,7 +163,7 @@ module C
|
|
163
163
|
/SpringGreen/i.r | /SteelBlue/i.r | /Tan/i.r | /Teal/i.r | /Thistle/i.r | /Tomato/i.r |
|
164
164
|
/Turquoise/i.r | /Violet/i.r | /Wheat/i.r | /White/i.r | /WhiteSmoke/i.r | /Yellow/i.r | /YellowGreen/i.r
|
165
165
|
|
166
|
-
UTC_OFFSET = seq(C::SIGN, /[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r._?) do |s, h, m, z|
|
166
|
+
UTC_OFFSET = seq(C::SIGN, /[0-9]{2}/.r, /[0-9]{2}/.r, /[0-9]{2}/.r._?) do |(s, h, m, z)|
|
167
167
|
h = { sign: s, hour: h, min: m }
|
168
168
|
h[:sec] = z[0] unless z.empty?
|
169
169
|
h
|
@@ -76,18 +76,18 @@ module Vobject::Vcalendar
|
|
76
76
|
rangevalue = /THISANDFUTURE/i.r
|
77
77
|
relatedvalue = /START/i.r | /END/i.r
|
78
78
|
reltypevalue = /PARENT/i.r | /CHILD/i.r | /SIBLING/i.r | C::XNAME_VCAL | C::IANATOKEN
|
79
|
-
tzidvalue = seq("/".r._?, C::PTEXT_VCAL).map { |_, val| val }
|
79
|
+
tzidvalue = seq("/".r._?, C::PTEXT_VCAL).map { |(_, val)| val }
|
80
80
|
valuetype = /BINARY/i.r | /BOOLEAN/i.r | /CAL-ADDRESS/i.r | /DATE-TIME/i.r | /DATE/i.r |
|
81
81
|
/DURATION/i.r | /FLOAT/i.r | /INTEGER/i.r | /PERIOD/i.r | /RECUR/i.r | /TEXT/i.r |
|
82
82
|
/TIME/i.r | /URI/i.r | /UTC-OFFSET/i.r | C::XNAME_VCAL | C::IANATOKEN
|
83
83
|
rolevalue = /CHAIR/i.r | /REQ-PARTICIPANT/i.r | /OPT-PARTICIPANT/i.r | /NON-PARTICIPANT/i.r |
|
84
84
|
C::XNAME_VCAL | C::IANATOKEN
|
85
|
-
pvalue_list = (seq(paramvalue << ",".r, lazy { pvalue_list }) & /[;:]/.r).map do |e, list|
|
85
|
+
pvalue_list = (seq(paramvalue << ",".r, lazy { pvalue_list }) & /[;:]/.r).map do |(e, list)|
|
86
86
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n"), list].flatten
|
87
87
|
end | (paramvalue & /[;:]/.r).map do |e|
|
88
88
|
[e.sub(Regexp.new("^\"(.+)\"$"), '\1').gsub(/\\n/, "\n")]
|
89
89
|
end
|
90
|
-
quoted_string_list = (seq(C::QUOTEDSTRING_VCAL << ",".r, lazy { quoted_string_list }) & /[;:]/.r).map do |e, list|
|
90
|
+
quoted_string_list = (seq(C::QUOTEDSTRING_VCAL << ",".r, lazy { quoted_string_list }) & /[;:]/.r).map do |(e, list)|
|
91
91
|
[self.class.rfc6868decode(e.sub(Regexp.new("^\"(.+)\"$"), "\1").gsub(/\\n/, "\n")), list].flatten
|
92
92
|
end | (C::QUOTEDSTRING_VCAL & /[;:]/.r).map do |e|
|
93
93
|
[self.class.rfc6868decode(e.sub(Regexp.new("^\"(.+)\"$"), "\1").gsub(/\\n/, "\n"))]
|
@@ -96,79 +96,79 @@ module Vobject::Vcalendar
|
|
96
96
|
rfc4288regname = /[A-Za-z0-9!#$&.+^+-]{1,127}/.r
|
97
97
|
rfc4288typename = rfc4288regname
|
98
98
|
rfc4288subtypename = rfc4288regname
|
99
|
-
fmttypevalue = seq(rfc4288typename, "/", rfc4288subtypename).map
|
99
|
+
fmttypevalue = seq(rfc4288typename, "/", rfc4288subtypename).map {|x, _| x.join }
|
100
100
|
|
101
101
|
# RFC 7986
|
102
102
|
displayval = /BADGE/i.r | /GRAPHIC/i.r | /FULLSIZE/i.r | /THUMBNAIL/i.r | C::XNAME_VCAL | C::IANATOKEN
|
103
|
-
displayvallist = seq(displayval << ",".r, lazy { displayvallist }) do |d, l|
|
103
|
+
displayvallist = seq(displayval << ",".r, lazy { displayvallist }) do |(d, l)|
|
104
104
|
[d, l].flatten
|
105
105
|
end | displayval.map { |d| [d] }
|
106
106
|
featureval = /AUDIO/i.r | /CHAT/i.r | /FEED/i.r | /MODERATOR/i.r | /PHONE/i.r | /SCREEN/i.r |
|
107
107
|
/VIDEO/i.r | C::XNAME_VCAL | C::IANATOKEN
|
108
|
-
featurevallist = seq(featureval << ",".r, lazy { featurevallist }) do |d, l|
|
108
|
+
featurevallist = seq(featureval << ",".r, lazy { featurevallist }) do |(d, l)|
|
109
109
|
[d, l].flatten
|
110
110
|
end | featureval.map { |d| [d] }
|
111
111
|
|
112
|
-
param = seq(/ALTREP/i.r, "=", quotedparamvalue) do |name, _, val|
|
112
|
+
param = seq(/ALTREP/i.r, "=", quotedparamvalue) do |(name, _, val)|
|
113
113
|
{ name.upcase.tr("-", "_").to_sym => val }
|
114
|
-
end | seq(/CN/i.r, "=", paramvalue) do |name, _, val|
|
114
|
+
end | seq(/CN/i.r, "=", paramvalue) do |(name, _, val)|
|
115
115
|
{ name.upcase.tr("-", "_").to_sym => val }
|
116
|
-
end | seq(/CUTYPE/i.r, "=", cutypevalue) do |name, _, val|
|
116
|
+
end | seq(/CUTYPE/i.r, "=", cutypevalue) do |(name, _, val)|
|
117
117
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
118
|
-
end | seq(/DELEGATED-FROM/i.r, "=", quoted_string_list) do |name, _, val|
|
118
|
+
end | seq(/DELEGATED-FROM/i.r, "=", quoted_string_list) do |(name, _, val)|
|
119
119
|
val = val[0] if val.length == 1
|
120
120
|
{ name.upcase.tr("-", "_").to_sym => val }
|
121
|
-
end | seq(/DELEGATED-TO/i.r, "=", quoted_string_list) do |name, _, val|
|
121
|
+
end | seq(/DELEGATED-TO/i.r, "=", quoted_string_list) do |(name, _, val)|
|
122
122
|
val = val[0] if val.length == 1
|
123
123
|
{ name.upcase.tr("-", "_").to_sym => val }
|
124
|
-
end | seq(/DIR/i.r, "=", quotedparamvalue) do |name, _, val|
|
124
|
+
end | seq(/DIR/i.r, "=", quotedparamvalue) do |(name, _, val)|
|
125
125
|
{ name.upcase.tr("-", "_").to_sym => val }
|
126
|
-
end | seq(/ENCODING/i.r, "=", encodingvalue) do |name, _, val|
|
126
|
+
end | seq(/ENCODING/i.r, "=", encodingvalue) do |(name, _, val)|
|
127
127
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
128
|
-
end | seq(/FMTTYPE/i.r, "=", fmttypevalue) do |name, _, val|
|
128
|
+
end | seq(/FMTTYPE/i.r, "=", fmttypevalue) do |(name, _, val)|
|
129
129
|
{ name.upcase.tr("-", "_").to_sym => val.downcase }
|
130
|
-
end | seq(/FBTYPE/i.r, "=", fbtypevalue) do |name, _, val|
|
130
|
+
end | seq(/FBTYPE/i.r, "=", fbtypevalue) do |(name, _, val)|
|
131
131
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
132
|
-
end | seq(/LANGUAGE/i.r, "=", C::RFC5646LANGVALUE) do |name, _, val|
|
132
|
+
end | seq(/LANGUAGE/i.r, "=", C::RFC5646LANGVALUE) do |(name, _, val)|
|
133
133
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
134
|
-
end | seq(/MEMBER/i.r, "=", quoted_string_list) do |name, _, val|
|
134
|
+
end | seq(/MEMBER/i.r, "=", quoted_string_list) do |(name, _, val)|
|
135
135
|
val = val[0] if val.length == 1
|
136
136
|
{ name.upcase.tr("-", "_").to_sym => val }
|
137
|
-
end | seq(/PARTSTAT/i.r, "=", partstatvalue) do |name, _, val|
|
137
|
+
end | seq(/PARTSTAT/i.r, "=", partstatvalue) do |(name, _, val)|
|
138
138
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
139
|
-
end | seq(/RANGE/i.r, "=", rangevalue) do |name, _, val|
|
139
|
+
end | seq(/RANGE/i.r, "=", rangevalue) do |(name, _, val)|
|
140
140
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
141
|
-
end | seq(/RELATED/i.r, "=", relatedvalue) do |name, _, val|
|
141
|
+
end | seq(/RELATED/i.r, "=", relatedvalue) do |(name, _, val)|
|
142
142
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
143
|
-
end | seq(/RELTYPE/i.r, "=", reltypevalue) do |name, _, val|
|
143
|
+
end | seq(/RELTYPE/i.r, "=", reltypevalue) do |(name, _, val)|
|
144
144
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
145
|
-
end | seq(/ROLE/i.r, "=", rolevalue) do |name, _, val|
|
145
|
+
end | seq(/ROLE/i.r, "=", rolevalue) do |(name, _, val)|
|
146
146
|
{ name.upcase.tr("-", "_").to_sym => val.upcase }
|
147
|
-
end | seq(/RSVP/i.r, "=", C::BOOLEAN) do |name, _, val|
|
147
|
+
end | seq(/RSVP/i.r, "=", C::BOOLEAN) do |(name, _, val)|
|
148
148
|
{ name.upcase.tr("-", "_").to_sym => val }
|
149
|
-
end | seq(/SENT-BY/i.r, "=", quotedparamvalue) do |name, _, val|
|
149
|
+
end | seq(/SENT-BY/i.r, "=", quotedparamvalue) do |(name, _, val)|
|
150
150
|
{ name.upcase.tr("-", "_").to_sym => val }
|
151
|
-
end | seq(/TZID/i.r, "=", tzidvalue) do |name, _, val|
|
151
|
+
end | seq(/TZID/i.r, "=", tzidvalue) do |(name, _, val)|
|
152
152
|
{ name.upcase.tr("-", "_").to_sym => val }
|
153
|
-
end | seq(/VALUE/i.r, "=", valuetype) do |name, _, val|
|
153
|
+
end | seq(/VALUE/i.r, "=", valuetype) do |(name, _, val)|
|
154
154
|
{ name.upcase.tr("-", "_").to_sym => val }
|
155
155
|
# RFC 7986
|
156
|
-
end | seq(/DISPLAY/i.r, "=", displayvallist) do |name, _, val|
|
156
|
+
end | seq(/DISPLAY/i.r, "=", displayvallist) do |(name, _, val)|
|
157
157
|
{ name.upcase.tr("-", "_").to_sym => val }
|
158
|
-
end | seq(/FEATURE/i.r, "=", featurevallist) do |name, _, val|
|
158
|
+
end | seq(/FEATURE/i.r, "=", featurevallist) do |(name, _, val)|
|
159
159
|
{ name.upcase.tr("-", "_").to_sym => val }
|
160
|
-
end | seq(/EMAIL/i.r, "=", paramvalue) do |name, _, val|
|
160
|
+
end | seq(/EMAIL/i.r, "=", paramvalue) do |(name, _, val)|
|
161
161
|
{ name.upcase.tr("-", "_").to_sym => val }
|
162
|
-
end | seq(/LABEL/i.r, "=", paramvalue) do |name, _, val|
|
162
|
+
end | seq(/LABEL/i.r, "=", paramvalue) do |(name, _, val)|
|
163
163
|
{ name.upcase.tr("-", "_").to_sym => val }
|
164
|
-
end | seq(otherparamname, "=", pvalue_list) do |name, _, val|
|
164
|
+
end | seq(otherparamname, "=", pvalue_list) do |(name, _, val)|
|
165
165
|
val = val[0] if val.length == 1
|
166
166
|
{ name.upcase.tr("-", "_").to_sym => val }
|
167
|
-
end | seq(paramname, "=", pvalue_list) do |name, _, val|
|
167
|
+
end | seq(paramname, "=", pvalue_list) do |(name, _, val)|
|
168
168
|
parse_err("Violated format of parameter value #{name} = #{val}")
|
169
169
|
end
|
170
170
|
|
171
|
-
params = seq(";".r >> param & ";", lazy { params }) do |p, ps|
|
171
|
+
params = seq(";".r >> param & ";", lazy { params }) do |(p, ps)|
|
172
172
|
p.merge(ps) do |key, old, new|
|
173
173
|
if @cardinality1[:PARAM].include?(key)
|
174
174
|
parse_err("Violated cardinality of parameter #{key}")
|
@@ -179,7 +179,7 @@ module Vobject::Vcalendar
|
|
179
179
|
end | seq(";".r >> param).map { |e| e[0] }
|
180
180
|
|
181
181
|
contentline = seq(linegroup._?, C::NAME_VCAL, params._? << ":".r,
|
182
|
-
C::VALUE, /(\r|\n|\r\n)/) do |g, name, p, value, _|
|
182
|
+
C::VALUE, /(\r|\n|\r\n)/) do |(g, name, p, value, _)|
|
183
183
|
key = name.upcase.tr("-", "_").to_sym
|
184
184
|
hash = { key => { value: value } }
|
185
185
|
hash[key][:group] = g[0] unless g.empty?
|
@@ -189,7 +189,7 @@ module Vobject::Vcalendar
|
|
189
189
|
end
|
190
190
|
|
191
191
|
props = ("".r & beginend).map { {} } |
|
192
|
-
seq(contentline, lazy { props }) do |c, rest|
|
192
|
+
seq(contentline, lazy { props }) do |(c, rest)|
|
193
193
|
k = c.keys[0]
|
194
194
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :GENERIC, c[k][:value], @ctx)
|
195
195
|
errors << errors1
|
@@ -199,7 +199,7 @@ module Vobject::Vcalendar
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
alarmprops = ("".r & beginend).map { {} } |
|
202
|
-
seq(contentline, lazy { alarmprops }) do |c, rest|
|
202
|
+
seq(contentline, lazy { alarmprops }) do |(c, rest)|
|
203
203
|
k = c.keys[0]
|
204
204
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :ALARM, c[k][:value], @ctx)
|
205
205
|
errors << errors1
|
@@ -211,7 +211,7 @@ module Vobject::Vcalendar
|
|
211
211
|
end
|
212
212
|
end
|
213
213
|
fbprops = ("".r & beginend).map { {} } |
|
214
|
-
seq(contentline, lazy { fbprops }) do |c, rest|
|
214
|
+
seq(contentline, lazy { fbprops }) do |(c, rest)|
|
215
215
|
k = c.keys[0]
|
216
216
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :FREEBUSY, c[k][:value], @ctx)
|
217
217
|
errors << errors1
|
@@ -223,7 +223,7 @@ module Vobject::Vcalendar
|
|
223
223
|
end
|
224
224
|
end
|
225
225
|
journalprops = ("".r & beginend).map { {} } |
|
226
|
-
seq(contentline, lazy { journalprops }) do |c, rest|
|
226
|
+
seq(contentline, lazy { journalprops }) do |(c, rest)|
|
227
227
|
k = c.keys[0]
|
228
228
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :JOURNAL, c[k][:value], @ctx)
|
229
229
|
errors << errors1
|
@@ -235,7 +235,7 @@ module Vobject::Vcalendar
|
|
235
235
|
end
|
236
236
|
end
|
237
237
|
tzprops = ("".r & beginend).map { {} } |
|
238
|
-
seq(contentline, lazy { tzprops }) do |c, rest|
|
238
|
+
seq(contentline, lazy { tzprops }) do |(c, rest)|
|
239
239
|
k = c.keys[0]
|
240
240
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :TZ, c[k][:value], @ctx)
|
241
241
|
errors << errors1
|
@@ -246,24 +246,24 @@ module Vobject::Vcalendar
|
|
246
246
|
[old, new].flatten
|
247
247
|
end
|
248
248
|
end
|
249
|
-
standardc = seq(/BEGIN:STANDARD(\r|\n|\r\n)/i.r, tzprops, /END:STANDARD(\r|\n|\r\n)/i.r) do |_, e, _|
|
249
|
+
standardc = seq(/BEGIN:STANDARD(\r|\n|\r\n)/i.r, tzprops, /END:STANDARD(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
250
250
|
parse_err("Missing DTSTART property") unless e.has_key?(:DTSTART)
|
251
251
|
parse_err("Missing TZOFFSETTO property") unless e.has_key?(:TZOFFSETTO)
|
252
252
|
parse_err("Missing TZOFFSETFROM property") unless e.has_key?(:TZOFFSETFROM)
|
253
253
|
{ STANDARD: { component: [e] } }
|
254
254
|
end
|
255
|
-
daylightc = seq(/BEGIN:DAYLIGHT(\r|\n|\r\n)/i.r, tzprops, /END:DAYLIGHT(\r|\n|\r\n)/i.r) do |_, e, _|
|
255
|
+
daylightc = seq(/BEGIN:DAYLIGHT(\r|\n|\r\n)/i.r, tzprops, /END:DAYLIGHT(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
256
256
|
parse_err("Missing DTSTART property") unless e.has_key?(:DTSTART)
|
257
257
|
parse_err("Missing TZOFFSETTO property") unless e.has_key?(:TZOFFSETTO)
|
258
258
|
parse_err("Missing TZOFFSETFROM property") unless e.has_key?(:TZOFFSETFROM)
|
259
259
|
{ DAYLIGHT: { component: [e] } }
|
260
260
|
end
|
261
261
|
timezoneprops =
|
262
|
-
seq(standardc, lazy { timezoneprops }) do |e, rest|
|
262
|
+
seq(standardc, lazy { timezoneprops }) do |(e, rest)|
|
263
263
|
e.merge(rest) { |_, old, new| { component: [old[:component], new[:component]].flatten } }
|
264
|
-
end | seq(daylightc, lazy { timezoneprops }) do |e, rest|
|
264
|
+
end | seq(daylightc, lazy { timezoneprops }) do |(e, rest)|
|
265
265
|
e.merge(rest) { |_, old, new| { component: [old[:component], new[:component]].flatten } }
|
266
|
-
end | seq(contentline, lazy { timezoneprops }) do |e, rest|
|
266
|
+
end | seq(contentline, lazy { timezoneprops }) do |(e, rest)|
|
267
267
|
k = e.keys[0]
|
268
268
|
e[k][:value], errors1 = Typegrammars.typematch(strict, k, e[k][:params], :TIMEZONE, e[k][:value], @ctx)
|
269
269
|
errors << errors1
|
@@ -276,7 +276,7 @@ module Vobject::Vcalendar
|
|
276
276
|
end |
|
277
277
|
("".r & beginend).map { {} }
|
278
278
|
todoprops = ("".r & beginend).map { {} } |
|
279
|
-
seq(contentline, lazy { todoprops }) do |c, rest|
|
279
|
+
seq(contentline, lazy { todoprops }) do |(c, rest)|
|
280
280
|
k = c.keys[0]
|
281
281
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :TODO, c[k][:value], @ctx)
|
282
282
|
errors << errors1
|
@@ -287,7 +287,7 @@ module Vobject::Vcalendar
|
|
287
287
|
[old, new].flatten
|
288
288
|
end
|
289
289
|
end
|
290
|
-
eventprops = seq(contentline, lazy { eventprops }) do |c, rest|
|
290
|
+
eventprops = seq(contentline, lazy { eventprops }) do |(c, rest)|
|
291
291
|
k = c.keys[0]
|
292
292
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :EVENT, c[k][:value], @ctx)
|
293
293
|
errors << errors1
|
@@ -299,7 +299,7 @@ module Vobject::Vcalendar
|
|
299
299
|
end
|
300
300
|
end |
|
301
301
|
("".r & beginend).map { {} }
|
302
|
-
alarmc = seq(/BEGIN:VALARM(\r|\n|\r\n)/i.r, alarmprops, /END:VALARM(\r|\n|\r\n)/i.r) do |_, e, _|
|
302
|
+
alarmc = seq(/BEGIN:VALARM(\r|\n|\r\n)/i.r, alarmprops, /END:VALARM(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
303
303
|
parse_err("Missing ACTION property") unless e.has_key?(:ACTION)
|
304
304
|
parse_err("Missing TRIGGER property") unless e.has_key?(:TRIGGER)
|
305
305
|
if e.has_key?(:DURATION) && !e.has_key?(:REPEAT) || !e.has_key?(:DURATION) && e.has_key?(:REPEAT)
|
@@ -320,24 +320,24 @@ module Vobject::Vcalendar
|
|
320
320
|
end
|
321
321
|
{ VALARM: { component: [e] } }
|
322
322
|
end
|
323
|
-
freebusyc = seq(/BEGIN:VFREEBUSY(\r|\n|\r\n)/i.r, fbprops, /END:VFREEBUSY(\r|\n|\r\n)/i.r) do |_, e, _|
|
323
|
+
freebusyc = seq(/BEGIN:VFREEBUSY(\r|\n|\r\n)/i.r, fbprops, /END:VFREEBUSY(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
324
324
|
parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP)
|
325
325
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
326
326
|
parse_err("DTEND before DTSTART") if e.has_key?(:DTEND) && e.has_key?(:DTSTART) &&
|
327
327
|
e[:DTEND][:value] < e[:DTSTART][:value]
|
328
328
|
{ VFREEBUSY: { component: [e] } }
|
329
329
|
end
|
330
|
-
journalc = seq(/BEGIN:VJOURNAL(\r|\n|\r\n)/i.r, journalprops, /END:VJOURNAL(\r|\n|\r\n)/i.r) do |_, e, _|
|
330
|
+
journalc = seq(/BEGIN:VJOURNAL(\r|\n|\r\n)/i.r, journalprops, /END:VJOURNAL(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
331
331
|
parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP)
|
332
332
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
333
333
|
parse_err("Missing DTSTART property with RRULE property") if e.has_key?(:RRULE) && !e.has_key?(:DTSTART)
|
334
334
|
{ VJOURNAL: { component: [e] } }
|
335
335
|
end
|
336
|
-
timezonec = seq(/BEGIN:VTIMEZONE(\r|\n|\r\n)/i.r, timezoneprops, /END:VTIMEZONE(\r|\n|\r\n)/i.r) do |_, e, _|
|
336
|
+
timezonec = seq(/BEGIN:VTIMEZONE(\r|\n|\r\n)/i.r, timezoneprops, /END:VTIMEZONE(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
337
337
|
parse_err("Missing STANDARD || DAYLIGHT property") unless e.has_key?(:STANDARD) || e.has_key?(:DAYLIGHT)
|
338
338
|
{ VTIMEZONE: { component: [e] } }
|
339
339
|
end
|
340
|
-
todoc = seq(/BEGIN:VTODO(\r|\n|\r\n)/i.r, todoprops, alarmc.star, /END:VTODO(\r|\n|\r\n)/i.r) do |_, e, a, _|
|
340
|
+
todoc = seq(/BEGIN:VTODO(\r|\n|\r\n)/i.r, todoprops, alarmc.star, /END:VTODO(\r|\n|\r\n)/i.r) do |(_, e, a, _)|
|
341
341
|
parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP)
|
342
342
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
343
343
|
parse_err("Coocurring DUE && DURATION properties") if e.has_key?(:DUE) && e.has_key?(:DURATION)
|
@@ -354,7 +354,7 @@ module Vobject::Vcalendar
|
|
354
354
|
end
|
355
355
|
{ VTODO: { component: [e] } }
|
356
356
|
end
|
357
|
-
eventc = seq(/BEGIN:VEVENT(\r|\n|\r\n)/i.r, eventprops, alarmc.star, /END:VEVENT(\r|\n|\r\n)/i.r) do |_, e, a, _|
|
357
|
+
eventc = seq(/BEGIN:VEVENT(\r|\n|\r\n)/i.r, eventprops, alarmc.star, /END:VEVENT(\r|\n|\r\n)/i.r) do |(_, e, a, _)|
|
358
358
|
parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP)
|
359
359
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
360
360
|
parse_err("Coocurring DTEND && DURATION properties") if e.has_key?(:DTEND) && e.has_key?(:DURATION)
|
@@ -368,20 +368,20 @@ module Vobject::Vcalendar
|
|
368
368
|
end
|
369
369
|
{ VEVENT: { component: [e] } }
|
370
370
|
end
|
371
|
-
xcomp = seq(/BEGIN:/i.r, C::XNAME_VCAL, /(\r|\n|\r\n)/i.r, props, /END:/i.r, C::XNAME_VCAL, /(\r|\n|\r\n)/i.r) do |_, n, _, p, _, n1, _|
|
371
|
+
xcomp = seq(/BEGIN:/i.r, C::XNAME_VCAL, /(\r|\n|\r\n)/i.r, props, /END:/i.r, C::XNAME_VCAL, /(\r|\n|\r\n)/i.r) do |(_, n, _, p, _, n1, _)|
|
372
372
|
n = n.upcase
|
373
373
|
n1 = n1.upcase
|
374
374
|
parse_err("Mismatch BEGIN:#{n}, END:#{n1}") if n != n1
|
375
375
|
{ n1.to_sym => { component: [p] } }
|
376
376
|
end
|
377
|
-
ianacomp = seq(/BEGIN:/i.r ^ C::ICALPROPNAMES, C::IANATOKEN, /(\r|\n|\r\n)/i.r, props, /END:/i.r ^ C::ICALPROPNAMES, C::IANATOKEN, /(\r|\n|\r\n)/i.r) do |_, n, _, p, _, n1, _|
|
377
|
+
ianacomp = seq(/BEGIN:/i.r ^ C::ICALPROPNAMES, C::IANATOKEN, /(\r|\n|\r\n)/i.r, props, /END:/i.r ^ C::ICALPROPNAMES, C::IANATOKEN, /(\r|\n|\r\n)/i.r) do |(_, n, _, p, _, n1, _)|
|
378
378
|
n = n.upcase
|
379
379
|
n1 = n1.upcase
|
380
380
|
parse_err("Mismatch BEGIN:#{n}, END:#{n1}") if n != n1
|
381
381
|
{ n1.to_sym => { component: [p] } }
|
382
382
|
end
|
383
383
|
# RFC 7953
|
384
|
-
availableprops = seq(contentline, lazy { availableprops }) do |c, rest|
|
384
|
+
availableprops = seq(contentline, lazy { availableprops }) do |(c, rest)|
|
385
385
|
k = c.keys[0]
|
386
386
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :AVAILABLE, c[k][:value], @ctx)
|
387
387
|
errors << errors1
|
@@ -392,14 +392,14 @@ module Vobject::Vcalendar
|
|
392
392
|
[old, new].flatten
|
393
393
|
end
|
394
394
|
end | ("".r & beginend).map { {} }
|
395
|
-
availablec = seq(/BEGIN:AVAILABLE(\r|\n|\r\n)/i.r, availableprops, /END:AVAILABLE(\r|\n|\r\n)/i.r) do |_, e, _|
|
395
|
+
availablec = seq(/BEGIN:AVAILABLE(\r|\n|\r\n)/i.r, availableprops, /END:AVAILABLE(\r|\n|\r\n)/i.r) do |(_, e, _)|
|
396
396
|
# parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP) # required in spec, but not in examples
|
397
397
|
parse_err("Missing DTSTART property") unless e.has_key?(:DTSTART)
|
398
398
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
399
399
|
parse_err("Coocurring DTEND && DURATION properties") if e.has_key?(:DTEND) && e.has_key?(:DURATION)
|
400
400
|
{ AVAILABLE: { component: [e] } }
|
401
401
|
end
|
402
|
-
availabilityprops = seq(contentline, lazy { availabilityprops }) do |c, rest|
|
402
|
+
availabilityprops = seq(contentline, lazy { availabilityprops }) do |(c, rest)|
|
403
403
|
k = c.keys[0]
|
404
404
|
c[k][:value], errors1 = Typegrammars.typematch(strict, k, c[k][:params], :VAVAILABILITY, c[k][:value], @ctx)
|
405
405
|
errors << errors1
|
@@ -410,7 +410,7 @@ module Vobject::Vcalendar
|
|
410
410
|
[old, new].flatten
|
411
411
|
end
|
412
412
|
end | ("".r & beginend).map { {} }
|
413
|
-
vavailabilityc = seq(/BEGIN:VAVAILABILITY(\r|\n|\r\n)/i.r, availabilityprops, availablec.star, /END:VAVAILABILITY(\r|\n|\r\n)/i.r) do |_, e, a, _|
|
413
|
+
vavailabilityc = seq(/BEGIN:VAVAILABILITY(\r|\n|\r\n)/i.r, availabilityprops, availablec.star, /END:VAVAILABILITY(\r|\n|\r\n)/i.r) do |(_, e, a, _)|
|
414
414
|
parse_err("Missing DTSTAMP property") unless e.has_key?(:DTSTAMP)
|
415
415
|
parse_err("Missing UID property") unless e.has_key?(:UID)
|
416
416
|
parse_err("Coocurring DTEND && DURATION properties") if e.has_key?(:DTEND) && e.has_key?(:DURATION)
|
@@ -425,7 +425,7 @@ module Vobject::Vcalendar
|
|
425
425
|
end
|
426
426
|
|
427
427
|
component = eventc | todoc | journalc | freebusyc | timezonec | ianacomp | xcomp | vavailabilityc
|
428
|
-
components = seq(component, lazy { components }) do |c, r|
|
428
|
+
components = seq(component, lazy { components }) do |(c, r)|
|
429
429
|
c.merge(r) do |_key, old, new|
|
430
430
|
{ component: [old[:component], new[:component]].flatten }
|
431
431
|
end
|
@@ -435,7 +435,7 @@ module Vobject::Vcalendar
|
|
435
435
|
/UID/i.r | /LAST-MOD/i.r | /URL/i.r | /REFRESH/i.r | /SOURCE/i.r | /COLOR/i.r | # RFC 7986
|
436
436
|
/NAME/i.r | /DESCRIPTION/i.r | /CATEGORIES/i.r | /IMAGE/i.r | # RFC 7986
|
437
437
|
C::XNAME_VCAL | C::IANATOKEN
|
438
|
-
calprop = seq(calpropname, params._? << ":".r, C::VALUE, /(\r|\n|\r\n)/) do |key, p, value, _|
|
438
|
+
calprop = seq(calpropname, params._? << ":".r, C::VALUE, /(\r|\n|\r\n)/) do |(key, p, value, _)|
|
439
439
|
key = key.upcase.tr("-", "_").to_sym
|
440
440
|
val, errors1 = Typegrammars.typematch(strict, key, p[0], :CALENDAR, value, @ctx)
|
441
441
|
errors << errors1
|
@@ -446,7 +446,7 @@ module Vobject::Vcalendar
|
|
446
446
|
# TODO not doing constraint that each description must be in a different language
|
447
447
|
end
|
448
448
|
calprops = ("".r & beginend).map { {} } |
|
449
|
-
seq(calprop, lazy { calprops }) do |c, rest|
|
449
|
+
seq(calprop, lazy { calprops }) do |(c, rest)|
|
450
450
|
c.merge(rest) do |key, old, new|
|
451
451
|
if @cardinality1[:ICAL].include?(key.upcase)
|
452
452
|
parse_err("Violated cardinality of property #{key}")
|
@@ -454,7 +454,7 @@ module Vobject::Vcalendar
|
|
454
454
|
[old, new].flatten
|
455
455
|
end
|
456
456
|
end
|
457
|
-
vobject = seq(/BEGIN:VCALENDAR(\r|\n|\r\n)/i.r, calprops, components, /END:VCALENDAR(\r|\n|\r\n)/i.r) do |_b, v, rest, _e|
|
457
|
+
vobject = seq(/BEGIN:VCALENDAR(\r|\n|\r\n)/i.r, calprops, components, /END:VCALENDAR(\r|\n|\r\n)/i.r) do |(_b, v, rest, _e)|
|
458
458
|
parse_err("Missing PRODID attribute") unless v.has_key?(:PRODID)
|
459
459
|
parse_err("Missing VERSION attribute") unless v.has_key?(:VERSION)
|
460
460
|
rest.delete(:END)
|