Skip to content

Commit 3a236bb

Browse files
committed
create a new module page-data and revert lib/pages
1 parent 3f8681c commit 3a236bb

2 files changed

Lines changed: 68 additions & 78 deletions

File tree

lib/page-data.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
const path = require('path')
2+
const languages = require('./languages')
3+
const versions = Object.keys(require('./all-versions'))
4+
const createTree = require('./create-tree')
5+
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
6+
const englishPath = path.join(__dirname, '..', 'content')
7+
8+
// This function creates three structures that we need for various purposes:
9+
// 1. siteTree: A nested object with pages for every language and version:
10+
// siteTree[languageCode][version].childPages[<array of pages>].childPages[<array of pages>] (etc...)
11+
//
12+
// 2. pageMap: A map of all pages with permalinks as keys for fast lookup.
13+
//
14+
// 3. pageList: A simple array of all page objects for fast iterating.
15+
module.exports = async function loadPageData () {
16+
// We only need to initialize pages *once per language* since pages don't change per version. So we do that
17+
// first since it's the most expensive work. This gets us a nested object with pages attached that we can use
18+
// as the basis for the siteTree after we do some versioning.
19+
const rawTree = {}
20+
await Promise.all(Object.values(languages)
21+
.map(async (langObj) => {
22+
rawTree[langObj.code] = await createTree(englishPath, langObj)
23+
}))
24+
25+
// Now that we have the object of all pages per language, we can walk it for each version and do a couple operations:
26+
// 1. Add a versioned href to every item, where the href is the relevant permalink for the current version.
27+
// A) Add an entry for the permalink in the pageMap.
28+
// 2. Drop any child pages that are not available in the current version.
29+
// Note that order of languages and versions doesn't matter, but order of child page arrays DOES matter (for navigation).
30+
const siteTree = {}
31+
const pageMap = {}
32+
33+
await Promise.all(Object.keys(languages).map(async (langCode) => {
34+
const treePerVersion = {}
35+
36+
await Promise.all(versions.map(async (version) => {
37+
// Yes, we are mutating the rawTree object here.
38+
versionPages(rawTree[langCode])
39+
40+
// This step can't be asynchronous because the order of child pages matters.
41+
function versionPages (item) {
42+
// Add a versioned href as a convenience for use in layouts.
43+
item.href = item.page.permalinks
44+
.find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
45+
.href
46+
47+
// Add permalinks to the pageMap.
48+
pageMap[item.href] = item.page
49+
50+
if (!item.childPages) return item
51+
52+
// Drop child pages that do not apply to the current version
53+
item.childPages = item.childPages.filter(childPage => childPage.page.applicableVersions.includes(version))
54+
item.childPages.forEach(childPage => versionPages(childPage))
55+
}
56+
57+
treePerVersion[version] = rawTree[langCode]
58+
}))
59+
60+
siteTree[langCode] = treePerVersion
61+
}))
62+
63+
// Get a simple array of pages.
64+
const pageList = [...new Set(Object.values(pageMap))]
65+
66+
return { siteTree, pageList, pageMap }
67+
}

lib/pages.js

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,7 @@
11
const path = require('path')
2-
const languages = require('./languages')
3-
const versions = Object.keys(require('./all-versions'))
4-
const createTree = require('./create-tree')
5-
const nonEnterpriseDefaultVersion = require('./non-enterprise-default-version')
6-
const englishPath = path.join(__dirname, '..', 'content')
72
const walk = require('walk-sync').entries
83
const Page = require('./page')
9-
10-
// This function creates a nested object that can be accessed like this:
11-
// siteTree[languageCode][version].childPages[<array of pages>].childPages[<array of pages>] (etc...)
12-
async function loadTree () {
13-
// We only need to initialize pages once per language (since pages don't change per version), so we do that
14-
// first since it's the most expensive work. This gets us a nested object with pages attached that we can use
15-
// as the basis for the siteTree after we do some versioning.
16-
const rawTree = {}
17-
await Promise.all(Object.values(languages)
18-
.map(async (langObj) => {
19-
rawTree[langObj.code] = await createTree(englishPath, langObj)
20-
}))
21-
22-
// Now that we have the paged tree, we can walk it for every version and do two operations:
23-
// 1. Add a versioned href to every node (we can get this easily from the permalinks array).
24-
// 2. Recurisvely drop any child pages that are not available in the current version.
25-
// Note that order of languages and versions doesn't matter, but order of child page arrays DOES matter (for nav).
26-
const siteTree = {}
27-
await Promise.all(Object.keys(languages).map(async (langCode) => {
28-
const treePerVersion = {}
29-
30-
await Promise.all(versions.map(async (version) => {
31-
// Yes, we are mutating the rawTree object here.
32-
versionPages(rawTree[langCode])
33-
34-
// This step can't be asynchronous because the order of child pages matters.
35-
function versionPages (item) {
36-
// Add a versioned href as a convenience for use in layouts.
37-
item.href = item.page.permalinks
38-
.find(pl => pl.pageVersion === version || (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion))
39-
40-
if (!item.childPages) return item
41-
42-
// Drop child pages that do not apply to the current version
43-
item.childPages = item.childPages.filter(childPage => childPage.page.applicableVersions.includes(version))
44-
item.childPages.forEach(childPage => versionPages(childPage))
45-
}
46-
47-
treePerVersion[version] = rawTree[langCode]
48-
}))
49-
50-
siteTree[langCode] = treePerVersion
51-
}))
52-
53-
console.log(siteTree.en[nonEnterpriseDefaultVersion])
54-
55-
return siteTree
56-
}
57-
58-
async function loadPageListFromTree (tree) {
59-
const siteTree = tree || await loadTree()
60-
61-
// Traverse the tree of pages and create a simple array of pages.
62-
// (We don't care about the language code or version here, so we can start two levels in.)
63-
const collection = Object.values(siteTree).map(v => Object.values(v)).flat()
64-
const result = []
65-
collectPages(collection, result)
66-
67-
function collectPages (arr, result) {
68-
arr.forEach(item => {
69-
if (item.page) {
70-
result.push(item.page)
71-
}
72-
if (item.childPages) {
73-
collectPages(item.childPages, result)
74-
}
75-
})
76-
}
77-
78-
return result
79-
}
4+
const languages = require('./languages')
805

816
async function loadPageList () {
827
// load english pages
@@ -141,8 +66,6 @@ async function loadPageMap (pageList) {
14166
}
14267

14368
module.exports = {
144-
loadTree,
145-
// loadPages: loadPageListFromTree,
14669
loadPages: loadPageList,
14770
loadPageMap
14871
}

0 commit comments

Comments
 (0)