module Awestruct
module Extensions
class Paginator
module Paginated
attr_accessor :window
attr_accessor :next_page
attr_accessor :previous_page
attr_accessor :current_page
attr_accessor :current_page_index
attr_accessor :pages
def links
html = %Q(
)
html
end
end
def initialize(prop_name, input_path, opts={})
@prop_name = prop_name
@input_path = input_path
@per_page = opts[:per_page] || 20
@window_size = opts[:window_size] || 2
@remove_input = opts.has_key?( :remove_input ) ? opts[:remove_input] : true
@output_prefix = opts[:output_prefix] || File.dirname( @input_path )
@collection = opts[:collection]
end
def execute(site)
removal_path = nil
all = @collection || site.send( @prop_name )
i = 1
paginated_pages = []
all.each_slice( @per_page ) do |slice|
page = site.engine.find_and_load_site_page( @input_path )
removal_path ||= page.output_path
slice.extend( Paginated )
page.send( "#{@prop_name}=", slice )
if ( i == 1 )
page.output_path = File.join( @output_prefix, File.basename( @input_path ) + ".html" )
else
page.output_path = File.join( @output_prefix, "page#{i}.html" )
end
page.paginate_generated = true
site.pages << page
paginated_pages << page
i = i + 1
end
if ( @remove_input )
site.pages.reject!{|page|
( ! page.paginate_generated && ( page.output_path == removal_path ) )
}
end
prev_page = nil
paginated_pages.each_with_index do |page,i|
page.send( @prop_name ).current_page = page
page.send( @prop_name ).current_page_index = i
page.send( @prop_name ).pages = paginated_pages
page.send( @prop_name ).window = 1
if ( prev_page != nil )
prev_page.send( @prop_name ).next_page = page
page.send( @prop_name ).previous_page = prev_page
end
prev_page = page
end
paginated_pages.first
end
end
end
end