Class: Dimples::Pager

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dimples/pager.rb

Overview

A class for paginating a collection of posts.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site, url, posts) ⇒ Pager

Returns a new instance of Pager.



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/dimples/pager.rb', line 14

def initialize(site, url, posts)
  @site = site
  @url = url
  @posts = posts

  @per_page = @site.config.pagination[:per_page]
  @page_prefix = @site.config.pagination[:page_prefix]
  @page_count = (posts.length.to_f / @per_page.to_i).ceil

  step_to(1)
end

Instance Attribute Details

#current_pageObject (readonly)

Returns the value of attribute current_page.



8
9
10
# File 'lib/dimples/pager.rb', line 8

def current_page
  @current_page
end

#next_pageObject (readonly)

Returns the value of attribute next_page.



8
9
10
# File 'lib/dimples/pager.rb', line 8

def next_page
  @next_page
end

#page_countObject (readonly)

Returns the value of attribute page_count.



8
9
10
# File 'lib/dimples/pager.rb', line 8

def page_count
  @page_count
end

#previous_pageObject (readonly)

Returns the value of attribute previous_page.



8
9
10
# File 'lib/dimples/pager.rb', line 8

def previous_page
  @previous_page
end

Class Method Details

.paginate(site, url, posts, metadata = {}) ⇒ Object



10
11
12
# File 'lib/dimples/pager.rb', line 10

def self.paginate(site, url, posts,  = {})
  new(site, url, posts).paginate()
end

Instance Method Details

#current_page_urlObject



57
58
59
# File 'lib/dimples/pager.rb', line 57

def current_page_url
  @current_page == 1 ? @url : "#{@url}#{@page_prefix}#{@current_page}"
end

#first_page_urlObject



61
62
63
# File 'lib/dimples/pager.rb', line 61

def first_page_url
  @url
end

#last_page_urlObject



65
66
67
# File 'lib/dimples/pager.rb', line 65

def last_page_url
  @page_count == 1 ? @url : "#{@url}#{@page_prefix}#{@page_count}"
end

#metadataObject



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/dimples/pager.rb', line 89

def 
  {
    posts: posts_at(current_page),
    current_page: @current_page,
    page_count: @page_count,
    post_count: @posts.count,
    previous_page: @previous_page,
    next_page: @next_page,
    urls: urls
  }
end

#next_page?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/dimples/pager.rb', line 53

def next_page?
  @current_page + 1 <= @page_count
end

#next_page_urlObject



75
76
77
# File 'lib/dimples/pager.rb', line 75

def next_page_url
  "#{@url}#{@page_prefix}#{@next_page}" if @next_page
end

#paginate(metadata) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/dimples/pager.rb', line 26

def paginate()
  (1..@page_count).each do |index|
    step_to(index)

    @site.layouts['posts']&.write(
      File.join(@site.config.build_paths[:root], current_page_url, 'index.html'),
      .merge(pagination: self., url: current_page_url)
    )
  end
end

#posts_at(page) ⇒ Object



45
46
47
# File 'lib/dimples/pager.rb', line 45

def posts_at(page)
  @posts.slice((page - 1) * @per_page, @per_page)
end

#previous_page?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/dimples/pager.rb', line 49

def previous_page?
  (@current_page - 1).positive?
end

#previous_page_urlObject



69
70
71
72
73
# File 'lib/dimples/pager.rb', line 69

def previous_page_url
  return unless @previous_page

  @previous_page == 1 ? @url : "#{@url}#{@page_prefix}#{@previous_page}"
end

#step_to(page) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/dimples/pager.rb', line 37

def step_to(page)
  @current_page = page
  @previous_page = previous_page? ? @current_page - 1 : nil
  @next_page = next_page? ? @current_page + 1 : nil

  @current_page
end

#urlsObject



79
80
81
82
83
84
85
86
87
# File 'lib/dimples/pager.rb', line 79

def urls
  {
    current_page: current_page_url,
    first_page: first_page_url,
    last_page: last_page_url,
    previous_page: previous_page_url,
    next_page: next_page_url
  }
end