Skip to content

Commit

Permalink
Simple XML Pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
stilkov committed Dec 21, 2008
1 parent 299f1f3 commit a8fe630
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 4 deletions.
26 changes: 22 additions & 4 deletions lib/will_paginate/view_helpers.rb
Expand Up @@ -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

Expand Down Expand Up @@ -104,14 +105,17 @@ 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
when Class
options[:renderer].new
else
options[:renderer]
end
end


# render HTML for pagination
renderer.prepare collection, options, self
renderer.to_html
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
58 changes: 58 additions & 0 deletions test/view_test.rb
Expand Up @@ -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
<link rel="next" href="/foo/bar?page=3" />
<link rel="prev" href="/foo/bar?page=1" />
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
<link rel="prev" href="/foo/bar?page=1" />
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
<link rel="next" href="/foo/bar?page=2" />
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
<navigation>
<link rel="next" href="/foo/bar?page=3" />
<link rel="prev" href="/foo/bar?page=1" />
</navigation>
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:
<link rel="next" href="/foo/bar?page=3" />
<link rel="prev" href="/foo/bar?page=1" />
XML
assert_dom_equal expected, buffer
end

## other helpers ##

def test_paginated_section
Expand Down

0 comments on commit a8fe630

Please sign in to comment.