class Liquid::Rails::PaginateTag

Constants

Syntax

Public Class Methods

new(tag_name, markup, context) click to toggle source
Calls superclass method
# File lib/liquid-rails/tags/paginate_tag.rb, line 16
def initialize(tag_name, markup, context)
  super

  if markup =~ Syntax
    @collection_name = $1
    @page_size = if $2
      $3.to_i
    else
      25
    end

    @attributes = { 'window_size' => 3 }
    markup.scan(Liquid::TagAttributes) do |key, value|
      @attributes[key] = value
    end
  else
    raise SyntaxError.new("Syntax Error in tag 'paginate' - Valid syntax: paginate [collection] by number")
  end
end

Public Instance Methods

render(context) click to toggle source
Calls superclass method
# File lib/liquid-rails/tags/paginate_tag.rb, line 36
def render(context)
  @context = context

  context.stack do
    collection = @context[@collection_name].presence || @context.environments[0][@collection_name]
    raise ::Liquid::ArgumentError.new("Cannot paginate collection '#{@collection_name}'. Not found.") if collection.nil?

    if collection.is_a? Array
      paginated_collection = Kaminari.paginate_array(collection.to_a).page(current_page).per(@page_size)
    elsif collection.respond_to?(:page)
      paginated_collection = collection.page(current_page).per(@page_size)
    end

    page_count = paginated_collection.total_pages
    pagination = {}
    pagination['collection']      = paginated_collection
    pagination['current_offset']  = (current_page-1) * @page_size
    pagination['current_page']    = current_page
    pagination['page_size']       = @page_size
    pagination['pages']           = page_count
    pagination['items']           = paginated_collection.total_count
    pagination['previous']        = link('« Previous'.html_safe, current_page-1 ) unless 1 >= current_page
    pagination['next']            = link('Next &raquo;'.html_safe, current_page+1 )     unless page_count < current_page+1
    pagination['parts']           = []

    hellip_break = false
    if page_count > 1
      1.upto(page_count) do |page|

        if current_page == page
          pagination['parts'] << no_link(page)
        elsif page == 1
          pagination['parts'] << link(page, page)
        elsif page == page_count - 1
          pagination['parts'] << link(page, page)
        elsif page <= current_page - window_size or page >= current_page + window_size
          next if hellip_break
          pagination['parts'] << no_link('&hellip;')
          hellip_break = true
          next
        else
          pagination['parts'] << link(page, page)
        end

        hellip_break = false
      end
    end
    context['paginate'] = pagination

    super
  end
end

Private Instance Methods

current_page() click to toggle source
# File lib/liquid-rails/tags/paginate_tag.rb, line 91
def current_page
  _current_page = @context.registers[:controller].params[:page]
  _current_page.nil? ? 1 : _current_page.to_i
end
current_url() click to toggle source
# File lib/liquid-rails/tags/paginate_tag.rb, line 96
def current_url
  current_url = @context.registers[:controller].request.fullpath.gsub(/page=[0-9]+&?/, '')
  current_url = current_url.slice(0..-2) if current_url.last == '?' || current_url.last == '&'
  current_url
end
window_size() click to toggle source
# File lib/liquid-rails/tags/paginate_tag.rb, line 102
def window_size
  @attributes['window_size']
end