move the tree rendering steps to lib/page-data which happens during warm-server
This commit is contained in:
@@ -1,9 +1,13 @@
|
|||||||
const path = require('path')
|
const path = require('path')
|
||||||
const languages = require('./languages')
|
const languages = require('./languages')
|
||||||
const versions = Object.keys(require('./all-versions'))
|
const versions = Object.keys(require('./all-versions'))
|
||||||
|
const enterpriseServerVersions = versions.filter(v => v.startsWith('enterprise-server@'))
|
||||||
const createTree = require('./create-tree')
|
const createTree = require('./create-tree')
|
||||||
|
const renderContent = require('./render-content')
|
||||||
|
const loadSiteData = require('./site-data')
|
||||||
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
|
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
|
||||||
const englishPath = path.posix.join(__dirname, '..', 'content')
|
const englishPath = path.posix.join(__dirname, '..', 'content')
|
||||||
|
const renderOpts = { textOnly: true, encodeEntities: true }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We only need to initialize pages _once per language_ since pages don't change per version. So we do that
|
* We only need to initialize pages _once per language_ since pages don't change per version. So we do that
|
||||||
@@ -33,7 +37,8 @@ async function loadUnversionedTree () {
|
|||||||
*
|
*
|
||||||
* Order of languages and versions doesn't matter, but order of child page arrays DOES matter (for navigation).
|
* Order of languages and versions doesn't matter, but order of child page arrays DOES matter (for navigation).
|
||||||
*/
|
*/
|
||||||
async function loadSiteTree (unversionedTree) {
|
async function loadSiteTree (unversionedTree, siteData) {
|
||||||
|
const site = siteData || await loadSiteData()
|
||||||
const rawTree = Object.assign({}, (unversionedTree || await loadUnversionedTree()))
|
const rawTree = Object.assign({}, (unversionedTree || await loadUnversionedTree()))
|
||||||
const siteTree = {}
|
const siteTree = {}
|
||||||
|
|
||||||
@@ -43,7 +48,7 @@ async function loadSiteTree (unversionedTree) {
|
|||||||
// in every version...
|
// in every version...
|
||||||
await Promise.all(versions.map(async (version) => {
|
await Promise.all(versions.map(async (version) => {
|
||||||
// "version" the pages.
|
// "version" the pages.
|
||||||
treePerVersion[version] = versionPages(Object.assign({}, rawTree[langCode]), version)
|
treePerVersion[version] = await versionPages(Object.assign({}, rawTree[langCode]), version, langCode, siteData)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
siteTree[langCode] = treePerVersion
|
siteTree[langCode] = treePerVersion
|
||||||
@@ -52,20 +57,56 @@ async function loadSiteTree (unversionedTree) {
|
|||||||
return siteTree
|
return siteTree
|
||||||
}
|
}
|
||||||
|
|
||||||
// This step can't be asynchronous because the order of child pages matters.
|
async function versionPages (obj, version, langCode, siteData) {
|
||||||
function versionPages (obj, version) {
|
|
||||||
// Add a versioned href as a convenience for use in layouts.
|
// Add a versioned href as a convenience for use in layouts.
|
||||||
obj.href = obj.page.permalinks
|
obj.href = obj.page.permalinks
|
||||||
.find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
|
.find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
|
||||||
.href
|
.href
|
||||||
|
|
||||||
|
const context = {
|
||||||
|
currentLanguage: langCode,
|
||||||
|
currentVersion: version,
|
||||||
|
enterpriseServerVersions,
|
||||||
|
site: site[langCode].site
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render any titles, short titles, and intros that contain Liquid.
|
||||||
|
// Note the Liquid parseAndRender method is MUCH faster than renderContent or renderProp.
|
||||||
|
obj.renderedFullTitle = obj.page.title.includes('{')
|
||||||
|
? await renderContent.liquid.parseAndRender(obj.page.title, context, renderOpts)
|
||||||
|
: obj.page.title
|
||||||
|
|
||||||
|
if (obj.page.shortTitle) {
|
||||||
|
obj.renderedShortTitle = obj.page.shortTitle.includes('{')
|
||||||
|
? await renderContent.liquid.parseAndRender(obj.page.shortTitle, context, renderOpts)
|
||||||
|
: obj.page.shortTitle
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj.page.intro) {
|
||||||
|
obj.renderedIntro = obj.page.intro.includes('{')
|
||||||
|
? await renderContent.liquid.parseAndRender(obj.page.intro, context, renderOpts)
|
||||||
|
: obj.page.intro
|
||||||
|
}
|
||||||
|
|
||||||
|
// Surface any Liquid within Liquid that may not have been parsed, since we are not doing
|
||||||
|
// parsing round trips above in order to protect our warm-server performance.
|
||||||
|
if (obj.renderedFullTitle.includes('}')) {
|
||||||
|
console.error(`WARNING: found Liquid in parsed title on ${obj.page.fullPath}`)
|
||||||
|
}
|
||||||
|
if (obj.renderedShortTitle && obj.renderedShortTitle.includes('}')) {
|
||||||
|
console.error(`WARNING: found Liquid in parsed short title on ${obj.page.fullPath}`)
|
||||||
|
}
|
||||||
|
if (obj.renderedIntro && obj.renderedIntro.includes('}')) {
|
||||||
|
console.error(`WARNING: found Liquid in parsed intro on ${obj.page.fullPath}`)
|
||||||
|
}
|
||||||
|
|
||||||
if (!obj.childPages) return obj
|
if (!obj.childPages) return obj
|
||||||
|
|
||||||
const versionedChildPages = obj.childPages
|
const versionedChildPages = await Promise.all(obj.childPages
|
||||||
// Drop child pages that do not apply to the current version.
|
// Drop child pages that do not apply to the current version.
|
||||||
.filter(childPage => childPage.page.applicableVersions.includes(version))
|
.filter(childPage => childPage.page.applicableVersions.includes(version))
|
||||||
// Version the child pages recursively.
|
// Version the child pages recursively.
|
||||||
.map(childPage => versionPages(Object.assign({}, childPage), version))
|
.map(async (childPage) => await versionPages(Object.assign({}, childPage), version, langCode, siteData)))
|
||||||
|
|
||||||
obj.childPages = [...versionedChildPages]
|
obj.childPages = [...versionedChildPages]
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,12 @@ async function warmServer () {
|
|||||||
unversionedTree = await dog.loadUnversionedTree()
|
unversionedTree = await dog.loadUnversionedTree()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!site) {
|
||||||
|
site = dog.loadSiteData()
|
||||||
|
}
|
||||||
|
|
||||||
if (!siteTree) {
|
if (!siteTree) {
|
||||||
siteTree = await dog.loadSiteTree(unversionedTree)
|
siteTree = await dog.loadSiteTree(unversionedTree, site)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pageList) {
|
if (!pageList) {
|
||||||
@@ -56,10 +60,6 @@ async function warmServer () {
|
|||||||
pageMap = await dog.loadPageMap(pageList)
|
pageMap = await dog.loadPageMap(pageList)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!site) {
|
|
||||||
site = dog.loadSiteData()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!redirects) {
|
if (!redirects) {
|
||||||
redirects = await dog.loadRedirects(pageList)
|
redirects = await dog.loadRedirects(pageList)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
const { sortBy } = require('lodash')
|
|
||||||
const renderOpts = { textOnly: true, encodeEntities: true }
|
|
||||||
|
|
||||||
module.exports = async function renderTreeTitles (req, res, next) {
|
|
||||||
if (!req.context.page) return next()
|
|
||||||
if (req.context.page.documentType === 'homepage') return next()
|
|
||||||
|
|
||||||
await renderLiquidInTitles(req.context.siteTree[req.context.currentLanguage][req.context.currentVersion], req.context)
|
|
||||||
|
|
||||||
return next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new props to each siteTree page here...
|
|
||||||
async function renderLiquidInTitles (pageInTree, context) {
|
|
||||||
// We _only_ need to render the titles and shortTitles that contain Liquid.
|
|
||||||
pageInTree.renderedFullTitle = pageInTree.page.title.includes('{')
|
|
||||||
? await pageInTree.page.renderProp('title', context, renderOpts)
|
|
||||||
: pageInTree.page.title
|
|
||||||
|
|
||||||
if (pageInTree.page.shortTitle) {
|
|
||||||
pageInTree.renderedShortTitle = pageInTree.page.shortTitle.includes('{')
|
|
||||||
? await pageInTree.page.renderProp('shortTitle', context, renderOpts)
|
|
||||||
: pageInTree.page.shortTitle
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pageInTree.childPages) return
|
|
||||||
|
|
||||||
pageInTree.page.childPages = sortBy(
|
|
||||||
await Promise.all(pageInTree.childPages.map(async (childPage) => await renderLiquidInTitles(childPage, context))),
|
|
||||||
// Sort by the ordered array of `children` in the frontmatter.
|
|
||||||
pageInTree.page.children
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user