meblog
Version:
A simple blog engine for personal blogging
62 lines (61 loc) • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const PostParser_1 = tslib_1.__importDefault(require("./PostParser"));
const Post_1 = require("./Post");
const FileUtils_1 = tslib_1.__importDefault(require("../util/FileUtils"));
const MarkdownItRenderer_1 = tslib_1.__importDefault(require("../markdown/MarkdownItRenderer"));
class MarkdownPostParser extends PostParser_1.default {
mdRenderer;
constructor() {
super();
this.mdRenderer = new MarkdownItRenderer_1.default();
}
parse(filePath, separator = '---') {
const post = {};
let content = FileUtils_1.default.readFile(filePath);
if (!content) {
return new Post_1.Post();
}
post.markdown = content;
post.slug = this.extractSlug(filePath);
let separatorCounter = 0;
const metaLines = [];
while (true) {
const index = content.indexOf('\n');
if (index < 0) {
break;
}
const line = content.substring(0, index).trim();
content = content.substring(index + 1);
if (line === separator) {
separatorCounter += 1;
if (separatorCounter === 2) {
post.body = this.mdRenderer.render(content);
break;
}
else {
continue;
}
}
if (separatorCounter <= 1) {
metaLines.push(line);
}
}
metaLines.forEach((line) => {
const colonIndex = line.indexOf(':');
if (colonIndex <= 0) {
return;
}
const metaName = line.substring(0, colonIndex).trim();
const metaValue = line.substring(colonIndex + 1).trim();
post[metaName] = metaValue;
});
return new Post_1.Post(post);
}
extractSlug(filePath) {
const fileName = FileUtils_1.default.basename(filePath, FileUtils_1.default.ext(filePath));
return fileName.replace(/[^\w-]*/gm, '');
}
}
exports.default = MarkdownPostParser;