mystjs
Version:
Markdown parser for MyST markdown in JavaScript
141 lines • 6.66 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mystParser = exports.MyST = exports.defaultOptions = exports.rolesDefault = exports.Role = exports.directiveOptions = exports.Directive = exports.directivesDefault = void 0;
const markdown_it_1 = __importDefault(require("markdown-it"));
const unified_1 = require("unified");
const rehype_stringify_1 = __importDefault(require("rehype-stringify"));
const markdown_it_docutils_1 = require("markdown-it-docutils");
const config_1 = require("./config");
const mdast_1 = require("./mdast");
const plugins_1 = require("./plugins");
var markdown_it_docutils_2 = require("markdown-it-docutils");
Object.defineProperty(exports, "directivesDefault", { enumerable: true, get: function () { return markdown_it_docutils_2.directivesDefault; } });
Object.defineProperty(exports, "Directive", { enumerable: true, get: function () { return markdown_it_docutils_2.Directive; } });
Object.defineProperty(exports, "directiveOptions", { enumerable: true, get: function () { return markdown_it_docutils_2.directiveOptions; } });
Object.defineProperty(exports, "Role", { enumerable: true, get: function () { return markdown_it_docutils_2.Role; } });
Object.defineProperty(exports, "rolesDefault", { enumerable: true, get: function () { return markdown_it_docutils_2.rolesDefault; } });
exports.defaultOptions = {
allowDangerousHtml: false,
markdownit: {},
extensions: {
colonFences: true,
frontmatter: true,
math: true,
footnotes: true,
deflist: true,
tasklist: true,
tables: true,
blocks: true,
},
transform: {},
docutils: {
roles: markdown_it_docutils_1.rolesDefault,
directives: markdown_it_docutils_1.directivesDefault,
},
mdast: {},
hast: {
clobberPrefix: 'm-',
},
formatHtml: true,
stringifyHtml: {},
};
class MyST {
constructor(opts = exports.defaultOptions) {
this.opts = this._parseOptions(opts);
this.tokenizer = this._createTokenizer();
}
_parseOptions(user) {
var _a, _b, _c, _d;
const opts = {
allowDangerousHtml: (_a = user.allowDangerousHtml) !== null && _a !== void 0 ? _a : exports.defaultOptions.allowDangerousHtml,
transform: Object.assign(Object.assign({}, exports.defaultOptions.transform), user.transform),
mdast: Object.assign(Object.assign({}, exports.defaultOptions.mdast), user.mdast),
hast: Object.assign(Object.assign({}, exports.defaultOptions.hast), user.hast),
docutils: Object.assign(Object.assign({}, exports.defaultOptions.docutils), user.docutils),
markdownit: Object.assign(Object.assign({}, exports.defaultOptions.markdownit), user.markdownit),
extensions: Object.assign(Object.assign({}, exports.defaultOptions.extensions), user.extensions),
formatHtml: (_b = user.formatHtml) !== null && _b !== void 0 ? _b : exports.defaultOptions.formatHtml,
stringifyHtml: Object.assign(Object.assign({}, exports.defaultOptions.stringifyHtml), user.stringifyHtml),
};
const rolesHandlers = {};
const directivesHandlers = {};
const mdastHandlers = {};
const hastHandlers = {};
Object.entries((_c = user.roles) !== null && _c !== void 0 ? _c : {}).forEach(([k, { myst, mdast, hast }]) => {
rolesHandlers[k] = myst;
mdastHandlers[k] = mdast;
hastHandlers[mdast.type] = hast;
});
Object.entries((_d = user.directives) !== null && _d !== void 0 ? _d : {}).forEach(([k, { myst, mdast, hast }]) => {
directivesHandlers[k] = myst;
mdastHandlers[k] = mdast;
hastHandlers[mdast.type] = hast;
});
opts.docutils.roles = Object.assign(Object.assign({}, opts.docutils.roles), rolesHandlers);
opts.docutils.directives = Object.assign(Object.assign({}, opts.docutils.directives), directivesHandlers);
opts.hast.handlers = Object.assign(Object.assign({}, opts.hast.handlers), hastHandlers);
opts.mdast.handlers = Object.assign(Object.assign({}, opts.mdast.handlers), mdastHandlers);
if (opts.allowDangerousHtml) {
opts.markdownit.html = true;
opts.hast.allowDangerousHtml = true;
opts.hast.allowDangerousHtml = true;
opts.stringifyHtml.allowDangerousHtml = true;
}
return opts;
}
_createTokenizer() {
const exts = this.opts.extensions;
const tokenizer = (0, markdown_it_1.default)(config_1.MARKDOWN_IT_CONFIG, this.opts.markdownit);
if (exts.tables)
tokenizer.enable('table');
if (exts.colonFences)
tokenizer.use(plugins_1.colonFencePlugin);
if (exts.frontmatter)
tokenizer.use(plugins_1.frontMatterPlugin, () => ({})).use(plugins_1.convertFrontMatter);
if (exts.blocks)
tokenizer.use(plugins_1.mystBlockPlugin);
if (exts.footnotes)
tokenizer.use(plugins_1.footnotePlugin).disable('footnote_inline'); // not yet implemented in myst-parser
tokenizer.use(plugins_1.docutilsPlugin, this.opts.docutils);
if (exts.math)
tokenizer.use(plugins_1.mathPlugin, exts.math);
if (exts.deflist)
tokenizer.use(plugins_1.deflistPlugin);
if (exts.tasklist)
tokenizer.use(plugins_1.tasklistPlugin);
return tokenizer;
}
parse(content) {
return (0, mdast_1.tokensToMyst)(this.tokenizer.parse(content, {}), this.opts.mdast);
}
render(content) {
const tree = this.parse(content);
const html = this.renderMdast(tree);
return html;
}
renderMdast(tree) {
const state = new mdast_1.State();
const pipe = (0, unified_1.unified)()
.use(mdast_1.transform, state, this.opts.transform)
.use(mdast_1.mystToHast, this.opts.hast)
.use(mdast_1.formatHtml, this.opts.formatHtml)
.use(rehype_stringify_1.default, this.opts.stringifyHtml);
const result = pipe.runSync(tree);
const html = pipe.stringify(result);
return html.trim();
}
}
exports.MyST = MyST;
/**
* MyST Parser as a Unified Plugin
*/
const mystParser = function mystParser() {
this.Parser = (content, opts) => {
return new MyST(opts).parse(content);
};
};
exports.mystParser = mystParser;
//# sourceMappingURL=myst.js.map
;