pagination.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. var merge = require('utils-merge');
  2. var util = require('util');
  3. function pagination(base, posts, options){
  4. if (typeof base !== 'string') throw new TypeError('base must be a string!');
  5. if (!posts) throw new TypeError('posts is required!');
  6. options = options || {};
  7. if (base && base[base.length - 1] !== '/') base += '/';
  8. var length = posts.length;
  9. var perPage = options.hasOwnProperty('perPage') ? +options.perPage : 10;
  10. var total = perPage ? Math.ceil(length / perPage) : 1;
  11. var format = options.format || 'page/%d/';
  12. var layout = options.layout || ['archive', 'index'];
  13. var data = options.data || {};
  14. var result = [];
  15. var urlCache = {};
  16. function formatURL(i){
  17. if (urlCache[i]) return urlCache[i];
  18. var url = base;
  19. if (i > 1) url += util.format(format, i);
  20. urlCache[i] = url;
  21. return url;
  22. }
  23. function makeData(i){
  24. var data = {
  25. base: base,
  26. total: total,
  27. current: i,
  28. current_url: formatURL(i),
  29. posts: perPage ? posts.slice(perPage * (i - 1), perPage * i) : posts,
  30. prev: 0,
  31. prev_link: '',
  32. next: 0,
  33. next_link: ''
  34. };
  35. if (i > 1){
  36. data.prev = i - 1;
  37. data.prev_link = formatURL(data.prev);
  38. }
  39. if (i < total){
  40. data.next = i + 1;
  41. data.next_link = formatURL(data.next);
  42. }
  43. return data;
  44. }
  45. if (perPage){
  46. for (var i = 1; i <= total; i++){
  47. result.push({
  48. path: formatURL(i),
  49. layout: layout,
  50. data: merge(makeData(i), data)
  51. });
  52. }
  53. } else {
  54. result.push({
  55. path: base,
  56. layout: layout,
  57. data: merge(makeData(1), data)
  58. });
  59. }
  60. return result;
  61. }
  62. module.exports = pagination;