import { get, has, isEmpty, reduce, times, toSafeInteger } from 'lodash-es' import * as cheerio from 'cheerio' export async function task ({ payload }) { WIKI.logger.info(`Rendering page ${payload.id}...`) try { await WIKI.ensureDb() const page = await WIKI.db.pages.getPageFromDb(payload.id) if (!page) { throw new Error('Invalid Page Id') } const site = await WIKI.db.sites.query().findById(page.siteId) let output = page.content // Empty content? if (isEmpty(output)) { WIKI.logger.warn(`Failed to render page ID ${payload.id} because content was empty: [ FAILED ]`) throw new Error(`Failed to render page ID ${payload.id} because content was empty.`) } // Parse to HTML switch (page.contentType) { case 'asciidoc': { const { render } = await import('../../renderers/asciidoc.mjs') output = await render(output, site.config?.editors?.asciidoc?.config ?? {}) break } case 'markdown': { const { render } = await import('../../renderers/markdown.mjs') output = await render(output, site.config?.editors?.markdown?.config ?? {}) break } } // Render HTML await WIKI.db.renderers.fetchDefinitions() const pipeline = await WIKI.db.renderers.getRenderingPipeline(page.contentType) for (const core of pipeline) { const { render } = (await import(`../../modules/rendering/${core.key}/renderer.mjs`)) output = await render.call({ config: core.config, children: core.children, page, site, 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({ // label: $(el).text().trim(), // key: leafSlug.substring(1), // children: [] // }) // }) // Save to DB await WIKI.db.pages.query() .patch({ render: output, toc: JSON.stringify(toc.root) }) .where('id', payload.id) // Save to cache // await WIKI.db.pages.savePageToCache({ // ...page, // render: output, // toc: JSON.stringify(toc.root) // }) WIKI.logger.info(`Rendered page ${payload.id}: [ COMPLETED ]`) } catch (err) { WIKI.logger.error(`Rendering page ${payload.id}: [ FAILED ]`) WIKI.logger.error(err.message) throw err } }