123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 'use strict';
- const pagination = require('hexo-pagination');
- const fmtNum = num => {
- return num < 10 ? '0' + num : num;
- };
- module.exports = function(locals) {
- const config = this.config;
- let archiveDir = config.archive_dir;
- const paginationDir = config.pagination_dir || 'page';
- const allPosts = locals.posts.sort(config.archive_generator.order_by || '-date');
- const perPage = config.archive_generator.per_page;
- let result = [];
- if (!allPosts.length) return;
- if (archiveDir[archiveDir.length - 1] !== '/') archiveDir += '/';
- function generate(path, posts, options) {
- options = options || {};
- options.archive = true;
- result = result.concat(pagination(path, posts, {
- perPage: perPage,
- layout: ['archive', 'index'],
- format: paginationDir + '/%d/',
- data: options
- }));
- }
- generate(archiveDir, allPosts);
- if (!config.archive_generator.yearly) return result;
- const posts = {};
- // Organize posts by date
- allPosts.forEach(post => {
- const date = post.date;
- const year = date.year();
- const month = date.month() + 1; // month is started from 0
- if (!Object.prototype.hasOwnProperty.call(posts, year)) {
- // 13 arrays. The first array is for posts in this year
- // and the other arrays is for posts in this month
- posts[year] = [
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- [],
- []
- ];
- }
- posts[year][0].push(post);
- posts[year][month].push(post);
- // Daily
- if (config.archive_generator.daily) {
- const day = date.date();
- if (!Object.prototype.hasOwnProperty.call(posts[year][month], 'day')) {
- posts[year][month].day = {};
- }
- (posts[year][month].day[day] || (posts[year][month].day[day] = [])).push(post);
- }
- });
- const Query = this.model('Post').Query;
- const years = Object.keys(posts);
- let year, data, month, monthData, url;
- // Yearly
- for (let i = 0, len = years.length; i < len; i++) {
- year = +years[i];
- data = posts[year];
- url = archiveDir + year + '/';
- if (!data[0].length) continue;
- generate(url, new Query(data[0]), {year: year});
- if (!config.archive_generator.monthly && !config.archive_generator.daily) continue;
- // Monthly
- for (month = 1; month <= 12; month++) {
- monthData = data[month];
- if (!monthData.length) continue;
- if (config.archive_generator.monthly) {
- generate(url + fmtNum(month) + '/', new Query(monthData), {
- year: year,
- month: month
- });
- }
- if (!config.archive_generator.daily) continue;
- // Daily
- for (let day = 1; day <= 31; day++) {
- const dayData = monthData.day[day];
- if (!dayData || !dayData.length) continue;
- generate(url + fmtNum(month) + '/' + fmtNum(day) + '/', new Query(dayData), {
- year: year,
- month: month,
- day: day
- });
- }
- }
- }
- return result;
- };
|