UNPKG

2.94 kBJavaScriptView Raw
1'use strict';
2
3var pagination = require('hexo-pagination');
4
5var fmtNum = function(num) {
6 return num < 10 ? '0' + num : num;
7};
8
9module.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 // Organize posts by date
40 allPosts.forEach(function(post) {
41 var date = post.date;
42 var year = date.year();
43 var month = date.month() + 1; // month is started from 0
44
45 if (!posts.hasOwnProperty(year)) {
46 // 13 arrays. The first array is for posts in this year
47 // and the other arrays is for posts in this month
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 // Daily
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 // Yearly
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 // Monthly
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 // Daily
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};