|
|
const _ = require('lodash') const cheerio = require('cheerio')
/* global WIKI */
module.exports = async (pageId) => { WIKI.logger.info(`Rendering page ID ${pageId}...`)
try { WIKI.models = require('../core/db').init() await WIKI.configSvc.loadFromDb() await WIKI.configSvc.applyFlags()
const page = await WIKI.models.pages.getPageFromDb(pageId) if (!page) { throw new Error('Invalid Page Id') }
await WIKI.models.renderers.fetchDefinitions() const pipeline = await WIKI.models.renderers.getRenderingPipeline(page.contentType)
let output = page.content
if (_.isEmpty(page.content)) { await WIKI.models.knex.destroy() WIKI.logger.warn(`Failed to render page ID ${pageId} because content was empty: [ FAILED ]`) }
for (let core of pipeline) { const renderer = require(`../modules/rendering/${_.kebabCase(core.key)}/renderer.js`) output = await renderer.render.call({ config: core.config, children: core.children, page: page, input: output }) }
// Parse TOC
const $ = cheerio.load(output) let isStrict = $('h1').length > 0 // <- Allows for documents using H2 as top level
let toc = { root: [] }
$('h1,h2,h3,h4,h5,h6').each((idx, el) => { const depth = _.toSafeInteger(el.name.substring(1)) - (isStrict ? 1 : 2) let leafPathError = false
const leafPath = _.reduce(_.times(depth), (curPath, curIdx) => { if (_.has(toc, curPath)) { const lastLeafIdx = _.get(toc, curPath).length - 1 if (lastLeafIdx >= 0) { curPath = `${curPath}[${lastLeafIdx}].children` } else { leafPathError = true } } return curPath }, 'root')
if (leafPathError) { return }
const leafSlug = $('.toc-anchor', el).first().attr('href') $('.toc-anchor', el).remove()
_.get(toc, leafPath).push({ title: _.trim($(el).text()), anchor: leafSlug, children: [] }) })
// Save to DB
await WIKI.models.pages.query() .patch({ render: output, toc: JSON.stringify(toc.root) }) .where('id', pageId)
// Save to cache
await WIKI.models.pages.savePageToCache({ ...page, render: output, toc: JSON.stringify(toc.root) })
await WIKI.models.knex.destroy()
WIKI.logger.info(`Rendering page ID ${pageId}: [ COMPLETED ]`) } catch (err) { WIKI.logger.error(`Rendering page ID ${pageId}: [ FAILED ]`) WIKI.logger.error(err.message) // exit process with error code
throw err } }
|