class Sigmund::Liquid::Tags::CustomPaginate

Constants

Syntax

Public Class Methods

new(tag_name, markup, tokens, context) click to toggle source
Calls superclass method
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 11
def initialize(tag_name, markup, tokens, context)
  if markup =~ Syntax
    @collection_name = $1
    @options = { }
    markup.scan(::Liquid::TagAttributes) { |key, value| @options[key.to_sym] = value.gsub(/^'/, '').gsub(/'$/, '') }
    @per_page = @options[:per_page] ? @options[:per_page] : 10
    @window_size = @options[:window_size] ? @options[:window_size].to_i : 3
  else
    raise ::Liquid::SyntaxError.new("Syntax Error in 'paginate' - Valid syntax: paginate <collection> by <number>")
  end

  super
end

Public Instance Methods

render(context) click to toggle source
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 25
def render(context)
  context.stack do
    collection = context[@collection_name]
    @per_page = context[@per_page]

    if @per_page == 'all' 
      @per_page = collection.size + 1
    end

    raise ::Liquid::ArgumentError.new("Cannot paginate array '#{@collection_name}'. Not found.") if collection.nil?

    if collection.is_a? Array
      pagination = Kaminari.paginate_array(collection).page(context['current_page']).per(@per_page).to_liquid.stringify_keys
    else
      pagination = collection.send(:paginate, {
        page:       context['current_page'],
        per_page:   @per_page
      }).to_liquid.stringify_keys
    end
    page_count, current_page = pagination['total_pages'], pagination['current_page']

    path = sanitize_path(context['fullpath'])

    pagination['previous'] = link(I18n.t('pagination.previous'), current_page - 1, path) if pagination['previous_page']
    pagination['next'] = link(I18n.t('pagination.next'), current_page + 1, path) if pagination['next_page']
    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, path)
        elsif page == page_count 
          pagination['parts'] << link(page, page, path)
        elsif page <= current_page - window_size or page >= current_page + window_size
          next if hellip_break
          pagination['parts'] << no_link('&laquo;')
          hellip_break = true
          next
        else
          pagination['parts'] << link(page, page, path)
        end
        hellip_break = false
      end
    end

    context['custom_paginate'] = pagination

    render_all(@nodelist, context)
  end
end

Private Instance Methods

sanitize_path(path) click to toggle source
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 82
def sanitize_path(path)
  _path = path.gsub(/page=[0-9]+&?/, '').gsub(/_pjax=true&?/, '')
  _path = _path.slice(0..-2) if _path.last == '?' || _path.last == '&'
  _path
end
window_size() click to toggle source
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 88
def window_size
  @window_size
end