UNPKG

1.39 kBJavaScriptView Raw
1'use strict';
2
3const defaults = require('lodash/defaults');
4const util = require('hexo-util');
5const pathFn = require('path');
6const Permalink = util.Permalink;
7let permalink;
8
9function postPermalinkFilter(data) {
10 const config = this.config;
11 const meta = {
12 id: data.id || data._id,
13 title: data.slug,
14 name: typeof data.slug === 'string' ? pathFn.basename(data.slug) : '',
15 post_title: util.slugize(data.title, {transform: 1}),
16 year: data.date.format('YYYY'),
17 month: data.date.format('MM'),
18 day: data.date.format('DD'),
19 i_month: data.date.format('M'),
20 i_day: data.date.format('D')
21 };
22
23 if (!permalink || permalink.rule !== config.permalink) {
24 permalink = new Permalink(config.permalink);
25 }
26
27 const categories = data.categories;
28
29 if (categories.length) {
30 meta.category = categories.last().slug;
31 } else {
32 meta.category = config.default_category;
33 }
34
35 const keys = Object.keys(data);
36 let key = '';
37
38 for (let i = 0, len = keys.length; i < len; i++) {
39 key = keys[i];
40 if (meta.hasOwnProperty(key)) continue;
41
42 // Use Object.getOwnPropertyDescriptor to copy getters to avoid "Maximum call
43 // stack size exceeded" error
44 Object.defineProperty(meta, key, Object.getOwnPropertyDescriptor(data, key));
45 }
46
47 return permalink.stringify(defaults(meta, config.permalink_defaults));
48}
49
50module.exports = postPermalinkFilter;