diff options
Diffstat (limited to 'lib/output/generatePage.js')
-rw-r--r-- | lib/output/generatePage.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/output/generatePage.js b/lib/output/generatePage.js new file mode 100644 index 0000000..a93d4b0 --- /dev/null +++ b/lib/output/generatePage.js @@ -0,0 +1,71 @@ +var Promise = require('../utils/promise'); +var error = require('../utils/error'); +var timing = require('../utils/timing'); + +var Parse = require('../parse'); +var Templating = require('../templating'); +var JSONUtils = require('../json'); +var createTemplateEngine = require('./createTemplateEngine'); +var callPageHook = require('./callPageHook'); + +/** + Prepare and generate HTML for a page + + @param {Output} output + @param {Page} page + @return {Promise<Page>} +*/ +function generatePage(output, page) { + var book = output.getBook(); + var engine = createTemplateEngine(output); + + return timing.measure( + 'page.generate', + Parse.parsePage(book, page) + .then(function(resultPage) { + var file = resultPage.getFile(); + var filePath = file.getPath(); + var parser = file.getParser(); + var context = JSONUtils.encodeBookWithPage(book, resultPage); + + if (!parser) { + return Promise.reject(error.FileNotParsableError({ + filename: filePath + })); + } + + // Call hook "page:before" + return callPageHook('page:before', output, resultPage) + + // Escape code blocks with raw tags + .then(function(currentPage) { + return parser.page.prepare(currentPage.getContent()); + }) + + // Render templating syntax + .then(function(content) { + return Templating.render(engine, filePath, content, context); + }) + + // Render page using parser (markdown -> HTML) + .then(parser.page).get('content') + + // Post processing for templating syntax + .then(function(content) { + return Templating.postRender(engine, content); + }) + + // Return new page + .then(function(content) { + return resultPage.set('content', content); + }) + + // Call final hook + .then(function(currentPage) { + return callPageHook('page', output, currentPage); + }); + }) + ); +} + +module.exports = generatePage; |