mirror of https://github.com/jkjoy/sunpeiwen.git
77 lines
1.7 KiB
JavaScript
77 lines
1.7 KiB
JavaScript
'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;
|