UNPKG

2.39 kBJavaScriptView Raw
1'use strict';
2
3const pathFn = require('path');
4const moment = require('moment');
5const defaults = require('lodash/defaults');
6const Promise = require('bluebird');
7const util = require('hexo-util');
8const fs = require('hexo-fs');
9const Permalink = util.Permalink;
10let permalink;
11
12const reservedKeys = {
13 year: true,
14 month: true,
15 i_month: true,
16 day: true,
17 i_day: true,
18 title: true
19};
20
21function newPostPathFilter(data = {}, replace) {
22 const sourceDir = this.source_dir;
23 const draftDir = pathFn.join(sourceDir, '_drafts');
24 const postDir = pathFn.join(sourceDir, '_posts');
25 const config = this.config;
26 const newPostName = config.new_post_name;
27 const permalinkDefaults = config.permalink_defaults;
28 const path = data.path;
29 const layout = data.layout;
30 const slug = data.slug;
31 let target = '';
32
33 if (!permalink || permalink.rule !== newPostName) {
34 permalink = new Permalink(newPostName);
35 }
36
37 if (path) {
38 switch (layout) {
39 case 'page':
40 target = pathFn.join(sourceDir, path);
41 break;
42
43 case 'draft':
44 target = pathFn.join(draftDir, path);
45 break;
46
47 default:
48 target = pathFn.join(postDir, path);
49 }
50 } else if (slug) {
51 switch (layout) {
52 case 'page':
53 target = pathFn.join(sourceDir, slug, 'index');
54 break;
55
56 case 'draft':
57 target = pathFn.join(draftDir, slug);
58 break;
59
60 default: {
61 const date = moment(data.date || Date.now());
62 const keys = Object.keys(data);
63 let key = '';
64
65 const filenameData = {
66 year: date.format('YYYY'),
67 month: date.format('MM'),
68 i_month: date.format('M'),
69 day: date.format('DD'),
70 i_day: date.format('D'),
71 title: slug
72 };
73
74 for (let i = 0, len = keys.length; i < len; i++) {
75 key = keys[i];
76 if (!reservedKeys[key]) filenameData[key] = data[key];
77 }
78
79 target = pathFn.join(postDir, permalink.stringify(
80 defaults(filenameData, permalinkDefaults)));
81 }
82 }
83 } else {
84 return Promise.reject(new TypeError('Either data.path or data.slug is required!'));
85 }
86
87 if (!pathFn.extname(target)) {
88 target += pathFn.extname(newPostName) || '.md';
89 }
90
91 if (replace) {
92 return Promise.resolve(target);
93 }
94
95 return fs.ensurePath(target);
96}
97
98module.exports = newPostPathFilter;