feedtools 0.2.26 → 0.2.27
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +232 -216
- data/db/migration.rb +2 -0
- data/db/schema.mysql.sql +2 -0
- data/db/schema.postgresql.sql +3 -1
- data/db/schema.sqlite.sql +3 -1
- data/lib/feed_tools.rb +37 -14
- data/lib/feed_tools/database_feed_cache.rb +13 -2
- data/lib/feed_tools/feed.rb +430 -104
- data/lib/feed_tools/feed_item.rb +533 -268
- data/lib/feed_tools/helpers/generic_helper.rb +1 -1
- data/lib/feed_tools/helpers/html_helper.rb +78 -116
- data/lib/feed_tools/helpers/retrieval_helper.rb +33 -3
- data/lib/feed_tools/helpers/uri_helper.rb +46 -54
- data/lib/feed_tools/monkey_patch.rb +27 -1
- data/lib/feed_tools/vendor/html5/History.txt +10 -0
- data/lib/feed_tools/vendor/html5/Manifest.txt +117 -0
- data/lib/feed_tools/vendor/html5/README +45 -0
- data/lib/feed_tools/vendor/html5/Rakefile.rb +33 -0
- data/lib/feed_tools/vendor/html5/bin/html5 +217 -0
- data/lib/feed_tools/vendor/html5/lib/core_ext/string.rb +17 -0
- data/lib/feed_tools/vendor/html5/lib/html5.rb +13 -0
- data/lib/feed_tools/vendor/html5/lib/html5/constants.rb +1046 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/base.rb +10 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/inject_meta_charset.rb +82 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/iso639codes.rb +752 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/optionaltags.rb +198 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/rfc2046.rb +30 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/rfc3987.rb +89 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/sanitizer.rb +15 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/validator.rb +830 -0
- data/lib/feed_tools/vendor/html5/lib/html5/filters/whitespace.rb +36 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser.rb +248 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_body_phase.rb +46 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_frameset_phase.rb +33 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_head_phase.rb +50 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/before_head_phase.rb +41 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_body_phase.rb +613 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_caption_phase.rb +69 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_cell_phase.rb +78 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_column_group_phase.rb +55 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_frameset_phase.rb +57 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_head_phase.rb +138 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_row_phase.rb +89 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_select_phase.rb +85 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_body_phase.rb +86 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_phase.rb +115 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/initial_phase.rb +133 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/phase.rb +154 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/root_element_phase.rb +41 -0
- data/lib/feed_tools/vendor/html5/lib/html5/html5parser/trailing_end_phase.rb +35 -0
- data/lib/feed_tools/vendor/html5/lib/html5/inputstream.rb +648 -0
- data/lib/feed_tools/vendor/html5/lib/html5/liberalxmlparser.rb +158 -0
- data/lib/feed_tools/vendor/html5/lib/html5/sanitizer.rb +188 -0
- data/lib/feed_tools/vendor/html5/lib/html5/serializer.rb +2 -0
- data/lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb +179 -0
- data/lib/feed_tools/vendor/html5/lib/html5/serializer/xhtmlserializer.rb +20 -0
- data/lib/feed_tools/vendor/html5/lib/html5/sniffer.rb +45 -0
- data/lib/feed_tools/vendor/html5/lib/html5/tokenizer.rb +966 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treebuilders.rb +24 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/base.rb +334 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/hpricot.rb +231 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/rexml.rb +209 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/simpletree.rb +185 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treewalkers.rb +26 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/base.rb +162 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/hpricot.rb +48 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/rexml.rb +48 -0
- data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/simpletree.rb +48 -0
- data/lib/feed_tools/vendor/html5/lib/html5/version.rb +3 -0
- data/lib/feed_tools/vendor/html5/testdata/encoding/chardet/test_big5.txt +51 -0
- data/lib/feed_tools/vendor/html5/testdata/encoding/test-yahoo-jp.dat +10 -0
- data/lib/feed_tools/vendor/html5/testdata/encoding/tests1.dat +394 -0
- data/lib/feed_tools/vendor/html5/testdata/encoding/tests2.dat +81 -0
- data/lib/feed_tools/vendor/html5/testdata/sanitizer/tests1.dat +416 -0
- data/lib/feed_tools/vendor/html5/testdata/serializer/core.test +104 -0
- data/lib/feed_tools/vendor/html5/testdata/serializer/injectmeta.test +65 -0
- data/lib/feed_tools/vendor/html5/testdata/serializer/optionaltags.test +900 -0
- data/lib/feed_tools/vendor/html5/testdata/serializer/options.test +60 -0
- data/lib/feed_tools/vendor/html5/testdata/serializer/whitespace.test +51 -0
- data/lib/feed_tools/vendor/html5/testdata/sites/google-results.htm +1 -0
- data/lib/feed_tools/vendor/html5/testdata/sites/python-ref-import.htm +1 -0
- data/lib/feed_tools/vendor/html5/testdata/sites/web-apps-old.htm +1 -0
- data/lib/feed_tools/vendor/html5/testdata/sites/web-apps.htm +34275 -0
- data/lib/feed_tools/vendor/html5/testdata/sniffer/htmlOrFeed.json +43 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/contentModelFlags.test +48 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/entities.test +2339 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/escapeFlag.test +21 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/test1.test +172 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/test2.test +129 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/test3.test +367 -0
- data/lib/feed_tools/vendor/html5/testdata/tokenizer/test4.test +198 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests1.dat +1950 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests2.dat +773 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests3.dat +270 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests4.dat +60 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests5.dat +175 -0
- data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests6.dat +196 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/attributes.test +1035 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/base-href-attribute.test +787 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/base-target-attribute.test +35 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/blockquote-cite-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/classattribute.test +152 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/contenteditableattribute.test +59 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/contextmenuattribute.test +115 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/dirattribute.test +59 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/draggableattribute.test +63 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/html-xmlns-attribute.test +23 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/idattribute.test +115 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/inputattributes.test +2795 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/irrelevantattribute.test +63 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/langattribute.test +5579 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/li-value-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/link-href-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/link-hreflang-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/link-rel-attribute.test +271 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/ol-start-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/starttags.test +375 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/style-scoped-attribute.test +7 -0
- data/lib/feed_tools/vendor/html5/testdata/validator/tabindexattribute.test +79 -0
- data/lib/feed_tools/vendor/html5/tests/preamble.rb +72 -0
- data/lib/feed_tools/vendor/html5/tests/test_encoding.rb +35 -0
- data/lib/feed_tools/vendor/html5/tests/test_lxp.rb +279 -0
- data/lib/feed_tools/vendor/html5/tests/test_parser.rb +68 -0
- data/lib/feed_tools/vendor/html5/tests/test_sanitizer.rb +142 -0
- data/lib/feed_tools/vendor/html5/tests/test_serializer.rb +68 -0
- data/lib/feed_tools/vendor/html5/tests/test_sniffer.rb +27 -0
- data/lib/feed_tools/vendor/html5/tests/test_stream.rb +62 -0
- data/lib/feed_tools/vendor/html5/tests/test_tokenizer.rb +94 -0
- data/lib/feed_tools/vendor/html5/tests/test_treewalkers.rb +135 -0
- data/lib/feed_tools/vendor/html5/tests/test_validator.rb +31 -0
- data/lib/feed_tools/vendor/html5/tests/tokenizer_test_parser.rb +63 -0
- data/lib/feed_tools/vendor/uri.rb +781 -0
- data/lib/feed_tools/version.rb +1 -1
- data/rakefile +27 -6
- data/test/unit/atom_test.rb +298 -210
- data/test/unit/helper_test.rb +7 -12
- data/test/unit/rdf_test.rb +51 -1
- data/test/unit/rss_test.rb +13 -3
- metadata +239 -116
- data/lib/feed_tools/vendor/htree.rb +0 -97
- data/lib/feed_tools/vendor/htree/container.rb +0 -10
- data/lib/feed_tools/vendor/htree/context.rb +0 -67
- data/lib/feed_tools/vendor/htree/display.rb +0 -27
- data/lib/feed_tools/vendor/htree/doc.rb +0 -149
- data/lib/feed_tools/vendor/htree/elem.rb +0 -262
- data/lib/feed_tools/vendor/htree/encoder.rb +0 -163
- data/lib/feed_tools/vendor/htree/equality.rb +0 -218
- data/lib/feed_tools/vendor/htree/extract_text.rb +0 -37
- data/lib/feed_tools/vendor/htree/fstr.rb +0 -33
- data/lib/feed_tools/vendor/htree/gencode.rb +0 -97
- data/lib/feed_tools/vendor/htree/htmlinfo.rb +0 -672
- data/lib/feed_tools/vendor/htree/inspect.rb +0 -108
- data/lib/feed_tools/vendor/htree/leaf.rb +0 -94
- data/lib/feed_tools/vendor/htree/loc.rb +0 -367
- data/lib/feed_tools/vendor/htree/modules.rb +0 -48
- data/lib/feed_tools/vendor/htree/name.rb +0 -124
- data/lib/feed_tools/vendor/htree/output.rb +0 -207
- data/lib/feed_tools/vendor/htree/parse.rb +0 -409
- data/lib/feed_tools/vendor/htree/raw_string.rb +0 -124
- data/lib/feed_tools/vendor/htree/regexp-util.rb +0 -15
- data/lib/feed_tools/vendor/htree/rexml.rb +0 -130
- data/lib/feed_tools/vendor/htree/scan.rb +0 -166
- data/lib/feed_tools/vendor/htree/tag.rb +0 -111
- data/lib/feed_tools/vendor/htree/template.rb +0 -909
- data/lib/feed_tools/vendor/htree/text.rb +0 -115
- data/lib/feed_tools/vendor/htree/traverse.rb +0 -465
data/lib/feed_tools/feed_item.rb
CHANGED
@@ -37,6 +37,20 @@ module FeedTools
|
|
37
37
|
@title = nil
|
38
38
|
@id = nil
|
39
39
|
@time = Time.now.gmtime
|
40
|
+
@version = FeedTools::FEED_TOOLS_VERSION::STRING
|
41
|
+
end
|
42
|
+
|
43
|
+
# Breaks any references that the feed entry may be keeping around, thus
|
44
|
+
# making the job of the garbage collector much, much easier. Call this
|
45
|
+
# method prior to feed entries going out of scope to prevent memory leaks.
|
46
|
+
def dispose()
|
47
|
+
@feed_data = nil
|
48
|
+
@feed_data_type = nil
|
49
|
+
@xml_document = nil
|
50
|
+
@root_node = nil
|
51
|
+
@title = nil
|
52
|
+
@id = nil
|
53
|
+
@time = nil
|
40
54
|
end
|
41
55
|
|
42
56
|
# Returns the parent feed of this feed item
|
@@ -69,6 +83,58 @@ module FeedTools
|
|
69
83
|
return parent_feed
|
70
84
|
end
|
71
85
|
|
86
|
+
# Does a full parse of the feed item.
|
87
|
+
def full_parse
|
88
|
+
self.configurations
|
89
|
+
|
90
|
+
self.encoding
|
91
|
+
self.xml_document
|
92
|
+
self.root_node
|
93
|
+
|
94
|
+
self.feed_type
|
95
|
+
self.feed_version
|
96
|
+
|
97
|
+
self.id
|
98
|
+
self.title
|
99
|
+
self.content
|
100
|
+
self.summary
|
101
|
+
self.links
|
102
|
+
self.link
|
103
|
+
self.comments
|
104
|
+
self.time
|
105
|
+
self.updated
|
106
|
+
self.published
|
107
|
+
self.source
|
108
|
+
self.categories
|
109
|
+
self.tags
|
110
|
+
self.images
|
111
|
+
self.rights
|
112
|
+
self.author
|
113
|
+
self.publisher
|
114
|
+
|
115
|
+
self.itunes_summary
|
116
|
+
self.itunes_subtitle
|
117
|
+
self.itunes_image_link
|
118
|
+
self.itunes_author
|
119
|
+
self.itunes_duration
|
120
|
+
|
121
|
+
self.media_text
|
122
|
+
self.media_thumbnail_link
|
123
|
+
|
124
|
+
self.explicit?
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns a duplicate object suitable for serialization
|
128
|
+
def serializable
|
129
|
+
self.full_parse()
|
130
|
+
feed_item_to_dump = self.dup
|
131
|
+
feed_item_to_dump.author
|
132
|
+
feed_item_to_dump.publisher
|
133
|
+
feed_item_to_dump.instance_variable_set("@xml_document", nil)
|
134
|
+
feed_item_to_dump.instance_variable_set("@root_node", nil)
|
135
|
+
return feed_item_to_dump
|
136
|
+
end
|
137
|
+
|
72
138
|
# Returns the load options for this feed.
|
73
139
|
def configurations
|
74
140
|
if @configurations.blank?
|
@@ -90,7 +156,12 @@ module FeedTools
|
|
90
156
|
# Returns the feed item's encoding.
|
91
157
|
def encoding
|
92
158
|
if @encoding.nil?
|
93
|
-
|
159
|
+
parent_feed = self.feed
|
160
|
+
if parent_feed != nil
|
161
|
+
@encoding = parent_feed.encoding
|
162
|
+
else
|
163
|
+
@encoding = nil
|
164
|
+
end
|
94
165
|
end
|
95
166
|
return @encoding
|
96
167
|
end
|
@@ -114,14 +185,18 @@ module FeedTools
|
|
114
185
|
# Sets the feed item's data type.
|
115
186
|
def feed_data_type=(new_feed_data_type)
|
116
187
|
@feed_data_type = new_feed_data_type
|
188
|
+
if self.feed_data_type != :xml
|
189
|
+
@xml_document = nil
|
190
|
+
end
|
117
191
|
end
|
118
192
|
|
119
193
|
# Returns a REXML Document of the feed_data
|
120
194
|
def xml_document
|
121
|
-
if
|
122
|
-
|
123
|
-
|
124
|
-
|
195
|
+
if @xml_document.nil?
|
196
|
+
return nil if self.feed_data.blank?
|
197
|
+
if self.feed_data_type != :xml
|
198
|
+
@xml_document = nil
|
199
|
+
else
|
125
200
|
# TODO: :ignore_whitespace_nodes => :all
|
126
201
|
# Add that?
|
127
202
|
# ======================================
|
@@ -131,9 +206,10 @@ module FeedTools
|
|
131
206
|
return @xml_document
|
132
207
|
end
|
133
208
|
|
134
|
-
# Returns the first node within the root_node that matches the xpath
|
209
|
+
# Returns the first node within the root_node that matches the xpath
|
210
|
+
# query.
|
135
211
|
def find_node(xpath, select_result_value=false)
|
136
|
-
if
|
212
|
+
if self.feed_data_type != :xml
|
137
213
|
raise "The feed data type is not xml."
|
138
214
|
end
|
139
215
|
return FeedTools::XmlHelper.try_xpaths(self.root_node, [xpath],
|
@@ -142,7 +218,7 @@ module FeedTools
|
|
142
218
|
|
143
219
|
# Returns all nodes within the root_node that match the xpath query.
|
144
220
|
def find_all_nodes(xpath, select_result_value=false)
|
145
|
-
if
|
221
|
+
if self.feed_data_type != :xml
|
146
222
|
raise "The feed data type is not xml."
|
147
223
|
end
|
148
224
|
return FeedTools::XmlHelper.try_xpaths_all(self.root_node, [xpath],
|
@@ -191,6 +267,10 @@ module FeedTools
|
|
191
267
|
def id
|
192
268
|
if @id.nil?
|
193
269
|
@id = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
270
|
+
"atom10:id/@gr:original-id",
|
271
|
+
"atom03:id/@gr:original-id",
|
272
|
+
"atom:id/@gr:original-id",
|
273
|
+
"id/@gr:original-id",
|
194
274
|
"atom10:id/text()",
|
195
275
|
"atom03:id/text()",
|
196
276
|
"atom:id/text()",
|
@@ -215,10 +295,11 @@ module FeedTools
|
|
215
295
|
"atom03:title",
|
216
296
|
"atom:title",
|
217
297
|
"title",
|
218
|
-
"dc:title"
|
298
|
+
"dc:title",
|
299
|
+
"headline"
|
219
300
|
])
|
220
301
|
@title = FeedTools::HtmlHelper.process_text_construct(title_node,
|
221
|
-
self.feed_type, self.feed_version)
|
302
|
+
self.feed_type, self.feed_version, [self.base_uri])
|
222
303
|
if self.feed_type == "atom" ||
|
223
304
|
self.configurations[:always_strip_wrapper_elements]
|
224
305
|
@title = FeedTools::HtmlHelper.strip_wrapper_element(@title)
|
@@ -251,6 +332,7 @@ module FeedTools
|
|
251
332
|
"atom10:content",
|
252
333
|
"atom03:content",
|
253
334
|
"atom:content",
|
335
|
+
"body/datacontent",
|
254
336
|
"xhtml:body",
|
255
337
|
"body",
|
256
338
|
"xhtml:div",
|
@@ -273,18 +355,18 @@ module FeedTools
|
|
273
355
|
"info"
|
274
356
|
])
|
275
357
|
@content = FeedTools::HtmlHelper.process_text_construct(content_node,
|
276
|
-
self.feed_type, self.feed_version)
|
358
|
+
self.feed_type, self.feed_version, [self.base_uri])
|
277
359
|
if self.feed_type == "atom" ||
|
278
360
|
self.configurations[:always_strip_wrapper_elements]
|
279
361
|
@content = FeedTools::HtmlHelper.strip_wrapper_element(@content)
|
280
362
|
end
|
281
|
-
if @content.
|
363
|
+
if @content.nil?
|
282
364
|
@content = self.media_text
|
283
365
|
end
|
284
|
-
if @content.
|
366
|
+
if @content.nil?
|
285
367
|
@content = self.itunes_summary
|
286
368
|
end
|
287
|
-
if @content.
|
369
|
+
if @content.nil?
|
288
370
|
@content = self.itunes_subtitle
|
289
371
|
end
|
290
372
|
end
|
@@ -323,10 +405,11 @@ module FeedTools
|
|
323
405
|
"atom03:content",
|
324
406
|
"atom:content",
|
325
407
|
"content",
|
326
|
-
"info"
|
408
|
+
"info",
|
409
|
+
"body/datacontent"
|
327
410
|
])
|
328
411
|
@summary = FeedTools::HtmlHelper.process_text_construct(summary_node,
|
329
|
-
self.feed_type, self.feed_version)
|
412
|
+
self.feed_type, self.feed_version, [self.base_uri])
|
330
413
|
if self.feed_type == "atom" ||
|
331
414
|
self.configurations[:always_strip_wrapper_elements]
|
332
415
|
@summary = FeedTools::HtmlHelper.strip_wrapper_element(@summary)
|
@@ -349,143 +432,6 @@ module FeedTools
|
|
349
432
|
@summary = new_summary
|
350
433
|
end
|
351
434
|
|
352
|
-
# Returns the contents of the itunes:summary element
|
353
|
-
def itunes_summary
|
354
|
-
if @itunes_summary.nil?
|
355
|
-
@itunes_summary = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
356
|
-
"itunes:summary/text()"
|
357
|
-
], :select_result_value => true)
|
358
|
-
unless @itunes_summary.blank?
|
359
|
-
@itunes_summary = FeedTools::HtmlHelper.unescape_entities(@itunes_summary)
|
360
|
-
@itunes_summary = FeedTools::HtmlHelper.sanitize_html(@itunes_summary)
|
361
|
-
@itunes_summary.strip!
|
362
|
-
else
|
363
|
-
@itunes_summary = nil
|
364
|
-
end
|
365
|
-
end
|
366
|
-
return @itunes_summary
|
367
|
-
end
|
368
|
-
|
369
|
-
# Sets the contents of the itunes:summary element
|
370
|
-
def itunes_summary=(new_itunes_summary)
|
371
|
-
@itunes_summary = new_itunes_summary
|
372
|
-
end
|
373
|
-
|
374
|
-
# Returns the contents of the itunes:subtitle element
|
375
|
-
def itunes_subtitle
|
376
|
-
if @itunes_subtitle.nil?
|
377
|
-
@itunes_subtitle = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
378
|
-
"itunes:subtitle/text()"
|
379
|
-
], :select_result_value => true)
|
380
|
-
unless @itunes_subtitle.blank?
|
381
|
-
@itunes_subtitle = FeedTools::HtmlHelper.unescape_entities(@itunes_subtitle)
|
382
|
-
@itunes_subtitle = FeedTools::HtmlHelper.sanitize_html(@itunes_subtitle)
|
383
|
-
@itunes_subtitle.strip!
|
384
|
-
else
|
385
|
-
@itunes_subtitle = nil
|
386
|
-
end
|
387
|
-
end
|
388
|
-
return @itunes_subtitle
|
389
|
-
end
|
390
|
-
|
391
|
-
# Sets the contents of the itunes:subtitle element
|
392
|
-
def itunes_subtitle=(new_itunes_subtitle)
|
393
|
-
@itunes_subtitle = new_itunes_subtitle
|
394
|
-
end
|
395
|
-
|
396
|
-
# Returns the contents of the media:text element
|
397
|
-
def media_text
|
398
|
-
if @media_text.nil?
|
399
|
-
@media_text = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
400
|
-
"media:text/text()"
|
401
|
-
], :select_result_value => true)
|
402
|
-
unless @media_text.blank?
|
403
|
-
@media_text = FeedTools::HtmlHelper.unescape_entities(@media_text)
|
404
|
-
@media_text = FeedTools::HtmlHelper.sanitize_html(@media_text)
|
405
|
-
@media_text.strip!
|
406
|
-
else
|
407
|
-
@media_text = nil
|
408
|
-
end
|
409
|
-
end
|
410
|
-
return @media_text
|
411
|
-
end
|
412
|
-
|
413
|
-
# Sets the contents of the media:text element
|
414
|
-
def media_text=(new_media_text)
|
415
|
-
@media_text = new_media_text
|
416
|
-
end
|
417
|
-
|
418
|
-
# Returns the feed item link
|
419
|
-
def link
|
420
|
-
if @link.nil?
|
421
|
-
max_score = 0
|
422
|
-
for link_object in self.links.reverse
|
423
|
-
score = 0
|
424
|
-
if FeedTools::HtmlHelper.html_type?(link_object.type)
|
425
|
-
score = score + 2
|
426
|
-
elsif link_object.type != nil
|
427
|
-
score = score - 1
|
428
|
-
end
|
429
|
-
if FeedTools::HtmlHelper.xml_type?(link_object.type)
|
430
|
-
score = score + 1
|
431
|
-
end
|
432
|
-
if link_object.rel == "alternate"
|
433
|
-
score = score + 1
|
434
|
-
end
|
435
|
-
if link_object.rel == "self"
|
436
|
-
score = score - 1
|
437
|
-
end
|
438
|
-
if score >= max_score
|
439
|
-
max_score = score
|
440
|
-
@link = link_object.href
|
441
|
-
end
|
442
|
-
end
|
443
|
-
if @link.blank?
|
444
|
-
@link = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
445
|
-
"@href",
|
446
|
-
"@rdf:about",
|
447
|
-
"@about"
|
448
|
-
], :select_result_value => true)
|
449
|
-
end
|
450
|
-
if @link.blank?
|
451
|
-
if FeedTools::UriHelper.is_uri?(self.id) &&
|
452
|
-
(self.id =~ /^http/)
|
453
|
-
@link = self.id
|
454
|
-
end
|
455
|
-
end
|
456
|
-
if !@link.blank?
|
457
|
-
@link = FeedTools::HtmlHelper.unescape_entities(@link)
|
458
|
-
end
|
459
|
-
@link = self.comments if @link.blank?
|
460
|
-
@link = nil if @link.blank?
|
461
|
-
begin
|
462
|
-
if !(@link =~ /^file:/) &&
|
463
|
-
!FeedTools::UriHelper.is_uri?(@link)
|
464
|
-
stored_base_uri =
|
465
|
-
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
466
|
-
self.feed.base_uri if self.feed != nil
|
467
|
-
end
|
468
|
-
root_base_uri = nil
|
469
|
-
unless self.root_node.nil?
|
470
|
-
root_base_uri = self.root_node.base_uri
|
471
|
-
end
|
472
|
-
@link = FeedTools::UriHelper.resolve_relative_uri(
|
473
|
-
@link, [root_base_uri,stored_base_uri])
|
474
|
-
end
|
475
|
-
rescue
|
476
|
-
end
|
477
|
-
if self.configurations[:url_normalization_enabled]
|
478
|
-
@link = FeedTools::UriHelper.normalize_url(@link)
|
479
|
-
end
|
480
|
-
end
|
481
|
-
return @link
|
482
|
-
end
|
483
|
-
|
484
|
-
# Sets the feed item link
|
485
|
-
def link=(new_link)
|
486
|
-
@link = new_link
|
487
|
-
end
|
488
|
-
|
489
435
|
# Returns the links collection
|
490
436
|
def links
|
491
437
|
if @links.nil?
|
@@ -507,6 +453,7 @@ module FeedTools
|
|
507
453
|
"@atom03:href",
|
508
454
|
"@atom:href",
|
509
455
|
"@href",
|
456
|
+
"@url",
|
510
457
|
"text()"
|
511
458
|
], :select_result_value => true)
|
512
459
|
if link_object.href.nil? && link_node.base_uri != nil
|
@@ -517,7 +464,7 @@ module FeedTools
|
|
517
464
|
!FeedTools::UriHelper.is_uri?(link_object.href)
|
518
465
|
stored_base_uri =
|
519
466
|
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
520
|
-
self.
|
467
|
+
self.base_uri if self.feed != nil
|
521
468
|
end
|
522
469
|
link_object.href = FeedTools::UriHelper.resolve_relative_uri(
|
523
470
|
link_object.href,
|
@@ -588,6 +535,15 @@ module FeedTools
|
|
588
535
|
end
|
589
536
|
@links << link_object
|
590
537
|
end
|
538
|
+
if @links.empty? && self.enclosures.size > 0
|
539
|
+
# If there's seriously nothing to link to, but there's enclosures
|
540
|
+
# available, then add a link to the first one.
|
541
|
+
enclosure_link = self.enclosures[0]
|
542
|
+
link_object = FeedTools::Link.new
|
543
|
+
link_object.href = enclosure_link.url
|
544
|
+
link_object.type = enclosure_link.type
|
545
|
+
@links << link_object
|
546
|
+
end
|
591
547
|
end
|
592
548
|
return @links
|
593
549
|
end
|
@@ -596,7 +552,193 @@ module FeedTools
|
|
596
552
|
def links=(new_links)
|
597
553
|
@links = new_links
|
598
554
|
end
|
599
|
-
|
555
|
+
|
556
|
+
# Returns the feed item link
|
557
|
+
def link
|
558
|
+
if @link.nil?
|
559
|
+
max_score = 0
|
560
|
+
for link_object in self.links.reverse
|
561
|
+
score = 0
|
562
|
+
if FeedTools::HtmlHelper.html_type?(link_object.type)
|
563
|
+
score = score + 2
|
564
|
+
elsif link_object.type != nil
|
565
|
+
score = score - 1
|
566
|
+
end
|
567
|
+
if FeedTools::HtmlHelper.xml_type?(link_object.type)
|
568
|
+
score = score + 1
|
569
|
+
end
|
570
|
+
if link_object.type =~ /^video/ && self.links.size == 1
|
571
|
+
score = score + 1
|
572
|
+
elsif link_object.type =~ /^audio/ && self.links.size == 1
|
573
|
+
score = score + 1
|
574
|
+
end
|
575
|
+
if link_object.rel == "alternate"
|
576
|
+
score = score + 1
|
577
|
+
end
|
578
|
+
if link_object.rel == "self"
|
579
|
+
score = score - 1
|
580
|
+
end
|
581
|
+
if score >= max_score
|
582
|
+
max_score = score
|
583
|
+
@link = link_object.href
|
584
|
+
end
|
585
|
+
end
|
586
|
+
if @link.blank?
|
587
|
+
@link = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
588
|
+
"@href",
|
589
|
+
"@rdf:about",
|
590
|
+
"@about"
|
591
|
+
], :select_result_value => true)
|
592
|
+
end
|
593
|
+
if @link.blank?
|
594
|
+
if FeedTools::UriHelper.is_uri?(self.id) &&
|
595
|
+
(self.id =~ /^http/)
|
596
|
+
@link = self.id
|
597
|
+
end
|
598
|
+
end
|
599
|
+
if !@link.blank?
|
600
|
+
@link = FeedTools::HtmlHelper.unescape_entities(@link)
|
601
|
+
end
|
602
|
+
@link = self.comments if @link.blank?
|
603
|
+
@link = nil if @link.blank?
|
604
|
+
begin
|
605
|
+
if !(@link =~ /^file:/) &&
|
606
|
+
!FeedTools::UriHelper.is_uri?(@link)
|
607
|
+
stored_base_uri =
|
608
|
+
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
609
|
+
self.base_uri if self.feed != nil
|
610
|
+
end
|
611
|
+
root_base_uri = nil
|
612
|
+
unless self.root_node.nil?
|
613
|
+
root_base_uri = self.root_node.base_uri
|
614
|
+
end
|
615
|
+
@link = FeedTools::UriHelper.resolve_relative_uri(
|
616
|
+
@link, [root_base_uri,stored_base_uri])
|
617
|
+
end
|
618
|
+
rescue
|
619
|
+
end
|
620
|
+
if self.configurations[:url_normalization_enabled]
|
621
|
+
@link = FeedTools::UriHelper.normalize_url(@link)
|
622
|
+
end
|
623
|
+
end
|
624
|
+
return @link
|
625
|
+
end
|
626
|
+
|
627
|
+
# Sets the feed item link
|
628
|
+
def link=(new_link)
|
629
|
+
@link = new_link
|
630
|
+
end
|
631
|
+
|
632
|
+
# Returns the parent feed's base_uri if any.
|
633
|
+
def base_uri
|
634
|
+
parent_feed = self.feed
|
635
|
+
if parent_feed != nil
|
636
|
+
return parent_feed.base_uri
|
637
|
+
else
|
638
|
+
return nil
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
# Returns the url for posting comments
|
643
|
+
def comments
|
644
|
+
if @comments.nil?
|
645
|
+
@comments = FeedTools::XmlHelper.try_xpaths(
|
646
|
+
self.root_node, ["comments/text()"],
|
647
|
+
:select_result_value => true)
|
648
|
+
begin
|
649
|
+
if !(@comments =~ /^file:/) &&
|
650
|
+
!FeedTools::UriHelper.is_uri?(@comments)
|
651
|
+
root_base_uri = nil
|
652
|
+
unless self.root_node.nil?
|
653
|
+
root_base_uri = self.root_node.base_uri
|
654
|
+
end
|
655
|
+
@comments = FeedTools::UriHelper.resolve_relative_uri(
|
656
|
+
@comments, [root_base_uri, self.base_uri])
|
657
|
+
end
|
658
|
+
rescue
|
659
|
+
end
|
660
|
+
if self.configurations[:url_normalization_enabled]
|
661
|
+
@comments = FeedTools::UriHelper.normalize_url(@comments)
|
662
|
+
end
|
663
|
+
end
|
664
|
+
return @comments
|
665
|
+
end
|
666
|
+
|
667
|
+
# Sets the url for posting comments
|
668
|
+
def comments=(new_comments)
|
669
|
+
@comments = new_comments
|
670
|
+
end
|
671
|
+
|
672
|
+
# Returns the contents of the itunes:summary element
|
673
|
+
def itunes_summary
|
674
|
+
if @itunes_summary.nil?
|
675
|
+
@itunes_summary = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
676
|
+
"itunes:summary/text()"
|
677
|
+
], :select_result_value => true)
|
678
|
+
unless @itunes_summary.blank?
|
679
|
+
@itunes_summary =
|
680
|
+
FeedTools::HtmlHelper.unescape_entities(@itunes_summary)
|
681
|
+
@itunes_summary =
|
682
|
+
FeedTools::HtmlHelper.sanitize_html(@itunes_summary)
|
683
|
+
@itunes_summary.strip!
|
684
|
+
else
|
685
|
+
@itunes_summary = nil
|
686
|
+
end
|
687
|
+
end
|
688
|
+
return @itunes_summary
|
689
|
+
end
|
690
|
+
|
691
|
+
# Sets the contents of the itunes:summary element
|
692
|
+
def itunes_summary=(new_itunes_summary)
|
693
|
+
@itunes_summary = new_itunes_summary
|
694
|
+
end
|
695
|
+
|
696
|
+
# Returns the contents of the itunes:subtitle element
|
697
|
+
def itunes_subtitle
|
698
|
+
if @itunes_subtitle.nil?
|
699
|
+
@itunes_subtitle = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
700
|
+
"itunes:subtitle/text()"
|
701
|
+
], :select_result_value => true)
|
702
|
+
unless @itunes_subtitle.blank?
|
703
|
+
@itunes_subtitle =
|
704
|
+
FeedTools::HtmlHelper.unescape_entities(@itunes_subtitle)
|
705
|
+
@itunes_subtitle =
|
706
|
+
FeedTools::HtmlHelper.sanitize_html(@itunes_subtitle)
|
707
|
+
@itunes_subtitle.strip!
|
708
|
+
else
|
709
|
+
@itunes_subtitle = nil
|
710
|
+
end
|
711
|
+
end
|
712
|
+
return @itunes_subtitle
|
713
|
+
end
|
714
|
+
|
715
|
+
# Sets the contents of the itunes:subtitle element
|
716
|
+
def itunes_subtitle=(new_itunes_subtitle)
|
717
|
+
@itunes_subtitle = new_itunes_subtitle
|
718
|
+
end
|
719
|
+
|
720
|
+
# Returns the contents of the media:text element
|
721
|
+
def media_text
|
722
|
+
if @media_text.nil?
|
723
|
+
@media_text = FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
724
|
+
"media:text/text()"
|
725
|
+
], :select_result_value => true)
|
726
|
+
unless @media_text.blank?
|
727
|
+
@media_text = FeedTools::HtmlHelper.unescape_entities(@media_text)
|
728
|
+
@media_text = FeedTools::HtmlHelper.sanitize_html(@media_text)
|
729
|
+
@media_text.strip!
|
730
|
+
else
|
731
|
+
@media_text = nil
|
732
|
+
end
|
733
|
+
end
|
734
|
+
return @media_text
|
735
|
+
end
|
736
|
+
|
737
|
+
# Sets the contents of the media:text element
|
738
|
+
def media_text=(new_media_text)
|
739
|
+
@media_text = new_media_text
|
740
|
+
end
|
741
|
+
|
600
742
|
# Returns a list of the feed item's categories
|
601
743
|
def categories
|
602
744
|
if @categories.nil?
|
@@ -607,16 +749,19 @@ module FeedTools
|
|
607
749
|
])
|
608
750
|
for category_node in category_nodes
|
609
751
|
category = FeedTools::Category.new
|
610
|
-
category.term = FeedTools::XmlHelper.try_xpaths(
|
752
|
+
category.term = FeedTools::XmlHelper.try_xpaths(
|
753
|
+
category_node, ["@term", "text()"],
|
611
754
|
:select_result_value => true)
|
612
755
|
category.term.strip! unless category.term.nil?
|
613
|
-
category.label = FeedTools::XmlHelper.try_xpaths(
|
756
|
+
category.label = FeedTools::XmlHelper.try_xpaths(
|
757
|
+
category_node, ["@label"],
|
614
758
|
:select_result_value => true)
|
615
759
|
category.label.strip! unless category.label.nil?
|
616
|
-
category.scheme = FeedTools::XmlHelper.try_xpaths(
|
617
|
-
|
618
|
-
|
619
|
-
|
760
|
+
category.scheme = FeedTools::XmlHelper.try_xpaths(
|
761
|
+
category_node, [
|
762
|
+
"@scheme",
|
763
|
+
"@domain"
|
764
|
+
], :select_result_value => true)
|
620
765
|
category.scheme.strip! unless category.scheme.nil?
|
621
766
|
@categories << category
|
622
767
|
end
|
@@ -641,6 +786,7 @@ module FeedTools
|
|
641
786
|
"url/text()",
|
642
787
|
"@rdf:resource",
|
643
788
|
"@href",
|
789
|
+
"@url",
|
644
790
|
"text()"
|
645
791
|
], :select_result_value => true)
|
646
792
|
if image.href.nil? && image_node.base_uri != nil
|
@@ -651,7 +797,7 @@ module FeedTools
|
|
651
797
|
!FeedTools::UriHelper.is_uri?(image.href)
|
652
798
|
stored_base_uri =
|
653
799
|
FeedTools::GenericHelper.recursion_trap(:feed_link) do
|
654
|
-
self.
|
800
|
+
self.base_uri if self.feed != nil
|
655
801
|
end
|
656
802
|
image.href = FeedTools::UriHelper.resolve_relative_uri(
|
657
803
|
image.href, [image_node.base_uri, stored_base_uri])
|
@@ -707,7 +853,8 @@ module FeedTools
|
|
707
853
|
"itunes:link[@rel='image']/@href"
|
708
854
|
], :select_result_value => true)
|
709
855
|
if self.configurations[:url_normalization_enabled]
|
710
|
-
@itunes_image_link =
|
856
|
+
@itunes_image_link =
|
857
|
+
FeedTools::UriHelper.normalize_url(@itunes_image_link)
|
711
858
|
end
|
712
859
|
end
|
713
860
|
return @itunes_image_link
|
@@ -721,11 +868,13 @@ module FeedTools
|
|
721
868
|
# Returns the feed item media thumbnail link
|
722
869
|
def media_thumbnail_link
|
723
870
|
if @media_thumbnail_link.nil?
|
724
|
-
@media_thumbnail_link = FeedTools::XmlHelper.try_xpaths(
|
725
|
-
|
726
|
-
|
871
|
+
@media_thumbnail_link = FeedTools::XmlHelper.try_xpaths(
|
872
|
+
self.root_node, [
|
873
|
+
"media:thumbnail/@url"
|
874
|
+
], :select_result_value => true)
|
727
875
|
if self.configurations[:url_normalization_enabled]
|
728
|
-
@media_thumbnail_link =
|
876
|
+
@media_thumbnail_link =
|
877
|
+
FeedTools::UriHelper.normalize_url(@media_thumbnail_link)
|
729
878
|
end
|
730
879
|
end
|
731
880
|
return @media_thumbnail_link
|
@@ -750,7 +899,7 @@ module FeedTools
|
|
750
899
|
"rights"
|
751
900
|
])
|
752
901
|
@rights = FeedTools::HtmlHelper.process_text_construct(rights_node,
|
753
|
-
self.feed_type, self.feed_version)
|
902
|
+
self.feed_type, self.feed_version, [self.base_uri])
|
754
903
|
if self.feed_type == "atom" ||
|
755
904
|
self.configurations[:always_strip_wrapper_elements]
|
756
905
|
@rights = FeedTools::HtmlHelper.strip_wrapper_element(@rights)
|
@@ -764,12 +913,24 @@ module FeedTools
|
|
764
913
|
@rights = new_rights
|
765
914
|
end
|
766
915
|
|
767
|
-
|
768
|
-
|
916
|
+
# Returns the first license link for the feed item.
|
917
|
+
def license
|
918
|
+
return self.licenses.first
|
919
|
+
end
|
920
|
+
|
921
|
+
# Returns all licenses linked from this feed item.
|
922
|
+
def licenses
|
923
|
+
if @licenses.nil?
|
924
|
+
@licenses = self.links.select do |link|
|
925
|
+
link.rel == "license"
|
926
|
+
end
|
927
|
+
end
|
928
|
+
return @licenses
|
769
929
|
end
|
770
930
|
|
771
|
-
|
772
|
-
|
931
|
+
# Sets the feed item's licenses.
|
932
|
+
def licenses=(new_licenses)
|
933
|
+
@licenses = new_licenses
|
773
934
|
end
|
774
935
|
|
775
936
|
# Returns all feed item enclosures
|
@@ -793,6 +954,9 @@ module FeedTools
|
|
793
954
|
media_group_enclosures =
|
794
955
|
FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["media:group"])
|
795
956
|
|
957
|
+
bogus_enclosures =
|
958
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node, ["video"])
|
959
|
+
|
796
960
|
# TODO: Implement this
|
797
961
|
bittorrent_enclosures =
|
798
962
|
FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
@@ -839,6 +1003,33 @@ module FeedTools
|
|
839
1003
|
@enclosures << enclosure
|
840
1004
|
end
|
841
1005
|
end
|
1006
|
+
|
1007
|
+
# Parse atom-type enclosures. If there are repeats of the same
|
1008
|
+
# enclosure object, we merge the two together.
|
1009
|
+
for enclosure_node in bogus_enclosures
|
1010
|
+
enclosure_url = FeedTools::HtmlHelper.unescape_entities(
|
1011
|
+
enclosure_node.attributes["url"].to_s)
|
1012
|
+
enclosure = nil
|
1013
|
+
new_enclosure = false
|
1014
|
+
for existing_enclosure in @enclosures
|
1015
|
+
if existing_enclosure.url == enclosure_url
|
1016
|
+
enclosure = existing_enclosure
|
1017
|
+
break
|
1018
|
+
end
|
1019
|
+
end
|
1020
|
+
if enclosure.nil?
|
1021
|
+
new_enclosure = true
|
1022
|
+
enclosure = FeedTools::Enclosure.new
|
1023
|
+
end
|
1024
|
+
enclosure.url = enclosure_url
|
1025
|
+
if File.extname(enclosure_url) == ".wmv"
|
1026
|
+
enclosure.type = "video/x-ms-wmv"
|
1027
|
+
end
|
1028
|
+
enclosure.explicit = false
|
1029
|
+
if new_enclosure
|
1030
|
+
@enclosures << enclosure
|
1031
|
+
end
|
1032
|
+
end
|
842
1033
|
|
843
1034
|
# Creates an anonymous method to parse content objects from the media
|
844
1035
|
# module. We do this to avoid excessive duplication of code since we
|
@@ -873,21 +1064,26 @@ module FeedTools
|
|
873
1064
|
enclosure_node.attributes["expression"].to_s
|
874
1065
|
enclosure.is_default =
|
875
1066
|
(enclosure_node.attributes["isDefault"].to_s.downcase == "true")
|
876
|
-
enclosure_thumbnail_url =
|
877
|
-
|
1067
|
+
enclosure_thumbnail_url =
|
1068
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1069
|
+
["media:thumbnail/@url"], :select_result_value => true)
|
878
1070
|
if !enclosure_thumbnail_url.blank?
|
879
1071
|
enclosure.thumbnail = FeedTools::EnclosureThumbnail.new(
|
880
|
-
FeedTools::HtmlHelper.unescape_entities(enclosure_thumbnail_url),
|
881
1072
|
FeedTools::HtmlHelper.unescape_entities(
|
882
|
-
|
1073
|
+
enclosure_thumbnail_url),
|
1074
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1075
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1076
|
+
["media:thumbnail/@height"],
|
883
1077
|
:select_result_value => true)),
|
884
1078
|
FeedTools::HtmlHelper.unescape_entities(
|
885
|
-
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1079
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1080
|
+
["media:thumbnail/@width"],
|
886
1081
|
:select_result_value => true))
|
887
1082
|
)
|
888
1083
|
end
|
889
1084
|
enclosure.categories = []
|
890
|
-
for category in FeedTools::XmlHelper.try_xpaths_all(
|
1085
|
+
for category in FeedTools::XmlHelper.try_xpaths_all(
|
1086
|
+
enclosure_node, ["media:category"])
|
891
1087
|
enclosure.categories << FeedTools::Category.new
|
892
1088
|
enclosure.categories.last.term =
|
893
1089
|
FeedTools::HtmlHelper.unescape_entities(category.inner_xml)
|
@@ -904,20 +1100,24 @@ module FeedTools
|
|
904
1100
|
enclosure.categories.last.label = nil
|
905
1101
|
end
|
906
1102
|
end
|
907
|
-
enclosure_media_hash =
|
908
|
-
|
1103
|
+
enclosure_media_hash =
|
1104
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1105
|
+
["media:hash/text()"], :select_result_value => true)
|
909
1106
|
if !enclosure_media_hash.nil?
|
910
1107
|
enclosure.hash = FeedTools::EnclosureHash.new(
|
911
|
-
FeedTools::HtmlHelper.sanitize_html(
|
912
|
-
|
1108
|
+
FeedTools::HtmlHelper.sanitize_html(
|
1109
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1110
|
+
enclosure_media_hash), :strip),
|
913
1111
|
"md5"
|
914
1112
|
)
|
915
1113
|
end
|
916
|
-
enclosure_media_player_url =
|
917
|
-
|
1114
|
+
enclosure_media_player_url =
|
1115
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1116
|
+
["media:player/@url"], :select_result_value => true)
|
918
1117
|
if !enclosure_media_player_url.blank?
|
919
1118
|
enclosure.player = FeedTools::EnclosurePlayer.new(
|
920
|
-
FeedTools::HtmlHelper.unescape_entities(
|
1119
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1120
|
+
enclosure_media_player_url),
|
921
1121
|
FeedTools::HtmlHelper.unescape_entities(
|
922
1122
|
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
923
1123
|
["media:player/@height"], :select_result_value => true)),
|
@@ -927,9 +1127,11 @@ module FeedTools
|
|
927
1127
|
)
|
928
1128
|
end
|
929
1129
|
enclosure.credits = []
|
930
|
-
for credit in FeedTools::XmlHelper.try_xpaths_all(
|
1130
|
+
for credit in FeedTools::XmlHelper.try_xpaths_all(
|
1131
|
+
enclosure_node, ["media:credit"])
|
931
1132
|
enclosure.credits << FeedTools::EnclosureCredit.new(
|
932
|
-
FeedTools::HtmlHelper.unescape_entities(
|
1133
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1134
|
+
credit.inner_xml.to_s.strip),
|
933
1135
|
FeedTools::HtmlHelper.unescape_entities(
|
934
1136
|
credit.attributes["role"].to_s.downcase)
|
935
1137
|
)
|
@@ -940,10 +1142,12 @@ module FeedTools
|
|
940
1142
|
enclosure.credits.last.role = nil
|
941
1143
|
end
|
942
1144
|
end
|
943
|
-
enclosure.explicit =
|
944
|
-
|
1145
|
+
enclosure.explicit =
|
1146
|
+
(FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1147
|
+
["media:adult/text()"]).to_s.downcase == "true")
|
945
1148
|
enclosure_media_text =
|
946
|
-
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1149
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1150
|
+
["media:text/text()"])
|
947
1151
|
if !enclosure_media_text.blank?
|
948
1152
|
enclosure.text = FeedTools::HtmlHelper.unescape_entities(
|
949
1153
|
enclosure_media_text)
|
@@ -964,7 +1168,8 @@ module FeedTools
|
|
964
1168
|
# Parse the group objects.
|
965
1169
|
for media_group in media_group_enclosures
|
966
1170
|
group_media_content_enclosures =
|
967
|
-
FeedTools::XmlHelper.try_xpaths_all(media_group,
|
1171
|
+
FeedTools::XmlHelper.try_xpaths_all(media_group,
|
1172
|
+
["media:content"])
|
968
1173
|
|
969
1174
|
# Parse the content objects within the group objects.
|
970
1175
|
affected_enclosures =
|
@@ -973,23 +1178,27 @@ module FeedTools
|
|
973
1178
|
# Now make sure that content objects inherit certain properties from
|
974
1179
|
# the group objects.
|
975
1180
|
for enclosure in affected_enclosures
|
976
|
-
media_group_thumbnail =
|
977
|
-
|
1181
|
+
media_group_thumbnail =
|
1182
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1183
|
+
["media:thumbnail/@url"], :select_result_value => true)
|
978
1184
|
if enclosure.thumbnail.nil? && !media_group_thumbnail.blank?
|
979
1185
|
enclosure.thumbnail = FeedTools::EnclosureThumbnail.new(
|
980
1186
|
FeedTools::HtmlHelper.unescape_entities(
|
981
1187
|
media_group_thumbnail),
|
982
1188
|
FeedTools::HtmlHelper.unescape_entities(
|
983
|
-
FeedTools::XmlHelper.try_xpaths(media_group,
|
1189
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1190
|
+
["media:thumbnail/@height"],
|
984
1191
|
:select_result_value => true)),
|
985
1192
|
FeedTools::HtmlHelper.unescape_entities(
|
986
|
-
FeedTools::XmlHelper.try_xpaths(media_group,
|
1193
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1194
|
+
["media:thumbnail/@width"],
|
987
1195
|
:select_result_value => true))
|
988
1196
|
)
|
989
1197
|
end
|
990
1198
|
if (enclosure.categories.blank?)
|
991
1199
|
enclosure.categories = []
|
992
|
-
for category in FeedTools::XmlHelper.try_xpaths_all(
|
1200
|
+
for category in FeedTools::XmlHelper.try_xpaths_all(
|
1201
|
+
media_group, ["media:category"])
|
993
1202
|
enclosure.categories << FeedTools::Category.new
|
994
1203
|
enclosure.categories.last.term =
|
995
1204
|
FeedTools::HtmlHelper.unescape_entities(category.inner_xml)
|
@@ -1007,31 +1216,42 @@ module FeedTools
|
|
1007
1216
|
end
|
1008
1217
|
end
|
1009
1218
|
end
|
1010
|
-
enclosure_media_group_hash =
|
1011
|
-
|
1219
|
+
enclosure_media_group_hash =
|
1220
|
+
FeedTools::XmlHelper.try_xpaths(enclosure_node,
|
1221
|
+
["media:hash/text()"], :select_result_value => true)
|
1012
1222
|
if enclosure.hash.nil? && !enclosure_media_group_hash.blank?
|
1013
1223
|
enclosure.hash = FeedTools::EnclosureHash.new(
|
1014
|
-
FeedTools::HtmlHelper.sanitize_html(
|
1015
|
-
|
1224
|
+
FeedTools::HtmlHelper.sanitize_html(
|
1225
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1226
|
+
enclosure_media_group_hash), :strip),
|
1016
1227
|
"md5"
|
1017
1228
|
)
|
1018
1229
|
end
|
1019
|
-
enclosure_media_group_url = FeedTools::XmlHelper.try_xpaths(
|
1020
|
-
|
1230
|
+
enclosure_media_group_url = FeedTools::XmlHelper.try_xpaths(
|
1231
|
+
media_group,
|
1232
|
+
"media:player/@url",
|
1233
|
+
:select_result_value => true
|
1234
|
+
)
|
1021
1235
|
if enclosure.player.nil? && !enclosure_media_group_url.blank?
|
1022
1236
|
enclosure.player = FeedTools::EnclosurePlayer.new(
|
1023
|
-
FeedTools::HtmlHelper.unescape_entities(enclosure_media_group_url),
|
1024
1237
|
FeedTools::HtmlHelper.unescape_entities(
|
1025
|
-
|
1238
|
+
enclosure_media_group_url),
|
1239
|
+
FeedTools::HtmlHelper.unescape_entities(
|
1240
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1241
|
+
["media:player/@height"],
|
1026
1242
|
:select_result_value => true)),
|
1027
1243
|
FeedTools::HtmlHelper.unescape_entities(
|
1028
|
-
FeedTools::XmlHelper.try_xpaths(media_group,
|
1029
|
-
:
|
1244
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1245
|
+
["media:player/@width"],
|
1246
|
+
:select_result_value => true
|
1247
|
+
)
|
1248
|
+
)
|
1030
1249
|
)
|
1031
1250
|
end
|
1032
1251
|
if enclosure.credits.nil? || enclosure.credits.size == 0
|
1033
1252
|
enclosure.credits = []
|
1034
|
-
for credit in FeedTools::XmlHelper.try_xpaths_all(
|
1253
|
+
for credit in FeedTools::XmlHelper.try_xpaths_all(
|
1254
|
+
media_group, ["media:credit"])
|
1035
1255
|
enclosure.credits << FeedTools::EnclosureCredit.new(
|
1036
1256
|
FeedTools::HtmlHelper.unescape_entities(credit.inner_xml),
|
1037
1257
|
FeedTools::HtmlHelper.unescape_entities(
|
@@ -1043,13 +1263,15 @@ module FeedTools
|
|
1043
1263
|
end
|
1044
1264
|
end
|
1045
1265
|
if enclosure.explicit?.nil?
|
1046
|
-
enclosure.explicit =
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1266
|
+
enclosure.explicit =
|
1267
|
+
((FeedTools::XmlHelper.try_xpaths(media_group, [
|
1268
|
+
"media:adult/text()"
|
1269
|
+
], :select_result_value => true).downcase == "true") ?
|
1270
|
+
true : false)
|
1050
1271
|
end
|
1051
|
-
enclosure_media_group_text =
|
1052
|
-
|
1272
|
+
enclosure_media_group_text =
|
1273
|
+
FeedTools::XmlHelper.try_xpaths(media_group,
|
1274
|
+
["media:text/text()"], :select_result_value => true)
|
1053
1275
|
if enclosure.text.nil? && !enclosure_media_group_text.blank?
|
1054
1276
|
enclosure.text = FeedTools::HtmlHelper.sanitize_html(
|
1055
1277
|
FeedTools::HtmlHelper.unescape_entities(
|
@@ -1070,12 +1292,14 @@ module FeedTools
|
|
1070
1292
|
|
1071
1293
|
# Add all the itunes categories
|
1072
1294
|
itunes_categories =
|
1073
|
-
FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1295
|
+
FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1296
|
+
["itunes:category"])
|
1074
1297
|
for itunes_category in itunes_categories
|
1075
1298
|
genre = "Podcasts"
|
1076
1299
|
category = itunes_category.attributes["text"].to_s
|
1077
1300
|
subcategory =
|
1078
|
-
FeedTools::XmlHelper.try_xpaths(itunes_category,
|
1301
|
+
FeedTools::XmlHelper.try_xpaths(itunes_category,
|
1302
|
+
["itunes:category/@text"],
|
1079
1303
|
:select_result_value => true)
|
1080
1304
|
category_path = genre
|
1081
1305
|
if !category.blank?
|
@@ -1136,6 +1360,14 @@ module FeedTools
|
|
1136
1360
|
unless enclosure.categories.nil?
|
1137
1361
|
enclosure.categories.uniq!
|
1138
1362
|
end
|
1363
|
+
|
1364
|
+
# Normalize enclosure URIs
|
1365
|
+
if !enclosure.href.blank?
|
1366
|
+
enclosure.href =
|
1367
|
+
FeedTools::UriHelper.normalize_url(enclosure.href)
|
1368
|
+
else
|
1369
|
+
enclosure.href = nil
|
1370
|
+
end
|
1139
1371
|
end
|
1140
1372
|
|
1141
1373
|
# And finally, now things get complicated. This is where we make
|
@@ -1302,6 +1534,12 @@ module FeedTools
|
|
1302
1534
|
rescue
|
1303
1535
|
end
|
1304
1536
|
end
|
1537
|
+
if FeedTools::XmlHelper.try_xpaths(author_node,
|
1538
|
+
["@gr:unknown-author"], :select_result_value => true) == "true"
|
1539
|
+
if @author.name == "(author unknown)"
|
1540
|
+
@author.name = nil
|
1541
|
+
end
|
1542
|
+
end
|
1305
1543
|
end
|
1306
1544
|
# Fallback on the itunes module if we didn't find an author name
|
1307
1545
|
begin
|
@@ -1309,6 +1547,13 @@ module FeedTools
|
|
1309
1547
|
rescue
|
1310
1548
|
@author.name = nil
|
1311
1549
|
end
|
1550
|
+
if @author.name.blank? && @author.email.blank? &&
|
1551
|
+
@author.href.blank?
|
1552
|
+
parent_feed = self.feed
|
1553
|
+
if parent_feed != nil
|
1554
|
+
@author = parent_feed.author.dup
|
1555
|
+
end
|
1556
|
+
end
|
1312
1557
|
end
|
1313
1558
|
return @author
|
1314
1559
|
end
|
@@ -1392,6 +1637,13 @@ module FeedTools
|
|
1392
1637
|
rescue
|
1393
1638
|
end
|
1394
1639
|
end
|
1640
|
+
if @publisher.name.blank? && @publisher.email.blank? &&
|
1641
|
+
@publisher.href.blank?
|
1642
|
+
parent_feed = self.feed
|
1643
|
+
if parent_feed != nil
|
1644
|
+
@publisher = parent_feed.publisher.dup
|
1645
|
+
end
|
1646
|
+
end
|
1395
1647
|
end
|
1396
1648
|
return @publisher
|
1397
1649
|
end
|
@@ -1422,7 +1674,12 @@ module FeedTools
|
|
1422
1674
|
@itunes_author = FeedTools::HtmlHelper.unescape_entities(
|
1423
1675
|
FeedTools::XmlHelper.try_xpaths(self.root_node,
|
1424
1676
|
["itunes:author/text()"], :select_result_value => true))
|
1425
|
-
|
1677
|
+
if @itunes_author.blank?
|
1678
|
+
parent_feed = self.feed
|
1679
|
+
if parent_feed != nil
|
1680
|
+
@itunes_author = parent_feed.itunes_author
|
1681
|
+
end
|
1682
|
+
end
|
1426
1683
|
end
|
1427
1684
|
return @itunes_author
|
1428
1685
|
end
|
@@ -1484,7 +1741,8 @@ module FeedTools
|
|
1484
1741
|
"published/text()",
|
1485
1742
|
"dc:date/text()",
|
1486
1743
|
"pubDate/text()",
|
1487
|
-
"date/text()"
|
1744
|
+
"date/text()",
|
1745
|
+
"lastupdated/text()"
|
1488
1746
|
], :select_result_value => true)
|
1489
1747
|
begin
|
1490
1748
|
if !time_string.blank?
|
@@ -1585,7 +1843,8 @@ module FeedTools
|
|
1585
1843
|
"atom03:modified/text()",
|
1586
1844
|
"atom:modified/text()",
|
1587
1845
|
"modified/text()",
|
1588
|
-
"lastBuildDate/text()"
|
1846
|
+
"lastBuildDate/text()",
|
1847
|
+
"lastupdated/text()"
|
1589
1848
|
], :select_result_value => true)
|
1590
1849
|
if !updated_string.blank?
|
1591
1850
|
@updated = Time.parse(updated_string).gmtime rescue nil
|
@@ -1630,36 +1889,8 @@ module FeedTools
|
|
1630
1889
|
def published=(new_published)
|
1631
1890
|
@published = new_published
|
1632
1891
|
end
|
1633
|
-
|
1634
|
-
# Returns the url for posting comments
|
1635
|
-
def comments
|
1636
|
-
if @comments.nil?
|
1637
|
-
@comments = FeedTools::XmlHelper.try_xpaths(self.root_node, ["comments/text()"],
|
1638
|
-
:select_result_value => true)
|
1639
|
-
begin
|
1640
|
-
if !(@comments =~ /^file:/) &&
|
1641
|
-
!FeedTools::UriHelper.is_uri?(@comments)
|
1642
|
-
root_base_uri = nil
|
1643
|
-
unless self.root_node.nil?
|
1644
|
-
root_base_uri = self.root_node.base_uri
|
1645
|
-
end
|
1646
|
-
@comments = FeedTools::UriHelper.resolve_relative_uri(
|
1647
|
-
@comments, [root_base_uri, self.base_uri])
|
1648
|
-
end
|
1649
|
-
rescue
|
1650
|
-
end
|
1651
|
-
if self.configurations[:url_normalization_enabled]
|
1652
|
-
@comments = FeedTools::UriHelper.normalize_url(@comments)
|
1653
|
-
end
|
1654
|
-
end
|
1655
|
-
return @comments
|
1656
|
-
end
|
1657
|
-
|
1658
|
-
# Sets the url for posting comments
|
1659
|
-
def comments=(new_comments)
|
1660
|
-
@comments = new_comments
|
1661
|
-
end
|
1662
1892
|
|
1893
|
+
# TODO: FIX ME! This code is completely wrong.
|
1663
1894
|
# The source that this post was based on
|
1664
1895
|
def source
|
1665
1896
|
if @source.nil?
|
@@ -1702,7 +1933,8 @@ module FeedTools
|
|
1702
1933
|
if rdf_bag != nil && rdf_bag.size > 0
|
1703
1934
|
for tag_node in rdf_bag
|
1704
1935
|
begin
|
1705
|
-
tag_url = FeedTools::XmlHelper.try_xpaths(tag_node,
|
1936
|
+
tag_url = FeedTools::XmlHelper.try_xpaths(tag_node,
|
1937
|
+
["@resource"],
|
1706
1938
|
:select_result_value => true)
|
1707
1939
|
tag_match = tag_url.scan(/\/(tag|tags)\/(\w+)$/)
|
1708
1940
|
if tag_match.size > 0
|
@@ -1715,7 +1947,8 @@ module FeedTools
|
|
1715
1947
|
end
|
1716
1948
|
if @tags.nil? || @tags.size == 0
|
1717
1949
|
@tags = []
|
1718
|
-
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1950
|
+
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1951
|
+
["category/text()"],
|
1719
1952
|
:select_result_value => true)
|
1720
1953
|
for tag in tag_list
|
1721
1954
|
@tags << tag.to_s.downcase.strip
|
@@ -1723,7 +1956,8 @@ module FeedTools
|
|
1723
1956
|
end
|
1724
1957
|
if @tags.nil? || @tags.size == 0
|
1725
1958
|
@tags = []
|
1726
|
-
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1959
|
+
tag_list = FeedTools::XmlHelper.try_xpaths_all(self.root_node,
|
1960
|
+
["dc:subject/text()"],
|
1727
1961
|
:select_result_value => true)
|
1728
1962
|
for tag in tag_list
|
1729
1963
|
@tags << tag.to_s.downcase.strip
|
@@ -1731,9 +1965,10 @@ module FeedTools
|
|
1731
1965
|
end
|
1732
1966
|
if @tags.blank?
|
1733
1967
|
begin
|
1734
|
-
itunes_keywords_string =
|
1735
|
-
|
1736
|
-
|
1968
|
+
itunes_keywords_string =
|
1969
|
+
FeedTools::XmlHelper.try_xpaths(self.root_node, [
|
1970
|
+
"itunes:keywords/text()"
|
1971
|
+
], :select_result_value => true)
|
1737
1972
|
unless itunes_keywords_string.blank?
|
1738
1973
|
@tags = itunes_keywords_string.downcase.split(",")
|
1739
1974
|
if @tags.size == 1
|
@@ -1771,8 +2006,10 @@ module FeedTools
|
|
1771
2006
|
"media:adult/text()",
|
1772
2007
|
"itunes:explicit/text()"
|
1773
2008
|
], :select_result_value => true)
|
1774
|
-
|
1775
|
-
|
2009
|
+
parent_feed = self.feed
|
2010
|
+
if explicit_string == "true" || explicit_string == "yes"
|
2011
|
+
@explicit = true
|
2012
|
+
elsif parent_feed != nil && parent_feed.explicit?
|
1776
2013
|
@explicit = true
|
1777
2014
|
else
|
1778
2015
|
@explicit = false
|
@@ -1786,8 +2023,9 @@ module FeedTools
|
|
1786
2023
|
@explicit = (new_explicit ? true : false)
|
1787
2024
|
end
|
1788
2025
|
|
1789
|
-
# A hook method that is called during the feed generation process.
|
1790
|
-
# will enable additional content to be inserted
|
2026
|
+
# A hook method that is called during the feed generation process.
|
2027
|
+
# Overriding this method will enable additional content to be inserted
|
2028
|
+
# into the feed.
|
1791
2029
|
def build_xml_hook(feed_type, version, xml_builder)
|
1792
2030
|
return nil
|
1793
2031
|
end
|
@@ -1796,20 +2034,41 @@ module FeedTools
|
|
1796
2034
|
def build_xml(feed_type=(self.feed.feed_type or "atom"), version=nil,
|
1797
2035
|
xml_builder=Builder::XmlMarkup.new(
|
1798
2036
|
:indent => 2, :escape_attrs => false))
|
2037
|
+
|
2038
|
+
parent_feed = self.feed
|
2039
|
+
if parent_feed.find_node(
|
2040
|
+
"access:restriction/@relationship").to_s == "deny"
|
2041
|
+
raise StandardError,
|
2042
|
+
"Operation not permitted. This feed denies redistribution."
|
2043
|
+
elsif parent_feed.find_node("@indexing:index").to_s == "no"
|
2044
|
+
raise StandardError,
|
2045
|
+
"Operation not permitted. This feed denies redistribution."
|
2046
|
+
end
|
2047
|
+
if self.find_node(
|
2048
|
+
"access:restriction/@relationship").to_s == "deny"
|
2049
|
+
raise StandardError,
|
2050
|
+
"Operation not permitted. This feed item denies redistribution."
|
2051
|
+
end
|
2052
|
+
|
2053
|
+
self.full_parse()
|
2054
|
+
|
1799
2055
|
if feed_type == "rss" && (version == nil || version == 0.0)
|
1800
2056
|
version = 1.0
|
1801
2057
|
elsif feed_type == "atom" && (version == nil || version == 0.0)
|
1802
2058
|
version = 1.0
|
1803
2059
|
end
|
1804
|
-
if feed_type == "rss" &&
|
2060
|
+
if feed_type == "rss" &&
|
2061
|
+
(version == 0.9 || version == 1.0 || version == 1.1)
|
1805
2062
|
# RDF-based rss format
|
1806
2063
|
if link.nil?
|
1807
|
-
raise "Cannot generate an rdf-based feed item with a
|
2064
|
+
raise "Cannot generate an rdf-based feed item with a " +
|
2065
|
+
"nil link field."
|
1808
2066
|
end
|
1809
2067
|
return xml_builder.item("rdf:about" =>
|
1810
2068
|
FeedTools::HtmlHelper.escape_entities(link)) do
|
1811
2069
|
unless self.title.blank?
|
1812
|
-
xml_builder.title(
|
2070
|
+
xml_builder.title(
|
2071
|
+
FeedTools::HtmlHelper.strip_html_tags(self.title))
|
1813
2072
|
else
|
1814
2073
|
xml_builder.title
|
1815
2074
|
end
|
@@ -1851,7 +2110,8 @@ module FeedTools
|
|
1851
2110
|
# normal rss format
|
1852
2111
|
return xml_builder.item do
|
1853
2112
|
unless self.title.blank?
|
1854
|
-
xml_builder.title(
|
2113
|
+
xml_builder.title(
|
2114
|
+
FeedTools::HtmlHelper.strip_html_tags(self.title))
|
1855
2115
|
end
|
1856
2116
|
unless self.link.blank?
|
1857
2117
|
xml_builder.link(self.link)
|
@@ -1876,11 +2136,12 @@ module FeedTools
|
|
1876
2136
|
elsif !self.time.nil?
|
1877
2137
|
xml_builder.pubDate(self.time.rfc822)
|
1878
2138
|
end
|
1879
|
-
unless self.
|
1880
|
-
xml_builder.tag!("dc:rights", self.
|
2139
|
+
unless self.rights.blank?
|
2140
|
+
xml_builder.tag!("dc:rights", self.rights)
|
1881
2141
|
end
|
1882
2142
|
unless self.guid.blank?
|
1883
|
-
if FeedTools::UriHelper.is_uri?(self.guid) &&
|
2143
|
+
if FeedTools::UriHelper.is_uri?(self.guid) &&
|
2144
|
+
(self.guid =~ /^http/)
|
1884
2145
|
xml_builder.guid(self.guid, "isPermaLink" => "true")
|
1885
2146
|
else
|
1886
2147
|
xml_builder.guid(self.guid, "isPermaLink" => "false")
|
@@ -1919,7 +2180,8 @@ module FeedTools
|
|
1919
2180
|
end
|
1920
2181
|
rescue
|
1921
2182
|
end
|
1922
|
-
attribute_hash["url"] =
|
2183
|
+
attribute_hash["url"] =
|
2184
|
+
FeedTools::UriHelper.normalize_url(enclosure.url)
|
1923
2185
|
if enclosure.type != nil
|
1924
2186
|
attribute_hash["type"] = enclosure.type
|
1925
2187
|
end
|
@@ -1993,7 +2255,8 @@ module FeedTools
|
|
1993
2255
|
if self.id != nil
|
1994
2256
|
unless FeedTools::UriHelper.is_uri? self.id
|
1995
2257
|
if self.time != nil && self.link != nil
|
1996
|
-
xml_builder.id(FeedTools::UriHelper.build_tag_uri(
|
2258
|
+
xml_builder.id(FeedTools::UriHelper.build_tag_uri(
|
2259
|
+
self.link, self.time))
|
1997
2260
|
elsif self.link != nil
|
1998
2261
|
xml_builder.id(FeedTools.build_urn_uuid_uri(self.link))
|
1999
2262
|
else
|
@@ -2004,7 +2267,8 @@ module FeedTools
|
|
2004
2267
|
xml_builder.id(self.id)
|
2005
2268
|
end
|
2006
2269
|
elsif self.time != nil && self.link != nil
|
2007
|
-
xml_builder.id(FeedTools::UriHelper.build_tag_uri(
|
2270
|
+
xml_builder.id(FeedTools::UriHelper.build_tag_uri(
|
2271
|
+
self.link, self.time))
|
2008
2272
|
else
|
2009
2273
|
raise "Cannot build feed, missing feed unique id."
|
2010
2274
|
end
|
@@ -2018,7 +2282,8 @@ module FeedTools
|
|
2018
2282
|
attribute_hash = {}
|
2019
2283
|
next if enclosure.url.blank?
|
2020
2284
|
attribute_hash["rel"] = "enclosure"
|
2021
|
-
attribute_hash["href"] =
|
2285
|
+
attribute_hash["href"] =
|
2286
|
+
FeedTools::UriHelper.normalize_url(enclosure.url)
|
2022
2287
|
if enclosure.type != nil
|
2023
2288
|
attribute_hash["type"] = enclosure.type
|
2024
2289
|
end
|