assemble-plugin-index

0.3.3 • Public • Published

assemble-plugin-index NPM version Build Status

Template indexing plugin for Assemble.io.

Install with npm

npm i assemble-plugin-index --save-dev

Getting Started

In your assemblefile.js, insert the following line immediately after you have require()d assemble:

var index = require('assemble-plugin-index')(assemble);

It is important that you pass the assemble instance variable to the module for initialization. Upon initialization, the module creates a new renderable index collection within assemble. Before using the plugin in the task pipeline, you have to specify a location where index collections can be found:

assemble.indices('templates/indices/*.hbs');

Now, the plugin can be used within the task pipeline. The following example demonstrates the use of the index plugin used within a task pipeline:

assemble.task('posts', function() {
  assemble.src('templates/posts/*.hbs')
    .pipe(index('posts', {pattern: 'index:num:', limit: 10}))
    .pipe(assemble.dest('dist/'));
});

This will create dist/index.hbs, dist/index1.hbs, dist/index2.hbs and so forth.

You can also specify options globally using the assemble API:

assemble.option('index', {limit: 10});

Visit the plugin docs for more info or for help getting started.

API

index

  • {String}: Identifier of an index template.
  • {Object}: Options for the generation of templates.
  • {Object}: Options for rendering templates.

Plugin function for the generation of index templates.

Options

limit

Type: Number Default: 10

Maximum collection items per index page.

pattern

Type: String, 'Function' Default: Template name with attached page number

File naming pattern with attached page number and without file extension. By default, files are named by the index template's name plus an additional page number for successive pages.

The string :num: is replaced with the page number or removed for the first page.

When a function is given, it is called for every page generated and must return a string without file extension. The function is called with the page number, index, and an array of items that are going to be added to the page.

filter

Type: String, Array, Function Default: undefined

The default filter takes only the data object of each template in the pipeline excluding src and dest properties. If these properties are needed, they need to be explicitly specified.

When a string is given, only one property named by the specified string within the data object will be filtered.

When an array is given, all properties specified in the array within the data object will be filtered.

When a function is given, the function will be called with a file argument representing the currently processing vinyl file. The function must immediately return the filtered result as an Object containing filtered properties.

process

Type: Array, Function Default: function(items, cb) { return cb(null, items); }

A single or an array of chained post-processing functions. Each function must call the callback(error, items) when finished. If an error occurred, the chain is broken. Otherwise error must be null and items must contain all items to index.

Context

The templating context contains the following variables which can be used for the generation of the index page.

items

Type: Array

An array containing all items available for this particular index page. Each item contains the following properties:

  • the relative url to the template
  • properties generated by the used filter

pagination

Type: Object

An object describing the state of the index pagination as the following code listing shows:

{
  first: 'index.html',
  prev: 'index2.html',
  current: 'index3.html',
  next: undefined,
  last: 'index3.html',
  pages: ['index.html', 'index1.html', 'index2.html', 'index3.html'],
  isFirst: false,
  isLast: true
}

first

Type: String

Relative path of the first index page in a collection of index pages.

prev

Type: String

Relative path of the previous index page in a collection of index pages.

next

Type: String

Relative path of the next index page in a collection of index pages.

last

Type: String

Relative path of the last index page in a collection of index pages.

pages

Type: Array

An array of strings of relative paths of all index pages.

isFirst

Type: Boolean

Whether the current index page is the first index page of a collection of index pages.

isLast

Type: Boolean

Whether the current index page is the last index page of a collection of index pages.

Template

The following listing shows an example index template:

<ul>
  {{#each items}}
    <li><a href="{{url}}">{{title}}</a></li>
  {{/each}}
</ul>
{{#with pagination}}
  <ul>
    {{#if isFirst}}
      <li><a>Prev</a></li>
    {{else}}
      <li><a href="{{prev}}">Prev</a></li>
    {{/if}}
    {{#each pages}}
      {{#is this ../current}}
        <li><a>{{@index}}</a></li>
      {{else}}
        <li><a href="{{this}}">{{@index}}</a></li>
      {{/is}}
    {{/each}}
    {{#if isLast}}
      <li><a>Next</a></li>
    {{else}}
      <li><a href="{{last}}">Next</a></li>
    {{/if}}
  </ul>
{{/with}}

Frequently Asked Questions

The file extensions of the pagination URLs don't match the actual file extension. How do I fix this?

This can be the case if you have configured a third-party plugin such as gulp-extname to change file extensions.

Solution: Use the assemble builtin {{replace}} helper to replace file extensions. The following snippet shows a pagination with .html extensions:

{{#with pagination}}
  <ul>
    {{#if isFirst}}
      <li><a>Prev</a></li>
    {{else}}
      <li><a href="{{replace prev '.hbs' '.html'}}">Prev</a></li>
    {{/if}}
    {{#each pages}}
      {{#is this ../current}}
        <li><a>{{@index}}</a></li>
      {{else}}
        <li><a href="{{replace this '.hbs' '.html'}}">{{@index}}</a></li>
      {{/is}}
    {{/each}}
    {{#if isLast}}
      <li><a>Next</a></li>
    {{else}}
      <li><a href="{{replace last '.hbs' '.html'}}">Next</a></li>
    {{/if}}
  </ul>
{{/with}}

How do I sort items in the collection?

This is exactly what the postprocess option is made for! Let's assume that you have a collection of blog posts that need to be sorted by their posted property. When using a filter, do not forget to include the posted property as well!

assemble.task('posts', function() {
  assemble.src('templates/posts/*.hbs')
    .pipe(index('posts', {
      pattern: 'index:num:',
      filter: ['title', 'posted', 'summary']
      limit: 10,
      process: [
        function(items, cb) {
          cb(null, items.sort(function(item1, item2) {
            return item2.posted - item1.posted;
          }));
        }
      ]
    }))
    .pipe(assemble.dest('dist/'));
});

Authors

Vincent Wochnik

License

Copyright (c) 2015 Vincent Wochnik
Released under the MIT license


This file was generated by verb-cli on April 18, 2015.

Package Sidebar

Install

npm i assemble-plugin-index

Weekly Downloads

1

Version

0.3.3

License

none

Last publish

Collaborators

  • vwochnik