md-toy-blog
Version:
Very simple Markdown blog: serves your md as html without fancy databases. You will only spend time writing the actual data.
54 lines (45 loc) • 1.76 kB
text/typescript
import fs from 'fs';
export default class MarkdownToHtmlService { //implements MarkdownToHtmlConstructorInterface {
private defaultPostPrivacy: "private" | "public" = "private";
private fm: FmFunction;
private converter: SdConverter;
constructor({fm, converter} : { fm: FmFunction; converter: SdConverter; }) {
this.fm = fm;
this.converter = converter;
}
extractFmAttributesAndHtmlBodyFromMd(postSlug: string, markdownFilePath: string, preHtmlCallback: PreHtmlCallback) {
const fm = this.fm;
const converter = this.converter;
const privacy = this.defaultPostPrivacy;
return new Promise<FmDataInterface>(function(resolve, reject) {
fs.readFile(markdownFilePath, 'utf-8', function(err, fileContents) {
if (err) return reject(err);
let data = fm(fileContents);
const attributes = (typeof data.attributes === 'undefined')
? { privacy }
: { ...data.attributes };
const attributesWithSlug = {
...attributes,
slug: postSlug,
privacy: attributes?.privacy || privacy
}
const fixNoLanguageBugFallbackToJS = function (body: string) {
return body.replace(/```\n([\s\S]*?\n)```/sg, "```text\n$1```");
};
const safeBody = fixNoLanguageBugFallbackToJS(data.body);
const dataBeforeCallback = {
...data,
attributes: { ...attributesWithSlug },
body: safeBody,
};
const dataAfterCallback = preHtmlCallback
? preHtmlCallback(dataBeforeCallback)
: { ...dataBeforeCallback };
return resolve({
...dataAfterCallback,
bodyHtml: converter.makeHtml(dataAfterCallback.body)
});
});
})
};
}