const PostHTML = require('posthtml'); const parser = require('./parser'); const renderer = require('./renderer'); /** * @typedef {Object} PostHTMLTree * @see https://github.com/posthtml/posthtml/blob/master/docs/tree.md#json */ class PostHTMLProcessingResult { constructor(tree) { this.tree = tree; } get html() { return this.toString(); } toString() { return renderer(this.tree, this.tree.options); } render() { return this.toString(); } } class Processor { /** * @param {Array} [plugins] */ constructor(plugins) { const posthtml = this.posthtml = PostHTML(plugins); this.version = posthtml.version; this.name = posthtml.name; this.plugins = posthtml.plugins; } /** * @param {...Function} plugins * @return {Processor} */ use(...plugins) { this.posthtml.use.apply(this, ...plugins); return this; } /** * @param {string|PostHTMLTree} ast * @param {Object} options {@see https://github.com/posthtml/posthtml-render#options} * @return {Promise} */ process(ast, options = null) { const opts = Object.assign({ parser }, options); return this.posthtml.process(ast, opts).then(({ tree }) => new PostHTMLProcessingResult(tree)); } } Processor.parser = parser; Processor.render = renderer; /** * @param {Array} [plugins] * @return {Processor} */ module.exports = plugins => new Processor(plugins); module.exports.parser = parser; module.exports.renderer = renderer; module.exports.Processor = Processor; module.exports.Result = PostHTMLProcessingResult;