json-to-frontmatter-markdown
Version:
Transform json to a markdown file with frontmatter and body
85 lines (76 loc) • 2.11 kB
JavaScript
/* @flow */
import leftPad from "left-pad";
type TFrontMatter = {
[string]: string | Array<string>
};
export type TFrontMatterMarkdown = {
frontmatter: Array<TFrontMatter>,
body: string
};
function newLineAndIndent(markdownString, depth) {
if (depth === 0) {
return `${markdownString}\n`;
}
return `${markdownString}\n${leftPad('', depth*2)}`;
}
function transformMarkdownKeyValueToString(
key,
value,
markdownString,
depth = 0
) {
try {
if (typeof value === "object") {
if (value instanceof Array) {
const arrayString = `${value.map(item => `"${item}"`)}`;
return `${newLineAndIndent(
markdownString,
depth
)}${key}: [${arrayString}]`;
} else if (value instanceof Error) {
return markdownString;
} else {
return Object.entries(value).reduce(
(accString, [entryKey, entryValue]) => {
return `${transformMarkdownKeyValueToString(
entryKey,
entryValue,
accString,
depth + 1
)}`;
},
`${newLineAndIndent(markdownString, depth)}${key}:`
);
}
} else {
return `${newLineAndIndent(markdownString, depth)}${key}: "${value}"`;
}
} catch (err) {
return `${newLineAndIndent(markdownString, depth)}${key}: ${JSON.stringify(
value
)}`;
}
}
function transformToMarkdownString(frontmatterMarkdown: TFrontMatterMarkdown) {
let markdownString = `---`;
frontmatterMarkdown.frontmatter.forEach(frontmatterField =>
Object.entries(frontmatterField).forEach(([key, value]) => {
markdownString = transformMarkdownKeyValueToString(
key,
value,
markdownString
);
})
);
markdownString = `${markdownString}\n---`;
try {
markdownString = `${markdownString}\n${frontmatterMarkdown.body}`;
} catch (e) {
markdownString = `${markdownString}\n${JSON.stringify(
frontmatterMarkdown.body
)}`;
}
// TODO implement the transform
return markdownString;
}
export default transformToMarkdownString;