diff --git a/src/parser.js b/src/parser.js index 9afecf7..3b25779 100644 --- a/src/parser.js +++ b/src/parser.js @@ -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) { diff --git a/src/settings.js b/src/settings.js index cad784b..9425ce9 100644 --- a/src/settings.js +++ b/src/settings.js @@ -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']; diff --git a/src/writer.js b/src/writer.js index 33be01b..18dc6bb 100644 --- a/src/writer.js +++ b/src/writer.js @@ -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; }