Filterting for categories, omit empty lists in frontmatter

This commit is contained in:
Will Boyd
2020-12-22 10:28:45 -05:00
parent 9e6d38adc9
commit 9799ce5929
3 changed files with 30 additions and 12 deletions
+7 -5
View File
@@ -51,7 +51,7 @@ function collectPosts(data, config) {
title: getPostTitle(post),
date: getPostDate(post),
categories: getCategories(post),
tags: getTags(post),
tags: getTags(post)
},
content: translator.getPostContent(post, turndownService, config)
}));
@@ -95,20 +95,22 @@ function getPostDate(post) {
}
function getCategories(post) {
return processCategoryTags(post, "category");
const categories = processCategoryTags(post, 'category');
return categories.filter(category => !settings.filter_categories.includes(category));
}
function getTags(post) {
return processCategoryTags(post, "post_tag");
return processCategoryTags(post, 'post_tag');
}
function processCategoryTags(post, domain) {
if (!post.category) {
return [];
}
return post.category
.filter(c => c["$"].domain === domain)
.map(({ $: c }) => c.nicename);
.filter(category => category.$.domain === domain)
.map(({ $: attributes }) => attributes.nicename);
}
function collectAttachedImages(data) {
+4
View File
@@ -14,3 +14,7 @@ exports.include_time_with_date = false;
// tokens are documented here: https://moment.github.io/luxon/docs/manual/formatting.html#table-of-tokens
// if set, this takes precedence over include_time_with_date
exports.custom_date_formatting = '';
// categories to be excluded from post frontmatter
// this does not filter out posts themselves, just the categories listed in their frontmatter
exports.filter_categories = ['uncategorized'];
+19 -7
View File
@@ -56,14 +56,26 @@ async function writeMarkdownFilesPromise(posts, config ) {
async function loadMarkdownFilePromise(post) {
let output = '---\n';
Object.entries(post.frontmatter).forEach(pair => {
const key = pair[0];
const value = Array.isArray(pair[1])
? (pair[1].length === 0 ? "" : "\n - \"" + pair[1].join("\"\n - \"") + "\"")
: '"' + (pair[1] || '').replace(/"/g, '\\"') +'"';
output += key + ': ' + value + '\n';
Object.entries(post.frontmatter).forEach(([key, value]) => {
let outputValue;
if (Array.isArray(value)) {
if (value.length > 0) {
// array of one or more strings
outputValue = value.reduce((list, item) => `${list}\n - "${item}"`, '');
}
} else {
// single string value
const escapedValue = (value || '').replace(/"/g, '\\"');
outputValue = `"${escapedValue}"`;
}
if (outputValue !== undefined) {
output += `${key}: ${outputValue}\n`;
}
});
output += '---\n\n' + post.content + '\n';
output += `---\n\n${post.content}\n`;
return output;
}