From 9fb7ae47c5d86cc4b0f052de23ff8bc698232371 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Wed, 5 Feb 2025 15:58:26 -0500 Subject: [PATCH] Refactor how post meta is parsed --- src/frontmatter.js | 12 ++++---- src/parser.js | 71 ++++++++++++++++++---------------------------- src/writer.js | 11 ++----- 3 files changed, 37 insertions(+), 57 deletions(-) diff --git a/src/frontmatter.js b/src/frontmatter.js index 1926037..821104c 100644 --- a/src/frontmatter.js +++ b/src/frontmatter.js @@ -17,16 +17,16 @@ export function categories(post) { return categories.filter((category) => category !== 'uncategorized'); } -// get cover image filename, previously decoded and set on post.meta +// get cover image filename, previously decoded and set on post // this one is unique as it relies on special logic executed by the parser export function coverImage(post) { - return post.meta.coverImage; + return post.coverImage; } -// get post date, previously saved as a luxon datetime object on post.meta +// get post date, previously saved as a luxon datetime object on post // this value is also used for year/month folders, date prefixes, etc. as needed export function date(post) { - return post.meta.date; + return post.date; } // get excerpt, not decoded, newlines collapsed @@ -39,9 +39,9 @@ export function id(post) { return post.data.post_id[0]; } -// get slug, previously decoded and set on post.meta +// get slug, previously decoded and set on post export function slug(post) { - return post.meta.slug; + return post.slug; } // get array of decoded tag names diff --git a/src/parser.js b/src/parser.js index 6819488..b143db0 100644 --- a/src/parser.js +++ b/src/parser.js @@ -60,26 +60,7 @@ function collectPosts(channelData, postTypes, config) { const postsForType = getItemsOfType(channelData, postType) .filter(postData => postData.status[0] !== 'trash' && postData.status[0] !== 'draft') .filter(postData => !(postType === 'page' && postData.post_name[0] === 'sample-page')) - .map(postData => ({ - // raw post data, used by frontmatter getters - data: postData, - - // meta data isn't written to file, but is used to help with other things - meta: { - type: postType, - id: getPostId(postData), - slug: getPostSlug(postData), - date: getPostDate(postData, config), - coverImageId: getPostCoverImageId(postData), - - // these are possibly set later in mergeImagesIntoPosts() - coverImage: undefined, - imageUrls: [] - }, - - // contents of the post in markdown - content: translator.getPostContent(postData, turndownService, config) - })); + .map(postData => buildPost(postData, turndownService, config)); if (postTypes.length > 1) { console.log(`${postsForType.length} "${postType}" posts found.`); @@ -94,26 +75,30 @@ function collectPosts(channelData, postTypes, config) { return allPosts; } -function getPostId(postData) { - return postData.post_id[0]; +function buildPost(data, turndownService, config) { + return { + // full raw post data, used by some frontmatter getters + data, + + // contents of the post in markdown + content: translator.getPostContent(data, turndownService, config), + + // these are not written to file, but help with other things + type: data.post_type[0], + id: data.post_id[0], + slug: decodeURIComponent(data.post_name[0]), + date: luxon.DateTime.fromRFC2822(data.pubDate[0], { zone: config.customDateTimezone }), + coverImageId: getPostMetaValue(data.postmeta, '_thumbnail_id'), + + // these are possibly set later in mergeImagesIntoPosts() + coverImage: undefined, + imageUrls: [] + }; } -function getPostSlug(postData) { - return decodeURIComponent(postData.post_name[0]); -} - -function getPostDate(postData, config) { - return luxon.DateTime.fromRFC2822(postData.pubDate[0], { zone: config.customDateTimezone }); -} - -function getPostCoverImageId(postData) { - if (postData.postmeta === undefined) { - return undefined; - } - - const postmeta = postData.postmeta.find(postmeta => postmeta.meta_key[0] === '_thumbnail_id'); - const id = postmeta ? postmeta.meta_value[0] : undefined; - return id; +function getPostMetaValue(metas, key) { + const meta = metas && metas.find((meta) => meta.meta_key[0] === key); + return meta ? meta.meta_value[0] : undefined; } function collectAttachedImages(channelData) { @@ -161,18 +146,18 @@ function mergeImagesIntoPosts(images, posts) { let shouldAttach = false; // this image was uploaded as an attachment to this post - if (image.postId === post.meta.id) { + if (image.postId === post.id) { shouldAttach = true; } // this image was set as the featured image for this post - if (image.id === post.meta.coverImageId) { + if (image.id === post.coverImageId) { shouldAttach = true; - post.meta.coverImage = shared.getFilenameFromUrl(image.url); + post.coverImage = shared.getFilenameFromUrl(image.url); } - if (shouldAttach && !post.meta.imageUrls.includes(image.url)) { - post.meta.imageUrls.push(image.url); + if (shouldAttach && !post.imageUrls.includes(image.url)) { + post.imageUrls.push(image.url); } }); }); diff --git a/src/writer.js b/src/writer.js index 1d82afa..4b0df4e 100644 --- a/src/writer.js +++ b/src/writer.js @@ -54,7 +54,7 @@ async function writeMarkdownFilesPromise(posts, config) { } else { const payload = { item: post, - name: post.meta.type + ' - ' + post.meta.slug, + name: post.type + ' - ' + post.slug, destinationPath, delay }; @@ -112,7 +112,7 @@ async function writeImageFilesPromise(posts, config) { const payloads = posts.flatMap(post => { const postPath = buildPostPath(post, config); const imagesDir = path.join(path.dirname(postPath), 'images'); - return post.meta.imageUrls.flatMap(imageUrl => { + return post.imageUrls.flatMap(imageUrl => { const filename = shared.getFilenameFromUrl(imageUrl); const destinationPath = path.join(imagesDir, filename); if (checkFile(destinationPath)) { @@ -177,12 +177,7 @@ async function loadImageFilePromise(imageUrl, config) { } function buildPostPath(post, config) { - const outputDir = config.output; - const type = post.meta.type; - const date = post.meta.date; - const slug = post.meta.slug; - - return shared.buildPostPath(outputDir, type, date, slug, config); + return shared.buildPostPath(config.output, post.type, post.date, post.slug, config); } function checkFile(path) {