module PaginationHelper def smart_paginator(records, &block) if records.is_sequential_paginator? || params[:page].to_i > 200 sequential_paginator(records) else numbered_paginator(records, &block) end end def sequential_paginator(records) html = "" unless records.is_first_page? html << '
  • ' + link_to("« Previous", params.merge(:page => "b#{records.first_id}")) + '
  • ' end unless records.is_last_page? html << '
  • ' + link_to("Next »", params.merge(:page => "a#{records.last_id}")) + '
  • ' end html << "
    " html.html_safe end def numbered_paginator(records, &block) html = "" window = 3 if records.total_pages <= (window * 2) + 5 1.upto(records.total_pages) do |page| html << numbered_paginator_item(page, records.current_page, &block) end elsif records.current_page <= window + 2 1.upto(records.current_page + window) do |page| html << numbered_paginator_item(page, records.current_page, &block) end html << numbered_paginator_item("...", records.current_page, &block) html << numbered_paginator_final_item(records.total_pages, records.current_page, &block) elsif records.current_page >= records.total_pages - (window + 1) html << numbered_paginator_item(1, records.current_page, &block) html << numbered_paginator_item("...", records.current_page, &block) (records.current_page - window).upto(records.total_pages) do |page| html << numbered_paginator_item(page, records.current_page, &block) end else html << numbered_paginator_item(1, records.current_page, &block) html << numbered_paginator_item("...", records.current_page, &block) (records.current_page - window).upto(records.current_page + window) do |page| html << numbered_paginator_item(page, records.current_page, &block) end html << numbered_paginator_item("...", records.current_page, &block) html << numbered_paginator_final_item(records.total_pages, records.current_page, &block) end html << "" html.html_safe end def numbered_paginator_final_item(total_pages, current_page, &block) if total_pages <= 200 numbered_paginator_item(total_pages, current_page, &block) else "" end end def numbered_paginator_item(page, current_page, &block) html = "
  • " if page == "..." html << "..." elsif page == current_page html << page.to_s else html << capture(page, &block) end html << "
  • " html.html_safe end end