12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 'use strict';
- const 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 += '/';
- const length = posts.length;
- const perPage = Object.prototype.hasOwnProperty.call(options, 'perPage') ? +options.perPage : 10;
- const total = perPage ? Math.ceil(length / perPage) : 1;
- const format = options.format || 'page/%d/';
- const layout = options.layout || ['archive', 'index'];
- const data = options.data || {};
- const result = [];
- const urlCache = {};
- function formatURL(i) {
- if (urlCache[i]) return urlCache[i];
- let url = base;
- if (i > 1) url += util.format(format, i);
- urlCache[i] = url;
- return url;
- }
- function makeData(i) {
- const data = {
- base,
- 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 (let i = 1; i <= total; i++) {
- result.push({
- path: formatURL(i),
- layout,
- data: Object.assign(makeData(i), data)
- });
- }
- } else {
- result.push({
- path: base,
- layout,
- data: Object.assign(makeData(1), data)
- });
- }
- return result;
- }
- module.exports = pagination;
|