feedtools 0.2.22 → 0.2.23
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +28 -0
- data/README +23 -2
- data/db/migration.rb +19 -0
- data/db/schema.mysql.sql +1 -1
- data/db/schema.postgresql.sql +1 -1
- data/db/schema.sqlite.sql +1 -1
- data/lib/feed_tools.rb +71 -388
- data/lib/feed_tools/database_feed_cache.rb +4 -3
- data/lib/feed_tools/feed.rb +809 -607
- data/lib/feed_tools/feed_item.rb +551 -574
- data/lib/feed_tools/feed_structures.rb +252 -0
- data/lib/feed_tools/helpers/feed_tools_helper.rb +6 -5
- data/lib/feed_tools/helpers/generic_helper.rb +16 -158
- data/lib/feed_tools/helpers/html_helper.rb +629 -0
- data/lib/feed_tools/helpers/retrieval_helper.rb +5 -0
- data/lib/feed_tools/helpers/uri_helper.rb +223 -0
- data/lib/feed_tools/helpers/xml_helper.rb +239 -0
- data/rakefile +10 -237
- data/test/unit/amp_test.rb +102 -94
- data/test/unit/atom_test.rb +239 -6
- data/test/unit/cache_test.rb +1 -1
- data/test/unit/encoding_test.rb +5 -5
- data/test/unit/generation_test.rb +34 -1
- data/test/unit/helper_test.rb +111 -17
- data/test/unit/rss_test.rb +21 -2
- metadata +7 -3
- data/lib/feed_tools/helpers/module_helper.rb +0 -27
data/lib/feed_tools/feed_item.rb
CHANGED
@@ -21,140 +21,18 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
+
require 'feed_tools/feed_structures'
|
25
|
+
|
24
26
|
module FeedTools
|
25
27
|
# The <tt>FeedTools::FeedItem</tt> class represents the structure of
|
26
28
|
# a single item within a web feed.
|
27
29
|
class FeedItem
|
28
|
-
# :stopdoc:
|
29
|
-
include REXML
|
30
|
-
include GenericHelper
|
31
|
-
private :validate_options
|
32
|
-
# :startdoc:
|
33
|
-
|
34
|
-
# This class stores information about a feed item's file enclosures.
|
35
|
-
class Enclosure
|
36
|
-
# The url for the enclosure
|
37
|
-
attr_accessor :url
|
38
|
-
# The MIME type of the file referenced by the enclosure
|
39
|
-
attr_accessor :type
|
40
|
-
# The size of the file referenced by the enclosure
|
41
|
-
attr_accessor :file_size
|
42
|
-
# The total play time of the file referenced by the enclosure
|
43
|
-
attr_accessor :duration
|
44
|
-
# The height in pixels of the enclosed media
|
45
|
-
attr_accessor :height
|
46
|
-
# The width in pixels of the enclosed media
|
47
|
-
attr_accessor :width
|
48
|
-
# The bitrate of the enclosed media
|
49
|
-
attr_accessor :bitrate
|
50
|
-
# The framerate of the enclosed media
|
51
|
-
attr_accessor :framerate
|
52
|
-
# The thumbnail for this enclosure
|
53
|
-
attr_accessor :thumbnail
|
54
|
-
# The categories for this enclosure
|
55
|
-
attr_accessor :categories
|
56
|
-
# A hash of the enclosed file
|
57
|
-
attr_accessor :hash
|
58
|
-
# A website containing some kind of media player instead of a direct
|
59
|
-
# link to the media file.
|
60
|
-
attr_accessor :player
|
61
|
-
# A list of credits for the enclosed media
|
62
|
-
attr_accessor :credits
|
63
|
-
# A text rendition of the enclosed media
|
64
|
-
attr_accessor :text
|
65
|
-
# A list of alternate version of the enclosed media file
|
66
|
-
attr_accessor :versions
|
67
|
-
# The default version of the enclosed media file
|
68
|
-
attr_accessor :default_version
|
69
|
-
|
70
|
-
# Returns true if this is the default enclosure
|
71
|
-
def is_default?
|
72
|
-
return @is_default
|
73
|
-
end
|
74
|
-
|
75
|
-
# Sets whether this is the default enclosure for the media group
|
76
|
-
def is_default=(new_is_default)
|
77
|
-
@is_default = new_is_default
|
78
|
-
end
|
79
|
-
|
80
|
-
# Returns true if the enclosure contains explicit material
|
81
|
-
def explicit?
|
82
|
-
return @explicit
|
83
|
-
end
|
84
|
-
|
85
|
-
# Sets the explicit attribute on the enclosure
|
86
|
-
def explicit=(new_explicit)
|
87
|
-
@explicit = new_explicit
|
88
|
-
end
|
89
|
-
|
90
|
-
# Determines if the object is a sample, or the full version of the
|
91
|
-
# object, or if it is a stream.
|
92
|
-
# Possible values are 'sample', 'full', 'nonstop'.
|
93
|
-
def expression
|
94
|
-
return @expression
|
95
|
-
end
|
96
|
-
|
97
|
-
# Sets the expression attribute on the enclosure.
|
98
|
-
# Allowed values are 'sample', 'full', 'nonstop'.
|
99
|
-
def expression=(new_expression)
|
100
|
-
unless ['sample', 'full', 'nonstop'].include? new_expression.downcase
|
101
|
-
raise ArgumentError,
|
102
|
-
"Permitted values are 'sample', 'full', 'nonstop'."
|
103
|
-
end
|
104
|
-
@expression = new_expression.downcase
|
105
|
-
end
|
106
|
-
|
107
|
-
# Returns true if this enclosure contains audio content
|
108
|
-
def audio?
|
109
|
-
unless self.type.nil?
|
110
|
-
return true if (self.type =~ /^audio/) != nil
|
111
|
-
end
|
112
|
-
# TODO: create a more complete list
|
113
|
-
# =================================
|
114
|
-
audio_extensions = ['mp3', 'm4a', 'm4p', 'wav', 'ogg', 'wma']
|
115
|
-
audio_extensions.each do |extension|
|
116
|
-
if (url =~ /#{extension}$/) != nil
|
117
|
-
return true
|
118
|
-
end
|
119
|
-
end
|
120
|
-
return false
|
121
|
-
end
|
122
|
-
|
123
|
-
# Returns true if this enclosure contains video content
|
124
|
-
def video?
|
125
|
-
unless self.type.nil?
|
126
|
-
return true if (self.type =~ /^video/) != nil
|
127
|
-
return true if self.type == "image/mov"
|
128
|
-
end
|
129
|
-
# TODO: create a more complete list
|
130
|
-
# =================================
|
131
|
-
video_extensions = ['mov', 'mp4', 'avi', 'wmv', 'asf']
|
132
|
-
video_extensions.each do |extension|
|
133
|
-
if (url =~ /#{extension}$/) != nil
|
134
|
-
return true
|
135
|
-
end
|
136
|
-
end
|
137
|
-
return false
|
138
|
-
end
|
139
|
-
|
140
|
-
alias_method :link, :url
|
141
|
-
alias_method :link=, :url=
|
142
|
-
end
|
143
|
-
|
144
|
-
# TODO: Make these actual classes instead of structs
|
145
|
-
# ==================================================
|
146
|
-
EnclosureHash = Struct.new( "EnclosureHash", :hash, :type )
|
147
|
-
EnclosurePlayer = Struct.new( "EnclosurePlayer", :url, :height, :width )
|
148
|
-
EnclosureCredit = Struct.new( "EnclosureCredit", :name, :role )
|
149
|
-
EnclosureThumbnail = Struct.new( "EnclosureThumbnail", :url, :height,
|
150
|
-
:width )
|
151
|
-
|
152
30
|
# Initialize the feed object
|
153
31
|
def initialize
|
154
32
|
super
|
155
33
|
@feed_data = nil
|
156
34
|
@feed_data_type = :xml
|
157
|
-
@
|
35
|
+
@xml_document = nil
|
158
36
|
@root_node = nil
|
159
37
|
@title = nil
|
160
38
|
@id = nil
|
@@ -191,6 +69,14 @@ module FeedTools
|
|
191
69
|
return parent_feed
|
192
70
|
end
|
193
71
|
|
72
|
+
# Returns the feed item's encoding.
|
73
|
+
def encoding
|
74
|
+
if @encoding.nil?
|
75
|
+
@encoding = self.feed.encoding
|
76
|
+
end
|
77
|
+
return @encoding
|
78
|
+
end
|
79
|
+
|
194
80
|
# Returns the feed item's raw data.
|
195
81
|
def feed_data
|
196
82
|
return @feed_data
|
@@ -213,18 +99,18 @@ module FeedTools
|
|
213
99
|
end
|
214
100
|
|
215
101
|
# Returns a REXML Document of the feed_data
|
216
|
-
def
|
102
|
+
def xml_document
|
217
103
|
if self.feed_data_type != :xml
|
218
|
-
@
|
104
|
+
@xml_document = nil
|
219
105
|
else
|
220
|
-
if @
|
106
|
+
if @xml_document.nil?
|
221
107
|
# TODO: :ignore_whitespace_nodes => :all
|
222
108
|
# Add that?
|
223
109
|
# ======================================
|
224
|
-
@
|
110
|
+
@xml_document = REXML::Document.new(self.feed_data)
|
225
111
|
end
|
226
112
|
end
|
227
|
-
return @
|
113
|
+
return @xml_document
|
228
114
|
end
|
229
115
|
|
230
116
|
# Returns the first node within the root_node that matches the xpath query.
|
@@ -232,7 +118,7 @@ module FeedTools
|
|
232
118
|
if feed.feed_data_type != :xml
|
233
119
|
raise "The feed data type is not xml."
|
234
120
|
end
|
235
|
-
return try_xpaths(self.root_node, [xpath],
|
121
|
+
return FeedTools::XmlHelper.try_xpaths(self.root_node, [xpath],
|
236
122
|
:select_result_value => select_result_value)
|
237
123
|
end
|
238
124
|
|
@@ -241,25 +127,52 @@ module FeedTools
|
|
241
127
|
if feed.feed_data_type != :xml
|
242
128
|
raise "The feed data type is not xml."
|
243
129
|
end
|
244
|
-
return try_xpaths_all(self.root_node, [xpath],
|
130
|
+
return FeedTools::XmlHelper.try_xpaths_all(self.root_node, [xpath],
|
245
131
|
:select_result_value => select_result_value)
|
246
132
|
end
|
247
133
|
|
248
134
|
# Returns the root node of the feed item.
|
249
135
|
def root_node
|
250
136
|
if @root_node.nil?
|
251
|
-
if
|
137
|
+
if self.xml_document.nil?
|
252
138
|
return nil
|
253
139
|
end
|
254
|
-
@root_node =
|
140
|
+
@root_node = self.xml_document.root
|
255
141
|
end
|
256
142
|
return @root_node
|
257
143
|
end
|
144
|
+
|
145
|
+
# Sets the root node of the feed item.
|
146
|
+
#
|
147
|
+
# This allows namespace information to be inherited by the feed item
|
148
|
+
# from the feed itself. When creating individual nodes from scratch,
|
149
|
+
# the <tt>feed_data=</tt> method should be used instead.
|
150
|
+
def root_node=(new_root_node)
|
151
|
+
@root_node = new_root_node
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns the feed type of this item
|
155
|
+
def feed_type
|
156
|
+
if @feed_type.nil?
|
157
|
+
parent_feed = self.feed
|
158
|
+
@feed_type = parent_feed.feed_type unless parent_feed.nil?
|
159
|
+
end
|
160
|
+
return @feed_type
|
161
|
+
end
|
162
|
+
|
163
|
+
# Returns the feed version of this item
|
164
|
+
def feed_version
|
165
|
+
if @feed_version.nil?
|
166
|
+
parent_feed = self.feed
|
167
|
+
@feed_version = parent_feed.feed_version unless parent_feed.nil?
|
168
|
+
end
|
169
|
+
return @feed_version
|
170
|
+
end
|
258
171
|
|
259
172
|
# Returns the feed items's unique id
|
260
173
|
def id
|
261
174
|
if @id.nil?
|
262
|
-
@id = try_xpaths(self.root_node, [
|
175
|
+
@id = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
263
176
|
"atom10:id/text()",
|
264
177
|
"atom03:id/text()",
|
265
178
|
"atom:id/text()",
|
@@ -279,42 +192,18 @@ module FeedTools
|
|
279
192
|
def title
|
280
193
|
if @title.nil?
|
281
194
|
repair_entities = false
|
282
|
-
title_node = try_xpaths(self.root_node, [
|
195
|
+
title_node = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
283
196
|
"atom10:title",
|
284
197
|
"atom03:title",
|
285
198
|
"atom:title",
|
286
199
|
"title",
|
287
200
|
"dc:title"
|
288
201
|
])
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
title_mode = try_xpaths(title_node, "@mode",
|
295
|
-
:select_result_value => true)
|
296
|
-
title_encoding = try_xpaths(title_node, "@encoding",
|
297
|
-
:select_result_value => true)
|
298
|
-
|
299
|
-
# Note that we're checking for misuse of type, mode and encoding here
|
300
|
-
if title_type == "base64" || title_mode == "base64" ||
|
301
|
-
title_encoding == "base64"
|
302
|
-
@title = Base64.decode64(title_node.inner_xml.strip)
|
303
|
-
elsif title_type == "xhtml" || title_mode == "xhtml" ||
|
304
|
-
title_type == "xml" || title_mode == "xml" ||
|
305
|
-
title_type == "application/xhtml+xml"
|
306
|
-
@title = title_node.inner_xml
|
307
|
-
elsif title_type == "escaped" || title_mode == "escaped"
|
308
|
-
@title = FeedTools.unescape_entities(
|
309
|
-
title_node.inner_xml)
|
310
|
-
else
|
311
|
-
@title = title_node.inner_xml
|
312
|
-
repair_entities = true
|
313
|
-
end
|
314
|
-
unless @title.nil?
|
315
|
-
@title = FeedTools.sanitize_html(@title, :strip)
|
316
|
-
@title = FeedTools.unescape_entities(@title) if repair_entities
|
317
|
-
@title = FeedTools.tidy_html(@title) unless repair_entities
|
202
|
+
@title = FeedTools::HtmlHelper.process_text_construct(title_node,
|
203
|
+
self.feed_type, self.feed_version)
|
204
|
+
if self.feed_type == "atom" ||
|
205
|
+
FeedTools.configurations[:always_strip_wrapper_elements]
|
206
|
+
@title = FeedTools::HtmlHelper.strip_wrapper_element(@title)
|
318
207
|
end
|
319
208
|
if !@title.blank? && FeedTools.configurations[:strip_comment_count]
|
320
209
|
# Some blogging tools include the number of comments in a post
|
@@ -326,9 +215,6 @@ module FeedTools
|
|
326
215
|
# unstripped title, just use find_node("title/text()").to_s
|
327
216
|
@title = @title.strip.gsub(/\[\d*\]$/, "").strip
|
328
217
|
end
|
329
|
-
@title.gsub!(/>\n</, "><")
|
330
|
-
@title.gsub!(/\n/, " ")
|
331
|
-
@title.strip!
|
332
218
|
@title = nil if @title.blank?
|
333
219
|
end
|
334
220
|
return @title
|
@@ -343,15 +229,19 @@ module FeedTools
|
|
343
229
|
def content
|
344
230
|
if @content.nil?
|
345
231
|
repair_entities = false
|
346
|
-
content_node = try_xpaths(self.root_node, [
|
232
|
+
content_node = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
347
233
|
"atom10:content",
|
348
234
|
"atom03:content",
|
349
235
|
"atom:content",
|
236
|
+
"xhtml:body",
|
237
|
+
"body",
|
238
|
+
"xhtml:div",
|
239
|
+
"div",
|
240
|
+
"p:payload",
|
241
|
+
"payload",
|
350
242
|
"content:encoded",
|
351
243
|
"content",
|
352
244
|
"fullitem",
|
353
|
-
"xhtml:body",
|
354
|
-
"body",
|
355
245
|
"encoded",
|
356
246
|
"description",
|
357
247
|
"tagline",
|
@@ -364,35 +254,14 @@ module FeedTools
|
|
364
254
|
"blurb",
|
365
255
|
"info"
|
366
256
|
])
|
367
|
-
|
368
|
-
|
257
|
+
@content = FeedTools::HtmlHelper.process_text_construct(content_node,
|
258
|
+
self.feed_type, self.feed_version)
|
259
|
+
if self.feed_type == "atom" ||
|
260
|
+
FeedTools.configurations[:always_strip_wrapper_elements]
|
261
|
+
@content = FeedTools::HtmlHelper.strip_wrapper_element(@content)
|
369
262
|
end
|
370
|
-
|
371
|
-
|
372
|
-
content_mode = try_xpaths(content_node, "@mode",
|
373
|
-
:select_result_value => true)
|
374
|
-
content_encoding = try_xpaths(content_node, "@encoding",
|
375
|
-
:select_result_value => true)
|
376
|
-
|
377
|
-
# Note that we're checking for misuse of type, mode and encoding here
|
378
|
-
if !content_encoding.blank?
|
379
|
-
@content =
|
380
|
-
"[Embedded data objects are not currently supported.]"
|
381
|
-
elsif content_node.cdatas.size > 0
|
382
|
-
@content = content_node.cdatas.first.value
|
383
|
-
elsif content_type == "base64" || content_mode == "base64" ||
|
384
|
-
content_encoding == "base64"
|
385
|
-
@content = Base64.decode64(content_node.inner_xml.strip)
|
386
|
-
elsif content_type == "xhtml" || content_mode == "xhtml" ||
|
387
|
-
content_type == "xml" || content_mode == "xml" ||
|
388
|
-
content_type == "application/xhtml+xml"
|
389
|
-
@content = content_node.inner_xml
|
390
|
-
elsif content_type == "escaped" || content_mode == "escaped"
|
391
|
-
@content = FeedTools.unescape_entities(
|
392
|
-
content_node.inner_xml)
|
393
|
-
else
|
394
|
-
@content = content_node.inner_xml
|
395
|
-
repair_entities = true
|
263
|
+
if @content.blank?
|
264
|
+
@content = self.media_text
|
396
265
|
end
|
397
266
|
if @content.blank?
|
398
267
|
@content = self.itunes_summary
|
@@ -400,15 +269,6 @@ module FeedTools
|
|
400
269
|
if @content.blank?
|
401
270
|
@content = self.itunes_subtitle
|
402
271
|
end
|
403
|
-
|
404
|
-
unless @content.blank?
|
405
|
-
@content = FeedTools.sanitize_html(@content, :strip)
|
406
|
-
@content = FeedTools.unescape_entities(@content) if repair_entities
|
407
|
-
@content = FeedTools.tidy_html(@content)
|
408
|
-
end
|
409
|
-
|
410
|
-
@content = @content.strip unless @content.nil?
|
411
|
-
@content = nil if @content.blank?
|
412
272
|
end
|
413
273
|
return @content
|
414
274
|
end
|
@@ -422,7 +282,7 @@ module FeedTools
|
|
422
282
|
def summary
|
423
283
|
if @summary.nil?
|
424
284
|
repair_entities = false
|
425
|
-
summary_node = try_xpaths(self.root_node, [
|
285
|
+
summary_node = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
426
286
|
"atom10:summary",
|
427
287
|
"atom03:summary",
|
428
288
|
"atom:summary",
|
@@ -432,9 +292,13 @@ module FeedTools
|
|
432
292
|
"description",
|
433
293
|
"tagline",
|
434
294
|
"subtitle",
|
435
|
-
"fullitem",
|
436
295
|
"xhtml:body",
|
437
296
|
"body",
|
297
|
+
"xhtml:div",
|
298
|
+
"div",
|
299
|
+
"p:payload",
|
300
|
+
"payload",
|
301
|
+
"fullitem",
|
438
302
|
"content:encoded",
|
439
303
|
"encoded",
|
440
304
|
"atom10:content",
|
@@ -443,35 +307,14 @@ module FeedTools
|
|
443
307
|
"content",
|
444
308
|
"info"
|
445
309
|
])
|
446
|
-
|
447
|
-
|
310
|
+
@summary = FeedTools::HtmlHelper.process_text_construct(summary_node,
|
311
|
+
self.feed_type, self.feed_version)
|
312
|
+
if self.feed_type == "atom" ||
|
313
|
+
FeedTools.configurations[:always_strip_wrapper_elements]
|
314
|
+
@summary = FeedTools::HtmlHelper.strip_wrapper_element(@summary)
|
448
315
|
end
|
449
|
-
|
450
|
-
|
451
|
-
summary_mode = try_xpaths(summary_node, "@mode",
|
452
|
-
:select_result_value => true)
|
453
|
-
summary_encoding = try_xpaths(summary_node, "@encoding",
|
454
|
-
:select_result_value => true)
|
455
|
-
|
456
|
-
# Note that we're checking for misuse of type, mode and encoding here
|
457
|
-
if !summary_encoding.blank?
|
458
|
-
@summary =
|
459
|
-
"[Embedded data objects are not currently supported.]"
|
460
|
-
elsif summary_node.cdatas.size > 0
|
461
|
-
@summary = summary_node.cdatas.first.value
|
462
|
-
elsif summary_type == "base64" || summary_mode == "base64" ||
|
463
|
-
summary_encoding == "base64"
|
464
|
-
@summary = Base64.decode64(summary_node.inner_xml.strip)
|
465
|
-
elsif summary_type == "xhtml" || summary_mode == "xhtml" ||
|
466
|
-
summary_type == "xml" || summary_mode == "xml" ||
|
467
|
-
summary_type == "application/xhtml+xml"
|
468
|
-
@summary = summary_node.inner_xml
|
469
|
-
elsif summary_type == "escaped" || summary_mode == "escaped"
|
470
|
-
@summary = FeedTools.unescape_entities(
|
471
|
-
summary_node.inner_xml)
|
472
|
-
else
|
473
|
-
@summary = summary_node.inner_xml
|
474
|
-
repair_entities = true
|
316
|
+
if @summary.blank?
|
317
|
+
@summary = self.media_text
|
475
318
|
end
|
476
319
|
if @summary.blank?
|
477
320
|
@summary = self.itunes_summary
|
@@ -479,15 +322,6 @@ module FeedTools
|
|
479
322
|
if @summary.blank?
|
480
323
|
@summary = self.itunes_subtitle
|
481
324
|
end
|
482
|
-
|
483
|
-
unless @summary.blank?
|
484
|
-
@summary = FeedTools.sanitize_html(@summary, :strip)
|
485
|
-
@summary = FeedTools.unescape_entities(@summary) if repair_entities
|
486
|
-
@summary = FeedTools.tidy_html(@summary)
|
487
|
-
end
|
488
|
-
|
489
|
-
@summary = @summary.strip unless @summary.nil?
|
490
|
-
@summary = nil if @summary.blank?
|
491
325
|
end
|
492
326
|
return @summary
|
493
327
|
end
|
@@ -500,12 +334,13 @@ module FeedTools
|
|
500
334
|
# Returns the contents of the itunes:summary element
|
501
335
|
def itunes_summary
|
502
336
|
if @itunes_summary.nil?
|
503
|
-
@itunes_summary = try_xpaths(self.root_node, [
|
337
|
+
@itunes_summary = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
504
338
|
"itunes:summary/text()"
|
505
|
-
])
|
339
|
+
], :select_result_value => true)
|
506
340
|
unless @itunes_summary.blank?
|
507
|
-
@itunes_summary = FeedTools.unescape_entities(@itunes_summary)
|
508
|
-
@itunes_summary = FeedTools.sanitize_html(@itunes_summary)
|
341
|
+
@itunes_summary = FeedTools::HtmlHelper.unescape_entities(@itunes_summary)
|
342
|
+
@itunes_summary = FeedTools::HtmlHelper.sanitize_html(@itunes_summary)
|
343
|
+
@itunes_summary.strip!
|
509
344
|
else
|
510
345
|
@itunes_summary = nil
|
511
346
|
end
|
@@ -521,12 +356,13 @@ module FeedTools
|
|
521
356
|
# Returns the contents of the itunes:subtitle element
|
522
357
|
def itunes_subtitle
|
523
358
|
if @itunes_subtitle.nil?
|
524
|
-
@itunes_subtitle = try_xpaths(self.root_node, [
|
359
|
+
@itunes_subtitle = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
525
360
|
"itunes:subtitle/text()"
|
526
|
-
])
|
361
|
+
], :select_result_value => true)
|
527
362
|
unless @itunes_subtitle.blank?
|
528
|
-
@itunes_subtitle = FeedTools.unescape_entities(@itunes_subtitle)
|
529
|
-
@itunes_subtitle = FeedTools.sanitize_html(@itunes_subtitle)
|
363
|
+
@itunes_subtitle = FeedTools::HtmlHelper.unescape_entities(@itunes_subtitle)
|
364
|
+
@itunes_subtitle = FeedTools::HtmlHelper.sanitize_html(@itunes_subtitle)
|
365
|
+
@itunes_subtitle.strip!
|
530
366
|
else
|
531
367
|
@itunes_subtitle = nil
|
532
368
|
end
|
@@ -542,14 +378,16 @@ module FeedTools
|
|
542
378
|
# Returns the contents of the media:text element
|
543
379
|
def media_text
|
544
380
|
if @media_text.nil?
|
545
|
-
@media_text = FeedTools.
|
546
|
-
"
|
547
|
-
|
381
|
+
@media_text = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
382
|
+
"media:text/text()"
|
383
|
+
], :select_result_value => true)
|
384
|
+
unless @media_text.blank?
|
385
|
+
@media_text = FeedTools::HtmlHelper.unescape_entities(@media_text)
|
386
|
+
@media_text = FeedTools::HtmlHelper.sanitize_html(@media_text)
|
387
|
+
@media_text.strip!
|
388
|
+
else
|
548
389
|
@media_text = nil
|
549
390
|
end
|
550
|
-
unless @media_text.nil?
|
551
|
-
@media_text = FeedTools.sanitize_html(@media_text)
|
552
|
-
end
|
553
391
|
end
|
554
392
|
return @media_text
|
555
393
|
end
|
@@ -562,88 +400,64 @@ module FeedTools
|
|
562
400
|
# Returns the feed item link
|
563
401
|
def link
|
564
402
|
if @link.nil?
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
"
|
577
|
-
|
578
|
-
|
579
|
-
"
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
403
|
+
max_score = 0
|
404
|
+
for link_object in self.links.reverse
|
405
|
+
score = 0
|
406
|
+
if FeedTools::HtmlHelper.html_type?(link_object.type)
|
407
|
+
score = score + 2
|
408
|
+
elsif link_object.type != nil
|
409
|
+
score = score - 1
|
410
|
+
end
|
411
|
+
if FeedTools::HtmlHelper.xml_type?(link_object.type)
|
412
|
+
score = score + 1
|
413
|
+
end
|
414
|
+
if link_object.rel == "alternate"
|
415
|
+
score = score + 1
|
416
|
+
end
|
417
|
+
if link_object.rel == "self"
|
418
|
+
score = score - 1
|
419
|
+
end
|
420
|
+
if score >= max_score
|
421
|
+
max_score = score
|
422
|
+
@link = link_object.href
|
423
|
+
end
|
424
|
+
end
|
425
|
+
if @link.blank?
|
426
|
+
@link = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
427
|
+
"@href",
|
428
|
+
"@rdf:about",
|
429
|
+
"@about"
|
430
|
+
], :select_result_value => true)
|
431
|
+
end
|
584
432
|
if @link.blank?
|
585
|
-
if FeedTools.is_uri?(self.
|
586
|
-
|
587
|
-
|
588
|
-
@link = self.guid
|
433
|
+
if FeedTools::UriHelper.is_uri?(self.id) &&
|
434
|
+
(self.id =~ /^http/)
|
435
|
+
@link = self.id
|
589
436
|
end
|
590
437
|
end
|
591
438
|
if !@link.blank?
|
592
|
-
@link = FeedTools.unescape_entities(@link)
|
593
|
-
end
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
# @link = feed.base + @link
|
603
|
-
# end
|
604
|
-
if @link.blank?
|
605
|
-
link_node = try_xpaths(self.root_node, [
|
606
|
-
"atom10:link",
|
607
|
-
"atom03:link",
|
608
|
-
"atom:link",
|
609
|
-
"link"
|
610
|
-
])
|
611
|
-
if link_node != nil
|
612
|
-
if link_node.attributes['type'].to_s =~ /^image/ ||
|
613
|
-
link_node.attributes['type'].to_s =~ /^application/ ||
|
614
|
-
link_node.attributes['type'].to_s =~ /xml/ ||
|
615
|
-
link_node.attributes['rel'].to_s =~ /self/
|
616
|
-
for child in self.root_node
|
617
|
-
if child.class == REXML::Element
|
618
|
-
if child.name.downcase == "link"
|
619
|
-
if child.attributes['type'].to_s =~ /^image/ ||
|
620
|
-
child.attributes['type'].to_s =~ /^application/ ||
|
621
|
-
child.attributes['type'].to_s =~ /xml/ ||
|
622
|
-
child.attributes['rel'].to_s =~ /self/
|
623
|
-
@link = nil
|
624
|
-
next
|
625
|
-
else
|
626
|
-
@link = child.attributes['href'].to_s
|
627
|
-
if @link.blank?
|
628
|
-
@link = child.inner_xml
|
629
|
-
end
|
630
|
-
if @link.blank?
|
631
|
-
next
|
632
|
-
end
|
633
|
-
break
|
634
|
-
end
|
635
|
-
end
|
636
|
-
end
|
439
|
+
@link = FeedTools::HtmlHelper.unescape_entities(@link)
|
440
|
+
end
|
441
|
+
@link = self.comments if @link.blank?
|
442
|
+
@link = nil if @link.blank?
|
443
|
+
begin
|
444
|
+
if !(@link =~ /^file:/) &&
|
445
|
+
!FeedTools::UriHelper.is_uri?(@link)
|
446
|
+
stored_base_uri =
|
447
|
+
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
448
|
+
self.feed.base_uri if self.feed != nil
|
637
449
|
end
|
638
|
-
|
639
|
-
|
450
|
+
root_base_uri = nil
|
451
|
+
unless self.root_node.nil?
|
452
|
+
root_base_uri = self.root_node.base_uri
|
640
453
|
end
|
454
|
+
@link = FeedTools::UriHelper.resolve_relative_uri(
|
455
|
+
@link, [root_base_uri,stored_base_uri])
|
641
456
|
end
|
457
|
+
rescue
|
642
458
|
end
|
643
|
-
@link = self.comments if @link.blank?
|
644
|
-
@link = nil if @link.blank?
|
645
459
|
if FeedTools.configurations[:url_normalization_enabled]
|
646
|
-
@link = FeedTools.normalize_url(@link)
|
460
|
+
@link = FeedTools::UriHelper.normalize_url(@link)
|
647
461
|
end
|
648
462
|
end
|
649
463
|
return @link
|
@@ -653,24 +467,135 @@ module FeedTools
|
|
653
467
|
def link=(new_link)
|
654
468
|
@link = new_link
|
655
469
|
end
|
470
|
+
|
471
|
+
# Returns the links collection
|
472
|
+
def links
|
473
|
+
if @links.nil?
|
474
|
+
@links = []
|
475
|
+
link_nodes =
|
476
|
+
FeedTools::XmlHelper.combine_xpaths_all(self.root_node, [
|
477
|
+
"atom10:link",
|
478
|
+
"atom03:link",
|
479
|
+
"atom:link",
|
480
|
+
"link",
|
481
|
+
"a",
|
482
|
+
"url",
|
483
|
+
"href"
|
484
|
+
])
|
485
|
+
for link_node in link_nodes
|
486
|
+
link_object = FeedTools::Link.new
|
487
|
+
link_object.href = FeedTools::XmlHelper.try_xpaths(link_node, [
|
488
|
+
"@atom10:href",
|
489
|
+
"@atom03:href",
|
490
|
+
"@atom:href",
|
491
|
+
"@href",
|
492
|
+
"text()"
|
493
|
+
], :select_result_value => true)
|
494
|
+
if link_object.href.nil? && link_node.base_uri != nil
|
495
|
+
link_object.href = ""
|
496
|
+
end
|
497
|
+
begin
|
498
|
+
if !(link_object.href =~ /^file:/) &&
|
499
|
+
!FeedTools::UriHelper.is_uri?(link_object.href)
|
500
|
+
stored_base_uri =
|
501
|
+
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
502
|
+
self.feed.base_uri if self.feed != nil
|
503
|
+
end
|
504
|
+
link_object.href = FeedTools::UriHelper.resolve_relative_uri(
|
505
|
+
link_object.href,
|
506
|
+
[link_node.base_uri, stored_base_uri])
|
507
|
+
end
|
508
|
+
rescue
|
509
|
+
end
|
510
|
+
if FeedTools.configurations[:url_normalization_enabled]
|
511
|
+
link_object.href =
|
512
|
+
FeedTools::UriHelper.normalize_url(link_object.href)
|
513
|
+
end
|
514
|
+
link_object.href.strip! unless link_object.href.nil?
|
515
|
+
next if link_object.href.blank?
|
516
|
+
link_object.hreflang = FeedTools::XmlHelper.try_xpaths(link_node, [
|
517
|
+
"@atom10:hreflang",
|
518
|
+
"@atom03:hreflang",
|
519
|
+
"@atom:hreflang",
|
520
|
+
"@hreflang"
|
521
|
+
], :select_result_value => true)
|
522
|
+
unless link_object.hreflang.nil?
|
523
|
+
link_object.hreflang = link_object.hreflang.downcase
|
524
|
+
end
|
525
|
+
link_object.rel = FeedTools::XmlHelper.try_xpaths(link_node, [
|
526
|
+
"@atom10:rel",
|
527
|
+
"@atom03:rel",
|
528
|
+
"@atom:rel",
|
529
|
+
"@rel"
|
530
|
+
], :select_result_value => true)
|
531
|
+
unless link_object.rel.nil?
|
532
|
+
link_object.rel = link_object.rel.downcase
|
533
|
+
end
|
534
|
+
link_object.type = FeedTools::XmlHelper.try_xpaths(link_node, [
|
535
|
+
"@atom10:type",
|
536
|
+
"@atom03:type",
|
537
|
+
"@atom:type",
|
538
|
+
"@type"
|
539
|
+
], :select_result_value => true)
|
540
|
+
unless link_object.type.nil?
|
541
|
+
link_object.type = link_object.type.downcase
|
542
|
+
end
|
543
|
+
link_object.title = FeedTools::XmlHelper.try_xpaths(link_node, [
|
544
|
+
"@atom10:title",
|
545
|
+
"@atom03:title",
|
546
|
+
"@atom:title",
|
547
|
+
"@title",
|
548
|
+
"text()"
|
549
|
+
], :select_result_value => true)
|
550
|
+
# This catches the ambiguities between atom, rss, and cdf
|
551
|
+
if link_object.title == link_object.href
|
552
|
+
link_object.title = nil
|
553
|
+
end
|
554
|
+
link_object.length = FeedTools::XmlHelper.try_xpaths(link_node, [
|
555
|
+
"@atom10:length",
|
556
|
+
"@atom03:length",
|
557
|
+
"@atom:length",
|
558
|
+
"@length"
|
559
|
+
], :select_result_value => true)
|
560
|
+
if !link_object.length.nil?
|
561
|
+
link_object.length = link_object.length.to_i
|
562
|
+
else
|
563
|
+
if !link_object.type.nil? && link_object.type[0..4] != "text" &&
|
564
|
+
link_object.type[-3..-1] != "xml" &&
|
565
|
+
link_object.href =~ /^http:\/\//
|
566
|
+
# Retrieve the length with an http HEAD request
|
567
|
+
else
|
568
|
+
link_object.length = nil
|
569
|
+
end
|
570
|
+
end
|
571
|
+
@links << link_object
|
572
|
+
end
|
573
|
+
end
|
574
|
+
return @links
|
575
|
+
end
|
576
|
+
|
577
|
+
# Sets the links collection
|
578
|
+
def links=(new_links)
|
579
|
+
@links = new_links
|
580
|
+
end
|
656
581
|
|
657
582
|
# Returns a list of the feed item's categories
|
658
583
|
def categories
|
659
584
|
if @categories.nil?
|
660
585
|
@categories = []
|
661
|
-
category_nodes = try_xpaths_all(self.root_node, [
|
586
|
+
category_nodes = FeedTools::XmlHelper.try_xpaths_all(self.root_node, [
|
662
587
|
"category",
|
663
588
|
"dc:subject"
|
664
589
|
])
|
665
590
|
for category_node in category_nodes
|
666
|
-
category = FeedTools::
|
667
|
-
category.term = try_xpaths(category_node, ["@term", "text()"],
|
591
|
+
category = FeedTools::Category.new
|
592
|
+
category.term = FeedTools::XmlHelper.try_xpaths(category_node, ["@term", "text()"],
|
668
593
|
:select_result_value => true)
|
669
594
|
category.term.strip! unless category.term.nil?
|
670
|
-
category.label = try_xpaths(category_node, ["@label"],
|
595
|
+
category.label = FeedTools::XmlHelper.try_xpaths(category_node, ["@label"],
|
671
596
|
:select_result_value => true)
|
672
597
|
category.label.strip! unless category.label.nil?
|
673
|
-
category.scheme = try_xpaths(category_node, [
|
598
|
+
category.scheme = FeedTools::XmlHelper.try_xpaths(category_node, [
|
674
599
|
"@scheme",
|
675
600
|
"@domain"
|
676
601
|
], :select_result_value => true)
|
@@ -685,57 +610,57 @@ module FeedTools
|
|
685
610
|
def images
|
686
611
|
if @images.nil?
|
687
612
|
@images = []
|
688
|
-
image_nodes = try_xpaths_all(self.root_node, [
|
613
|
+
image_nodes = FeedTools::XmlHelper.try_xpaths_all(self.root_node, [
|
689
614
|
"image",
|
690
615
|
"logo",
|
691
616
|
"apple-wallpapers:image",
|
692
|
-
"
|
693
|
-
"atom03:link",
|
694
|
-
"atom:link",
|
695
|
-
"link"
|
617
|
+
"imageUrl"
|
696
618
|
])
|
697
619
|
unless image_nodes.blank?
|
698
620
|
for image_node in image_nodes
|
699
|
-
image = FeedTools::
|
700
|
-
image.
|
621
|
+
image = FeedTools::Image.new
|
622
|
+
image.href = FeedTools::XmlHelper.try_xpaths(image_node, [
|
701
623
|
"url/text()",
|
702
624
|
"@rdf:resource",
|
625
|
+
"@href",
|
703
626
|
"text()"
|
704
627
|
], :select_result_value => true)
|
705
|
-
if image.
|
706
|
-
|
707
|
-
image.url = try_xpaths(image_node, [
|
708
|
-
"@atom10:href",
|
709
|
-
"@atom03:href",
|
710
|
-
"@atom:href",
|
711
|
-
"@href"
|
712
|
-
], :select_result_value => true)
|
713
|
-
if image.url == self.link && image.url != nil
|
714
|
-
image.url = nil
|
715
|
-
end
|
628
|
+
if image.href.nil? && image_node.base_uri != nil
|
629
|
+
image.href = ""
|
716
630
|
end
|
717
|
-
|
718
|
-
image.
|
719
|
-
|
720
|
-
|
631
|
+
begin
|
632
|
+
if !(image.href =~ /^file:/) &&
|
633
|
+
!FeedTools::UriHelper.is_uri?(image.href)
|
634
|
+
stored_base_uri =
|
635
|
+
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
636
|
+
self.feed.base_uri if self.feed != nil
|
637
|
+
end
|
638
|
+
image.href = FeedTools::UriHelper.resolve_relative_uri(
|
639
|
+
image.href, [image_node.base_uri, stored_base_uri])
|
640
|
+
end
|
641
|
+
rescue
|
721
642
|
end
|
722
|
-
|
723
|
-
|
643
|
+
if FeedTools.configurations[:url_normalization_enabled]
|
644
|
+
image.href = FeedTools::UriHelper.normalize_url(image.href)
|
645
|
+
end
|
646
|
+
image.href.strip! unless image.href.nil?
|
647
|
+
next if image.href.blank?
|
648
|
+
image.title = FeedTools::XmlHelper.try_xpaths(image_node,
|
724
649
|
["title/text()"], :select_result_value => true)
|
725
650
|
image.title.strip! unless image.title.nil?
|
726
|
-
image.description = try_xpaths(image_node,
|
651
|
+
image.description = FeedTools::XmlHelper.try_xpaths(image_node,
|
727
652
|
["description/text()"], :select_result_value => true)
|
728
653
|
image.description.strip! unless image.description.nil?
|
729
|
-
image.link = try_xpaths(image_node,
|
654
|
+
image.link = FeedTools::XmlHelper.try_xpaths(image_node,
|
730
655
|
["link/text()"], :select_result_value => true)
|
731
656
|
image.link.strip! unless image.link.nil?
|
732
|
-
image.height = try_xpaths(image_node,
|
657
|
+
image.height = FeedTools::XmlHelper.try_xpaths(image_node,
|
733
658
|
["height/text()"], :select_result_value => true).to_i
|
734
659
|
image.height = nil if image.height <= 0
|
735
|
-
image.width = try_xpaths(image_node,
|
660
|
+
image.width = FeedTools::XmlHelper.try_xpaths(image_node,
|
736
661
|
["width/text()"], :select_result_value => true).to_i
|
737
662
|
image.width = nil if image.width <= 0
|
738
|
-
image.style = try_xpaths(image_node, [
|
663
|
+
image.style = FeedTools::XmlHelper.try_xpaths(image_node, [
|
739
664
|
"style/text()",
|
740
665
|
"@style"
|
741
666
|
], :select_result_value => true)
|
@@ -744,6 +669,14 @@ module FeedTools
|
|
744
669
|
@images << image unless image.url.nil?
|
745
670
|
end
|
746
671
|
end
|
672
|
+
for link_object in self.links
|
673
|
+
if link_object.type != nil && link_object.type =~ /^image/
|
674
|
+
image = FeedTools::Image.new
|
675
|
+
image.href = link_object.href
|
676
|
+
image.title = link_object.title
|
677
|
+
@images << image unless image.href.nil?
|
678
|
+
end
|
679
|
+
end
|
747
680
|
end
|
748
681
|
return @images
|
749
682
|
end
|
@@ -751,12 +684,12 @@ module FeedTools
|
|
751
684
|
# Returns the feed item itunes image link
|
752
685
|
def itunes_image_link
|
753
686
|
if @itunes_image_link.nil?
|
754
|
-
@itunes_image_link = try_xpaths(self.root_node, [
|
687
|
+
@itunes_image_link = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
755
688
|
"itunes:image/@href",
|
756
689
|
"itunes:link[@rel='image']/@href"
|
757
690
|
], :select_result_value => true)
|
758
691
|
if FeedTools.configurations[:url_normalization_enabled]
|
759
|
-
@itunes_image_link = FeedTools.normalize_url(@itunes_image_link)
|
692
|
+
@itunes_image_link = FeedTools::UriHelper.normalize_url(@itunes_image_link)
|
760
693
|
end
|
761
694
|
end
|
762
695
|
return @itunes_image_link
|
@@ -770,11 +703,11 @@ module FeedTools
|
|
770
703
|
# Returns the feed item media thumbnail link
|
771
704
|
def media_thumbnail_link
|
772
705
|
if @media_thumbnail_link.nil?
|
773
|
-
@media_thumbnail_link = try_xpaths(self.root_node, [
|
706
|
+
@media_thumbnail_link = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
774
707
|
"media:thumbnail/@url"
|
775
708
|
], :select_result_value => true)
|
776
709
|
if FeedTools.configurations[:url_normalization_enabled]
|
777
|
-
@media_thumbnail_link = FeedTools.normalize_url(@media_thumbnail_link)
|
710
|
+
@media_thumbnail_link = FeedTools::UriHelper.normalize_url(@media_thumbnail_link)
|
778
711
|
end
|
779
712
|
end
|
780
713
|
return @media_thumbnail_link
|
@@ -785,11 +718,11 @@ module FeedTools
|
|
785
718
|
@media_thumbnail_link = new_media_thumbnail_link
|
786
719
|
end
|
787
720
|
|
788
|
-
# Returns the feed item's
|
789
|
-
def
|
790
|
-
if @
|
721
|
+
# Returns the feed item's rights information
|
722
|
+
def rights
|
723
|
+
if @rights.nil?
|
791
724
|
repair_entities = false
|
792
|
-
|
725
|
+
rights_node = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
793
726
|
"atom10:copyright",
|
794
727
|
"atom03:copyright",
|
795
728
|
"atom:copyright",
|
@@ -798,52 +731,27 @@ module FeedTools
|
|
798
731
|
"dc:rights",
|
799
732
|
"rights"
|
800
733
|
])
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
copyright_mode = try_xpaths(copyright_node, "@mode",
|
807
|
-
:select_result_value => true)
|
808
|
-
copyright_encoding = try_xpaths(copyright_node, "@encoding",
|
809
|
-
:select_result_value => true)
|
810
|
-
|
811
|
-
# Note that we're checking for misuse of type, mode and encoding here
|
812
|
-
if !copyright_encoding.blank?
|
813
|
-
@copyright =
|
814
|
-
"[Embedded data objects are not currently supported.]"
|
815
|
-
elsif copyright_node.cdatas.size > 0
|
816
|
-
@copyright = copyright_node.cdatas.first.value
|
817
|
-
elsif copyright_type == "base64" || copyright_mode == "base64" ||
|
818
|
-
copyright_encoding == "base64"
|
819
|
-
@copyright = Base64.decode64(copyright_node.inner_xml.strip)
|
820
|
-
elsif copyright_type == "xhtml" || copyright_mode == "xhtml" ||
|
821
|
-
copyright_type == "xml" || copyright_mode == "xml" ||
|
822
|
-
copyright_type == "application/xhtml+xml"
|
823
|
-
@copyright = copyright_node.inner_xml
|
824
|
-
elsif copyright_type == "escaped" || copyright_mode == "escaped"
|
825
|
-
@copyright = FeedTools.unescape_entities(
|
826
|
-
copyright_node.inner_xml)
|
827
|
-
else
|
828
|
-
@copyright = copyright_node.inner_xml
|
829
|
-
repair_entities = true
|
830
|
-
end
|
831
|
-
|
832
|
-
unless @copyright.nil?
|
833
|
-
@copyright = FeedTools.sanitize_html(@copyright, :strip)
|
834
|
-
@copyright = FeedTools.unescape_entities(@copyright) if repair_entities
|
835
|
-
@copyright = FeedTools.tidy_html(@copyright)
|
734
|
+
@rights = FeedTools::HtmlHelper.process_text_construct(rights_node,
|
735
|
+
self.feed_type, self.feed_version)
|
736
|
+
if self.feed_type == "atom" ||
|
737
|
+
FeedTools.configurations[:always_strip_wrapper_elements]
|
738
|
+
@rights = FeedTools::HtmlHelper.strip_wrapper_element(@rights)
|
836
739
|
end
|
837
|
-
|
838
|
-
@copyright = @copyright.strip unless @copyright.nil?
|
839
|
-
@copyright = nil if @copyright.blank?
|
840
740
|
end
|
841
|
-
return @
|
741
|
+
return @rights
|
842
742
|
end
|
843
743
|
|
844
|
-
# Sets the feed item's
|
845
|
-
def
|
846
|
-
@
|
744
|
+
# Sets the feed item's rights information
|
745
|
+
def rights=(new_rights)
|
746
|
+
@rights = new_rights
|
747
|
+
end
|
748
|
+
|
749
|
+
def license #:nodoc:
|
750
|
+
raise "Not implemented yet."
|
751
|
+
end
|
752
|
+
|
753
|
+
def license=(new_license) #:nodoc:
|
754
|
+
raise "Not implemented yet."
|
847
755
|
end
|
848
756
|
|
849
757
|
# Returns all feed item enclosures
|
@@ -853,25 +761,32 @@ module FeedTools
|
|
853
761
|
|
854
762
|
# First, load up all the different possible sources of enclosures
|
855
763
|
rss_enclosures =
|
856
|
-
try_xpaths_all(self.root_node, ["enclosure"])
|
764
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["enclosure"])
|
857
765
|
atom_enclosures =
|
858
|
-
try_xpaths_all(self.root_node, [
|
766
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node, [
|
859
767
|
"atom10:link[@rel='enclosure']",
|
860
768
|
"atom03:link[@rel='enclosure']",
|
861
769
|
"atom:link[@rel='enclosure']",
|
862
770
|
"link[@rel='enclosure']"
|
863
771
|
])
|
864
772
|
media_content_enclosures =
|
865
|
-
try_xpaths_all(self.root_node,
|
773
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
774
|
+
["media:content"])
|
866
775
|
media_group_enclosures =
|
867
|
-
try_xpaths_all(self.root_node, ["media:group"])
|
776
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["media:group"])
|
777
|
+
|
778
|
+
# TODO: Implement this
|
779
|
+
bittorrent_enclosures =
|
780
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
781
|
+
["bitTorrent:torrent"])
|
782
|
+
|
868
783
|
|
869
784
|
# Parse RSS-type enclosures. Thanks to a few buggy enclosures
|
870
785
|
# implementations, sometimes these also manage to show up in atom
|
871
786
|
# files.
|
872
787
|
for enclosure_node in rss_enclosures
|
873
|
-
enclosure = Enclosure.new
|
874
|
-
enclosure.url = FeedTools.unescape_entities(
|
788
|
+
enclosure = FeedTools::Enclosure.new
|
789
|
+
enclosure.url = FeedTools::HtmlHelper.unescape_entities(
|
875
790
|
enclosure_node.attributes["url"].to_s)
|
876
791
|
enclosure.type = enclosure_node.attributes["type"].to_s
|
877
792
|
enclosure.file_size = enclosure_node.attributes["length"].to_i
|
@@ -883,7 +798,7 @@ module FeedTools
|
|
883
798
|
# Parse atom-type enclosures. If there are repeats of the same
|
884
799
|
# enclosure object, we merge the two together.
|
885
800
|
for enclosure_node in atom_enclosures
|
886
|
-
enclosure_url = FeedTools.unescape_entities(
|
801
|
+
enclosure_url = FeedTools::HtmlHelper.unescape_entities(
|
887
802
|
enclosure_node.attributes["href"].to_s)
|
888
803
|
enclosure = nil
|
889
804
|
new_enclosure = false
|
@@ -895,7 +810,7 @@ module FeedTools
|
|
895
810
|
end
|
896
811
|
if enclosure.nil?
|
897
812
|
new_enclosure = true
|
898
|
-
enclosure = Enclosure.new
|
813
|
+
enclosure = FeedTools::Enclosure.new
|
899
814
|
end
|
900
815
|
enclosure.url = enclosure_url
|
901
816
|
enclosure.type = enclosure_node.attributes["type"].to_s
|
@@ -914,7 +829,7 @@ module FeedTools
|
|
914
829
|
parse_media_content = lambda do |media_content_nodes|
|
915
830
|
affected_enclosures = []
|
916
831
|
for enclosure_node in media_content_nodes
|
917
|
-
enclosure_url = FeedTools.unescape_entities(
|
832
|
+
enclosure_url = FeedTools::HtmlHelper.unescape_entities(
|
918
833
|
enclosure_node.attributes["url"].to_s)
|
919
834
|
enclosure = nil
|
920
835
|
new_enclosure = false
|
@@ -926,7 +841,7 @@ module FeedTools
|
|
926
841
|
end
|
927
842
|
if enclosure.nil?
|
928
843
|
new_enclosure = true
|
929
|
-
enclosure = Enclosure.new
|
844
|
+
enclosure = FeedTools::Enclosure.new
|
930
845
|
end
|
931
846
|
enclosure.url = enclosure_url
|
932
847
|
enclosure.type = enclosure_node.attributes["type"].to_s
|
@@ -940,29 +855,29 @@ module FeedTools
|
|
940
855
|
enclosure_node.attributes["expression"].to_s
|
941
856
|
enclosure.is_default =
|
942
857
|
(enclosure_node.attributes["isDefault"].to_s.downcase == "true")
|
943
|
-
enclosure_thumbnail_url = try_xpaths(enclosure_node,
|
858
|
+
enclosure_thumbnail_url = FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
944
859
|
["media:thumbnail/@url"], :select_result_value => true)
|
945
860
|
if !enclosure_thumbnail_url.blank?
|
946
|
-
enclosure.thumbnail = EnclosureThumbnail.new(
|
947
|
-
FeedTools.unescape_entities(enclosure_thumbnail_url),
|
948
|
-
FeedTools.unescape_entities(
|
949
|
-
try_xpaths(enclosure_node, ["media:thumbnail/@height"],
|
861
|
+
enclosure.thumbnail = FeedTools::EnclosureThumbnail.new(
|
862
|
+
FeedTools::HtmlHelper.unescape_entities(enclosure_thumbnail_url),
|
863
|
+
FeedTools::HtmlHelper.unescape_entities(
|
864
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node, ["media:thumbnail/@height"],
|
950
865
|
:select_result_value => true)),
|
951
|
-
FeedTools.unescape_entities(
|
952
|
-
try_xpaths(enclosure_node, ["media:thumbnail/@width"],
|
866
|
+
FeedTools::HtmlHelper.unescape_entities(
|
867
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node, ["media:thumbnail/@width"],
|
953
868
|
:select_result_value => true))
|
954
869
|
)
|
955
870
|
end
|
956
871
|
enclosure.categories = []
|
957
|
-
for category in try_xpaths_all(enclosure_node, ["media:category"])
|
958
|
-
enclosure.categories << FeedTools::
|
872
|
+
for category in FeedTools::XmlHelper.try_xpaths_all(enclosure_node, ["media:category"])
|
873
|
+
enclosure.categories << FeedTools::Category.new
|
959
874
|
enclosure.categories.last.term =
|
960
|
-
FeedTools.unescape_entities(category.inner_xml)
|
875
|
+
FeedTools::HtmlHelper.unescape_entities(category.inner_xml)
|
961
876
|
enclosure.categories.last.scheme =
|
962
|
-
FeedTools.unescape_entities(
|
877
|
+
FeedTools::HtmlHelper.unescape_entities(
|
963
878
|
category.attributes["scheme"].to_s)
|
964
879
|
enclosure.categories.last.label =
|
965
|
-
FeedTools.unescape_entities(
|
880
|
+
FeedTools::HtmlHelper.unescape_entities(
|
966
881
|
category.attributes["label"].to_s)
|
967
882
|
if enclosure.categories.last.scheme.blank?
|
968
883
|
enclosure.categories.last.scheme = nil
|
@@ -971,33 +886,33 @@ module FeedTools
|
|
971
886
|
enclosure.categories.last.label = nil
|
972
887
|
end
|
973
888
|
end
|
974
|
-
enclosure_media_hash = try_xpaths(enclosure_node,
|
889
|
+
enclosure_media_hash = FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
975
890
|
["media:hash/text()"], :select_result_value => true)
|
976
891
|
if !enclosure_media_hash.nil?
|
977
|
-
enclosure.hash = EnclosureHash.new(
|
978
|
-
FeedTools.sanitize_html(FeedTools.unescape_entities(
|
892
|
+
enclosure.hash = FeedTools::EnclosureHash.new(
|
893
|
+
FeedTools::HtmlHelper.sanitize_html(FeedTools::HtmlHelper.unescape_entities(
|
979
894
|
enclosure_media_hash), :strip),
|
980
895
|
"md5"
|
981
896
|
)
|
982
897
|
end
|
983
|
-
enclosure_media_player_url = try_xpaths(enclosure_node,
|
898
|
+
enclosure_media_player_url = FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
984
899
|
["media:player/@url"], :select_result_value => true)
|
985
900
|
if !enclosure_media_player_url.blank?
|
986
|
-
enclosure.player = EnclosurePlayer.new(
|
987
|
-
FeedTools.unescape_entities(enclosure_media_player_url),
|
988
|
-
FeedTools.unescape_entities(
|
989
|
-
try_xpaths(enclosure_node,
|
901
|
+
enclosure.player = FeedTools::EnclosurePlayer.new(
|
902
|
+
FeedTools::HtmlHelper.unescape_entities(enclosure_media_player_url),
|
903
|
+
FeedTools::HtmlHelper.unescape_entities(
|
904
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
990
905
|
["media:player/@height"], :select_result_value => true)),
|
991
|
-
FeedTools.unescape_entities(
|
992
|
-
try_xpaths(enclosure_node,
|
906
|
+
FeedTools::HtmlHelper.unescape_entities(
|
907
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
993
908
|
["media:player/@width"], :select_result_value => true))
|
994
909
|
)
|
995
910
|
end
|
996
911
|
enclosure.credits = []
|
997
|
-
for credit in try_xpaths_all(enclosure_node, ["media:credit"])
|
998
|
-
enclosure.credits << EnclosureCredit.new(
|
999
|
-
FeedTools.unescape_entities(credit.inner_xml.to_s.strip),
|
1000
|
-
FeedTools.unescape_entities(
|
912
|
+
for credit in FeedTools::XmlHelper.try_xpaths_all(enclosure_node, ["media:credit"])
|
913
|
+
enclosure.credits << FeedTools::EnclosureCredit.new(
|
914
|
+
FeedTools::HtmlHelper.unescape_entities(credit.inner_xml.to_s.strip),
|
915
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1001
916
|
credit.attributes["role"].to_s.downcase)
|
1002
917
|
)
|
1003
918
|
if enclosure.credits.last.name.blank?
|
@@ -1007,12 +922,12 @@ module FeedTools
|
|
1007
922
|
enclosure.credits.last.role = nil
|
1008
923
|
end
|
1009
924
|
end
|
1010
|
-
enclosure.explicit = (try_xpaths(enclosure_node,
|
925
|
+
enclosure.explicit = (FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1011
926
|
["media:adult/text()"]).to_s.downcase == "true")
|
1012
927
|
enclosure_media_text =
|
1013
|
-
try_xpaths(enclosure_node, ["media:text/text()"])
|
928
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node, ["media:text/text()"])
|
1014
929
|
if !enclosure_media_text.blank?
|
1015
|
-
enclosure.text = FeedTools.unescape_entities(
|
930
|
+
enclosure.text = FeedTools::HtmlHelper.unescape_entities(
|
1016
931
|
enclosure_media_text)
|
1017
932
|
end
|
1018
933
|
affected_enclosures << enclosure
|
@@ -1031,7 +946,7 @@ module FeedTools
|
|
1031
946
|
# Parse the group objects.
|
1032
947
|
for media_group in media_group_enclosures
|
1033
948
|
group_media_content_enclosures =
|
1034
|
-
try_xpaths_all(media_group, ["media:content"])
|
949
|
+
FeedTools::XmlHelper.try_xpaths_all(media_group, ["media:content"])
|
1035
950
|
|
1036
951
|
# Parse the content objects within the group objects.
|
1037
952
|
affected_enclosures =
|
@@ -1040,31 +955,31 @@ module FeedTools
|
|
1040
955
|
# Now make sure that content objects inherit certain properties from
|
1041
956
|
# the group objects.
|
1042
957
|
for enclosure in affected_enclosures
|
1043
|
-
media_group_thumbnail = try_xpaths(media_group,
|
958
|
+
media_group_thumbnail = FeedTools::XmlHelper.try_xpaths(media_group,
|
1044
959
|
["media:thumbnail/@url"], :select_result_value => true)
|
1045
960
|
if enclosure.thumbnail.nil? && !media_group_thumbnail.blank?
|
1046
|
-
enclosure.thumbnail = EnclosureThumbnail.new(
|
1047
|
-
FeedTools.unescape_entities(
|
961
|
+
enclosure.thumbnail = FeedTools::EnclosureThumbnail.new(
|
962
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1048
963
|
media_group_thumbnail),
|
1049
|
-
FeedTools.unescape_entities(
|
1050
|
-
try_xpaths(media_group, ["media:thumbnail/@height"],
|
964
|
+
FeedTools::HtmlHelper.unescape_entities(
|
965
|
+
FeedTools::XmlHelper.try_xpaths(media_group, ["media:thumbnail/@height"],
|
1051
966
|
:select_result_value => true)),
|
1052
|
-
FeedTools.unescape_entities(
|
1053
|
-
try_xpaths(media_group, ["media:thumbnail/@width"],
|
967
|
+
FeedTools::HtmlHelper.unescape_entities(
|
968
|
+
FeedTools::XmlHelper.try_xpaths(media_group, ["media:thumbnail/@width"],
|
1054
969
|
:select_result_value => true))
|
1055
970
|
)
|
1056
971
|
end
|
1057
972
|
if (enclosure.categories.blank?)
|
1058
973
|
enclosure.categories = []
|
1059
|
-
for category in try_xpaths_all(media_group, ["media:category"])
|
1060
|
-
enclosure.categories << FeedTools::
|
974
|
+
for category in FeedTools::XmlHelper.try_xpaths_all(media_group, ["media:category"])
|
975
|
+
enclosure.categories << FeedTools::Category.new
|
1061
976
|
enclosure.categories.last.term =
|
1062
|
-
FeedTools.unescape_entities(category.inner_xml)
|
977
|
+
FeedTools::HtmlHelper.unescape_entities(category.inner_xml)
|
1063
978
|
enclosure.categories.last.scheme =
|
1064
|
-
FeedTools.unescape_entities(
|
979
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1065
980
|
category.attributes["scheme"].to_s)
|
1066
981
|
enclosure.categories.last.label =
|
1067
|
-
FeedTools.unescape_entities(
|
982
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1068
983
|
category.attributes["label"].to_s)
|
1069
984
|
if enclosure.categories.last.scheme.blank?
|
1070
985
|
enclosure.categories.last.scheme = nil
|
@@ -1074,34 +989,34 @@ module FeedTools
|
|
1074
989
|
end
|
1075
990
|
end
|
1076
991
|
end
|
1077
|
-
enclosure_media_group_hash = try_xpaths(enclosure_node,
|
992
|
+
enclosure_media_group_hash = FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1078
993
|
["media:hash/text()"], :select_result_value => true)
|
1079
994
|
if enclosure.hash.nil? && !enclosure_media_group_hash.blank?
|
1080
|
-
enclosure.hash = EnclosureHash.new(
|
1081
|
-
FeedTools.sanitize_html(FeedTools.unescape_entities(
|
995
|
+
enclosure.hash = FeedTools::EnclosureHash.new(
|
996
|
+
FeedTools::HtmlHelper.sanitize_html(FeedTools::HtmlHelper.unescape_entities(
|
1082
997
|
enclosure_media_group_hash), :strip),
|
1083
998
|
"md5"
|
1084
999
|
)
|
1085
1000
|
end
|
1086
|
-
enclosure_media_group_url = try_xpaths(media_group,
|
1001
|
+
enclosure_media_group_url = FeedTools::XmlHelper.try_xpaths(media_group,
|
1087
1002
|
"media:player/@url", :select_result_value => true)
|
1088
1003
|
if enclosure.player.nil? && !enclosure_media_group_url.blank?
|
1089
|
-
enclosure.player = EnclosurePlayer.new(
|
1090
|
-
FeedTools.unescape_entities(enclosure_media_group_url),
|
1091
|
-
FeedTools.unescape_entities(
|
1092
|
-
try_xpaths(media_group, ["media:player/@height"],
|
1004
|
+
enclosure.player = FeedTools::EnclosurePlayer.new(
|
1005
|
+
FeedTools::HtmlHelper.unescape_entities(enclosure_media_group_url),
|
1006
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1007
|
+
FeedTools::XmlHelper.try_xpaths(media_group, ["media:player/@height"],
|
1093
1008
|
:select_result_value => true)),
|
1094
|
-
FeedTools.unescape_entities(
|
1095
|
-
try_xpaths(media_group, ["media:player/@width"],
|
1009
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1010
|
+
FeedTools::XmlHelper.try_xpaths(media_group, ["media:player/@width"],
|
1096
1011
|
:select_result_value => true))
|
1097
1012
|
)
|
1098
1013
|
end
|
1099
1014
|
if enclosure.credits.nil? || enclosure.credits.size == 0
|
1100
1015
|
enclosure.credits = []
|
1101
|
-
for credit in try_xpaths_all(media_group, ["media:credit"])
|
1102
|
-
enclosure.credits << EnclosureCredit.new(
|
1103
|
-
FeedTools.unescape_entities(credit.inner_xml),
|
1104
|
-
FeedTools.unescape_entities(
|
1016
|
+
for credit in FeedTools::XmlHelper.try_xpaths_all(media_group, ["media:credit"])
|
1017
|
+
enclosure.credits << FeedTools::EnclosureCredit.new(
|
1018
|
+
FeedTools::HtmlHelper.unescape_entities(credit.inner_xml),
|
1019
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1105
1020
|
credit.attributes["role"].to_s.downcase)
|
1106
1021
|
)
|
1107
1022
|
if enclosure.credits.last.role.blank?
|
@@ -1110,16 +1025,16 @@ module FeedTools
|
|
1110
1025
|
end
|
1111
1026
|
end
|
1112
1027
|
if enclosure.explicit?.nil?
|
1113
|
-
enclosure.explicit = ((try_xpaths(media_group, [
|
1028
|
+
enclosure.explicit = ((FeedTools::XmlHelper.try_xpaths(media_group, [
|
1114
1029
|
"media:adult/text()"
|
1115
1030
|
], :select_result_value => true).downcase == "true") ?
|
1116
1031
|
true : false)
|
1117
1032
|
end
|
1118
|
-
enclosure_media_group_text = try_xpaths(media_group,
|
1033
|
+
enclosure_media_group_text = FeedTools::XmlHelper.try_xpaths(media_group,
|
1119
1034
|
["media:text/text()"], :select_result_value => true)
|
1120
1035
|
if enclosure.text.nil? && !enclosure_media_group_text.blank?
|
1121
|
-
enclosure.text = FeedTools.sanitize_html(
|
1122
|
-
FeedTools.unescape_entities(
|
1036
|
+
enclosure.text = FeedTools::HtmlHelper.sanitize_html(
|
1037
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1123
1038
|
enclosure_media_group_text), :strip)
|
1124
1039
|
end
|
1125
1040
|
end
|
@@ -1137,27 +1052,27 @@ module FeedTools
|
|
1137
1052
|
|
1138
1053
|
# Add all the itunes categories
|
1139
1054
|
itunes_categories =
|
1140
|
-
try_xpaths_all(self.root_node, ["itunes:category"])
|
1055
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["itunes:category"])
|
1141
1056
|
for itunes_category in itunes_categories
|
1142
1057
|
genre = "Podcasts"
|
1143
1058
|
category = itunes_category.attributes["text"].to_s
|
1144
1059
|
subcategory =
|
1145
|
-
try_xpaths(itunes_category, ["itunes:category/@text"],
|
1060
|
+
FeedTools::XmlHelper.try_xpaths(itunes_category, ["itunes:category/@text"],
|
1146
1061
|
:select_result_value => true)
|
1147
1062
|
category_path = genre
|
1148
|
-
if category
|
1063
|
+
if !category.blank?
|
1149
1064
|
category_path << "/" + category
|
1150
1065
|
end
|
1151
|
-
if subcategory
|
1066
|
+
if !subcategory.blank?
|
1152
1067
|
category_path << "/" + subcategory
|
1153
1068
|
end
|
1154
1069
|
for enclosure in @enclosures
|
1155
1070
|
if enclosure.categories.nil?
|
1156
1071
|
enclosure.categories = []
|
1157
1072
|
end
|
1158
|
-
enclosure.categories << FeedTools::
|
1073
|
+
enclosure.categories << FeedTools::Category.new
|
1159
1074
|
enclosure.categories.last.term =
|
1160
|
-
FeedTools.unescape_entities(category_path)
|
1075
|
+
FeedTools::HtmlHelper.unescape_entities(category_path)
|
1161
1076
|
enclosure.categories.last.scheme =
|
1162
1077
|
"http://www.apple.com/itunes/store/"
|
1163
1078
|
enclosure.categories.last.label =
|
@@ -1254,8 +1169,8 @@ module FeedTools
|
|
1254
1169
|
# Returns the feed item author
|
1255
1170
|
def author
|
1256
1171
|
if @author.nil?
|
1257
|
-
@author = FeedTools::
|
1258
|
-
author_node = try_xpaths(self.root_node, [
|
1172
|
+
@author = FeedTools::Author.new
|
1173
|
+
author_node = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1259
1174
|
"atom10:author",
|
1260
1175
|
"atom03:author",
|
1261
1176
|
"atom:author",
|
@@ -1266,9 +1181,9 @@ module FeedTools
|
|
1266
1181
|
"creator"
|
1267
1182
|
])
|
1268
1183
|
unless author_node.nil?
|
1269
|
-
@author.raw = FeedTools.
|
1270
|
-
|
1271
|
-
@author.raw =
|
1184
|
+
@author.raw = FeedTools::XmlHelper.try_xpaths(
|
1185
|
+
author_node, ["text()"], :select_result_value => true)
|
1186
|
+
@author.raw = FeedTools::HtmlHelper.unescape_entities(@author.raw)
|
1272
1187
|
unless @author.raw.nil?
|
1273
1188
|
raw_scan = @author.raw.scan(
|
1274
1189
|
/(.*)\((\b[A-Z0-9._%-\+]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b)\)/i)
|
@@ -1302,8 +1217,8 @@ module FeedTools
|
|
1302
1217
|
end
|
1303
1218
|
end
|
1304
1219
|
if @author.name.blank?
|
1305
|
-
@author.name = FeedTools.unescape_entities(
|
1306
|
-
try_xpaths(author_node, [
|
1220
|
+
@author.name = FeedTools::HtmlHelper.unescape_entities(
|
1221
|
+
FeedTools::XmlHelper.try_xpaths(author_node, [
|
1307
1222
|
"atom10:name/text()",
|
1308
1223
|
"atom03:name/text()",
|
1309
1224
|
"atom:name/text()",
|
@@ -1313,8 +1228,8 @@ module FeedTools
|
|
1313
1228
|
)
|
1314
1229
|
end
|
1315
1230
|
if @author.email.blank?
|
1316
|
-
@author.email = FeedTools.unescape_entities(
|
1317
|
-
try_xpaths(author_node, [
|
1231
|
+
@author.email = FeedTools::HtmlHelper.unescape_entities(
|
1232
|
+
FeedTools::XmlHelper.try_xpaths(author_node, [
|
1318
1233
|
"atom10:email/text()",
|
1319
1234
|
"atom03:email/text()",
|
1320
1235
|
"atom:email/text()",
|
@@ -1324,8 +1239,8 @@ module FeedTools
|
|
1324
1239
|
)
|
1325
1240
|
end
|
1326
1241
|
if @author.url.blank?
|
1327
|
-
@author.url = FeedTools.unescape_entities(
|
1328
|
-
try_xpaths(author_node, [
|
1242
|
+
@author.url = FeedTools::HtmlHelper.unescape_entities(
|
1243
|
+
FeedTools::XmlHelper.try_xpaths(author_node, [
|
1329
1244
|
"atom10:url/text()",
|
1330
1245
|
"atom03:url/text()",
|
1331
1246
|
"atom:url/text()",
|
@@ -1344,6 +1259,16 @@ module FeedTools
|
|
1344
1259
|
@author.raw = nil if @author.raw.blank?
|
1345
1260
|
@author.email = nil if @author.email.blank?
|
1346
1261
|
@author.url = nil if @author.url.blank?
|
1262
|
+
if @author.url != nil
|
1263
|
+
begin
|
1264
|
+
if !(@author.url =~ /^file:/) &&
|
1265
|
+
!FeedTools::UriHelper.is_uri?(@author.url)
|
1266
|
+
@author.url = FeedTools::UriHelper.resolve_relative_uri(
|
1267
|
+
@author.url, [author_node.base_uri, self.base_uri])
|
1268
|
+
end
|
1269
|
+
rescue
|
1270
|
+
end
|
1271
|
+
end
|
1347
1272
|
end
|
1348
1273
|
# Fallback on the itunes module if we didn't find an author name
|
1349
1274
|
begin
|
@@ -1366,7 +1291,7 @@ module FeedTools
|
|
1366
1291
|
# We're not looking at an author object, this is probably a string,
|
1367
1292
|
# default to setting the author's name.
|
1368
1293
|
if @author.nil?
|
1369
|
-
@author = FeedTools::
|
1294
|
+
@author = FeedTools::Author.new
|
1370
1295
|
end
|
1371
1296
|
@author.name = new_author
|
1372
1297
|
end
|
@@ -1375,11 +1300,11 @@ module FeedTools
|
|
1375
1300
|
# Returns the feed publisher
|
1376
1301
|
def publisher
|
1377
1302
|
if @publisher.nil?
|
1378
|
-
@publisher = FeedTools::
|
1303
|
+
@publisher = FeedTools::Author.new
|
1379
1304
|
|
1380
1305
|
# Set the author name
|
1381
|
-
@publisher.raw = FeedTools.unescape_entities(
|
1382
|
-
try_xpaths(self.root_node, [
|
1306
|
+
@publisher.raw = FeedTools::HtmlHelper.unescape_entities(
|
1307
|
+
FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1383
1308
|
"dc:publisher/text()",
|
1384
1309
|
"webMaster/text()"
|
1385
1310
|
], :select_result_value => true))
|
@@ -1420,6 +1345,20 @@ module FeedTools
|
|
1420
1345
|
@publisher.raw = nil if @publisher.raw.blank?
|
1421
1346
|
@publisher.email = nil if @publisher.email.blank?
|
1422
1347
|
@publisher.url = nil if @publisher.url.blank?
|
1348
|
+
if @publisher.url != nil
|
1349
|
+
begin
|
1350
|
+
if !(@publisher.url =~ /^file:/) &&
|
1351
|
+
!FeedTools::UriHelper.is_uri?(@publisher.url)
|
1352
|
+
root_base_uri = nil
|
1353
|
+
unless self.root_node.nil?
|
1354
|
+
root_base_uri = self.root_node.base_uri
|
1355
|
+
end
|
1356
|
+
@publisher.url = FeedTools::UriHelper.resolve_relative_uri(
|
1357
|
+
@publisher.url, [root_base_uri, self.base_uri])
|
1358
|
+
end
|
1359
|
+
rescue
|
1360
|
+
end
|
1361
|
+
end
|
1423
1362
|
end
|
1424
1363
|
return @publisher
|
1425
1364
|
end
|
@@ -1435,7 +1374,7 @@ module FeedTools
|
|
1435
1374
|
# We're not looking at an Author object, this is probably a string,
|
1436
1375
|
# default to setting the publisher's name.
|
1437
1376
|
if @publisher.nil?
|
1438
|
-
@publisher = FeedTools::
|
1377
|
+
@publisher = FeedTools::Author.new
|
1439
1378
|
end
|
1440
1379
|
@publisher.name = new_publisher
|
1441
1380
|
end
|
@@ -1447,8 +1386,8 @@ module FeedTools
|
|
1447
1386
|
# elements. They're actually amazingly common. People don't read specs.
|
1448
1387
|
def itunes_author
|
1449
1388
|
if @itunes_author.nil?
|
1450
|
-
@itunes_author = FeedTools.unescape_entities(
|
1451
|
-
try_xpaths(self.root_node,
|
1389
|
+
@itunes_author = FeedTools::HtmlHelper.unescape_entities(
|
1390
|
+
FeedTools::XmlHelper.try_xpaths(self.root_node,
|
1452
1391
|
["itunes:author/text()"], :select_result_value => true))
|
1453
1392
|
@itunes_author = feed.itunes_author if @itunes_author.blank?
|
1454
1393
|
end
|
@@ -1463,8 +1402,8 @@ module FeedTools
|
|
1463
1402
|
# Returns the number of seconds that the associated media runs for
|
1464
1403
|
def itunes_duration
|
1465
1404
|
if @itunes_duration.nil?
|
1466
|
-
raw_duration = FeedTools.unescape_entities(
|
1467
|
-
try_xpaths(self.root_node,
|
1405
|
+
raw_duration = FeedTools::HtmlHelper.unescape_entities(
|
1406
|
+
FeedTools::XmlHelper.try_xpaths(self.root_node,
|
1468
1407
|
["itunes:duration/text()"], :select_result_value => true))
|
1469
1408
|
if !raw_duration.blank?
|
1470
1409
|
hms = raw_duration.split(":").map { |x| x.to_i }
|
@@ -1487,11 +1426,11 @@ module FeedTools
|
|
1487
1426
|
|
1488
1427
|
# Returns the feed item time
|
1489
1428
|
def time(options = {})
|
1490
|
-
validate_options([ :estimate_timestamp ],
|
1429
|
+
FeedTools::GenericHelper.validate_options([ :estimate_timestamp ],
|
1491
1430
|
options.keys)
|
1492
1431
|
options = { :estimate_timestamp => true }.merge(options)
|
1493
1432
|
if @time.nil?
|
1494
|
-
time_string = try_xpaths(self.root_node, [
|
1433
|
+
time_string = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1495
1434
|
"atom10:updated/text()",
|
1496
1435
|
"atom03:updated/text()",
|
1497
1436
|
"atom:updated/text()",
|
@@ -1501,6 +1440,7 @@ module FeedTools
|
|
1501
1440
|
"atom:modified/text()",
|
1502
1441
|
"modified/text()",
|
1503
1442
|
"time/text()",
|
1443
|
+
"lastBuildDate/text()",
|
1504
1444
|
"atom10:issued/text()",
|
1505
1445
|
"atom03:issued/text()",
|
1506
1446
|
"atom:issued/text()",
|
@@ -1509,8 +1449,8 @@ module FeedTools
|
|
1509
1449
|
"atom03:published/text()",
|
1510
1450
|
"atom:published/text()",
|
1511
1451
|
"published/text()",
|
1512
|
-
"pubDate/text()",
|
1513
1452
|
"dc:date/text()",
|
1453
|
+
"pubDate/text()",
|
1514
1454
|
"date/text()"
|
1515
1455
|
], :select_result_value => true)
|
1516
1456
|
begin
|
@@ -1603,7 +1543,7 @@ module FeedTools
|
|
1603
1543
|
# Returns the feed item updated time
|
1604
1544
|
def updated
|
1605
1545
|
if @updated.nil?
|
1606
|
-
updated_string = try_xpaths(self.root_node, [
|
1546
|
+
updated_string = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1607
1547
|
"atom10:updated/text()",
|
1608
1548
|
"atom03:updated/text()",
|
1609
1549
|
"atom:updated/text()",
|
@@ -1611,7 +1551,8 @@ module FeedTools
|
|
1611
1551
|
"atom10:modified/text()",
|
1612
1552
|
"atom03:modified/text()",
|
1613
1553
|
"atom:modified/text()",
|
1614
|
-
"modified/text()"
|
1554
|
+
"modified/text()",
|
1555
|
+
"lastBuildDate/text()"
|
1615
1556
|
], :select_result_value => true)
|
1616
1557
|
if !updated_string.blank?
|
1617
1558
|
@updated = Time.parse(updated_string).gmtime rescue nil
|
@@ -1630,7 +1571,7 @@ module FeedTools
|
|
1630
1571
|
# Returns the feed item published time
|
1631
1572
|
def published
|
1632
1573
|
if @published.nil?
|
1633
|
-
published_string = try_xpaths(self.root_node, [
|
1574
|
+
published_string = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1634
1575
|
"atom10:issued/text()",
|
1635
1576
|
"atom03:issued/text()",
|
1636
1577
|
"atom:issued/text()",
|
@@ -1639,17 +1580,17 @@ module FeedTools
|
|
1639
1580
|
"atom03:published/text()",
|
1640
1581
|
"atom:published/text()",
|
1641
1582
|
"published/text()",
|
1642
|
-
"pubDate/text()",
|
1643
1583
|
"dc:date/text()",
|
1584
|
+
"pubDate/text()",
|
1644
1585
|
"date/text()"
|
1645
1586
|
], :select_result_value => true)
|
1646
1587
|
if !published_string.blank?
|
1647
|
-
@
|
1588
|
+
@published = Time.parse(published_string).gmtime rescue nil
|
1648
1589
|
else
|
1649
|
-
@
|
1590
|
+
@published = nil
|
1650
1591
|
end
|
1651
1592
|
end
|
1652
|
-
return @
|
1593
|
+
return @published
|
1653
1594
|
end
|
1654
1595
|
|
1655
1596
|
# Sets the feed item published time
|
@@ -1660,10 +1601,22 @@ module FeedTools
|
|
1660
1601
|
# Returns the url for posting comments
|
1661
1602
|
def comments
|
1662
1603
|
if @comments.nil?
|
1663
|
-
@comments = try_xpaths(self.root_node, ["comments/text()"],
|
1604
|
+
@comments = FeedTools::XmlHelper.try_xpaths(self.root_node, ["comments/text()"],
|
1664
1605
|
:select_result_value => true)
|
1606
|
+
begin
|
1607
|
+
if !(@comments =~ /^file:/) &&
|
1608
|
+
!FeedTools::UriHelper.is_uri?(@comments)
|
1609
|
+
root_base_uri = nil
|
1610
|
+
unless self.root_node.nil?
|
1611
|
+
root_base_uri = self.root_node.base_uri
|
1612
|
+
end
|
1613
|
+
@comments = FeedTools::UriHelper.resolve_relative_uri(
|
1614
|
+
@comments, [root_base_uri, self.base_uri])
|
1615
|
+
end
|
1616
|
+
rescue
|
1617
|
+
end
|
1665
1618
|
if FeedTools.configurations[:url_normalization_enabled]
|
1666
|
-
@comments = FeedTools.normalize_url(@comments)
|
1619
|
+
@comments = FeedTools::UriHelper.normalize_url(@comments)
|
1667
1620
|
end
|
1668
1621
|
end
|
1669
1622
|
return @comments
|
@@ -1677,10 +1630,12 @@ module FeedTools
|
|
1677
1630
|
# The source that this post was based on
|
1678
1631
|
def source
|
1679
1632
|
if @source.nil?
|
1680
|
-
@source = FeedTools::
|
1681
|
-
@source.
|
1633
|
+
@source = FeedTools::Link.new
|
1634
|
+
@source.href = FeedTools::XmlHelper.try_xpaths(
|
1635
|
+
self.root_node, ["source/@url"],
|
1682
1636
|
:select_result_value => true)
|
1683
|
-
@source.
|
1637
|
+
@source.title = FeedTools::XmlHelper.try_xpaths(
|
1638
|
+
self.root_node, ["source/text()"],
|
1684
1639
|
:select_result_value => true)
|
1685
1640
|
end
|
1686
1641
|
return @source
|
@@ -1697,7 +1652,7 @@ module FeedTools
|
|
1697
1652
|
end
|
1698
1653
|
if @tags.nil? || @tags.size == 0
|
1699
1654
|
@tags = []
|
1700
|
-
tag_list = try_xpaths_all(self.root_node,
|
1655
|
+
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1701
1656
|
["dc:subject/rdf:Bag/rdf:li/text()"],
|
1702
1657
|
:select_result_value => true)
|
1703
1658
|
if tag_list != nil && tag_list.size > 0
|
@@ -1709,12 +1664,12 @@ module FeedTools
|
|
1709
1664
|
if @tags.nil? || @tags.size == 0
|
1710
1665
|
# messy effort to find ourselves some tags, mainly for del.icio.us
|
1711
1666
|
@tags = []
|
1712
|
-
rdf_bag = try_xpaths_all(self.root_node,
|
1667
|
+
rdf_bag = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1713
1668
|
["taxo:topics/rdf:Bag/rdf:li"])
|
1714
1669
|
if rdf_bag != nil && rdf_bag.size > 0
|
1715
1670
|
for tag_node in rdf_bag
|
1716
1671
|
begin
|
1717
|
-
tag_url = try_xpaths(tag_node, ["@resource"],
|
1672
|
+
tag_url = FeedTools::XmlHelper.try_xpaths(tag_node, ["@resource"],
|
1718
1673
|
:select_result_value => true)
|
1719
1674
|
tag_match = tag_url.scan(/\/(tag|tags)\/(\w+)$/)
|
1720
1675
|
if tag_match.size > 0
|
@@ -1727,7 +1682,7 @@ module FeedTools
|
|
1727
1682
|
end
|
1728
1683
|
if @tags.nil? || @tags.size == 0
|
1729
1684
|
@tags = []
|
1730
|
-
tag_list = try_xpaths_all(self.root_node, ["category/text()"],
|
1685
|
+
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["category/text()"],
|
1731
1686
|
:select_result_value => true)
|
1732
1687
|
for tag in tag_list
|
1733
1688
|
@tags << tag.to_s.downcase.strip
|
@@ -1735,7 +1690,7 @@ module FeedTools
|
|
1735
1690
|
end
|
1736
1691
|
if @tags.nil? || @tags.size == 0
|
1737
1692
|
@tags = []
|
1738
|
-
tag_list = try_xpaths_all(self.root_node, ["dc:subject/text()"],
|
1693
|
+
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["dc:subject/text()"],
|
1739
1694
|
:select_result_value => true)
|
1740
1695
|
for tag in tag_list
|
1741
1696
|
@tags << tag.to_s.downcase.strip
|
@@ -1743,7 +1698,7 @@ module FeedTools
|
|
1743
1698
|
end
|
1744
1699
|
if @tags.blank?
|
1745
1700
|
begin
|
1746
|
-
itunes_keywords_string = try_xpaths(self.root_node, [
|
1701
|
+
itunes_keywords_string = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1747
1702
|
"itunes:keywords/text()"
|
1748
1703
|
], :select_result_value => true)
|
1749
1704
|
unless itunes_keywords_string.blank?
|
@@ -1779,7 +1734,7 @@ module FeedTools
|
|
1779
1734
|
# isn't explicitly marked as explicit.
|
1780
1735
|
def explicit?
|
1781
1736
|
if @explicit.nil?
|
1782
|
-
explicit_string = try_xpaths(self.root_node, [
|
1737
|
+
explicit_string = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1783
1738
|
"media:adult/text()",
|
1784
1739
|
"itunes:explicit/text()"
|
1785
1740
|
], :select_result_value => true)
|
@@ -1819,32 +1774,39 @@ module FeedTools
|
|
1819
1774
|
raise "Cannot generate an rdf-based feed item with a nil link field."
|
1820
1775
|
end
|
1821
1776
|
return xml_builder.item("rdf:about" =>
|
1822
|
-
FeedTools.escape_entities(link)) do
|
1823
|
-
unless title.
|
1824
|
-
xml_builder.title(title)
|
1777
|
+
FeedTools::HtmlHelper.escape_entities(link)) do
|
1778
|
+
unless self.title.blank?
|
1779
|
+
xml_builder.title(FeedTools::HtmlHelper.strip_html_tags(self.title))
|
1825
1780
|
else
|
1826
1781
|
xml_builder.title
|
1827
1782
|
end
|
1828
|
-
unless link.
|
1829
|
-
xml_builder.link(link)
|
1783
|
+
unless self.link.blank?
|
1784
|
+
xml_builder.link(self.link)
|
1830
1785
|
else
|
1831
1786
|
xml_builder.link
|
1832
1787
|
end
|
1833
|
-
unless
|
1834
|
-
xml_builder.
|
1788
|
+
unless self.author.nil? || self.author.name.nil?
|
1789
|
+
xml_builder.tag!("dc:creator", self.author.name)
|
1790
|
+
end
|
1791
|
+
unless self.summary.blank?
|
1792
|
+
xml_builder.description(self.summary)
|
1835
1793
|
else
|
1836
1794
|
xml_builder.description
|
1837
1795
|
end
|
1796
|
+
unless self.content.blank?
|
1797
|
+
xml_builder.tag!("content:encoded") do
|
1798
|
+
xml_builder.cdata!(self.content)
|
1799
|
+
end
|
1800
|
+
end
|
1838
1801
|
unless time.nil?
|
1839
1802
|
xml_builder.tag!("dc:date", time.iso8601)
|
1840
1803
|
end
|
1804
|
+
unless self.rights.blank?
|
1805
|
+
xml_builder.tag!("dc:rights", self.rights)
|
1806
|
+
end
|
1841
1807
|
unless tags.nil? || tags.size == 0
|
1842
|
-
|
1843
|
-
xml_builder.tag!("
|
1844
|
-
for tag in tags
|
1845
|
-
xml_builder.tag!("rdf:li", tag)
|
1846
|
-
end
|
1847
|
-
end
|
1808
|
+
for tag in tags
|
1809
|
+
xml_builder.tag!("dc:subject", tag)
|
1848
1810
|
end
|
1849
1811
|
if self.feed.podcast?
|
1850
1812
|
xml_builder.tag!("itunes:keywords", tags.join(", "))
|
@@ -1856,19 +1818,32 @@ module FeedTools
|
|
1856
1818
|
# normal rss format
|
1857
1819
|
return xml_builder.item do
|
1858
1820
|
unless self.title.blank?
|
1859
|
-
xml_builder.title(self.title)
|
1821
|
+
xml_builder.title(FeedTools::HtmlHelper.strip_html_tags(self.title))
|
1860
1822
|
end
|
1861
1823
|
unless self.link.blank?
|
1862
1824
|
xml_builder.link(link)
|
1863
1825
|
end
|
1864
|
-
unless self.
|
1865
|
-
xml_builder.
|
1826
|
+
unless self.author.nil? || self.author.name.nil?
|
1827
|
+
xml_builder.tag!("dc:creator", self.author.name)
|
1828
|
+
end
|
1829
|
+
unless self.summary.blank?
|
1830
|
+
xml_builder.description(self.summary)
|
1866
1831
|
end
|
1867
|
-
unless self.
|
1832
|
+
unless self.content.blank?
|
1833
|
+
xml_builder.tag!("content:encoded") do
|
1834
|
+
xml_builder.cdata!(self.content)
|
1835
|
+
end
|
1836
|
+
end
|
1837
|
+
if !self.published.nil?
|
1838
|
+
xml_builder.pubDate(self.published.rfc822)
|
1839
|
+
elsif !self.time.nil?
|
1868
1840
|
xml_builder.pubDate(self.time.rfc822)
|
1869
1841
|
end
|
1842
|
+
unless self.copyright.blank?
|
1843
|
+
xml_builder.tag!("dc:rights", self.copyright)
|
1844
|
+
end
|
1870
1845
|
unless self.guid.blank?
|
1871
|
-
if FeedTools.is_uri?(self.guid)
|
1846
|
+
if FeedTools::UriHelper.is_uri?(self.guid) && (self.guid =~ /^http/)
|
1872
1847
|
xml_builder.guid(self.guid, "isPermaLink" => "true")
|
1873
1848
|
else
|
1874
1849
|
xml_builder.guid(self.guid, "isPermaLink" => "false")
|
@@ -1879,12 +1854,8 @@ module FeedTools
|
|
1879
1854
|
end
|
1880
1855
|
end
|
1881
1856
|
unless tags.nil? || tags.size == 0
|
1882
|
-
|
1883
|
-
xml_builder.tag!("
|
1884
|
-
for tag in tags
|
1885
|
-
xml_builder.tag!("rdf:li", tag)
|
1886
|
-
end
|
1887
|
-
end
|
1857
|
+
for tag in tags
|
1858
|
+
xml_builder.tag!("category", tag)
|
1888
1859
|
end
|
1889
1860
|
if self.feed.podcast?
|
1890
1861
|
xml_builder.tag!("itunes:keywords", tags.join(", "))
|
@@ -1911,7 +1882,7 @@ module FeedTools
|
|
1911
1882
|
end
|
1912
1883
|
rescue
|
1913
1884
|
end
|
1914
|
-
attribute_hash["url"] = FeedTools.normalize_url(enclosure.url)
|
1885
|
+
attribute_hash["url"] = FeedTools::UriHelper.normalize_url(enclosure.url)
|
1915
1886
|
if enclosure.type != nil
|
1916
1887
|
attribute_hash["type"] = enclosure.type
|
1917
1888
|
end
|
@@ -1936,7 +1907,8 @@ module FeedTools
|
|
1936
1907
|
return xml_builder.entry("xmlns" =>
|
1937
1908
|
FEED_TOOLS_NAMESPACES['atom10']) do
|
1938
1909
|
unless title.nil? || title == ""
|
1939
|
-
xml_builder.title(
|
1910
|
+
xml_builder.title(
|
1911
|
+
FeedTools::HtmlHelper.strip_html_tags(self.title),
|
1940
1912
|
"type" => "html")
|
1941
1913
|
end
|
1942
1914
|
xml_builder.author do
|
@@ -1953,10 +1925,10 @@ module FeedTools
|
|
1953
1925
|
end
|
1954
1926
|
end
|
1955
1927
|
unless link.nil? || link == ""
|
1956
|
-
xml_builder.link(
|
1957
|
-
"
|
1958
|
-
|
1959
|
-
"
|
1928
|
+
xml_builder.link(
|
1929
|
+
"href" =>
|
1930
|
+
FeedTools::HtmlHelper.escape_entities(self.link),
|
1931
|
+
"rel" => "alternate")
|
1960
1932
|
end
|
1961
1933
|
if !self.content.blank?
|
1962
1934
|
xml_builder.content(self.content,
|
@@ -1978,10 +1950,13 @@ module FeedTools
|
|
1978
1950
|
unless self.published.nil?
|
1979
1951
|
xml_builder.published(self.published.iso8601)
|
1980
1952
|
end
|
1953
|
+
unless self.rights.blank?
|
1954
|
+
xml_builder.rights(self.rights)
|
1955
|
+
end
|
1981
1956
|
if self.id != nil
|
1982
|
-
unless FeedTools.is_uri? self.id
|
1957
|
+
unless FeedTools::UriHelper.is_uri? self.id
|
1983
1958
|
if self.time != nil && self.link != nil
|
1984
|
-
xml_builder.id(FeedTools.build_tag_uri(self.link, self.time))
|
1959
|
+
xml_builder.id(FeedTools::UriHelper.build_tag_uri(self.link, self.time))
|
1985
1960
|
elsif self.link != nil
|
1986
1961
|
xml_builder.id(FeedTools.build_urn_uuid_uri(self.link))
|
1987
1962
|
else
|
@@ -1992,7 +1967,7 @@ module FeedTools
|
|
1992
1967
|
xml_builder.id(self.id)
|
1993
1968
|
end
|
1994
1969
|
elsif self.time != nil && self.link != nil
|
1995
|
-
xml_builder.id(FeedTools.build_tag_uri(self.link, self.time))
|
1970
|
+
xml_builder.id(FeedTools::UriHelper.build_tag_uri(self.link, self.time))
|
1996
1971
|
else
|
1997
1972
|
raise "Cannot build feed, missing feed unique id."
|
1998
1973
|
end
|
@@ -2006,7 +1981,7 @@ module FeedTools
|
|
2006
1981
|
attribute_hash = {}
|
2007
1982
|
next if enclosure.url.blank?
|
2008
1983
|
attribute_hash["rel"] = "enclosure"
|
2009
|
-
attribute_hash["href"] = FeedTools.normalize_url(enclosure.url)
|
1984
|
+
attribute_hash["href"] = FeedTools::UriHelper.normalize_url(enclosure.url)
|
2010
1985
|
if enclosure.type != nil
|
2011
1986
|
attribute_hash["type"] = enclosure.type
|
2012
1987
|
end
|
@@ -2023,10 +1998,12 @@ module FeedTools
|
|
2023
1998
|
end
|
2024
1999
|
end
|
2025
2000
|
|
2026
|
-
alias_method :abstract, :
|
2027
|
-
alias_method :abstract=, :
|
2028
|
-
alias_method :description, :
|
2029
|
-
alias_method :description=, :
|
2001
|
+
alias_method :abstract, :summary
|
2002
|
+
alias_method :abstract=, :summary=
|
2003
|
+
alias_method :description, :summary
|
2004
|
+
alias_method :description=, :summary=
|
2005
|
+
alias_method :copyright, :rights
|
2006
|
+
alias_method :copyright=, :rights=
|
2030
2007
|
alias_method :guid, :id
|
2031
2008
|
alias_method :guid=, :id=
|
2032
2009
|
|