summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-27 08:47:28 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-27 08:47:28 +0000
commit2572d5e20efb42599759f97b1ec0cc66c15fb14a (patch)
tree1ce8b2aa09c9351b5e1efae7981c80d1bc916d85 /lib
parent0a93165e167a4d1d6b0f8a2dc0479524f49855d4 (diff)
* lib/rss/{0.9,1.0,2.0,trackback,xml-stylesheet}.rb: added
#setup_maker. * test/rss/test_setup_maker_*.rb: added tests for #setup_maker. * lib/rss/maker/base.rb(RSS::Maker::Items#max_size=): supported output item size limitation. * sample/rss/blend.rb: added sample for RSS Maker. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7391 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/rss/0.9.rb69
-rw-r--r--lib/rss/1.0.rb20
-rw-r--r--lib/rss/2.0.rb14
-rw-r--r--lib/rss/maker/base.rb5
-rw-r--r--lib/rss/rss.rb71
-rw-r--r--lib/rss/trackback.rb14
-rw-r--r--lib/rss/xml-stylesheet.rb7
7 files changed, 186 insertions, 14 deletions
diff --git a/lib/rss/0.9.rb b/lib/rss/0.9.rb
index 20a229b926..b80ad193a3 100644
--- a/lib/rss/0.9.rb
+++ b/lib/rss/0.9.rb
@@ -203,6 +203,26 @@ module RSS
rv
end
+ def maker_target(maker)
+ maker.channel
+ end
+
+ def setup_maker_elements(channel)
+ super
+ [
+ [skipDays, "day"],
+ [skipHours, "hour"],
+ ].each do |skip, key|
+ if skip
+ skip.__send__("#{key}s").each do |val|
+ target_skips = channel.__send__("skip#{key.capitalize}s")
+ new_target = target_skips.__send__("new_#{key}")
+ new_target.content = val.content
+ end
+ end
+ end
+ end
+
class SkipDays < Element
include RSS09
@@ -323,7 +343,7 @@ module RSS
other_element(false, next_indent),
]
end
- rv = @converter.convert(rv) if convert and @converter
+ rv = @converter.convert(rv) if convert and @converter
rv
end
@@ -335,6 +355,10 @@ module RSS
[nil, elem]
end
end
+
+ def maker_target(maker)
+ maker.image
+ end
end
class Cloud < Element
@@ -440,6 +464,16 @@ module RSS
rv
end
+ def maker_target(maker)
+ maker.items.new_item
+ end
+
+ def setup_maker_element(item)
+ super
+ @enclosure.setup_maker(item) if @enclosure
+ @source.setup_maker(item) if @source
+ end
+
class Source < Element
include RSS09
@@ -469,6 +503,15 @@ module RSS
]
end
+
+ def maker_target(item)
+ item.source
+ end
+
+ def setup_maker_attributes(source)
+ source.url = url
+ source.content = content
+ end
end
class Enclosure < Element
@@ -505,6 +548,15 @@ module RSS
]
end
+ def maker_target(item)
+ item.enclosure
+ end
+
+ def setup_maker_attributes(enclosure)
+ enclosure.url = url
+ enclosure.length = length
+ enclosure.type = type
+ end
end
class Category < Element
@@ -532,6 +584,15 @@ module RSS
]
end
+ def maker_target(item)
+ item.new_category
+ end
+
+ def setup_maker_attributes(category)
+ category.domain = domain
+ category.content = content
+ end
+
end
end
@@ -555,7 +616,7 @@ module RSS
other_element(false, next_indent),
]
end
- rv = @converter.convert(rv) if convert and @converter
+ rv = @converter.convert(rv) if convert and @converter
rv
end
@@ -567,6 +628,10 @@ module RSS
[nil, elem]
end
end
+
+ def maker_target(maker)
+ maker.textinput
+ end
end
end
diff --git a/lib/rss/1.0.rb b/lib/rss/1.0.rb
index 9a61e456ba..0e3e66ea95 100644
--- a/lib/rss/1.0.rb
+++ b/lib/rss/1.0.rb
@@ -274,6 +274,14 @@ module RSS
]
end
+ def maker_target(maker)
+ maker.channel
+ end
+
+ def setup_maker_attributes(channel)
+ channel.about = self.about
+ end
+
class Image < Element
include RSS10
@@ -469,6 +477,10 @@ module RSS
["#{PREFIX}:about", true, "about"]
]
end
+
+ def maker_target(maker)
+ maker.image
+ end
end
class Item < Element
@@ -535,6 +547,10 @@ module RSS
["#{PREFIX}:about", true, "about"]
]
end
+
+ def maker_target(maker)
+ maker.items.new_item
+ end
end
class Textinput < Element
@@ -604,6 +620,10 @@ module RSS
["#{PREFIX}:about", true, "about"]
]
end
+
+ def maker_target(maker)
+ maker.textinput
+ end
end
end
diff --git a/lib/rss/2.0.rb b/lib/rss/2.0.rb
index 0a2d86860d..5793b35938 100644
--- a/lib/rss/2.0.rb
+++ b/lib/rss/2.0.rb
@@ -113,6 +113,12 @@ EOT
end + _tags09
end
+ alias _setup_maker_element setup_maker_element
+ def setup_maker_element(item)
+ _setup_maker_element(item)
+ @guid.setup_maker(item) if @guid
+ end
+
class Guid < Element
include RSS09
@@ -138,6 +144,14 @@ EOT
]
end
+ def maker_target(item)
+ item.guid
+ end
+
+ def setup_maker_attributes(guid)
+ guid.isPermaLink = isPermaLink
+ guid.content = content
+ end
end
end
diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb
index 91eb072ec7..7301e53eb6 100644
--- a/lib/rss/maker/base.rb
+++ b/lib/rss/maker/base.rb
@@ -370,15 +370,16 @@ EOC
def_array_element("items")
- attr_accessor :do_sort
+ attr_accessor :do_sort, :max_size
def initialize(maker)
super
@do_sort = false
+ @max_size = -1
end
def normalize
- sort_if_need
+ sort_if_need[0..@max_size]
end
def current_element(rss)
diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb
index a63bee8a69..b6f67b86e8 100644
--- a/lib/rss/rss.rb
+++ b/lib/rss/rss.rb
@@ -165,8 +165,9 @@ EOC
alias_method(:install_have_attribute_element, :install_have_child_element)
def install_have_children_element(name, plural_name=nil)
- add_have_children_element(name)
-
+ plural_name ||= "#{name}s"
+ add_have_children_element(name, plural_name)
+
def_children_accessor(name, plural_name)
install_element(name, "s") do |n, elem_name|
<<-EOC
@@ -289,8 +290,7 @@ EOC
end
end
- def def_children_accessor(accessor_name, plural_name=nil)
- plural_name ||= "#{accessor_name}s"
+ def def_children_accessor(accessor_name, plural_name)
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
def #{plural_name}
@#{accessor_name}
@@ -405,8 +405,8 @@ EOC
@@have_children_elements
end
- def self.add_have_children_element(variable_name)
- @@have_children_elements << variable_name
+ def self.add_have_children_element(variable_name, plural_name)
+ @@have_children_elements << [variable_name, plural_name]
end
@@need_initialize_variables = []
@@ -484,6 +484,15 @@ EOC
__validate(tags, false)
end
+ def setup_maker(maker)
+ target = maker_target(maker)
+ unless target.nil?
+ setup_maker_attributes(target)
+ setup_maker_element(target)
+ setup_maker_elements(target)
+ end
+ end
+
private
def initialize_variables
self.class.need_initialize_variables.each do |variable_name|
@@ -494,7 +503,7 @@ EOC
end
def initialize_have_children_elements
- self.class.have_children_elements.each do |variable_name|
+ self.class.have_children_elements.each do |variable_name, plural_name|
instance_eval("@#{variable_name} = []")
end
end
@@ -558,6 +567,34 @@ EOC
def calc_indent
INDENT * (self.class.indent_size)
end
+
+ def maker_target(maker)
+ nil
+ end
+
+ def setup_maker_attributes(target)
+ end
+
+ def setup_maker_element(target)
+ self.class.need_initialize_variables.each do |var|
+ setter = "#{var}="
+ if target.respond_to?(setter)
+ target.__send__(setter, __send__(var))
+ end
+ end
+ end
+
+ def setup_maker_elements(parent)
+ self.class.have_children_elements.each do |name, plural_name|
+ real_name = name.sub(/^[^_]+_/, '')
+ if parent.respond_to?(plural_name)
+ target = parent.__send__(plural_name)
+ __send__(plural_name).each do |elem|
+ elem.__send__("setup_maker", target)
+ end
+ end
+ end
+ end
# not String class children.
def children
@@ -735,6 +772,18 @@ EOC
self.converter = Converter.new(@output_encoding, @encoding)
end
+ def setup_maker(maker)
+ maker.version = version
+ maker.encoding = encoding
+ maker.standalone = standalone
+
+ xml_stylesheets.each do |xss|
+ xss.setup_maker(maker)
+ end
+
+ setup_maker_elements(maker)
+ end
+
private
def tag(indent, attrs)
rv = xmldecl + xml_stylesheet_pi
@@ -759,6 +808,14 @@ EOC
end
end
+ def setup_maker_elements(maker)
+ channel.setup_maker(maker) if channel
+ image.setup_maker(maker) if image
+ textinput.setup_maker(maker) if textinput
+ items.each do |item|
+ item.setup_maker(maker)
+ end
+ end
end
end
diff --git a/lib/rss/trackback.rb b/lib/rss/trackback.rb
index 5cbf652406..1bcc60404d 100644
--- a/lib/rss/trackback.rb
+++ b/lib/rss/trackback.rb
@@ -65,9 +65,9 @@ module RSS
EOC
end
- [%w(about s)].each do |x, postfix|
- var_name = "#{TRACKBACK_PREFIX}_#{x}"
- klass_name = x.capitalize
+ [%w(about s)].each do |name, postfix|
+ var_name = "#{TRACKBACK_PREFIX}_#{name}"
+ klass_name = name.capitalize
klass.install_have_children_element(var_name)
klass.module_eval(<<-EOC, __FILE__, __LINE__)
undef #{var_name}
@@ -207,6 +207,14 @@ module RSS
]
end
+ def maker_target(abouts)
+ abouts.new_about
+ end
+
+ def setup_maker_attributes(about)
+ about.resource = self.resource
+ end
+
end
end
diff --git a/lib/rss/xml-stylesheet.rb b/lib/rss/xml-stylesheet.rb
index c51c0dc71a..05602eee9b 100644
--- a/lib/rss/xml-stylesheet.rb
+++ b/lib/rss/xml-stylesheet.rb
@@ -84,6 +84,13 @@ module RSS
@alternate
end
+ def setup_maker(maker)
+ xss = maker.xml_stylesheets.new_xml_stylesheet
+ ATTRIBUTES.each do |attr|
+ xss.__send__("#{attr}=", __send__(attr))
+ end
+ end
+
private
def guess_type(filename)
/\.([^.]+)$/ =~ filename