From 3a5ea10cb9c42e199d4c23b7cc217fe280c3b1c5 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 23 Feb 2024 12:53:58 -0500 Subject: [PATCH] Split out frontmatter getters --- src/frontmatter/categories.js | 13 ++++++++ src/frontmatter/coverImage.js | 3 ++ src/frontmatter/date.js | 15 +++++++++ src/frontmatter/tags.js | 13 ++++++++ src/frontmatter/title.js | 3 ++ src/parser.js | 60 ++++++++--------------------------- src/settings.js | 8 +++++ 7 files changed, 68 insertions(+), 47 deletions(-) create mode 100644 src/frontmatter/categories.js create mode 100644 src/frontmatter/coverImage.js create mode 100644 src/frontmatter/date.js create mode 100644 src/frontmatter/tags.js create mode 100644 src/frontmatter/title.js diff --git a/src/frontmatter/categories.js b/src/frontmatter/categories.js new file mode 100644 index 0000000..c324403 --- /dev/null +++ b/src/frontmatter/categories.js @@ -0,0 +1,13 @@ +const settings = require('../settings'); + +module.exports = (post) => { + if (!post.data.category) { + return []; + } + + const categories = post.data.category + .filter(category => category.$.domain === 'category') + .map(({ $: attributes }) => decodeURIComponent(attributes.nicename)); + + return categories.filter(category => !settings.filter_categories.includes(category)); +}; diff --git a/src/frontmatter/coverImage.js b/src/frontmatter/coverImage.js new file mode 100644 index 0000000..1808ea5 --- /dev/null +++ b/src/frontmatter/coverImage.js @@ -0,0 +1,3 @@ +module.exports = (post) => { + return post.meta.coverImage; +}; diff --git a/src/frontmatter/date.js b/src/frontmatter/date.js new file mode 100644 index 0000000..16292b7 --- /dev/null +++ b/src/frontmatter/date.js @@ -0,0 +1,15 @@ +const luxon = require('luxon'); + +const settings = require('../settings'); + +module.exports = (post) => { + const dateTime = luxon.DateTime.fromRFC2822(post.data.pubDate[0], { zone: 'utc' }); + + if (settings.custom_date_formatting) { + return dateTime.toFormat(settings.custom_date_formatting); + } else if (settings.include_time_with_date) { + return dateTime.toISO(); + } else { + return dateTime.toISODate(); + } +}; diff --git a/src/frontmatter/tags.js b/src/frontmatter/tags.js new file mode 100644 index 0000000..63d984f --- /dev/null +++ b/src/frontmatter/tags.js @@ -0,0 +1,13 @@ +const settings = require('../settings'); + +module.exports = (post) => { + if (!post.data.category) { + return []; + } + + const categories = post.data.category + .filter(category => category.$.domain === 'post_tag') + .map(({ $: attributes }) => decodeURIComponent(attributes.nicename)); + + return categories; +}; diff --git a/src/frontmatter/title.js b/src/frontmatter/title.js new file mode 100644 index 0000000..2b34f6c --- /dev/null +++ b/src/frontmatter/title.js @@ -0,0 +1,3 @@ +module.exports = (post) => { + return post.data.title[0]; +}; diff --git a/src/parser.js b/src/parser.js index 921ed00..d530e80 100644 --- a/src/parser.js +++ b/src/parser.js @@ -1,11 +1,17 @@ const fs = require('fs'); -const luxon = require('luxon'); const xml2js = require('xml2js'); const shared = require('./shared'); -const settings = require('./settings'); const translator = require('./translator'); +const frontmatter = { + title: require('./frontmatter/title'), + date: require('./frontmatter/date'), + categories: require('./frontmatter/categories'), + tags: require('./frontmatter/tags'), + coverImage: require('./frontmatter/coverImage'), +}; + async function parseFilePromise(config) { console.log('\nParsing...'); const content = await fs.promises.readFile(config.input, 'utf8'); @@ -104,45 +110,6 @@ function getPostCoverImageId(postData) { return id; } -function getPostTitle(post) { - return post.data.title[0]; -} - -function getPostDate(post) { - const dateTime = luxon.DateTime.fromRFC2822(post.data.pubDate[0], { zone: 'utc' }); - - if (settings.custom_date_formatting) { - return dateTime.toFormat(settings.custom_date_formatting); - } else if (settings.include_time_with_date) { - return dateTime.toISO(); - } else { - return dateTime.toISODate(); - } -} - -function getCategories(post) { - const categories = processCategoryTags(post.data, 'category'); - return categories.filter(category => !settings.filter_categories.includes(category)); -} - -function getTags(post) { - return processCategoryTags(post.data, 'post_tag'); -} - -function getCoverImage(post) { - return post.meta.coverImage; -} - -function processCategoryTags(postData, domain) { - if (!postData.category) { - return []; - } - - return postData.category - .filter(category => category.$.domain === domain) - .map(({ $: attributes }) => decodeURIComponent(attributes.nicename)); -} - function collectAttachedImages(channelData) { const images = getItemsOfType(channelData, 'attachment') // filter to certain image file types @@ -207,13 +174,12 @@ function mergeImagesIntoPosts(images, posts) { function populateFrontmatter(posts) { posts.forEach(post => { - console.log(post); post.frontmatter = { - title: getPostTitle(post), - date: getPostDate(post), - categories: getCategories(post), - tags: getTags(post), - coverImage: getCoverImage(post) + title: frontmatter.title(post), + date: frontmatter.date(post), + categories: frontmatter.categories(post), + tags: frontmatter.tags(post), + coverImage: frontmatter.coverImage(post) } }); } diff --git a/src/settings.js b/src/settings.js index bf4e206..57087ce 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,3 +1,11 @@ +exports.frontmatter_fields = [ + 'title', + 'date', + 'categories', + 'tags', + 'coverImage' +]; + // time in ms to wait between requesting image files // increase this if you see timeouts or server errors exports.image_file_request_delay = 500;