atom 0.2 → 0.3
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.
- data/lib/atom.rb +88 -27
- data/lib/xmlmapping.rb +20 -13
- metadata +2 -2
data/lib/atom.rb
CHANGED
@@ -26,6 +26,74 @@ require 'time'
|
|
26
26
|
|
27
27
|
module Atom
|
28
28
|
NAMESPACE = 'http://www.w3.org/2005/Atom'
|
29
|
+
XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'
|
30
|
+
|
31
|
+
class Text < String
|
32
|
+
attr :mime_type
|
33
|
+
|
34
|
+
def initialize(element)
|
35
|
+
type = element.attribute('type', NAMESPACE)
|
36
|
+
|
37
|
+
@mime_type = if type.nil?
|
38
|
+
'text/plain'
|
39
|
+
else
|
40
|
+
case type.value
|
41
|
+
when 'text': 'text/plain'
|
42
|
+
when 'html': 'text/html'
|
43
|
+
when 'xhtml': 'text/xhtml'
|
44
|
+
else raise "Unknown type: #{type.value}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
value = case @mime_type
|
49
|
+
when 'text/plain', 'text/html': element.texts.map {|t| t.value }.join
|
50
|
+
when 'text/xhtml' :
|
51
|
+
REXML::XPath.first(element, 'xhtml:div', 'xhtml' => XHTML_NAMESPACE).children.to_s
|
52
|
+
# TODO: resolve relative uris
|
53
|
+
end
|
54
|
+
|
55
|
+
super value
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class Content
|
60
|
+
attr :mime_type
|
61
|
+
attr :src
|
62
|
+
attr :value
|
63
|
+
|
64
|
+
def initialize(element)
|
65
|
+
type = element.attribute('type', NAMESPACE)
|
66
|
+
src = element.attribute('src', NAMESPACE)
|
67
|
+
|
68
|
+
if src.nil?
|
69
|
+
@mime_type = if type.nil?
|
70
|
+
'text/plain'
|
71
|
+
else
|
72
|
+
case type.value
|
73
|
+
when 'text': 'text/plain'
|
74
|
+
when 'html': 'text/html'
|
75
|
+
when 'xhtml': 'text/xhtml'
|
76
|
+
else type.value
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
@value = case @mime_type
|
81
|
+
when 'text/plain', 'text/html': element.texts.map { |t| t.value }.join
|
82
|
+
when 'text/xhtml':
|
83
|
+
REXML::XPath.first(element, 'xhtml:div', 'xhtml' => XHTML_NAMESPACE).children.to_s
|
84
|
+
when /\+xml$|\/xml$/: REXML::XPath.first(element).children.to_s
|
85
|
+
else element.texts.join.strip.unpack("m")[0]
|
86
|
+
end
|
87
|
+
else
|
88
|
+
@src = src.value
|
89
|
+
if !type.nil?
|
90
|
+
@mime_type = type.value
|
91
|
+
end
|
92
|
+
|
93
|
+
@value = nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
29
97
|
|
30
98
|
class Person
|
31
99
|
include XMLMapping
|
@@ -37,7 +105,11 @@ module Atom
|
|
37
105
|
has_one :uri
|
38
106
|
|
39
107
|
def to_s
|
40
|
-
|
108
|
+
if !email.nil?
|
109
|
+
"#{name} (#{email})"
|
110
|
+
else
|
111
|
+
name
|
112
|
+
end
|
41
113
|
end
|
42
114
|
end
|
43
115
|
|
@@ -48,10 +120,10 @@ module Atom
|
|
48
120
|
|
49
121
|
has_attribute :uri
|
50
122
|
has_attribute :version
|
51
|
-
text :
|
123
|
+
text :name
|
52
124
|
|
53
125
|
def to_s
|
54
|
-
|
126
|
+
name
|
55
127
|
end
|
56
128
|
end
|
57
129
|
|
@@ -61,7 +133,7 @@ module Atom
|
|
61
133
|
namespace NAMESPACE
|
62
134
|
|
63
135
|
has_attribute :href
|
64
|
-
has_attribute :rel
|
136
|
+
has_attribute :rel, :default => 'alternate'
|
65
137
|
has_attribute :type
|
66
138
|
has_attribute :hreflang
|
67
139
|
has_attribute :title
|
@@ -86,35 +158,23 @@ module Atom
|
|
86
158
|
end
|
87
159
|
end
|
88
160
|
|
89
|
-
class Content
|
90
|
-
include XMLMapping
|
91
|
-
|
92
|
-
namespace NAMESPACE
|
93
|
-
|
94
|
-
has_attribute :type
|
95
|
-
has_attribute :src
|
96
|
-
text :value
|
97
|
-
|
98
|
-
def to_s
|
99
|
-
value || src
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
161
|
class Source
|
104
162
|
include XMLMapping
|
105
163
|
|
106
164
|
namespace NAMESPACE
|
107
165
|
|
166
|
+
has_one :id
|
108
167
|
has_many :authors, :name => 'author', :type => Person
|
109
168
|
has_many :categories, :name => 'category', :type => Category
|
110
169
|
has_one :generator, :type => Generator
|
111
170
|
has_one :icon
|
112
171
|
has_many :links, :name => 'link', :type => Link
|
113
172
|
has_one :logo
|
114
|
-
has_one :rights
|
115
|
-
has_one :subtitle
|
116
|
-
has_one :title
|
173
|
+
has_one :rights, :type => Text
|
174
|
+
has_one :subtitle, :type => Text
|
175
|
+
has_one :title, :type => Text
|
117
176
|
has_one :updated, :transform => lambda { |t| Time.iso8601(t) }
|
177
|
+
has_many :contributors, :name => 'contributor', :type => Person
|
118
178
|
end
|
119
179
|
|
120
180
|
class Entry
|
@@ -123,16 +183,17 @@ module Atom
|
|
123
183
|
namespace NAMESPACE
|
124
184
|
|
125
185
|
has_one :id
|
126
|
-
has_one :title
|
127
|
-
has_one :summary
|
186
|
+
has_one :title, :type => Text
|
187
|
+
has_one :summary, :type => Text
|
128
188
|
has_many :authors, :name => 'author', :type => Person
|
129
189
|
has_many :contributors, :name => 'contributor', :type => Person
|
130
190
|
has_one :published, :transform => lambda { |t| Time.iso8601(t) }
|
131
191
|
has_one :updated, :transform => lambda { |t| Time.iso8601(t) }
|
132
192
|
has_many :links, :name => 'link', :type => Link
|
133
|
-
has_many :
|
193
|
+
has_many :categories, :name => 'category', :type => Category
|
134
194
|
has_one :content, :type => Content
|
135
195
|
has_one :source, :type => Source
|
196
|
+
has_one :rights, :type => Text
|
136
197
|
|
137
198
|
has_many :extended_elements, :name => :any, :namespace => :any, :type => :raw
|
138
199
|
end
|
@@ -143,8 +204,8 @@ module Atom
|
|
143
204
|
namespace NAMESPACE
|
144
205
|
|
145
206
|
has_one :id
|
146
|
-
has_one :title
|
147
|
-
has_one :subtitle
|
207
|
+
has_one :title, :type => Text
|
208
|
+
has_one :subtitle, :type => Text
|
148
209
|
has_many :authors, :name => 'author', :type => Person
|
149
210
|
has_many :contributors, :name => 'contributor', :type => Person
|
150
211
|
has_many :entries, :name => 'entry', :type => Entry
|
@@ -152,7 +213,7 @@ module Atom
|
|
152
213
|
has_many :links, :name => 'link', :type => Link
|
153
214
|
has_one :updated, :transform => lambda { |t| Time.iso8601(t) }
|
154
215
|
|
155
|
-
has_one :rights
|
216
|
+
has_one :rights, :type => Text
|
156
217
|
has_one :icon
|
157
218
|
has_one :logo
|
158
219
|
has_many :categories, :name => 'category', :type => Category
|
data/lib/xmlmapping.rb
CHANGED
@@ -42,6 +42,11 @@ module XMLMapping
|
|
42
42
|
raw_mappings.values.select { |mapping| mapping[:cardinality] == :many }.each { |m|
|
43
43
|
instance_variable_set("@#{m[:attribute]}", [])
|
44
44
|
}
|
45
|
+
|
46
|
+
# initialize defaults
|
47
|
+
raw_mappings.values.select { |mapping| mapping.has_key? :default }.each { |m|
|
48
|
+
instance_variable_set("@#{m[:attribute]}", m[:default])
|
49
|
+
}
|
45
50
|
|
46
51
|
root.each_element { |e|
|
47
52
|
process(e, mappings[:element])
|
@@ -64,19 +69,18 @@ module XMLMapping
|
|
64
69
|
def process(e, mappings)
|
65
70
|
mapping = find_mapping(mappings, e.namespace, e.name)
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
72
|
+
if !mapping.nil?
|
73
|
+
value = extract_value(e, mapping)
|
74
|
+
|
75
|
+
attribute = mapping[:attribute]
|
76
|
+
previous = instance_variable_get("@#{attribute}")
|
77
|
+
case mapping[:cardinality]
|
78
|
+
when :one
|
79
|
+
instance_variable_set("@#{attribute}", value)
|
80
|
+
when :many
|
81
|
+
previous << value
|
82
|
+
end
|
83
|
+
end
|
80
84
|
end
|
81
85
|
|
82
86
|
def find_mapping(mappings, namespace, name)
|
@@ -153,6 +157,9 @@ module XMLMapping
|
|
153
157
|
add(attribute, :text, options)
|
154
158
|
end
|
155
159
|
|
160
|
+
def ensure(message, &block)
|
161
|
+
end
|
162
|
+
|
156
163
|
private
|
157
164
|
def add(attribute, xml_type, mapping)
|
158
165
|
attr attribute
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: atom
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "0.
|
7
|
-
date: 2006-04-
|
6
|
+
version: "0.3"
|
7
|
+
date: 2006-04-11 00:00:00 -07:00
|
8
8
|
summary: Ruby library for working with the Atom syndication format
|
9
9
|
require_paths:
|
10
10
|
- lib
|