diff --git a/lib/will_paginate/view_helpers.rb b/lib/will_paginate/view_helpers.rb index 9233f3406..3f895dbc7 100644 --- a/lib/will_paginate/view_helpers.rb +++ b/lib/will_paginate/view_helpers.rb @@ -30,9 +30,10 @@ module ViewHelpers :separator => ' ', # single space is friendly to spiders and non-graphic browsers :param_name => :page, :params => nil, - :renderer => 'WillPaginate::LinkRenderer', + :renderer => nil, :page_links => true, - :container => true + :container => true, + :xml => false } mattr_reader :pagination_options @@ -104,6 +105,7 @@ def will_paginate(collection = nil, options = {}) end # get the renderer instance + options[:renderer] ||= options[:xml] ? 'WillPaginate::XmlLinkRenderer' : 'WillPaginate::LinkRenderer' renderer = case options[:renderer] when String options[:renderer].to_s.constantize.new @@ -111,7 +113,9 @@ def will_paginate(collection = nil, options = {}) options[:renderer].new else options[:renderer] - end + end + + # render HTML for pagination renderer.prepare collection, options, self renderer.to_html @@ -251,7 +255,11 @@ def html_attributes end protected - + + def options + @options + end + # Collects link items for visible page numbers. def windowed_links prev = nil @@ -387,4 +395,14 @@ def stringified_merge(target, other) end end end + + class XmlLinkRenderer < LinkRenderer + def to_html + buffer = options[:buffer] || "" + xml = options[:builder] || Builder::XmlMarkup.new(:target => buffer, :indent => 2, :margin => 1) + xml.link :rel => 'next', :href => url_for(@collection.next_page) unless @collection.next_page.nil? + xml.link :rel => 'prev', :href => url_for(@collection.previous_page) unless @collection.previous_page.nil? + xml.target! + end + end end diff --git a/test/view_test.rb b/test/view_test.rb index bd6b77f82..2b1d14029 100644 --- a/test/view_test.rb +++ b/test/view_test.rb @@ -165,6 +165,64 @@ def test_container_id end end + ## XML rendering ## + + def test_xml_pagination_output_with_prev_and_next + paginate({:page => 2, :per_page => 5, :total_entries => 22}, :xml => true) + expected = <<-XML + + + XML + assert_dom_equal expected, @html_result + end + + def test_xml_pagination_output_with_prev_only + paginate({:page => 2, :per_page => 5, :total_entries => 10}, :xml => true) + expected = <<-XML + + XML + assert_dom_equal expected, @html_result + end + + def test_xml_pagination_output_with_next_only + paginate({:page => 1, :per_page => 5, :total_entries => 10}, :xml => true) + expected = <<-XML + + XML + assert_dom_equal expected, @html_result + end + + def test_xml_pagination_output_with_single_page + paginate({:page => 1, :per_page => 5, :total_entries => 5}, :xml => true) + expected = "" + assert_dom_equal expected, @html_result + end + + def test_xml_pagination_output_with_builder + expected = <<-XML + + + + + XML + xml = Builder::XmlMarkup.new(:indent => 4, :margin => 1) + xml.navigation do + paginate({:page => 2, :per_page => 5, :total_entries => 22}, {:xml => true, :builder => xml}) + end + assert_dom_equal expected, xml.target! + end + + def test_xml_pagination_output_with_buffer + buffer =" Result: \n" + paginate({:page => 2, :per_page => 5, :total_entries => 22}, {:xml => true, :buffer => buffer}) + expected = <<-XML + Result: + + + XML + assert_dom_equal expected, buffer + end + ## other helpers ## def test_paginated_section