Jekyll Index Pages
Index page generator for Jekyll sites. Generates paginated index pages for blog posts, categories and tags. It can also generate a paginated yearly archive, author and collection pages.
Installation
Add this line to your Gemfile:
gem "jekyll-index-pages"
And then execute:
$ bundle
Or install it yourself as:
$ gem install jekyll-index-pages
Finally add this line to gems
setting in your _config.yml
file:
gems:
- jekyll-index-pages
Usage
Configuring the plugin
If you want to generate index pages for your blog posts, you can add the following settings to your _config.yml
file:
index_pages:
posts:
title: Post Listing Page Title
excerpt: Post listing page excerpt
per_page: 20
permalink: /blog/
layout: blog
This will tell the plugin to generate index pages with given title and excerpt, using the layout named _layouts/blog.html
. Each index page will contain up to 20 documents. First page can be accessed at /blog/
. Subsequent pages can be accessed at /blog/<page-num>/
.
Documents are sorted automatically using document's
date
setting, the first being the most recent.
If you want to generate index pages for categories, add the categories
setting to index_page
section:
index_pages:
categories:
...
The same reasoning applies if you want to generate index pages for tags:
index_pages:
tags:
...
Yearly archive:
index_pages:
archive:
...
And author pages:
index_pages:
authors:
...
For collection index pages, you need to include the collection name:
index_pages:
custom_name:
collection: collection_name
...
Default values for each setting are:
title: :label
excerpt: :label
per_page: 10
permalink: /:label/
For categories and tags, :label
variable refers to the category or tag name. For posts, :label
will always be equal to posts
. For the archive, :label
refers to any given year. For authors, :label
is the author name. :label
value is slugified when composing the permalink.
Note there is no default value for layout. You must always specify this setting otherwise pages will be generated blank, with no markup.
Because this plugin transliterates the URL for generated pages, you need to define a language as follows:
lang: en-US
Then get the specified locale file from https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale and add it to the _locales/
directory inside your site codebase.
Including custom data into templates
To include custom data in the template, you must define a variable in the configuration under the data
section:
index_pages:
posts:
layout: blog
data:
custom: This is a custom data item
In this case, you can print the contents of the custom
variable in the _layouts/blog.html
layout like this:
{{ page.custom }}
Including documents and pagination into templates
To include the paginated documents in your layouts, you can use the pager
variable as demonstrated next:
{% assign pager = page.pager %}
{% for doc in pager.docs %}
<h2>{{ doc.title }}</h2>
{{ doc.excerpt }}
<a href="{{ doc.url }}">Read more...</a>
{% endfor %}
Each document in pager.docs
is a Jekyll document, so you can access all its variables as normally do when developing a layout.
To include the pagination, you can do the following:
{% assign pager = page.pager %}
{% if pager.total_pages > 1 %}
{% if pager.prev_page > 0 %}
<a href="{{ pager.prev_page_url }}">Prev. page</a>
{% endif %}
<span>Page {{ pager.current_page }} of {{ pager.total_pages }}</span>
{% if pager.next_page > 0 %}
<a href="{{ pager.next_page_url }}">Next page</a>
{% endif %}
{% endif %}
Linking index pages
Sometimes you will need to link index pages, for example when building some kind of category navigation. For this particular use case, you can use {% category_url %}
, {% tag_url %}
, {% author_url %}
and {% archive_url %}
tags for getting the correct URL to a given index page.
<a href="{% category_url "Category name" %}">Category name</a>
<a href="{% tag_url "Tag name" %}">Tag name</a>
<a href="{% author_url "Author Name" %}">Author Name</a>
<a href="{% archive_url "2001" %}">2001</a>
You can pass the argument directly as a string or as a variable.
The following example demonstrates how to create a basic category navigation:
<ul>
{% for category in site.categories %}
<li><a href="{% category_url category[0] %}">{{ category[0] }}</a></li>
{% endfor%}
</ul>
Development
After checking out the repo, run script/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run script/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/rukbotto/jekyll-index-pages.
License
The gem is available as open source under the terms of the MIT License.