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