concerto_simple_rss 0.0.9 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/simple_rss.rb +82 -8
- data/lib/concerto_simple_rss/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e6fb52c7e3495312e80894ac2eb676a17e35d24
|
4
|
+
data.tar.gz: 7c7cf3c32745e8f4f62e8ed0e09ea944fb228dbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a33d6fcaa6f01b09b975812216f2eb044137363d86543575a1bb18d244aee0c160129edf94b2485a2a2724a05e3daecf49abfa126621d95e0cec5622e04eee00
|
7
|
+
data.tar.gz: c687174d1b8677b00114db8d97f7277f718d8f58220c6ae819b4a487d1ceceb22a80f7ac5d24527c983d6a441c036b5156ac9a072589072ae8a34a5035f8c99d
|
data/app/models/simple_rss.rb
CHANGED
@@ -38,14 +38,88 @@ class SimpleRss < DynamicContent
|
|
38
38
|
require 'rexml/document'
|
39
39
|
require 'xml/xslt'
|
40
40
|
|
41
|
-
XML::XSLT.registerErrorHandler { |string| puts string }
|
41
|
+
#XML::XSLT.registerErrorHandler { |string| puts string }
|
42
42
|
xslt = XML::XSLT.new()
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
43
|
+
begin
|
44
|
+
xslt.xml = REXML::Document.new(raw)
|
45
|
+
rescue REXML::ParseException => e
|
46
|
+
Rails.logger.error("Unable to parse incoming feed: #{e.message}")
|
47
|
+
raise "Unable to parse incoming feed. "
|
48
|
+
rescue => e
|
49
|
+
raise e
|
50
|
+
end
|
51
|
+
|
52
|
+
begin
|
53
|
+
xslt.xsl = REXML::Document.new(self.config['xsl'])
|
54
|
+
rescue REXML::ParseException => e
|
55
|
+
Rails.logger.error("Unable to parse Xsl: #{e.message}")
|
56
|
+
# fmt is <rexml::parseexception: message :> trace ... so just pull out the message
|
57
|
+
s = e.message
|
58
|
+
msg_stop = s.index(">")
|
59
|
+
s = s.slice(23, msg_stop - 23) if !msg_stop.nil?
|
60
|
+
raise "Unable to parse Xsl. #{s}"
|
61
|
+
rescue => e
|
62
|
+
raise e
|
63
|
+
end
|
64
|
+
|
65
|
+
# add a replace [gsub] function for more powerful transforms. You can use this in a transform
|
66
|
+
# by adding the bogus namespace http://concerto.functions
|
67
|
+
# A nodeset comes in as an array of REXML::Elements
|
68
|
+
XML::XSLT.registerExtFunc("http://concerto.functions", "replace") do |nodes, pattern, replacement|
|
69
|
+
result = []
|
70
|
+
begin
|
71
|
+
# this will only work with nodesets for now
|
72
|
+
re_pattern = Regexp.new(pattern)
|
73
|
+
if nodes.is_a?(Array) && nodes.count > 0 && nodes.first.is_a?(REXML::Element)
|
74
|
+
nodes.each do |node|
|
75
|
+
s = node.to_s
|
76
|
+
r = s.gsub(re_pattern, replacement)
|
77
|
+
result << REXML::Document.new(r)
|
78
|
+
end
|
79
|
+
elsif nodes.is_a?(String)
|
80
|
+
result = nodes.gsub(re_pattern, replacement)
|
81
|
+
else
|
82
|
+
# dont know how to handle this
|
83
|
+
Rails.logger.info "I'm sorry, but the xsl external function replace does not know how to handle this type #{nodes.class}"
|
84
|
+
end
|
85
|
+
rescue
|
86
|
+
Rails.logger.error "there was a problem replacing #{pattern} with #{replacement}"
|
87
|
+
end
|
88
|
+
|
89
|
+
result
|
90
|
+
end
|
91
|
+
|
92
|
+
data = xslt.serve()
|
93
|
+
|
94
|
+
# try to load the transformed data as an xml document so we can see if there are
|
95
|
+
# mulitple content-items that we need to parse out, if we cant then treat it as one content item
|
96
|
+
begin
|
97
|
+
data_xml = REXML::Document.new('<root>' + data + '</root>')
|
98
|
+
nodes = REXML::XPath.match(data_xml, "//content-item")
|
99
|
+
# if there are no content-items then add the whole result (data) as one content
|
100
|
+
if nodes.count == 0
|
101
|
+
htmltext = HtmlText.new()
|
102
|
+
htmltext.name = "#{feed_title}"
|
103
|
+
htmltext.data = data
|
104
|
+
contents << htmltext
|
105
|
+
else
|
106
|
+
# if there are any content-items then add each one as a separate content
|
107
|
+
nodes.each do |n|
|
108
|
+
htmltext = HtmlText.new()
|
109
|
+
htmltext.name = "#{feed_title}"
|
110
|
+
htmltext.data = n.to_s
|
111
|
+
contents << htmltext
|
112
|
+
end
|
113
|
+
end
|
114
|
+
rescue => e
|
115
|
+
Rails.logger.error("unable to parse resultant xml, assuming it is one content item #{e.message}")
|
116
|
+
# raise "unable to parse resultant xml #{e.message}"
|
117
|
+
# add the whole result as one content
|
118
|
+
htmltext = HtmlText.new()
|
119
|
+
htmltext.name = "#{feed_title}"
|
120
|
+
htmltext.data = data
|
121
|
+
contents << htmltext
|
122
|
+
end
|
49
123
|
else
|
50
124
|
raise ArgumentError, 'Unexpected output format for RSS feed.'
|
51
125
|
end
|
@@ -198,7 +272,7 @@ class SimpleRss < DynamicContent
|
|
198
272
|
o.config['xsl'] = data[:xsl]
|
199
273
|
results = o.build_content.first.data
|
200
274
|
rescue => e
|
201
|
-
results = "Unable to preview
|
275
|
+
results = "Unable to preview. #{e.message}"
|
202
276
|
end
|
203
277
|
|
204
278
|
return results
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concerto_simple_rss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Michalski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
127
|
version: '0'
|
128
128
|
requirements: []
|
129
129
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.0.
|
130
|
+
rubygems_version: 2.0.14
|
131
131
|
signing_key:
|
132
132
|
specification_version: 4
|
133
133
|
summary: RSS Dynamic Concerto for Concerto 2.
|