相关文章阅读顺序
前言: hexo-pagination是hexo的内部工具函数。 源码在此
这个分页函数是所有其他插件的基础,充分理解pagination函数,有助于我们随心所欲的创建自己想要的页面。 我们不关心hexo的内核是如何实现逻辑,我们更关心hexo需要什么样的数据,我们如何操控它。
开明宗义: pagination函数返回值类似这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { path: xxxDir, layout: [ 'layout1', 'layout2', 'layout3', 'layout4'] , data: { base: xxxDir, total: 1 , current: 1 , current_url: tagDir, posts: locals.posts, prev: 0 , prev_link: '', next: 0 , next_link: '', tags: tags } }
以这种形式return出来的值,hexo接受后,会生成一个指定layout的,在xxxDir文件夹位置的页面,其url为localhost:4000/xxxDir,内部可调用的数据便是data里面的值。(xxxDir==base,是一开始就带入的参数) 这样一说,整体就清晰了,你可以利用pagination来创建任意路径,任意布局,带入任意的data的页面了
pagination(base, posts, [options])
option对象
描述
缺省
perPage
每页展示文章
10
format
URL 格式
page/%d/
layout
布局, 可以是string或array.
[‘archive’, ‘index’]
data
额外的data
无
示例: 1 2 3 4 5 6 7 8 9 10 11 var pagination = require ('hexo-pagination' );pagination ('/tags/hexo' , [], { perPage : 10 , format : 'page/%d/' , layout : ['archive' , 'index' ], data : { tag : 'hexo' } });
这个function返回一个包含path, layout, data的数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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;
如果有分页 则result是一个数组集
其中data对象里面包含
Data
Description
base
Base URL
total
总共多少页
current
当前页码
current_url
当前页路径 (与path相同)
posts
当前页面文章数(被切割后的文章数)
prev
上一页(数字)
prev_link
上一页链接
next
下一页(数字)
next_link
下一页链接
其中,data是可以扩展的,内部是用了Object.assign,除了以上的9个键,你也可以自定义键值对往里面塞,也同样会显示在页面中
源码整体释义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 '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 = options.hasOwnProperty ('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;
参考链接:https://www.jianshu.com/p/186fa7da9253