Class: Jekyll::Paginate::Pager

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll-paginate/pager.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site, page, all_posts, num_pages = nil) ⇒ Pager

Initialize a new Pager.

site - the Jekyll::Site object page - The Integer page number. all_posts - The Array of all the site’s Posts. num_pages - The Integer number of pages or nil if you’d like the number

of pages calculated.


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/jekyll-paginate/pager.rb', line 98

def initialize(site, page, all_posts, num_pages = nil)
  @page = page
  @per_page = site.config['paginate'].to_i
  @total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page)

  if @page > @total_pages
    raise RuntimeError, "page number can't be greater than total pages: #{@page} > #{@total_pages}"
  end

  init = (@page - 1) * @per_page
  offset = (init + @per_page - 1) >= all_posts.size ? all_posts.size : (init + @per_page - 1)

  @total_posts = all_posts.size
  @posts = all_posts[init..offset]
  @previous_page = @page != 1 ? @page - 1 : nil
  @previous_page_path = Pager.paginate_path(site, @previous_page)
  @next_page = @page != @total_pages ? @page + 1 : nil
  @next_page_path = Pager.paginate_path(site, @next_page)
end

Instance Attribute Details

#next_pageObject (readonly)

Returns the value of attribute next_page.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def next_page
  @next_page
end

#next_page_pathObject (readonly)

Returns the value of attribute next_page_path.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def next_page_path
  @next_page_path
end

#pageObject (readonly)

Returns the value of attribute page.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def page
  @page
end

#per_pageObject (readonly)

Returns the value of attribute per_page.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def per_page
  @per_page
end

#postsObject (readonly)

Returns the value of attribute posts.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def posts
  @posts
end

#previous_pageObject (readonly)

Returns the value of attribute previous_page.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def previous_page
  @previous_page
end

#previous_page_pathObject (readonly)

Returns the value of attribute previous_page_path.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def previous_page_path
  @previous_page_path
end

#total_pagesObject (readonly)

Returns the value of attribute total_pages.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def total_pages
  @total_pages
end

#total_postsObject (readonly)

Returns the value of attribute total_posts.



4
5
6
# File 'lib/jekyll-paginate/pager.rb', line 4

def total_posts
  @total_posts
end

Class Method Details

.calculate_pages(all_posts, per_page) ⇒ Object

Calculate the number of pages.

all_posts - The Array of all Posts. per_page - The Integer of entries per page.

Returns the Integer number of pages.



13
14
15
# File 'lib/jekyll-paginate/pager.rb', line 13

def self.calculate_pages(all_posts, per_page)
  (all_posts.size.to_f / per_page.to_i).ceil
end

.ensure_leading_slash(path) ⇒ Object

Static: Return a String version of the input which has a leading slash.

If the input already has a forward slash in position zero, it will be
returned unchanged.

path - a String path

Returns the path with a leading slash



78
79
80
# File 'lib/jekyll-paginate/pager.rb', line 78

def self.ensure_leading_slash(path)
  path[0..0] == "/" ? path : "/#{path}"
end

.in_hierarchy(source, page_dir, paginate_path) ⇒ Object

Determine if the subdirectories of the two paths are the same relative to source

source - the site source page_dir - the directory of the Jekyll::Page paginate_path - the absolute paginate path (from root of FS)

Returns whether the subdirectories are the same relative to source



50
51
52
53
54
55
# File 'lib/jekyll-paginate/pager.rb', line 50

def self.in_hierarchy(source, page_dir, paginate_path)
  return false if paginate_path == File.dirname(paginate_path)
  return false if paginate_path == Pathname.new(source).parent
  page_dir == paginate_path ||
    in_hierarchy(source, page_dir, File.dirname(paginate_path))
end

.paginate_path(site, num_page) ⇒ Object

Static: Return the pagination path of the page

site - the Jekyll::Site object num_page - the pagination page number

Returns the pagination path as a string



63
64
65
66
67
68
69
# File 'lib/jekyll-paginate/pager.rb', line 63

def self.paginate_path(site, num_page)
  return nil if num_page.nil?
  return Pagination.first_page_url(site) if num_page <= 1
  format = site.config['paginate_path']
  format = format.sub(':num', num_page.to_s)
  ensure_leading_slash(format)
end

.pagination_candidate?(config, page) ⇒ Boolean

Static: Determine if a page is a possible candidate to be a template page.

Page's name must be `index.html` and exist in any of the directories
between the site source and `paginate_path`.

config - the site configuration hash page - the Jekyll::Page about which we’re inquiring

Returns true if the

Returns:

  • (Boolean)


35
36
37
38
39
40
41
# File 'lib/jekyll-paginate/pager.rb', line 35

def self.pagination_candidate?(config, page)
  page_dir = File.dirname(File.expand_path(remove_leading_slash(page.path), config['source']))
  paginate_path = remove_leading_slash(config['paginate_path'])
  paginate_path = File.expand_path(paginate_path, config['source'])
  page.name == 'index.html' &&
    in_hierarchy(config['source'], page_dir, File.dirname(paginate_path))
end

.pagination_enabled?(site) ⇒ Boolean

Determine if pagination is enabled the site.

site - the Jekyll::Site object

Returns true if pagination is enabled, false otherwise.

Returns:

  • (Boolean)


22
23
24
25
# File 'lib/jekyll-paginate/pager.rb', line 22

def self.pagination_enabled?(site)
 !site.config['paginate'].nil? &&
   site.pages.size > 0
end

.remove_leading_slash(path) ⇒ Object

Static: Return a String version of the input without a leading slash.

path - a String path

Returns the input without the leading slash



87
88
89
# File 'lib/jekyll-paginate/pager.rb', line 87

def self.remove_leading_slash(path)
  ensure_leading_slash(path)[1..-1]
end

Instance Method Details

#to_liquidObject

Convert this Pager’s data to a Hash suitable for use by Liquid.

Returns the Hash representation of this Pager.



121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/jekyll-paginate/pager.rb', line 121

def to_liquid
  {
    'page' => page,
    'per_page' => per_page,
    'posts' => posts,
    'total_posts' => total_posts,
    'total_pages' => total_pages,
    'previous_page' => previous_page,
    'previous_page_path' => previous_page_path,
    'next_page' => next_page,
    'next_page_path' => next_page_path
  }
end