77 lines
1.6 KiB
JavaScript
77 lines
1.6 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const isAbsolute = require('path-is-absolute');
|
|
const jade = require('jade');
|
|
const markdown = require('markdown-it');
|
|
const hljs = require('highlight.js');
|
|
|
|
class PageMarkdown {
|
|
|
|
constructor(config) {
|
|
|
|
config = config || {}
|
|
console.log(config)
|
|
this.file = config.file;
|
|
this.title = config.title || path.basename(this.file);
|
|
this.template = config.template || path.join(__dirname, './template.jade');
|
|
|
|
if (!isAbsolute(this.template)) {
|
|
this.template = path.join(process.cwd(), this.template);
|
|
}
|
|
|
|
if (!fs.existsSync(this.file)) {
|
|
throw new Error(`${this.file} does not exist`);
|
|
}
|
|
|
|
if (!fs.statSync(this.file).isFile()) {
|
|
throw new Error(`${this.file} is not a markdown file`);
|
|
}
|
|
|
|
this.md = markdown({
|
|
langPrefix: 'hljs ',
|
|
highlight: (string, lang) => {
|
|
try {
|
|
if (lang) {
|
|
return hljs.highlight(lang, string).value;
|
|
} else {
|
|
return hljs.highlightAuto(string).value;
|
|
}
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
return '';
|
|
}
|
|
});
|
|
}
|
|
|
|
render() {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
let string = fs.readFileSync(this.file).toString();
|
|
let html = this.md.render(string);
|
|
|
|
let options = {
|
|
pretty: true,
|
|
title: this.title,
|
|
content: html
|
|
};
|
|
|
|
jade.renderFile(this.template, options, (error, html) => {
|
|
|
|
if (error) {
|
|
reject(error);
|
|
}
|
|
|
|
resolve(html);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports.PageMarkdown = PageMarkdown;
|
|
|
|
|