blob: 472f4502362566bdbc901ce189ab7424437b9d13 [file] [log] [blame]
'use strict';
function bsPaginatorHelper(options){
/* jshint validthis: true */
options = options || {};
var current = options.current || this.page.current || 0;
var total = options.total || this.page.total || 1;
var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
var space = options.hasOwnProperty('space') ? options.space : '…';
var base = options.base || this.page.base || this.config.root || '';
var format = options.format || this.config.pagination_dir + '/%d/';
var prevText = options.prev_text || 'Prev';
var nextText = options.next_text || 'Next';
var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
var transform = options.transform;
var self = this;
var result = '';
var i;
if (!current) return '';
var currentPage = '<li class="active"><span class="page-number">' +
(transform ? transform(current) : current) +
'</span></li>';
function link(i){
return self.url_for(i === 1 ? base : base + format.replace('%d', i));
}
function pageLink(i){
return '<li><a class="page-number" href="' + link(i) + '">' +
(transform ? transform(i) : i) +
'</a></li>';
}
// Display the link to the previous page
if (prevNext){
if (current > 1) {
result += '<li><a class="page-prev" rel="prev" ' +
'href="' + link(current - 1) + '">' + prevText + '</a></li>';
} else {
result += '<li class="disabled"><span class="page-prev">' + prevText + '</a></li>';
}
}
if (options.show_all){
// Display pages on the left side of the current page
for (i = 1; i < current; i++){
result += pageLink(i);
}
// Display the current page
result += currentPage;
// Display pages on the right side of the current page
for (i = current + 1; i <= total; i++){
result += pageLink(i);
}
} else {
// It's too complicated. May need refactor.
var leftEnd = current <= endSize ? current - 1 : endSize;
var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
var spaceHtml = '<li class="disabled"><span class="page-space">' + space + '</span></li>';
// Display pages on the left edge
for (i = 1; i <= leftEnd; i++){
result += pageLink(i);
}
// Display spaces between edges and middle pages
if (space && current - endSize - midSize > 1){
result += spaceHtml;
}
// Display left middle pages
if (leftMid > leftEnd){
for (i = leftMid; i < current; i++){
result += pageLink(i);
}
}
// Display the current page
result += currentPage;
// Display right middle pages
if (rightMid < rightEnd){
for (i = current + 1; i <= rightMid; i++){
result += pageLink(i);
}
}
// Display spaces between edges and middle pages
if (space && total - endSize - midSize > current){
result += spaceHtml;
}
// Dispaly pages on the right edge
for (i = rightEnd; i <= total; i++){
result += pageLink(i);
}
}
// Display the link to the next page
if (prevNext){
if (current < total) {
result += '<li><a class="page-next" rel="next" ' +
'href="' + link(current + 1) + '">' + nextText + '</a></li>';
} else {
result += '<li class="disabled"><span class="page-next">' + nextText + '</a></li>';
}
}
return '<nav><ul class="pagination">' + result + '</ul></nav>';
}
hexo.extend.helper.register('bs_paginator', bsPaginatorHelper);