| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- var merge = require('utils-merge');
- var util = require('util');
- function pagination(base, posts, options){
- if (typeof base !== 'string') throw new TypeError('base must be a string!');
- if (!posts) throw new TypeError('posts is required!');
- options = options || {};
- if (base && base[base.length - 1] !== '/') base += '/';
- var length = posts.length;
- var perPage = options.hasOwnProperty('perPage') ? +options.perPage : 10;
- var total = perPage ? Math.ceil(length / perPage) : 1;
- var format = options.format || 'page/%d/';
- var layout = options.layout || ['archive', 'index'];
- var data = options.data || {};
- var result = [];
- var urlCache = {};
- function formatURL(i){
- if (urlCache[i]) return urlCache[i];
- var url = base;
- if (i > 1) url += util.format(format, i);
- urlCache[i] = url;
- return url;
- }
- function makeData(i){
- var data = {
- base: base,
- total: total,
- current: i,
- current_url: formatURL(i),
- posts: perPage ? posts.slice(perPage * (i - 1), perPage * i) : posts,
- prev: 0,
- prev_link: '',
- next: 0,
- next_link: ''
- };
- if (i > 1){
- data.prev = i - 1;
- data.prev_link = formatURL(data.prev);
- }
- if (i < total){
- data.next = i + 1;
- data.next_link = formatURL(data.next);
- }
- return data;
- }
- if (perPage){
- for (var i = 1; i <= total; i++){
- result.push({
- path: formatURL(i),
- layout: layout,
- data: merge(makeData(i), data)
- });
- }
- } else {
- result.push({
- path: base,
- layout: layout,
- data: merge(makeData(1), data)
- });
- }
- return result;
- }
- module.exports = pagination;
|