blob: 472f4502362566bdbc901ce189ab7424437b9d13 [file] [log] [blame]
Tang Cheng60ba8032016-06-20 15:31:17 +08001'use strict';
2
3function bsPaginatorHelper(options){
4 /* jshint validthis: true */
5 options = options || {};
6
7 var current = options.current || this.page.current || 0;
8 var total = options.total || this.page.total || 1;
9 var endSize = options.hasOwnProperty('end_size') ? +options.end_size : 1;
10 var midSize = options.hasOwnProperty('mid_size') ? +options.mid_size : 2;
11 var space = options.hasOwnProperty('space') ? options.space : '…';
12 var base = options.base || this.page.base || this.config.root || '';
13 var format = options.format || this.config.pagination_dir + '/%d/';
14 var prevText = options.prev_text || 'Prev';
15 var nextText = options.next_text || 'Next';
16 var prevNext = options.hasOwnProperty('prev_next') ? options.prev_next : true;
17 var transform = options.transform;
18 var self = this;
19 var result = '';
20 var i;
21
22 if (!current) return '';
23
24 var currentPage = '<li class="active"><span class="page-number">' +
25 (transform ? transform(current) : current) +
26 '</span></li>';
27
28 function link(i){
29 return self.url_for(i === 1 ? base : base + format.replace('%d', i));
30 }
31
32 function pageLink(i){
33 return '<li><a class="page-number" href="' + link(i) + '">' +
34 (transform ? transform(i) : i) +
35 '</a></li>';
36 }
37
38 // Display the link to the previous page
39 if (prevNext){
40 if (current > 1) {
41 result += '<li><a class="page-prev" rel="prev" ' +
42 'href="' + link(current - 1) + '">' + prevText + '</a></li>';
43 } else {
44 result += '<li class="disabled"><span class="page-prev">' + prevText + '</a></li>';
45 }
46 }
47
48 if (options.show_all){
49 // Display pages on the left side of the current page
50 for (i = 1; i < current; i++){
51 result += pageLink(i);
52 }
53
54 // Display the current page
55 result += currentPage;
56
57 // Display pages on the right side of the current page
58 for (i = current + 1; i <= total; i++){
59 result += pageLink(i);
60 }
61 } else {
62 // It's too complicated. May need refactor.
63 var leftEnd = current <= endSize ? current - 1 : endSize;
64 var rightEnd = total - current <= endSize ? current + 1 : total - endSize + 1;
65 var leftMid = current - midSize <= endSize ? current - midSize + endSize : current - midSize;
66 var rightMid = current + midSize + endSize > total ? current + midSize - endSize : current + midSize;
67 var spaceHtml = '<li class="disabled"><span class="page-space">' + space + '</span></li>';
68
69 // Display pages on the left edge
70 for (i = 1; i <= leftEnd; i++){
71 result += pageLink(i);
72 }
73
74 // Display spaces between edges and middle pages
75 if (space && current - endSize - midSize > 1){
76 result += spaceHtml;
77 }
78
79 // Display left middle pages
80 if (leftMid > leftEnd){
81 for (i = leftMid; i < current; i++){
82 result += pageLink(i);
83 }
84 }
85
86 // Display the current page
87 result += currentPage;
88
89 // Display right middle pages
90 if (rightMid < rightEnd){
91 for (i = current + 1; i <= rightMid; i++){
92 result += pageLink(i);
93 }
94 }
95
96 // Display spaces between edges and middle pages
97 if (space && total - endSize - midSize > current){
98 result += spaceHtml;
99 }
100
101 // Dispaly pages on the right edge
102 for (i = rightEnd; i <= total; i++){
103 result += pageLink(i);
104 }
105 }
106
107 // Display the link to the next page
108 if (prevNext){
109 if (current < total) {
110 result += '<li><a class="page-next" rel="next" ' +
111 'href="' + link(current + 1) + '">' + nextText + '</a></li>';
112 } else {
113 result += '<li class="disabled"><span class="page-next">' + nextText + '</a></li>';
114 }
115 }
116
117 return '<nav><ul class="pagination">' + result + '</ul></nav>';
118}
119
120hexo.extend.helper.register('bs_paginator', bsPaginatorHelper);