diff options
author | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-16 04:39:58 +0000 |
---|---|---|
committer | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-16 04:39:58 +0000 |
commit | 0ebac90b0ebb07ad2aa99080c8509559a7ddc74d (patch) | |
tree | 4e0e2233ffd5cc0a5e1052471c41d5f3d3172d6e /lib | |
parent | 64422ae4941480634fbc2788d73ec3ba44c70b4b (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')
-rw-r--r-- | lib/rss/0.9.rb | 139 | ||||
-rw-r--r-- | lib/rss/1.0.rb | 126 | ||||
-rw-r--r-- | lib/rss/2.0.rb | 20 | ||||
-rw-r--r-- | lib/rss/parser.rb | 4 | ||||
-rw-r--r-- | lib/rss/rss.rb | 35 | ||||
-rw-r--r-- | lib/rss/trackback.rb | 22 |
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 |