1 | 'use strict';
|
2 |
|
3 | var pagination = require('hexo-pagination');
|
4 |
|
5 | var fmtNum = function(num) {
|
6 | return num < 10 ? '0' + num : num;
|
7 | };
|
8 |
|
9 | module.exports = function(locals) {
|
10 | var config = this.config;
|
11 | var archiveDir = config.archive_dir;
|
12 | var paginationDir = config.pagination_dir || 'page';
|
13 | var allPosts = locals.posts.sort('-date');
|
14 | var perPage = config.archive_generator.per_page;
|
15 | var result = [];
|
16 |
|
17 | if (!allPosts.length) return;
|
18 |
|
19 | if (archiveDir[archiveDir.length - 1] !== '/') archiveDir += '/';
|
20 |
|
21 | function generate(path, posts, options) {
|
22 | options = options || {};
|
23 | options.archive = true;
|
24 |
|
25 | result = result.concat(pagination(path, posts, {
|
26 | perPage: perPage,
|
27 | layout: ['archive', 'index'],
|
28 | format: paginationDir + '/%d/',
|
29 | data: options
|
30 | }));
|
31 | }
|
32 |
|
33 | generate(archiveDir, allPosts);
|
34 |
|
35 | if (!config.archive_generator.yearly) return result;
|
36 |
|
37 | var posts = {};
|
38 |
|
39 |
|
40 | allPosts.forEach(function(post) {
|
41 | var date = post.date;
|
42 | var year = date.year();
|
43 | var month = date.month() + 1;
|
44 |
|
45 | if (!posts.hasOwnProperty(year)) {
|
46 |
|
47 |
|
48 | posts[year] = [
|
49 | [],
|
50 | [],
|
51 | [],
|
52 | [],
|
53 | [],
|
54 | [],
|
55 | [],
|
56 | [],
|
57 | [],
|
58 | [],
|
59 | [],
|
60 | [],
|
61 | []
|
62 | ];
|
63 | }
|
64 |
|
65 | posts[year][0].push(post);
|
66 | posts[year][month].push(post);
|
67 |
|
68 | if (config.archive_generator.daily) {
|
69 | var day = date.date();
|
70 | if (!posts[year][month].hasOwnProperty(day)) {
|
71 | posts[year][month].day = {};
|
72 | }
|
73 |
|
74 | (posts[year][month].day[day] || (posts[year][month].day[day] = [])).push(post);
|
75 | }
|
76 | });
|
77 |
|
78 | var Query = this.model('Post').Query;
|
79 | var years = Object.keys(posts);
|
80 | var year, data, month, monthData, url;
|
81 |
|
82 |
|
83 | for (var i = 0, len = years.length; i < len; i++) {
|
84 | year = +years[i];
|
85 | data = posts[year];
|
86 | url = archiveDir + year + '/';
|
87 | if (!data[0].length) continue;
|
88 |
|
89 | generate(url, new Query(data[0]), {year: year});
|
90 |
|
91 | if (!config.archive_generator.monthly && !config.archive_generator.daily) continue;
|
92 |
|
93 |
|
94 | for (month = 1; month <= 12; month++) {
|
95 | monthData = data[month];
|
96 | if (!monthData.length) continue;
|
97 | if (config.archive_generator.monthly) {
|
98 | generate(url + fmtNum(month) + '/', new Query(monthData), {
|
99 | year: year,
|
100 | month: month
|
101 | });
|
102 | }
|
103 |
|
104 | if (!config.archive_generator.daily) continue;
|
105 |
|
106 |
|
107 | for (var day = 1; day <= 31; day++) {
|
108 | var dayData = monthData.day[day];
|
109 | if (!dayData || !dayData.length) continue;
|
110 | generate(url + fmtNum(month) + '/' + fmtNum(day) + '/', new Query(dayData), {
|
111 | year: year,
|
112 | month: month,
|
113 | day: day
|
114 | });
|
115 | }
|
116 | }
|
117 | }
|
118 |
|
119 | return result;
|
120 | };
|