76 lines
2.2 KiB
JavaScript
Raw Normal View History

2020-02-29 16:27:55 -08:00
const path = require('path');
const { without } = require('lodash');
const { resolve, isCleanUrl } = require('./resolve');
const Page = require('./page');
2020-03-05 19:41:48 -08:00
const slugs = require('slugify');
const slugify = (s) => slugs(s, { remove: /[*+~.,()'"!?:@/\\]/g }).toLowerCase();
2020-02-29 16:27:55 -08:00
const pkg = require(resolve('package.json'));
const postmatch = /(\d{4}-\d\d-\d\d)\.\d{4}\.(\w+)/;
function arrayify (input) {
if (!input) return [];
if (!Array.isArray(input)) return [ input ];
return input;
}
2020-02-29 16:27:55 -08:00
module.exports = exports = class Post extends Page {
_dir (dir) {
// if the file name matches the postmatch pattern, then this needs to be /p/ file
const match = this.name.match(postmatch);
if (match) {
2020-03-05 19:42:57 -08:00
return [ 'tweets', match[2] ];
2020-02-29 16:27:55 -08:00
}
dir = dir.replace(postmatch, '$2').split('/');
dir = without(dir, 'posts', '_images');
2020-03-05 19:42:57 -08:00
dir.unshift('tweets');
2020-02-29 16:27:55 -08:00
return dir;
}
_out () {
var isIndexPage = (this.name === 'index' || this.name.match(postmatch));
var isClean = isCleanUrl(this.ext);
if (isClean && isIndexPage) {
this.out = path.join(this.base, 'index.html');
this.json = path.join(this.base, 'index.json');
this.url = this.dir;
} else if (isClean) {
this.out = path.join(this.base, this.name, 'index.html');
this.json = path.join(this.base, this.name + '.json');
this.url = path.join(this.dir, this.name);
} else if (isIndexPage) {
this.out = path.join(this.base, 'index.html');
this.json = path.join(this.base, this.name + '.json');
this.url = this.dir;
} else {
this.out = path.join(this.base, this.basename);
this.json = path.join(this.base, this.basename + '.json');
this.url = path.join(this.dir, this.basename);
}
const url = new URL(pkg.siteInfo.siteUrl);
url.pathname = this.url;
this.fullurl = url.href;
}
2020-03-02 20:28:46 -08:00
_parse (...args) {
super._parse(...args);
2020-03-05 19:41:48 -08:00
this.meta.tags = (this.meta.tags || []).reduce((result, tag) => {
result[slugify(tag)] = tag;
return result;
}, {});
this.meta.author = this.meta.author && arrayify(this.meta.author) || [];
2020-03-02 20:28:46 -08:00
this.classes.push('post');
}
2020-02-29 16:27:55 -08:00
};