www/util/slug.js

82 lines
2.1 KiB
JavaScript
Raw Normal View History

const fs = require('fs');
const matter = require('gray-matter');
const { join } = require('path');
2022-04-27 08:03:21 +00:00
const postsDir = join(process.cwd(), 'posts');
2022-04-28 01:55:18 +00:00
const cacheDir = join(process.cwd(), '.cache');
function getPost(rawslug, filter = []) {
const slug = rawslug.replace(/\.md$/, '');
2022-04-27 08:03:21 +00:00
const path = join(postsDir, `${slug}.md`);
const file = fs.readFileSync(path, 'utf-8');
const { data, content } = matter(file);
if (data['last_updated'] === undefined)
2022-04-28 01:55:18 +00:00
data['last_updated'] = '';
if (filter.length === 0)
return { ...data, content, slug, rawslug };
let post = {};
for (const [_, entry] of filter.entries()) {
if (entry === 'slug')
post[entry] = slug;
if (entry === 'rawslug')
post[entry] = rawslug;
if (entry === 'content')
post[entry] = content;
if (typeof data[entry] !== 'undefined') {
post[entry] = data[entry]
}
}
return post;
}
function getAllPosts(filter = []) {
2022-04-27 08:03:21 +00:00
const files = fs.readdirSync(postsDir);
2022-04-23 23:03:43 +00:00
return files
2022-04-27 10:28:15 +00:00
.filter(c => (!c.match(/^\.]/) && c.match(/\.md$/)))
.map(file => {
return getPost(file, filter)
2022-04-28 01:55:18 +00:00
})
.sort((a, b) => {
const dA = new Date(a['created_at']);
const dB = new Date(b['created_at']);
return dB - dA;
});
}
2022-04-28 01:55:18 +00:00
const postMetaCacheFile = join(cacheDir, 'posts.meta.json');
2022-04-27 08:03:21 +00:00
function cachePostsMeta() { // public access cache
const posts = getAllPosts(['title', 'slug', 'created_at', 'last_updated']);
2022-04-28 01:55:18 +00:00
if (!fs.existsSync(cacheDir)) {
fs.mkdirSync(cacheDir);
}
fs.writeFile(postMetaCacheFile, JSON.stringify(posts), (e) => {
2022-04-27 08:03:21 +00:00
if (e)
console.error(e);
});
return posts;
}
function getPostsMeta() {
2022-04-28 01:55:18 +00:00
try {
const file = fs.readFileSync(postMetaCacheFile, 'utf-8');
return JSON.parse(file);
} catch (e) {
2022-04-27 08:03:21 +00:00
return cachePostsMeta();
}
2022-04-28 01:55:18 +00:00
}
2022-04-27 08:03:21 +00:00
2022-04-28 01:55:18 +00:00
function cache() {
cachePostsMeta();
2022-04-27 08:03:21 +00:00
}
2022-04-28 01:55:18 +00:00
module.exports = { getAllPosts, getPost, getPostsMeta, cache };