simplevpim 0.2.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 08ff15164eefc84e5d61257fe22ec8859d1f0655
4
- data.tar.gz: 1b203ef978b22d2fdbbad12ed938778c15657e9b
2
+ SHA256:
3
+ metadata.gz: 837294bf422fd83d5713759e1983df1d04b6843557790a89f041c1aea5e81469
4
+ data.tar.gz: ce99d263776326cdac99f6831b1c8ce4bcc7f54d25d828175c215bfd9ba263ba
5
5
  SHA512:
6
- metadata.gz: d46e4ef92525db09907143557c0ea8770f49abe1dabfd95d6c8a7ac8edd8c4c8c6cd32af078e95bd14d7aeb964ca774a74cd69d83d2785447b7250448993f521
7
- data.tar.gz: ae20137ecc6ca8af511f20cb415f62cc9315c58d821e6ffde1eb36cec9b9eab8d4379f1902d7eac666a6e6b2422e361a3365dec06b5dc3c5d63c149b9d39fd1d
6
+ metadata.gz: b412cde4385b238ad9073e93d8be7346f2bd600b9d44d90297250f34ba670209fefbb97915dc8b7dfa55114a0c47e95213f0355494c11eb82409994be6191900
7
+ data.tar.gz: 97ef6fedf467824363b642147202d6cacaea03700d0492bd15969483ebf690891480da634cf8eea859676d9d6252bb7d9d8b2456bd4aa9ea4c6d800c7103ea97
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/simplevpim.rb CHANGED
@@ -2,28 +2,48 @@
2
2
 
3
3
  # file: simplevpim.rb
4
4
 
5
+ require 'hlt'
6
+ require 'nokogiri'
5
7
  require 'vpim/vcard'
6
8
  require 'rexle-builder'
7
- require 'simple-config'
9
+ require 'kvx'
10
+ require 'unichron'
8
11
 
9
12
 
10
13
  class SimpleVpim
11
14
 
12
- attr_reader :to_vcard, :to_xml
15
+ attr_reader :to_vcard, :to_vevent, :to_xml
13
16
 
14
17
  def initialize(s)
15
18
 
16
- h = SimpleConfig.new(s).to_h
19
+ kvx = Kvx.new(s)
20
+ @h = kvx.to_h
17
21
 
18
- if h[:name] then
19
- @to_vcard = make_vcard h
20
- @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
+
21
32
  end
22
33
 
23
34
  end
24
35
 
25
36
  alias to_vcf to_vcard
26
37
 
38
+ def to_hcard(layout=nil)
39
+ make_hcard layout, @h
40
+ end
41
+
42
+ def to_xcard()
43
+ make_xcard @to_xml
44
+ end
45
+
46
+
27
47
  private
28
48
 
29
49
  def extract_names(name)
@@ -32,20 +52,20 @@ class SimpleVpim
32
52
 
33
53
  if a.length == 2 then
34
54
 
35
- firstname, lastname = a[0],nil,a[-1], name
55
+ firstname, surname = a[0],nil,a[-1], name
36
56
 
37
57
  elsif a[0][/^Mrs?|Ms|Miss|Dr/] then
38
58
 
39
59
  prefix = a.shift
40
60
 
41
61
  if a.length == 2 then
42
- firstname, lastname = a[0],nil,a[-1], name
62
+ firstname, surname = a[0],nil,a[-1], name
43
63
  else
44
- [*a, a.join, ' ']
64
+ [*a, a.join(' ')]
45
65
  end
46
66
 
47
67
  else
48
- [*a, a.join, ' ']
68
+ [*a, a.join(' ')]
49
69
  end
50
70
  end
51
71
 
@@ -63,12 +83,12 @@ class SimpleVpim
63
83
  prefix = h[:prefix]
64
84
  suffix = h[:suffix]
65
85
 
66
- firstname, middlename, lastname, fullname = extract_names(h[:name])
86
+ firstname, middlename, surname, fullname = extract_names(h[:name])
67
87
 
68
88
  maker.add_name do |name|
69
89
  name.prefix = prefix if prefix
70
90
  name.given = firstname
71
- name.family = lastname
91
+ name.family = surname
72
92
  name.suffix = suffix if suffix
73
93
  name.fullname = fullname if fullname
74
94
  end
@@ -146,12 +166,174 @@ class SimpleVpim
146
166
  end
147
167
  end
148
168
 
169
+ def make_vevent(h)
170
+
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]
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)
327
+ xslt = Nokogiri::XSLT(xsl)
328
+ xslt.transform(doc).to_s
329
+ end
330
+
149
331
  def vcard_xml(h)
150
332
 
151
333
  prefix = h[:prefix]
152
334
  suffix = h[:suffix]
153
335
 
154
- firstname, middlename, lastname, fullname = extract_names(h[:name])
336
+ firstname, middlename, surname, fullname = extract_names(h[:name])
155
337
 
156
338
  xml = RexleBuilder.new
157
339
 
@@ -159,11 +341,11 @@ class SimpleVpim
159
341
 
160
342
  xml.name do
161
343
 
162
- xml.prefix = prefix if prefix
163
- xml.given = firstname
164
- xml.family = lastname
165
- xml.suffix = suffix if suffix
166
- xml.fullname = fullname if fullname
344
+ xml.prefix prefix if prefix
345
+ xml.given firstname
346
+ xml.family surname
347
+ xml.suffix suffix if suffix
348
+ xml.fullname fullname if fullname
167
349
  end
168
350
 
169
351
  # -- email -----------------------------
@@ -242,5 +424,13 @@ class SimpleVpim
242
424
 
243
425
  Rexle.new(a)
244
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
245
435
 
246
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.2.0
4
+ version: 0.5.0
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-09 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.10
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.10
59
+ version: 0.6.3
56
60
  - !ruby/object:Gem::Dependency
57
61
  name: vpim
58
62
  requirement: !ruby/object:Gem::Requirement
@@ -79,22 +83,22 @@ dependencies:
79
83
  requirements:
80
84
  - - "~>"
81
85
  - !ruby/object:Gem::Version
82
- version: '0.1'
86
+ version: '1.0'
83
87
  - - ">="
84
88
  - !ruby/object:Gem::Version
85
- version: 0.1.10
89
+ version: 1.0.3
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: '1.0'
93
97
  - - ">="
94
98
  - !ruby/object:Gem::Version
95
- version: 0.1.10
99
+ version: 1.0.3
96
100
  description:
97
- email: james@r0bertson.co.uk
101
+ email: digital.robertson@gmail.com
98
102
  executables: []
99
103
  extensions: []
100
104
  extra_rdoc_files: []
@@ -119,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
123
  - !ruby/object:Gem::Version
120
124
  version: '0'
121
125
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 2.2.2
126
+ rubygems_version: 3.1.2
124
127
  signing_key:
125
128
  specification_version: 4
126
129
  summary: A simple wrapper for the vPim gem
metadata.gz.sig CHANGED
Binary file