simplevpim 0.4.2 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 418c06275af606d7754e0061c3c96bb452c1921e
4
- data.tar.gz: 0e82a7d06f54bf31d125932a95ad58dbce6d2888
2
+ SHA256:
3
+ metadata.gz: 837294bf422fd83d5713759e1983df1d04b6843557790a89f041c1aea5e81469
4
+ data.tar.gz: ce99d263776326cdac99f6831b1c8ce4bcc7f54d25d828175c215bfd9ba263ba
5
5
  SHA512:
6
- metadata.gz: 3e6ef971d29b5e4cbf885b43a771e29067f8086c329d41db3da84008ae3a0de96beb1a8e5a233524165cc63962390174a46d03e3993c1c43a9b083b3a6fff9a8
7
- data.tar.gz: 6baa1158bba41c7103094620e0c2ada911a04cf69450994432959cbf1988dff29dc6e3142f4247cae6b562dd197edcfc09fcd8a407bd47667f030b6519e24fbe
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
@@ -7,19 +7,28 @@ require 'nokogiri'
7
7
  require 'vpim/vcard'
8
8
  require 'rexle-builder'
9
9
  require 'kvx'
10
+ require 'unichron'
10
11
 
11
12
 
12
13
  class SimpleVpim
13
14
 
14
- attr_reader :to_vcard, :to_xml
15
+ attr_reader :to_vcard, :to_vevent, :to_xml
15
16
 
16
17
  def initialize(s)
17
18
 
18
- @h = Kvx.new(s).to_h
19
+ kvx = Kvx.new(s)
20
+ @h = kvx.to_h
19
21
 
20
- if @h[:name] then
22
+ if s.lstrip =~ /# vcard/ and @h[:name] then
23
+
21
24
  @to_vcard = make_vcard @h
22
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
+
23
32
  end
24
33
 
25
34
  end
@@ -156,6 +165,24 @@ class SimpleVpim
156
165
 
157
166
  end
158
167
  end
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
159
186
 
160
187
  def make_hcard(raw_s, h)
161
188
 
@@ -294,7 +321,7 @@ EOF
294
321
 
295
322
  def make_xcard(xml)
296
323
  #lib = File.dirname(__FILE__)
297
- lib = 'http://rorbuilder.info/r/ruby/simplevpim'
324
+ lib = 'http://a0.jamesrobertson.me.uk/rorb/r/ruby/simplevpim'
298
325
  xsl = open(lib + '/xcard.xsl','UserAgent' => 'SimplevPim').read
299
326
  doc = Nokogiri::XML(xml)
300
327
  xslt = Nokogiri::XSLT(xsl)
@@ -397,5 +424,13 @@ EOF
397
424
 
398
425
  Rexle.new(a)
399
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
400
435
 
401
- end
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.4.2
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: 2015-04-29 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: kvx
41
+ name: hlt
38
42
  requirement: !ruby/object:Gem::Requirement
39
43
  requirements:
40
44
  - - "~>"
41
45
  - !ruby/object:Gem::Version
42
- version: '0.4'
46
+ version: '0.6'
43
47
  - - ">="
44
48
  - !ruby/object:Gem::Version
45
- version: 0.4.0
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.4'
56
+ version: '0.6'
53
57
  - - ">="
54
58
  - !ruby/object:Gem::Version
55
- version: 0.4.0
59
+ version: 0.6.3
56
60
  - !ruby/object:Gem::Dependency
57
61
  name: vpim
58
62
  requirement: !ruby/object:Gem::Requirement
@@ -79,69 +83,27 @@ dependencies:
79
83
  requirements:
80
84
  - - "~>"
81
85
  - !ruby/object:Gem::Version
82
- version: '0.2'
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- version: 0.2.1
86
- type: :runtime
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- requirements:
90
- - - "~>"
91
- - !ruby/object:Gem::Version
92
- version: '0.2'
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: 0.2.1
96
- - !ruby/object:Gem::Dependency
97
- name: nokogiri
98
- requirement: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '1.6'
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- version: 1.6.2.1
106
- type: :runtime
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: '1.6'
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- version: 1.6.2.1
116
- - !ruby/object:Gem::Dependency
117
- name: hlt
118
- requirement: !ruby/object:Gem::Requirement
119
- requirements:
120
- - - "~>"
121
- - !ruby/object:Gem::Version
122
- version: '0.4'
86
+ version: '1.0'
123
87
  - - ">="
124
88
  - !ruby/object:Gem::Version
125
- version: 0.4.0
89
+ version: 1.0.3
126
90
  type: :runtime
127
91
  prerelease: false
128
92
  version_requirements: !ruby/object:Gem::Requirement
129
93
  requirements:
130
94
  - - "~>"
131
95
  - !ruby/object:Gem::Version
132
- version: '0.4'
96
+ version: '1.0'
133
97
  - - ">="
134
98
  - !ruby/object:Gem::Version
135
- version: 0.4.0
99
+ version: 1.0.3
136
100
  description:
137
- email: james@r0bertson.co.uk
101
+ email: digital.robertson@gmail.com
138
102
  executables: []
139
103
  extensions: []
140
104
  extra_rdoc_files: []
141
105
  files:
142
106
  - lib/simplevpim.rb
143
- - lib/simplevpim.rb~
144
- - lib/xdata.xsl
145
107
  homepage: https://github.com/jrobertson/simplevpim
146
108
  licenses:
147
109
  - MIT
@@ -161,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
123
  - !ruby/object:Gem::Version
162
124
  version: '0'
163
125
  requirements: []
164
- rubyforge_project:
165
- rubygems_version: 2.4.6
126
+ rubygems_version: 3.1.2
166
127
  signing_key:
167
128
  specification_version: 4
168
129
  summary: A simple wrapper for the vPim gem
metadata.gz.sig CHANGED
Binary file
data/lib/simplevpim.rb~ DELETED
@@ -1,401 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # file: simplevpim.rb
4
-
5
- require 'hlt'
6
- require 'nokogiri'
7
- require 'vpim/vcard'
8
- require 'rexle-builder'
9
- require 'simple-config'
10
-
11
-
12
- class SimpleVpim
13
-
14
- attr_reader :to_vcard, :to_xml
15
-
16
- def initialize(s)
17
-
18
- @h = Kvx.new(s).to_h
19
-
20
- if @h[:name] then
21
- @to_vcard = make_vcard @h
22
- @to_xml = vcard_xml @h
23
- end
24
-
25
- end
26
-
27
- alias to_vcf to_vcard
28
-
29
- def to_hcard(layout=nil)
30
- make_hcard layout, @h
31
- end
32
-
33
- def to_xcard()
34
- make_xcard @to_xml
35
- end
36
-
37
-
38
- private
39
-
40
- def extract_names(name)
41
-
42
- a = name.split
43
-
44
- if a.length == 2 then
45
-
46
- firstname, surname = a[0],nil,a[-1], name
47
-
48
- elsif a[0][/^Mrs?|Ms|Miss|Dr/] then
49
-
50
- prefix = a.shift
51
-
52
- if a.length == 2 then
53
- firstname, surname = a[0],nil,a[-1], name
54
- else
55
- [*a, a.join(' ')]
56
- end
57
-
58
- else
59
- [*a, a.join(' ')]
60
- end
61
- end
62
-
63
- def make_vcard(h)
64
-
65
- card = Vpim::Vcard::Maker.make2 do |maker|
66
-
67
- def maker.add(field_name, value, params={})
68
-
69
- field = Vpim::DirectoryInfo::Field.create field_name, value, params
70
- add_field field
71
-
72
- end
73
-
74
- prefix = h[:prefix]
75
- suffix = h[:suffix]
76
-
77
- firstname, middlename, surname, fullname = extract_names(h[:name])
78
-
79
- maker.add_name do |name|
80
- name.prefix = prefix if prefix
81
- name.given = firstname
82
- name.family = surname
83
- name.suffix = suffix if suffix
84
- name.fullname = fullname if fullname
85
- end
86
-
87
- # -- email -----------------------------
88
-
89
- e = h[:email]
90
-
91
- if e then
92
-
93
- if e.is_a? String then
94
- maker.add_email e
95
- else
96
- eh = h[:email][:home]
97
- ew = h[:email][:work]
98
- maker.add_email(ew) { |e| e.location = 'work' } if ew
99
- maker.add_email(eh) { |e| e.location = 'home' } if eh
100
- end
101
- end
102
-
103
- # -- urls ---------------------------------
104
-
105
- h[:url] ||= h[:urls]
106
-
107
- if h[:url] then
108
-
109
- if h[:url].is_a? String then
110
- maker.add_url h[:url]
111
- else
112
-
113
- # unfortunately vPim doesn't use a block with the add_url method
114
- #maker.add_url (h[:url][:work]){|e| e.location = 'work'} if h[:url][:work]
115
-
116
- h[:url][:items].each {|url| maker.add_url url }
117
-
118
- end
119
-
120
- end
121
-
122
- # -- photos
123
-
124
- maker.add_photo {|photo| photo.link = h[:photo] } if h[:photo]
125
-
126
- # -- telephone
127
-
128
- tel = h[:tel]
129
-
130
- if tel then
131
-
132
- if tel.is_a? String then
133
-
134
- maker.add_tel tel
135
-
136
- else
137
- th = h[:tel][:home]
138
- tw = h[:tel][:work]
139
- maker.add_tel(tw) { |e| e.location = 'work' } if tw
140
- maker.add_tel(th) { |e| e.location = 'home' } if th
141
- end
142
- end
143
-
144
- # -- categories ------------
145
- maker.add 'CATEGORIES', h[:categories].split(/\s*,\s*/) if h[:categories]
146
-
147
- # -- source ------------
148
- maker.add 'SOURCE', h[:source] if h[:source]
149
-
150
- # -- Twitter ------------
151
- maker.add 'X-TWITTER', h[:twitter] if h[:twitter]
152
-
153
- # -- XMPP
154
- xmpp = h[:jabber] || h[:xmpp]
155
- maker.add 'X-JABBER', xmpp, 'TYPE' => 'im' if xmpp
156
-
157
- end
158
- end
159
-
160
- def make_hcard(raw_s, h)
161
-
162
- raw_s ||= %q(
163
- # hcard
164
-
165
- img.photo
166
- h1.fn
167
- .email
168
- .n
169
-
170
- home:
171
- .label
172
- .adr
173
- .tel
174
-
175
- work:
176
- .label
177
- .adr
178
- .tel
179
- )
180
-
181
- s = raw_s.split(/\n(?=\w+:?)/).inject('') do |r, x|
182
-
183
- x.sub!(/^\s*#\s+.*/,'') # ignore comments
184
-
185
- lines = x.lines
186
- type = lines[0][/^(\w+):/,1]
187
-
188
- if type then
189
-
190
- lines.shift
191
-
192
- r << lines.map do |line|
193
-
194
- if line[/\s*\.\w+/] then
195
- indent = line[/^ +/].to_s
196
- "%s%sspan.type %s" % [line.sub(/^ {2}/,''), indent, type]
197
- else
198
- line
199
- end
200
-
201
- end.join("\n") + "\n"
202
-
203
- else
204
-
205
- r << x + "\n"
206
- end
207
-
208
- r
209
-
210
- end
211
-
212
- html_string = Hlt.new(s).to_html
213
- html_template = <<EOF
214
- <html>
215
- <head>
216
- <link rel="profile" href="http://microformats.org/profile/hcard" />
217
- </head>
218
- <body>
219
- <div class='vcard'>#{html_string}</div>
220
- </body>
221
- </html>
222
- EOF
223
- doc = Rexle.new(html_template)
224
-
225
- def doc.set(selector, val=nil)
226
-
227
- e = self.at_css selector
228
- return unless e
229
- block_given? ? yield(e) : e.text = val
230
-
231
- end
232
-
233
- firstname, middlename, surname, fullname = extract_names(h[:name])
234
- doc.set '.fn', fullname
235
-
236
- #-- name ---------
237
-
238
- e = doc.at_css '.n'
239
- e.text = 'First Name:'
240
- fname = Rexle::Element.new('span')
241
- fname.attributes[:class] = 'given-name'
242
- fname.text = firstname
243
- e.add_element fname
244
- e.add_element Rexle::Element.new('br')
245
- e.add_text 'Last Name:'
246
- lname = Rexle::Element.new('span')
247
- lname.attributes[:class] = 'family-name'
248
- lname.text = surname
249
- e.add_element lname
250
-
251
-
252
-
253
- doc.at_css('.photo').delete unless h[:photo]
254
- doc.css('.tel').each(&:delete) unless h[:tel]
255
- doc.css('.adr').each(&:delete) unless h[:adr]
256
- doc.css('.label').each(&:delete) unless h[:label]
257
-
258
- if h[:email].is_a? String then
259
-
260
- e = doc.at_css '.email'
261
- e.text = 'Email:'
262
- alink = Rexle::Element.new('a')
263
- alink.attributes[:class] = 'value'
264
- alink.attributes[:href] = 'mailto:' + h[:email]
265
- alink.text = h[:email]
266
- e.add_element alink
267
-
268
- elsif h[:email].is_a? Hash then
269
-
270
- node = doc.at_css('.email')
271
-
272
- h[:email].reverse_each do |k,v|
273
- e = node.clone
274
- type = Rexle::Element.new('span')
275
- type.attributes[:class] = 'type'
276
- type.text = k.capitalize
277
- e.add_element type
278
- e.add_text ' Email:'
279
- alink = Rexle::Element.new('a')
280
- alink.attributes[:class] = 'value'
281
- alink.attributes[:href] = 'mailto:' + v
282
- alink.text = v
283
- e.add_element alink
284
-
285
- node.insert_after e
286
- end
287
- node.delete
288
-
289
- end
290
-
291
- doc.xml pretty: true, declaration: false
292
-
293
- end
294
-
295
- def make_xcard(xml)
296
- #lib = File.dirname(__FILE__)
297
- lib = 'http://rorbuilder.info/r/ruby/simplevpim'
298
- xsl = open(lib + '/xcard.xsl','UserAgent' => 'SimplevPim').read
299
- doc = Nokogiri::XML(xml)
300
- xslt = Nokogiri::XSLT(xsl)
301
- xslt.transform(doc).to_s
302
- end
303
-
304
- def vcard_xml(h)
305
-
306
- prefix = h[:prefix]
307
- suffix = h[:suffix]
308
-
309
- firstname, middlename, surname, fullname = extract_names(h[:name])
310
-
311
- xml = RexleBuilder.new
312
-
313
- a = xml.vcard do
314
-
315
- xml.name do
316
-
317
- xml.prefix prefix if prefix
318
- xml.given firstname
319
- xml.family surname
320
- xml.suffix suffix if suffix
321
- xml.fullname fullname if fullname
322
- end
323
-
324
- # -- email -----------------------------
325
-
326
- e = h[:email]
327
-
328
- if e then
329
-
330
- if e.is_a? String then
331
-
332
- xml.email e
333
-
334
- else
335
- eh = h[:email][:home]
336
- ew = h[:email][:work]
337
- xml.email({location: 'work'}, ew) if ew
338
- xml.email({location: 'home'}, eh) if eh
339
- end
340
- end
341
-
342
- # -- urls ---------------------------------
343
-
344
- h[:url] ||= h[:urls]
345
-
346
- if h[:url] then
347
-
348
- if h[:url].is_a? String then
349
- xml.url h[:url]
350
- else
351
-
352
- # unfortunately vPim doesn't use a block with the add_url method
353
- #maker.add_url (h[:url][:work]){|e| e.location = 'work'} if h[:url][:work]
354
-
355
- h[:url][:items].each {|url| xml.url url }
356
-
357
- end
358
-
359
- end
360
-
361
- # -- photos
362
-
363
- xml.photo link: h[:photo] if h[:photo]
364
-
365
- # -- telephone
366
-
367
- tel = h[:tel]
368
-
369
- if tel then
370
-
371
- if tel.is_a? String then
372
-
373
- xml.tel tel
374
-
375
- else
376
- th = h[:tel][:home]
377
- tw = h[:tel][:work]
378
- xml.tel({location: 'work'}, tw) if tw
379
- xml.tel({location: 'home'}, th) if th
380
- end
381
- end
382
-
383
- # -- categories ------------
384
- xml.categories h[:categories].split(/\s*,\s*/) if h[:categories]
385
-
386
- # -- source ------------
387
- xml.source h[:source] if h[:source]
388
-
389
- # -- Twitter ------------
390
- xml.x_twitter h[:twitter] if h[:twitter]
391
-
392
- # -- XMPP
393
- xmpp = h[:jabber] || h[:xmpp]
394
- xml.x_jabber({type: 'im'}, xmpp) if xmpp
395
-
396
- end
397
-
398
- Rexle.new(a)
399
- end
400
-
401
- end
data/lib/xdata.xsl DELETED
@@ -1,49 +0,0 @@
1
- <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
2
- <xsl:output method='xml' indent='yes'/>
3
-
4
-
5
- <xsl:template match='vcard'>
6
- <xsl:element name='vcards'>
7
- <xsl:attribute name='xmlns'>urn:ietf:params:xml:ns:vcard-4.0</xsl:attribute>
8
- <xsl:element name='vcard'>
9
-
10
- <xsl:apply-templates select='name' />
11
- <xsl:apply-templates select='email' />
12
- </xsl:element>
13
- </xsl:element>
14
-
15
- </xsl:template>
16
-
17
- <xsl:template match='name'>
18
- <xsl:element name='fn'>
19
- <xsl:element name='text'><xsl:value-of select='fullname'/></xsl:element></xsl:element>
20
- <xsl:element name='n'>
21
- <xsl:element name="surname"><xsl:value-of select='family' /></xsl:element>
22
- <xsl:element name="given"><xsl:value-of select='given' /></xsl:element>
23
- <xsl:element name="additional"><xsl:value-of select='middlename' /></xsl:element>
24
- <xsl:element name="prefix"><xsl:value-of select='prefix' /></xsl:element>
25
- <xsl:element name="suffix"><xsl:value-of select='suffix' /></xsl:element>
26
- </xsl:element>
27
-
28
- </xsl:template>
29
-
30
-
31
- <xsl:template match='email'>
32
-
33
- <xsl:element name='email'>
34
- <xsl:element name="parameters">
35
- <xsl:element name='type'>
36
- <xsl:element name='text'>
37
- <xsl:value-of select='@location'/>
38
- </xsl:element>
39
- </xsl:element>
40
- </xsl:element>
41
- <xsl:element name='text'>
42
- <xsl:value-of select='.' />
43
- </xsl:element>
44
-
45
- </xsl:element>
46
-
47
- </xsl:template>
48
-
49
- </xsl:stylesheet>