simplevpim 0.3.0 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0df24d09c743af64bf2d92cddeb6cddd562983a2
4
- data.tar.gz: 8bd4c70e5aedacd6123231ba34cafe33e0620935
2
+ SHA256:
3
+ metadata.gz: 23b8411e8323eb6df94ad8219a0789d71be6cb187fc0ac271c3cc3fe8bece742
4
+ data.tar.gz: 784fcd0808daa9bcef34deb53c4295235f82ea8777ae54548b3f59932330f3f0
5
5
  SHA512:
6
- metadata.gz: 15d735c9463a72ad18e245465c99f36b131f2b0d371835885ce8451f87b0ec26a7792c66578a27f8dd2ab5507eb983c51e32eb3551fe7546bb877314d72223ba
7
- data.tar.gz: c4acec171f6316d6067a48f59a132f21dbe812238ffdf3eb890ad0adcc9ac33c1c3951fd5cecdd31b0ee4e92725c2799421cfb1f6d10a4f85734623b84c14dd4
6
+ metadata.gz: cf3c0f93a8b533b12b6529736c6c31a336c12d52d41b3ed8ac288f03d55c05ff41b47ba7b5993506548b970fedfb067c8875d28e8049df7180811a6c9ac32e46
7
+ data.tar.gz: dc942fd4b16ed70e20f9f75faf121019d09c79f52cf5782b4bbf7c66143fe737a5e287431daaaf6c20012ae87f552653700763be604a4328310981cc8554c17e
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/simplevpim.rb CHANGED
@@ -2,32 +2,47 @@
2
2
 
3
3
  # file: simplevpim.rb
4
4
 
5
+ require 'hlt'
5
6
  require 'nokogiri'
6
7
  require 'vpim/vcard'
7
8
  require 'rexle-builder'
8
- require 'simple-config'
9
+ require 'kvx'
10
+ require 'unichron'
9
11
 
10
12
 
11
13
  class SimpleVpim
12
14
 
13
- attr_reader :to_vcard, :to_xml
15
+ attr_reader :to_vcard, :to_vevent, :to_xml
14
16
 
15
17
  def initialize(s)
16
18
 
17
- h = SimpleConfig.new(s).to_h
19
+ kvx = Kvx.new(s)
20
+ @h = kvx.to_h
18
21
 
19
- if h[:name] then
20
- @to_vcard = make_vcard h
21
- @to_xml = vcard_xml h
22
+ if s.lstrip =~ /# vcard/ and @h[:name] then
23
+
24
+ @to_vcard = make_vcard @h
25
+ @to_xml = vcard_xml @h
26
+
27
+ elsif @h[:title] or @h[:summary]
28
+
29
+ @to_vevent = make_vevent @h
30
+ @to_xml = vevent_xml kvx.to_xml
31
+
22
32
  end
23
33
 
24
34
  end
25
35
 
26
36
  alias to_vcf to_vcard
27
37
 
38
+ def to_hcard(layout=nil)
39
+ make_hcard layout, @h
40
+ end
41
+
28
42
  def to_xcard()
29
43
  make_xcard @to_xml
30
44
  end
45
+
31
46
 
32
47
  private
33
48
 
@@ -151,15 +166,166 @@ class SimpleVpim
151
166
  end
152
167
  end
153
168
 
154
- def make_xcard(xml)
169
+ def make_vevent(h)
155
170
 
156
- lib = File.dirname(__FILE__)
157
- xsl = File.read File.join(lib,'xcard.xsl')
158
- doc = Nokogiri::XML(xml)
171
+ dstart, dend = %i(start end).map do |x|
172
+ Unichron.new(h[x]).to_date.strftime("%Y%m%d")
173
+ end
174
+
175
+ s = "BEGIN:VEVENT
176
+ SUMMARY:#{h[:title] || h[:summary]}
177
+ DTSTART;VALUE=DATE:#{dstart}
178
+ DTEND;VALUE=DATE:#{dend}
179
+ "
180
+
181
+ s += 'LOCATION:' + h[:location] + "\n" if h[:location]
182
+ s += 'DESCRIPTION:' + h[:description] + "\n" if h[:description]
183
+ s += 'END:VEVENT'
184
+
185
+ end
186
+
187
+ def make_hcard(raw_s, h)
188
+
189
+ raw_s ||= %q(
190
+ # hcard
191
+
192
+ img.photo
193
+ h1.fn
194
+ .email
195
+ .n
196
+
197
+ home:
198
+ .label
199
+ .adr
200
+ .tel
201
+
202
+ work:
203
+ .label
204
+ .adr
205
+ .tel
206
+ )
207
+
208
+ s = raw_s.split(/\n(?=\w+:?)/).inject('') do |r, x|
209
+
210
+ x.sub!(/^\s*#\s+.*/,'') # ignore comments
211
+
212
+ lines = x.lines
213
+ type = lines[0][/^(\w+):/,1]
214
+
215
+ if type then
216
+
217
+ lines.shift
218
+
219
+ r << lines.map do |line|
220
+
221
+ if line[/\s*\.\w+/] then
222
+ indent = line[/^ +/].to_s
223
+ "%s%sspan.type %s" % [line.sub(/^ {2}/,''), indent, type]
224
+ else
225
+ line
226
+ end
227
+
228
+ end.join("\n") + "\n"
229
+
230
+ else
231
+
232
+ r << x + "\n"
233
+ end
234
+
235
+ r
236
+
237
+ end
238
+
239
+ html_string = Hlt.new(s).to_html
240
+ html_template = <<EOF
241
+ <html>
242
+ <head>
243
+ <link rel="profile" href="http://microformats.org/profile/hcard" />
244
+ </head>
245
+ <body>
246
+ <div class='vcard'>#{html_string}</div>
247
+ </body>
248
+ </html>
249
+ EOF
250
+ doc = Rexle.new(html_template)
251
+
252
+ def doc.set(selector, val=nil)
253
+
254
+ e = self.at_css selector
255
+ return unless e
256
+ block_given? ? yield(e) : e.text = val
257
+
258
+ end
259
+
260
+ firstname, middlename, surname, fullname = extract_names(h[:name])
261
+ doc.set '.fn', fullname
262
+
263
+ #-- name ---------
264
+
265
+ e = doc.at_css '.n'
266
+ e.text = 'First Name:'
267
+ fname = Rexle::Element.new('span')
268
+ fname.attributes[:class] = 'given-name'
269
+ fname.text = firstname
270
+ e.add_element fname
271
+ e.add_element Rexle::Element.new('br')
272
+ e.add_text 'Last Name:'
273
+ lname = Rexle::Element.new('span')
274
+ lname.attributes[:class] = 'family-name'
275
+ lname.text = surname
276
+ e.add_element lname
277
+
278
+
279
+
280
+ doc.at_css('.photo').delete unless h[:photo]
281
+ doc.css('.tel').each(&:delete) unless h[:tel]
282
+ doc.css('.adr').each(&:delete) unless h[:adr]
283
+ doc.css('.label').each(&:delete) unless h[:label]
159
284
 
285
+ if h[:email].is_a? String then
286
+
287
+ e = doc.at_css '.email'
288
+ e.text = 'Email:'
289
+ alink = Rexle::Element.new('a')
290
+ alink.attributes[:class] = 'value'
291
+ alink.attributes[:href] = 'mailto:' + h[:email]
292
+ alink.text = h[:email]
293
+ e.add_element alink
294
+
295
+ elsif h[:email].is_a? Hash then
296
+
297
+ node = doc.at_css('.email')
298
+
299
+ h[:email].reverse_each do |k,v|
300
+ e = node.clone
301
+ type = Rexle::Element.new('span')
302
+ type.attributes[:class] = 'type'
303
+ type.text = k.capitalize
304
+ e.add_element type
305
+ e.add_text ' Email:'
306
+ alink = Rexle::Element.new('a')
307
+ alink.attributes[:class] = 'value'
308
+ alink.attributes[:href] = 'mailto:' + v
309
+ alink.text = v
310
+ e.add_element alink
311
+
312
+ node.insert_after e
313
+ end
314
+ node.delete
315
+
316
+ end
317
+
318
+ doc.xml pretty: true, declaration: false
319
+
320
+ end
321
+
322
+ def make_xcard(xml)
323
+ #lib = File.dirname(__FILE__)
324
+ lib = 'http://a0.jamesrobertson.me.uk/rorb/r/ruby/simplevpim'
325
+ xsl = open(lib + '/xcard.xsl','UserAgent' => 'SimplevPim').read
326
+ doc = Nokogiri::XML(xml)
160
327
  xslt = Nokogiri::XSLT(xsl)
161
328
  xslt.transform(doc).to_s
162
-
163
329
  end
164
330
 
165
331
  def vcard_xml(h)
@@ -258,5 +424,13 @@ class SimpleVpim
258
424
 
259
425
  Rexle.new(a)
260
426
  end
427
+
428
+ def vevent_xml(xml)
429
+
430
+ doc = Rexle.new(xml)
431
+ doc.root.name = 'vevent'
432
+ doc.root.xml
433
+
434
+ end
261
435
 
262
436
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simplevpim
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,49 +10,53 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
- YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
- 8ixkARkWAmV1MB4XDTE0MTEwNDE4MDQxNVoXDTE1MTEwNDE4MDQxNVowSDESMBAG
16
- A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
- EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
- ggEBAOIxezQlow3Mc2hiMUYKNfXS0aeuDaDshlHayqGprhcjcC26JheR6fw5LC5q
19
- O2cLSN2X4/y1Ejpl3rDCaEQ2uTM+0oQdlEdOZaMDiPAYmkNHOursxMQ/ztylpgmZ
20
- hKYDn5NYhlh/HDAWgE4OJCsyTxR8/tUMQ2JsTNbh7iq2T2e9ruZK6+WO1uBxV299
21
- W9XJYLNQ+TNX1UyTlISTPz46ZHrW0jlBU5Jhkq+4qrvkHl0+CouJ8z+gHjZi1Zph
22
- mTWY3O4z5C/T9+7+8TdfRVIphUHrdbSaT4Q38uyGN3c4XTgd5gNDTjNVvTzHze4e
23
- dnNRUQeBAplZ0eNzi1Y0tlJNL78CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
- DwQEAwIEsDAdBgNVHQ4EFgQUtPSjl4Y/eGVgqBWQtt7eRXrUWUowJgYDVR0RBB8w
25
- HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAqTJgPKUN
27
- e9qRhikLsNIlI6KKbawhXeXCKUidNfPUC+ixm/jB5KZmC+jMCG4E6yhcbeHGLGAg
28
- D/nL4AYOQBiQAwhg6OZsScmz0mWAgU+T7/zgWpqlKPS0zAFCd6xaz2dAruQ7HeSb
29
- MHzJFvp/uiOm+4+zJmeaLfxC+XIqV2EzaY7IlNk3VO/eviBf5m0yymLXduGpc3O9
30
- H0WHqa7sI+WFHROziaQIz7hhd7qhJVuaTdqLb2NIcrz8jbvpFEeaBJWQB8P+1z+K
31
- h7sjjIWKCtgcFF+5Gf5AtJf6C0PlDSh7mc8uoo2XSef/GV6YvwUrQbPtFakM7LDs
32
- a3f37q6Z/UCE6w==
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwNjIxMjI1NjEzWhcN
15
+ MjIwNjIxMjI1NjEzWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC2HXPE
17
+ oxEBJSUeAX4qfaY1qkifPWhiR5H3rPYQwCFzPwsnUV98vv7RWWwJ/W7kkw1fuRTW
18
+ gk+6G23OtSToucs9J+V6BSaNa+I2OXldvDd/nyL32BnwbzaOgAxlYcAXSnnXtrFR
19
+ q7GBlpUtYnqBDR4PYtPfynRETWD8aFtTFba38Xbcwi7bph/7f6NA/YGw5o5pjuEa
20
+ 2tSoHKgyZV0XP5urGHpMU7J2Snt3sBrr+ZlETDHUtkpOUfzbsXEFwsi0Xhtvv9Et
21
+ ksoJk541l1IA63M/rAtXGYoN7cJUel4o1Yc6NSZ3YbBTksoTVdKBZb3D76i9wKzj
22
+ lBAvbt9H7slYmShcSKG1bSQ+OHHr621FEBKyjP9r0BnVF0fFIGG++LFSH1wxO8mI
23
+ UxnzaESfyoc2YcnPkzOPs9XgSZfDV08m8Zg7CM7n/BbL35Se8DpoOIE1uzWV9r3Q
24
+ bqT6PEpiB+lhAvf+NpNTeXpzahoVG+8NA7v8vOrHezuDEzTsTL1fJ2jrW78CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUm2477cZF
26
+ MIo69AMIHSjJV5Li5fMwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAXAjV1qgT+80h3KNCJfbCT1AlAL+Fd6UBS/9BBGWB
29
+ okJjZnG12AWn3hTkrtbcfPpL6HnC3jDa7bVmsh79nEXbCzAAtAG5wckmOyFQvVTr
30
+ Zv0+gw5uwt3v2ac4xdwCRcte/8vZtd7malj2UL2YHjSG0Y9iVbMbIQoeMQFrUTLQ
31
+ SNdUvlE6jDatAHLajoOel0P4qV6i98pYRZVD+jH7mG1n5D2xyDnov8OoK7cAYPvB
32
+ hKS+vGsPMK6D70pa3cSiOF6kYE94pgFL2OdoxpEpaKQukTzZnfODDSUx/IPud4OP
33
+ nH2NGMAKFKRnV1ckoSFcvhYYzJGpYYGFlGGMrAPtzAW8NyHDOwwA/koYXY1oh9kB
34
+ iOeNjtxEJvb/5Qnz8M8K2CBXRfktT6ZghoJMc12q2bM3XE71RF3yJ/E250/Xp3+Z
35
+ dBpGyLXPFeCV5Z8rWY+S891OLL3UPvcmIiolU7aaNSwvXBGLesCCH6TrIdhw4q2z
36
+ pM4lNlA3G8w+xUHw/9AE8V6p
33
37
  -----END CERTIFICATE-----
34
- date: 2014-11-10 00:00:00.000000000 Z
38
+ date: 2021-06-21 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
- name: simple-config
41
+ name: hlt
38
42
  requirement: !ruby/object:Gem::Requirement
39
43
  requirements:
40
44
  - - "~>"
41
45
  - !ruby/object:Gem::Version
42
- version: '0.1'
46
+ version: '0.6'
43
47
  - - ">="
44
48
  - !ruby/object:Gem::Version
45
- version: 0.1.13
49
+ version: 0.6.3
46
50
  type: :runtime
47
51
  prerelease: false
48
52
  version_requirements: !ruby/object:Gem::Requirement
49
53
  requirements:
50
54
  - - "~>"
51
55
  - !ruby/object:Gem::Version
52
- version: '0.1'
56
+ version: '0.6'
53
57
  - - ">="
54
58
  - !ruby/object:Gem::Version
55
- version: 0.1.13
59
+ version: 0.6.3
56
60
  - !ruby/object:Gem::Dependency
57
61
  name: vpim
58
62
  requirement: !ruby/object:Gem::Requirement
@@ -74,47 +78,47 @@ dependencies:
74
78
  - !ruby/object:Gem::Version
75
79
  version: 13.11.11
76
80
  - !ruby/object:Gem::Dependency
77
- name: rexle-builder
81
+ name: unichron
78
82
  requirement: !ruby/object:Gem::Requirement
79
83
  requirements:
80
84
  - - "~>"
81
85
  - !ruby/object:Gem::Version
82
- version: '0.1'
86
+ version: '0.3'
83
87
  - - ">="
84
88
  - !ruby/object:Gem::Version
85
- version: 0.1.10
89
+ version: 0.3.7
86
90
  type: :runtime
87
91
  prerelease: false
88
92
  version_requirements: !ruby/object:Gem::Requirement
89
93
  requirements:
90
94
  - - "~>"
91
95
  - !ruby/object:Gem::Version
92
- version: '0.1'
96
+ version: '0.3'
93
97
  - - ">="
94
98
  - !ruby/object:Gem::Version
95
- version: 0.1.10
99
+ version: 0.3.7
96
100
  - !ruby/object:Gem::Dependency
97
- name: nokogiri
101
+ name: rexle-builder
98
102
  requirement: !ruby/object:Gem::Requirement
99
103
  requirements:
100
104
  - - "~>"
101
105
  - !ruby/object:Gem::Version
102
- version: '1.6'
106
+ version: '1.0'
103
107
  - - ">="
104
108
  - !ruby/object:Gem::Version
105
- version: 1.6.2.1
109
+ version: 1.0.3
106
110
  type: :runtime
107
111
  prerelease: false
108
112
  version_requirements: !ruby/object:Gem::Requirement
109
113
  requirements:
110
114
  - - "~>"
111
115
  - !ruby/object:Gem::Version
112
- version: '1.6'
116
+ version: '1.0'
113
117
  - - ">="
114
118
  - !ruby/object:Gem::Version
115
- version: 1.6.2.1
119
+ version: 1.0.3
116
120
  description:
117
- email: james@r0bertson.co.uk
121
+ email: digital.robertson@gmail.com
118
122
  executables: []
119
123
  extensions: []
120
124
  extra_rdoc_files: []
@@ -139,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
143
  - !ruby/object:Gem::Version
140
144
  version: '0'
141
145
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.2.2
146
+ rubygems_version: 3.1.2
144
147
  signing_key:
145
148
  specification_version: 4
146
149
  summary: A simple wrapper for the vPim gem
metadata.gz.sig CHANGED
Binary file