summaryrefslogtreecommitdiff
path: root/lib/rss
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-16 04:39:58 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-16 04:39:58 +0000
commit0ebac90b0ebb07ad2aa99080c8509559a7ddc74d (patch)
tree4e0e2233ffd5cc0a5e1052471c41d5f3d3172d6e /lib/rss
parent64422ae4941480634fbc2788d73ec3ba44c70b4b (diff)
* lib/rss: supported prety print.
* test/rss/test_1.0.rb: added test for calculating default indent size. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7047 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss')
-rw-r--r--lib/rss/0.9.rb139
-rw-r--r--lib/rss/1.0.rb126
-rw-r--r--lib/rss/2.0.rb20
-rw-r--r--lib/rss/parser.rb4
-rw-r--r--lib/rss/rss.rb35
-rw-r--r--lib/rss/trackback.rb22
6 files changed, 193 insertions, 153 deletions
diff --git a/lib/rss/0.9.rb b/lib/rss/0.9.rb
index c95c47e974..8486c4fc1f 100644
--- a/lib/rss/0.9.rb
+++ b/lib/rss/0.9.rb
@@ -51,16 +51,18 @@ module RSS
end
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOR
#{xmldecl}
-#{xml_stylesheet_pi}<rss version="#{@rss_version}"#{ns_declaration}>
-#{channel_element(false)}
-#{other_element(false, "\t")}
-</rss>
+#{xml_stylesheet_pi}
+#{indent}<rss version="#{@rss_version}"#{ns_declaration(next_indent)}>
+#{channel_element(false, next_indent)}
+#{other_element(false, next_indent)}
+#{inent}}</rss>
EOR
- rv = @converter.convert(rv) if convert and @converter
- rv
+ rv = @converter.convert(rv) if convert and @converter
+ remove_empty_newline(rv)
end
private
@@ -135,30 +137,31 @@ EOR
super()
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOT
- <channel>
- #{title_element(false)}
- #{link_element(false)}
- #{description_element(false)}
- #{language_element(false)}
- #{copyright_element(false)}
- #{managingEditor_element(false)}
- #{webMaster_element(false)}
- #{rating_element(false)}
- #{pubDate_element(false)}
- #{lastBuildDate_element(false)}
- #{docs_element(false)}
- #{skipDays_element(false)}
- #{skipHours_element(false)}
- #{image_element(false)}
-#{item_elements(false)}
- #{textInput_element(false)}
-#{other_element(false, "\t\t")}
- </channel>
+#{indent}<channel>
+#{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)}
+#{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)}
+#{indent}</channel>
EOT
rv = @converter.convert(rv) if convert and @converter
- rv
+ rv
end
private
@@ -208,17 +211,18 @@ EOT
install_model(x, "?")
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOT
- <image>
- #{url_element(false)}
- #{title_element(false)}
- #{link_element(false)}
- #{width_element(false)}
- #{height_element(false)}
- #{description_element(false)}
-#{other_element(false, "\t\t\t\t")}
- </image>
+#{indent}<image>
+#{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)}
+#{indent}</image>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -257,14 +261,15 @@ EOT
@protocol = protocol
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOT
- <cloud
- domain="#{h @domain}"
- port="#{h @port}"
- path="#{h @path}"
- registerProcedure="#{h @registerProcedure}"
- protocol="#{h @protocol}"/>
+#{indent}<cloud
+#{next_indent}domain="#{h @domain}"
+#{next_indent}port="#{h @port}"
+#{next_indent}path="#{h @path}"
+#{next_indent}registerProcedure="#{h @registerProcedure}"
+#{next_indent}protocol="#{h @protocol}"/>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -302,17 +307,18 @@ EOT
install_model(tag, occurs)
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOT
- <item>
- #{title_element(false)}
- #{link_element(false)}
- #{description_element(false)}
- #{category_element(false)}
- #{source_element(false)}
- #{enclosure_element(false)}
-#{other_element(false, "\t\t\t\t")}
- </item>
+#{indent}<item>
+#{title_element(false, next_indent)}
+#{link_element(false, next_indent)}
+#{description_element(false, next_indent)}
+#{category_element(false, next_indent)}
+#{source_element(false, next_indent)}
+#{enclosure_element(false, next_indent)}
+#{other_element(false, next_indent)}
+#{indent}</item>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -350,7 +356,7 @@ EOT
@content = content
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @url
rv = %Q! <source url="#{@url}">!
rv << %Q!#{@content}</source>!
@@ -393,7 +399,7 @@ EOT
@type = type
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @url and @length and @type
rv = %Q!<enclosure url="#{h @url}" !
rv << %Q!length="#{h @length}" type="#{h @type}"/>!
@@ -433,7 +439,7 @@ EOT
@content = content
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @domain
rv = %Q!<category domain="#{h @domain}">!
rv << %Q!#{h @content}</category>!
@@ -464,15 +470,16 @@ EOT
install_model(x, nil)
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EOT
- <textInput>
- #{title_element(false)}
- #{description_element(false)}
- #{name_element(false)}
- #{link_element(false)}
-#{other_element(false, "\t\t\t\t")}
- </textInput>
+#{indent}<textInput>
+#{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)}
+#{indent}</textInput>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
diff --git a/lib/rss/1.0.rb b/lib/rss/1.0.rb
index be141d73d8..999301c595 100644
--- a/lib/rss/1.0.rb
+++ b/lib/rss/1.0.rb
@@ -28,7 +28,7 @@ module RSS
end
- TAG_NAME.replace('RDF')
+ @tag_name = 'RDF'
PREFIX = 'rdf'
URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@@ -57,19 +57,21 @@ module RSS
super('1.0', version, encoding, standalone)
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
rv = <<-EORDF
#{xmldecl}
-#{xml_stylesheet_pi}<#{PREFIX}:RDF#{ns_declaration}>
-#{channel_element(false)}
-#{image_element(false)}
-#{item_elements(false)}
-#{textinput_element(false)}
-#{other_element(false, "\t")}
-</#{PREFIX}:RDF>
+#{xml_stylesheet_pi}
+#{indent}<#{PREFIX}:RDF#{ns_declaration(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)}
+#{indent}</#{PREFIX}:RDF>
EORDF
rv = @converter.convert(rv) if convert and @converter
- rv
+ remove_empty_newline(rv)
end
private
@@ -105,7 +107,7 @@ EORDF
end
- TAG_NAME.replace('Seq')
+ @tag_name = 'Seq'
install_have_children_element("li")
@@ -116,12 +118,13 @@ EORDF
@li = li
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
<<-EOT
- <#{PREFIX}:Seq>
-#{li_elements(convert, "\t\t\t\t")}
-#{other_element(convert, "\t\t\t\t")}
- </#{PREFIX}:Seq>
+#{indent}<#{PREFIX}:Seq>
+#{li_elements(convert, next_indent)}
+#{other_element(convert, next_indent)}
+#{indent}</#{PREFIX}:Seq>
EOT
end
@@ -167,9 +170,9 @@ EOT
@resource = resource
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @resource
- rv = %Q!<#{PREFIX}:li resource="#{h @resource}" />\n!
+ rv = %Q!#{indent}<#{PREFIX}:li resource="#{h @resource}" />\n!
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -228,19 +231,20 @@ EOT
@about = about
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
about = ''
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
rv = <<-EOT
- <channel #{about}>
- #{title_element(false)}
- #{link_element(false)}
- #{description_element(false)}
- #{image_element(false)}
-#{items_element(false)}
- #{textinput_element(false)}
-#{other_element(false, "\t\t")}
- </channel>
+#{indent}<channel #{about}>
+#{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)}
+#{indent}</channel>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -293,9 +297,9 @@ EOT
@resource = resource
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @resource
- rv = %Q!<image #{PREFIX}:resource="#{h @resource}" />!
+ rv = %Q!#{indent}<image #{PREFIX}:resource="#{h @resource}" />!
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -335,9 +339,9 @@ EOT
@resource = resource
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @resource
- rv = %Q|<textinput #{PREFIX}:resource="#{h @resource}" />|
+ rv = %Q|#{indent}<textinput #{PREFIX}:resource="#{h @resource}" />|
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -382,12 +386,13 @@ EOT
@Seq = seq
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
<<-EOT
- <items>
-#{Seq_element(convert)}
-#{other_element(convert, "\t\t\t")}
- </items>
+#{indent}<items>
+#{Seq_element(convert, next_indent)}
+#{other_element(convert, next_indent)}
+#{indent}</items>
EOT
end
@@ -446,16 +451,17 @@ EOT
@about = about
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
about = ''
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
rv = <<-EOT
- <image #{about}>
- #{title_element(false)}
- #{url_element(false)}
- #{link_element(false)}
-#{other_element(false, "\t\t")}
- </image>
+#{indent}<image #{about}>
+#{title_element(false, next_indent)}
+#{url_element(false, next_indent)}
+#{link_element(false, next_indent)}
+#{other_element(false, next_indent)}
+#{indent}</image>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -515,16 +521,17 @@ EOT
@about = about
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
about = ''
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
rv = <<-EOT
- <item #{about}>
- #{title_element(false)}
- #{link_element(false)}
- #{description_element(false)}
-#{other_element(false, "\t\t")}
- </item>
+#{indent}<item #{about}>
+#{title_element(false, next_indent)}
+#{link_element(false, next_indent)}
+#{description_element(false, next_indent)}
+#{other_element(false, next_indent)}
+#{indent}</item>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
@@ -585,17 +592,18 @@ EOT
@about = about
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
+ next_indent = indent + INDENT
about = ''
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
rv = <<-EOT
- <textinput #{about}>
- #{title_element(false)}
- #{description_element(false)}
- #{name_element(false)}
- #{link_element(false)}
-#{other_element(false, "\t\t")}
- </textinput>
+#{indent}<textinput #{about}>
+#{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)}
+#{indent}</textinput>
EOT
rv = @converter.convert(rv) if convert and @converter
rv
diff --git a/lib/rss/2.0.rb b/lib/rss/2.0.rb
index c6c6db58a7..c4d055e984 100644
--- a/lib/rss/2.0.rb
+++ b/lib/rss/2.0.rb
@@ -23,11 +23,11 @@ module RSS
install_model(x, occurs)
end
- def other_element(convert, indent='')
+ def other_element(convert, indent)
rv = <<-EOT
-#{indent}#{category_element(convert)}
-#{indent}#{generator_element(convert)}
-#{indent}#{ttl_element(convert)}
+#{category_element(convert, indent)}
+#{generator_element(convert, indent)}
+#{ttl_element(convert, indent)}
EOT
rv << super
end
@@ -73,12 +73,12 @@ EOT
install_model(x, occurs)
end
- def other_element(convert, indent='')
+ def other_element(convert, indent)
rv = <<-EOT
-#{indent}#{author_element(false)}
-#{indent}#{comments_element(false)}
-#{indent}#{pubDate_element(false)}
-#{indent}#{guid_element(false)}
+#{author_element(false, indent)}
+#{comments_element(false, indent)}
+#{pubDate_element(false, indent)}
+#{guid_element(false, indent)}
EOT
rv << super
end
@@ -116,7 +116,7 @@ EOT
@content = content
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @content
rv = %Q!<guid!
rv << %Q! isPermaLink="#{h @isPermaLink}"! if @isPermaLink
diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb
index 1a8fdd4930..9b9ff59173 100644
--- a/lib/rss/parser.rb
+++ b/lib/rss/parser.rb
@@ -286,8 +286,8 @@ module RSS
@proc_stack.push(nil)
else
parent = "ROOT ELEMENT???"
- if current_class.const_defined?("TAG_NAME")
- parent = current_class.const_get("TAG_NAME")
+ if current_class.tag_name
+ parent = current_class.tag_name
end
raise NotExceptedTagError.new(local, parent)
end
diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb
index 13eaf7c505..24ba0eb170 100644
--- a/lib/rss/rss.rb
+++ b/lib/rss/rss.rb
@@ -154,7 +154,7 @@ module RSS
install_element(name) do |n, elem_name|
<<-EOC
if @#{n}
- "\#{indent}\#{@#{n}.to_s(convert)}"
+ "\#{@#{n}.to_s(convert, indent)}"
else
''
end
@@ -171,7 +171,7 @@ EOC
<<-EOC
rv = ''
@#{n}.each do |x|
- rv << "\#{indent}\#{x.to_s(convert)}"
+ rv << "\#{x.to_s(convert, indent)}"
end
rv
EOC
@@ -320,14 +320,16 @@ EOC
extend BaseModel
include Utils
+ INDENT = " "
+
class << self
def inherited(klass)
klass.module_eval(<<-EOC)
public
- TAG_NAME = name.split('::').last.downcase
-
+ @tag_name = name.split(/::/).last.downcase
+ @indent_size = name.split(/::/).size - 2
@@must_call_validators = {}
@@ -415,6 +417,14 @@ EOC
self::NSPOOL[prefix] = uri
end
+ def tag_name
+ @tag_name
+ end
+
+ def indent_size
+ @indent_size
+ end
+
end
attr_accessor :do_validate
@@ -426,7 +436,7 @@ EOC
end
def tag_name
- self.class::TAG_NAME
+ self.class.tag_name
end
def converter=(converter)
@@ -498,7 +508,7 @@ EOC
def validate_attribute
_attrs.each do |a_name, required|
if required and send(a_name).nil?
- raise MissingAttributeError.new(self.class::TAG_NAME, a_name)
+ raise MissingAttributeError.new(self.class.tag_name, a_name)
end
end
end
@@ -615,6 +625,15 @@ EOC
rv
end
+ private
+ def calc_indent
+ INDENT * (self.class.indent_size)
+ end
+
+ def remove_empty_newline(string)
+ string.gsub(/^\s*$(?:\r?\n?)/, '')
+ end
+
end
module RootElementMixin
@@ -646,11 +665,11 @@ EOC
rv
end
- def ns_declaration
+ def ns_declaration(indent)
rv = ''
self.class::NSPOOL.each do |prefix, uri|
prefix = ":#{prefix}" unless prefix.empty?
- rv << %Q|\n\txmlns#{prefix}="#{html_escape(uri)}"|
+ rv << %Q|\n#{indent}xmlns#{prefix}="#{html_escape(uri)}"|
end
rv
end
diff --git a/lib/rss/trackback.rb b/lib/rss/trackback.rb
index ae33ff8854..b427895aad 100644
--- a/lib/rss/trackback.rb
+++ b/lib/rss/trackback.rb
@@ -76,9 +76,10 @@ module RSS
@resource = resource
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @resource
- rv = %Q!<#{TRACKBACK_PREFIX}:ping #{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>!
+ rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:ping ]
+ rv << %Q[#{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>]
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -121,9 +122,10 @@ module RSS
@resource = resource
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @resource
- rv = %Q!<#{TRACKBACK_PREFIX}:about #{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>!
+ rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:about ]
+ rv << %Q[#{::RSS::RDF::PREFIX}:resource="#{h @resource}"/>]
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -245,9 +247,11 @@ module RSS
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @content
- rv = %Q!<#{TRACKBACK_PREFIX}:ping>#{h @content}</#{TRACKBACK_PREFIX}:ping>!
+ rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:ping>]
+ rv << h(@content)
+ rv << %Q[</#{TRACKBACK_PREFIX}:ping>]
rv = @converter.convert(rv) if convert and @converter
rv
else
@@ -274,9 +278,11 @@ module RSS
end
- def to_s(convert=true)
+ def to_s(convert=true, indent=calc_indent)
if @content
- rv = %Q!<#{TRACKBACK_PREFIX}:about>#{h @content}</#{TRACKBACK_PREFIX}:about>!
+ rv = %Q[#{indent}<#{TRACKBACK_PREFIX}:about>]
+ rv << h(@content)
+ rv << %Q[</#{TRACKBACK_PREFIX}:about>]
rv = @converter.convert(rv) if convert and @converter
rv
else