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('«') 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
link(title, page, path)
click to toggle source
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 96 def link(title, page, path) _path = %(#{path}#{path.include?('?') ? '&' : '?'}page=#{page}) { 'title' => title, 'url' => _path, 'is_link' => true } end
no_link(title)
click to toggle source
# File lib/sigmund/liquid/tags/custom_paginate.rb, line 92 def no_link(title) { 'title' => title, 'is_link' => false, 'hellip_break' => title == '…' } end
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