summaryrefslogtreecommitdiff
path: root/lib/rss
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-06-19 13:37:18 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-06-19 13:37:18 +0000
commit74a0bc896bef6dd84b93efef87c3d0e8ebadd909 (patch)
tree3532dcafb72f429b8d178cc307147f9ec131b675 /lib/rss
parent0976e9e32f2b92038da4c7b11bb94bbae6284362 (diff)
* lib/rss/rss.rb:
- provided default #to_s as RSS::Element#to_s. - removed RSS::Element#other_element. - RSS::Element#tag requires attributes as Hash instead of Array. * lib/rss/0.9.rb: removed #to_s to use RSS::Element#to_s. * lib/rss/1.0.rb: ditto. * lib/rss/image.rb: ditto. * lib/rss/taxonomy.rb: ditto. * lib/rss/trackback.rb: ditto. * lib/rss/2.0.rb: removed #other_element. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss')
-rw-r--r--lib/rss/0.9.rb207
-rw-r--r--lib/rss/1.0.rb126
-rw-r--r--lib/rss/2.0.rb21
-rw-r--r--lib/rss/image.rb20
-rw-r--r--lib/rss/rss.rb89
-rw-r--r--lib/rss/taxonomy.rb17
-rw-r--r--lib/rss/trackback.rb12
7 files changed, 79 insertions, 413 deletions
diff --git a/lib/rss/0.9.rb b/lib/rss/0.9.rb
index 4bb6a6e4b3..d69e807d30 100644
--- a/lib/rss/0.9.rb
+++ b/lib/rss/0.9.rb
@@ -58,17 +58,6 @@ module RSS
nil
end
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent, ns_declarations) do |next_indent|
- [
- channel_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
def setup_maker_elements(maker)
super
@@ -101,81 +90,30 @@ module RSS
include RSS09
[
- ["title", nil],
- ["link", nil],
- ["description", nil],
- ["language", nil],
- ["copyright", "?"],
- ["managingEditor", "?"],
- ["webMaster", "?"],
- ["rating", "?"],
- ["docs", "?"],
- ].each do |name, occurs|
- install_text_element(name)
- install_model(name, occurs)
- end
-
- [
- ["pubDate", "?"],
- ["lastBuildDate", "?"],
- ].each do |name, occurs|
- install_date_element(name, 'rfc822')
+ ["title", nil, :text],
+ ["link", nil, :text],
+ ["description", nil, :text],
+ ["language", nil, :text],
+ ["copyright", "?", :text],
+ ["managingEditor", "?", :text],
+ ["webMaster", "?", :text],
+ ["rating", "?", :text],
+ ["pubDate", "?", :date, 'rfc822'],
+ ["lastBuildDate", "?", :date, 'rfc822'],
+ ["docs", "?", :text],
+ ["cloud", "?", :have_attribute],
+ ["skipDays", "?", :have_child],
+ ["skipHours", "?", :have_child],
+ ["image", nil, :have_child],
+ ["item", "*", :have_children],
+ ["textInput", "?", :have_child],
+ ].each do |name, occurs, type, *args|
+ __send__("install_#{type}_element", name, *args)
install_model(name, occurs)
end
alias date pubDate
alias date= pubDate=
- [
- ["skipDays", "?"],
- ["skipHours", "?"],
- ["image", nil],
- ["textInput", "?"],
- ].each do |name, occurs|
- install_have_child_element(name)
- install_model(name, occurs)
- end
-
- [
- ["cloud", "?"]
- ].each do |name, occurs|
- install_have_attribute_element(name)
- install_model(name, occurs)
- end
-
- [
- ["item", "*"]
- ].each do |name, occurs|
- install_have_children_element(name)
- install_model(name, occurs)
- end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- link_element(false, next_indent),
- description_element(false, next_indent),
- language_element(false, next_indent),
- copyright_element(false, next_indent),
- managingEditor_element(false, next_indent),
- webMaster_element(false, next_indent),
- rating_element(false, next_indent),
- pubDate_element(false, next_indent),
- lastBuildDate_element(false, next_indent),
- docs_element(false, next_indent),
- cloud_element(false, next_indent),
- skipDays_element(false, next_indent),
- skipHours_element(false, next_indent),
- image_element(false, next_indent),
- item_elements(false, next_indent),
- textInput_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def children
[@skipDays, @skipHours, @image, @textInput, @cloud, *@item]
@@ -244,16 +182,6 @@ module RSS
install_model(name, occurs)
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- day_elements(false, next_indent)
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def children
@day
@@ -293,16 +221,6 @@ module RSS
install_model(name, occurs)
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- hour_elements(false, next_indent)
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def children
@hour
@@ -362,22 +280,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- url_element(false, next_indent),
- title_element(false, next_indent),
- link_element(false, next_indent),
- width_element(false, next_indent),
- height_element(false, next_indent),
- description_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def _tags
%w(url title link width height description).delete_if do |name|
@@ -418,59 +320,24 @@ module RSS
self.protocol = args[4]
end
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
end
class Item < Element
include RSS09
- %w(title link description).each do |name|
- install_text_element(name)
- end
-
- %w(source enclosure).each do |name|
- install_have_child_element(name)
- end
-
- [
- %w(category categories),
- ].each do |name, plural_name|
- install_have_children_element(name, plural_name)
- end
-
[
- ["title", '?'],
- ["link", '?'],
- ["description", '?'],
- ["category", '*'],
- ["source", '?'],
- ["enclosure", '?'],
- ].each do |tag, occurs|
+ ["title", '?', :text],
+ ["link", '?', :text],
+ ["description", '?', :text],
+ ["category", '*', :have_children, "categories"],
+ ["source", '?', :have_child],
+ ["enclosure", '?', :have_child],
+ ].each do |tag, occurs, type, *args|
+ __send__("install_#{type}_element", tag, *args)
install_model(tag, occurs)
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- link_element(false, next_indent),
- description_element(false, next_indent),
- category_elements(false, next_indent),
- source_element(false, next_indent),
- enclosure_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def children
[@source, @enclosure, *@category].compact
@@ -565,12 +432,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
-
private
def maker_target(item)
item.enclosure
@@ -640,20 +501,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- description_element(false, next_indent),
- name_element(false, next_indent),
- link_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def _tags
%w(title description name link).each do |name|
diff --git a/lib/rss/1.0.rb b/lib/rss/1.0.rb
index 9410fceb6a..060de8ff30 100644
--- a/lib/rss/1.0.rb
+++ b/lib/rss/1.0.rb
@@ -42,14 +42,13 @@ module RSS
["textinput", "?"],
].each do |tag, occurs|
install_model(tag, occurs)
+ if occurs == "+"
+ install_have_children_element(tag)
+ else
+ install_have_child_element(tag)
+ end
end
- %w(channel image textinput).each do |name|
- install_have_child_element(name)
- end
-
- install_have_children_element("item")
-
attr_accessor :rss_version, :version, :encoding, :standalone
def initialize(version=nil, encoding=nil, standalone=nil)
@@ -59,20 +58,6 @@ module RSS
def full_name
tag_name_with_prefix(PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent, ns_declarations) do |next_indent|
- [
- channel_element(false, next_indent),
- image_element(false, next_indent),
- item_elements(false, next_indent),
- textinput_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
private
def children
@@ -119,12 +104,6 @@ module RSS
def full_name
tag_name_with_prefix(PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
end
class Seq < Element
@@ -153,15 +132,6 @@ module RSS
@li = args[0] if args[0]
end
end
-
- def to_s(need_convert=true, indent='')
- tag(indent) do |next_indent|
- [
- li_elements(need_convert, next_indent),
- other_element(need_convert, next_indent),
- ]
- end
- end
def full_name
tag_name_with_prefix(PREFIX)
@@ -217,15 +187,6 @@ module RSS
@li = args[0] if args[0]
end
end
-
- def to_s(need_convert=true, indent='')
- tag(indent) do |next_indent|
- [
- li_elements(need_convert, next_indent),
- other_element(need_convert, next_indent),
- ]
- end
- end
def full_name
tag_name_with_prefix(PREFIX)
@@ -302,22 +263,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- link_element(false, next_indent),
- description_element(false, next_indent),
- image_element(false, next_indent),
- items_element(false, next_indent),
- textinput_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def children
[@image, @items, @textinput]
@@ -371,12 +316,6 @@ module RSS
self.resource = args[0]
end
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
end
class Textinput < Element
@@ -406,12 +345,6 @@ module RSS
self.resource = args[0]
end
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
end
class Items < Element
@@ -441,15 +374,6 @@ module RSS
end
self.Seq ||= Seq.new
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- Seq_element(need_convert, next_indent),
- other_element(need_convert, next_indent),
- ]
- end
- end
def resources
if @Seq
@@ -518,19 +442,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- url_element(false, next_indent),
- link_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def _tags
[
@@ -588,19 +499,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- link_element(false, next_indent),
- description_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def _tags
[
@@ -662,20 +560,6 @@ module RSS
end
end
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- title_element(false, next_indent),
- description_element(false, next_indent),
- name_element(false, next_indent),
- link_element(false, next_indent),
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
-
private
def _tags
[
diff --git a/lib/rss/2.0.rb b/lib/rss/2.0.rb
index 5f8da1f4f7..5b3feab300 100644
--- a/lib/rss/2.0.rb
+++ b/lib/rss/2.0.rb
@@ -28,15 +28,6 @@ module RSS
install_model(name, occurs)
end
- def other_element(need_convert, indent)
- rv = <<-EOT
-#{category_elements(need_convert, indent)}
-#{generator_element(need_convert, indent)}
-#{ttl_element(need_convert, indent)}
-EOT
- rv << super
- end
-
private
alias children09 children
def children
@@ -85,18 +76,6 @@ EOT
install_have_child_element(name)
install_model(name, occurs)
end
-
- def other_element(need_convert, indent)
- rv = [
- super,
- *%w(author comments pubDate guid).collect do |name|
- __send__("#{name}_element", false, indent)
- end
- ].reject do |value|
- /\A\s*\z/.match(value)
- end
- rv.join("\n")
- end
private
alias children09 children
diff --git a/lib/rss/image.rb b/lib/rss/image.rb
index e4557bfeb9..325b751187 100644
--- a/lib/rss/image.rb
+++ b/lib/rss/image.rb
@@ -89,16 +89,6 @@ module RSS
def full_name
tag_name_with_prefix(IMAGE_PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
private
def _tags
@@ -191,16 +181,6 @@ module RSS
def full_name
tag_name_with_prefix(IMAGE_PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- other_element(false, next_indent),
- ]
- end
- rv = convert(rv) if need_convert
- rv
- end
private
def maker_target(target)
diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb
index ab4dd1d87a..3dc9999e6f 100644
--- a/lib/rss/rss.rb
+++ b/lib/rss/rss.rb
@@ -231,11 +231,13 @@ EOC
private
def install_element(name, postfix="")
elem_name = name.sub('_', ':')
+ method_name = "#{name}_element#{postfix}"
+ add_to_element_method(method_name)
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
- def #{name}_element#{postfix}(need_convert=true, indent='')
+ def #{method_name}(need_convert=true, indent='')
#{yield(name, elem_name)}
end
- private :#{name}_element#{postfix}
+ private :#{method_name}
EOC
end
@@ -379,23 +381,6 @@ EOC
alias_method(:set_#{accessor_name}, :#{accessor_name}=)
EOC
end
-
- def def_content_only_to_s
- module_eval(<<-EOC, *get_file_and_line_from_caller(2))
- def to_s(need_convert=true, indent='')
- if @content
- rv = tag(indent) do |next_indent|
- h(@content)
- end
- rv = convert(rv) if need_convert
- rv
- else
- ""
- end
- end
-EOC
- end
-
end
class Element
@@ -409,6 +394,7 @@ EOC
MODEL = []
GET_ATTRIBUTES = []
HAVE_CHILDREN_ELEMENTS = []
+ TO_ELEMENT_METHODS = []
NEED_INITIALIZE_VARIABLES = []
PLURAL_FORMS = {}
@@ -426,6 +412,9 @@ EOC
def have_children_elements
HAVE_CHILDREN_ELEMENTS
end
+ def to_element_methods
+ TO_ELEMENT_METHODS
+ end
def need_initialize_variables
NEED_INITIALIZE_VARIABLES
end
@@ -439,6 +428,7 @@ EOC
klass.const_set("MODEL", [])
klass.const_set("GET_ATTRIBUTES", [])
klass.const_set("HAVE_CHILDREN_ELEMENTS", [])
+ klass.const_set("TO_ELEMENT_METHODS", [])
klass.const_set("NEED_INITIALIZE_VARIABLES", [])
klass.const_set("PLURAL_FORMS", {})
@@ -461,6 +451,9 @@ EOC
def self.have_children_elements
HAVE_CHILDREN_ELEMENTS + super
end
+ def self.to_element_methods
+ TO_ELEMENT_METHODS + super
+ end
def self.need_initialize_variables
NEED_INITIALIZE_VARIABLES + super
end
@@ -511,7 +504,6 @@ EOC
def self.content_setup(type=nil)
def_corresponded_attr_writer "content", type
convert_attr_reader :content
- def_content_only_to_s
@have_content = true
end
@@ -523,6 +515,10 @@ EOC
HAVE_CHILDREN_ELEMENTS << [variable_name, plural_name]
end
+ def self.add_to_element_method(method_name)
+ TO_ELEMENT_METHODS << method_name
+ end
+
def self.add_need_initialize_variable(variable_name)
NEED_INITIALIZE_VARIABLES << variable_name
end
@@ -607,7 +603,24 @@ EOC
setup_maker_elements(target)
end
end
-
+
+ def to_s(need_convert=true, indent='')
+ if self.class.have_content?
+ return "" unless @content
+ rv = tag(indent) do |next_indent|
+ h(@content)
+ end
+ else
+ rv = tag(indent) do |next_indent|
+ self.class.to_element_methods.collect do |method_name|
+ __send__(method_name, false, next_indent)
+ end
+ end
+ end
+ rv = convert(rv) if need_convert
+ rv
+ end
+
private
def initialize_variables(attrs)
normalized_attrs = {}
@@ -632,13 +645,13 @@ EOC
end
end
- def tag(indent, additional_attrs=[], &block)
+ def tag(indent, additional_attrs={}, &block)
next_indent = indent + INDENT
attrs = collect_attrs
return "" if attrs.nil?
- attrs += additional_attrs
+ attrs.update(additional_attrs)
start_tag = make_start_tag(indent, next_indent, attrs)
if block
@@ -675,13 +688,15 @@ EOC
end
def collect_attrs
- _attrs.collect do |name, required, alias_name|
+ attrs = {}
+ _attrs.each do |name, required, alias_name|
value = __send__(alias_name || name)
return nil if required and value.nil?
- [name, value]
- end.reject do |name, value|
- value.nil?
+ next if value.nil?
+ return nil if attrs.has_key?(name)
+ attrs[name] = value
end
+ attrs
end
def tag_name_with_prefix(prefix)
@@ -789,18 +804,6 @@ EOC
end
end
- def other_element(need_convert, indent='')
- rv = []
- private_methods.each do |meth|
- if /\A([^_]+)_[^_]+_elements?\z/ =~ meth and
- self.class::NSPOOL.has_key?($1)
- res = __send__(meth, need_convert, indent)
- rv << res if /\A\s*\z/ !~ res
- end
- end
- rv.join("\n")
- end
-
def _validate(ignore_unknown_element, tags, uri, model=self.class.model)
count = 1
do_redo = false
@@ -947,9 +950,9 @@ EOC
end
private
- def tag(indent, attrs, &block)
+ def tag(indent, attrs={}, &block)
rv = xmldecl + xml_stylesheet_pi
- rv << super(indent, attrs, &block)
+ rv << super(indent, ns_declarations.merge(attrs), &block)
rv
end
@@ -964,10 +967,12 @@ EOC
end
def ns_declarations
+ decls = {}
self.class::NSPOOL.collect do |prefix, uri|
prefix = ":#{prefix}" unless prefix.empty?
- ["xmlns#{prefix}", uri]
+ decls["xmlns#{prefix}"] = uri
end
+ decls
end
def setup_maker_elements(maker)
diff --git a/lib/rss/taxonomy.rb b/lib/rss/taxonomy.rb
index 7dd22707f7..d788976d92 100644
--- a/lib/rss/taxonomy.rb
+++ b/lib/rss/taxonomy.rb
@@ -85,15 +85,6 @@ module RSS
def maker_target(target)
target.taxo_topics
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- Bag_element(need_convert, next_indent),
- other_element(need_convert, next_indent),
- ]
- end
- end
def resources
if @Bag
@@ -173,14 +164,6 @@ module RSS
def full_name
tag_name_with_prefix(TAXO_PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent) do |next_indent|
- [
- other_element(need_convert, next_indent),
- ]
- end
- end
def taxo_validate(ignore_unknown_element, tags, uri)
elements = %w(link topics)
diff --git a/lib/rss/trackback.rb b/lib/rss/trackback.rb
index 277bb738d5..e7983b8a6f 100644
--- a/lib/rss/trackback.rb
+++ b/lib/rss/trackback.rb
@@ -148,12 +148,6 @@ module RSS
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
end
class TrackBackAbout < Element
@@ -195,12 +189,6 @@ module RSS
def full_name
tag_name_with_prefix(TRACKBACK_PREFIX)
end
-
- def to_s(need_convert=true, indent='')
- rv = tag(indent)
- rv = convert(rv) if need_convert
- rv
- end
private
def maker_target(abouts)