Peter Bacon Darwin 4d5fa5c855 build(aio): capture the h1 title and attach it to the document
The HTML post-processing now collects any h1
that is found in the renderedContent and attaches
it to the doc via the `doc.vFile.title` property.
2017-05-31 08:45:31 +03:00

50 lines
1.6 KiB
JavaScript

const rehype = require('rehype');
/**
* @dgProcessor postProcessHtml
*
* @description
* Use the rehype processing engine to manipulate the
* `renderedContent` HTML via rehype "plugins" that work with HTML ASTs (HASTs).
* See https://github.com/wooorm/rehype
*
* Each plugin is a factory function that will be called with the "rehype" engine as `this`.
* The factory should return a "transform" function that takes a HAST and returns a `boolean` or `undefined`.
* The HAST can be mutated by the "transform" function.
* If `false` is returned then the processing stops with that plugin.
*
* @property docTypes {string[]} the `docTypes` of docs that should be post-processed
* @property plugins {Function[]} the rehype plugins that will modify the HAST.
*
*/
module.exports = function postProcessHtml(log, createDocMessage) {
return {
$runAfter: ['docs-rendered'],
$runBefore: ['writing-files'],
docTypes: [],
plugins: [],
$process(docs) {
const engine = rehype()
.data('settings', { fragment: true });
this.plugins.forEach(plugin => engine.use(plugin));
let vFile;
docs
.filter(doc => this.docTypes.indexOf(doc.docType) !== -1)
.forEach(doc => {
try {
vFile = engine.processSync(doc.renderedContent);
doc.renderedContent = vFile.contents;
vFile.messages.forEach(m => {
log.warn(createDocMessage(m.message, doc));
});
doc.vFile = vFile;
} catch(e) {
throw new Error(createDocMessage(e.message, doc));
}
});
}
};
};