views:

71

answers:

1

I have implemented the following custom link renderer class:

class PaginationListLinkRenderer < WillPaginate::LinkRenderer

  def to_html
    links = @options[:page_links] ? windowed_links : []

    links.unshift(page_link_or_span(@collection.previous_page, 'previous', @options[:previous_label]))
    links.push(page_link_or_span(@collection.next_page, 'next', @options[:next_label]))

    html = links.join(@options[:separator])
    @options[:container] ? @template.content_tag(:ul, html, html_attributes) : html
  end

protected

  def windowed_links
    visible_page_numbers.map { |n| page_link_or_span(n, (n == current_page ? 'current' : nil)) }
  end

  def page_link_or_span(page, span_class, text = nil)
    text ||= page.to_s
    if page && page != current_page
      page_link(page, text, :class => span_class)
    else
      page_span(page, text, :class => span_class)
    end
  end

  def page_link(page, text, attributes = {})
    @template.content_tag(:li, @template.link_to(text, url_for(page)), attributes)
  end

  def page_span(page, text, attributes = {})
    @template.content_tag(:li, text, attributes)
  end

end 

which is mostly the work of http://thewebfellas.com/blog/2008/8/3/roll-your-own-pagination-links-with-will_paginate

One issue I have though, there are 70 pages to be paginated, I have set the :inner_window=>2 and :outer_window=>2 and the pagination produces:

1 2 3 4 5 65 66 67

How can I add a "..." seperator between 5 and 65 in the page numbers?

A: 

Try using the following

protected

def gap_marker; '...'; end

def windowed_links
  prev = nil

  visible_page_numbers.inject [] do |links, n|
    # detect gaps:
    links << gap_marker if prev and n > prev + 1
    links << page_link_or_span(n)
    prev = n
    links
  end
end