@indiekit/preset-jekyll
Version:
Jekyll publication preset for Indiekit
75 lines (66 loc) • 2.04 kB
JavaScript
import snakecaseKeys from "snakecase-keys";
import YAML from "yaml";
/**
* Get content
* @access private
* @param {object} properties - JF2 properties
* @returns {string} Content
*/
const getContent = (properties) => {
if (properties.content) {
const content =
properties.content.text || properties.content.html || properties.content;
return `\n${content}\n`;
} else {
return "";
}
};
/**
* Get front matter
* @access private
* @param {object} properties - JF2 properties
* @returns {string} Front matter in chosen format
*/
const getFrontMatter = (properties) => {
/**
* Jekyll uses snake_case for YAML property keys, i.e. `excerpt_separator`
* @see {@link https://jekyllrb.com/docs/posts/#post-excerpts}
*/
properties = snakecaseKeys(properties, { deep: true });
/**
* Replace Microformat properties with Jekyll equivalents
* @see {@link https://jekyllrb.com/docs/front-matter/ #predefined-variables-for-posts}
*/
properties = {
date: properties.published,
...(properties.name && { title: properties.name }),
...properties,
};
/**
* Draft posts
* @see {@link https://jekyllrb.com/docs/front-matter/#predefined-global-variables}
*/
if (properties.post_status === "draft") {
properties.published = false;
} else {
delete properties.published;
}
delete properties.content; // Shown below front matter
delete properties.name; // Use `title`
delete properties.post_status; // Use `published`
delete properties.slug; // File path dictates slug
delete properties.type; // Not required
delete properties.url; // Not required
const frontMatter = YAML.stringify(properties, { lineWidth: 0 });
return `---\n${frontMatter}---\n`;
};
/**
* Get post template
* @param {object} properties - JF2 properties
* @returns {string} Rendered template
*/
export const getPostTemplate = (properties) => {
const content = getContent(properties);
const frontMatter = getFrontMatter(properties);
return frontMatter + content;
};