-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild-categories.js
50 lines (45 loc) · 1.74 KB
/
build-categories.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const fs = require('fs');
const yaml = require('js-yaml');
const { titleCase } = require('title-case');
const { noCase } = require('change-case');
const flatten = require('flat');
function buildCategories(outFile) {
const categories = {};
for (const dataDir of fs.readdirSync(`data`)) {
for (const entryFile of fs.readdirSync(`data/${dataDir}`, {})) {
const entryData = yaml.load(fs.readFileSync(`data/${dataDir}/${entryFile}`));
if (!entryData) {
continue;
}
const entryName =
(entryData.config && entryData.config.title) || titleCase(noCase(entryFile.split('.')[0]));
if (entryData.config && entryData.config.categories) {
const categoriesToAdd = flatten(entryData.config.categories, { delimiter: '~' });
for (const category of Object.keys(categoriesToAdd)) {
// make sure all upper categories exist
for (const [index, subcategory] of category.split('~').entries()) {
const subcategoryFullName = category
.split('~')
.slice(0, index + 1)
.join('~');
const subcategoryPages = categories[subcategoryFullName] || [];
categories[subcategoryFullName] = subcategoryPages;
}
const categoryPages = categories[category] || [];
categoryPages.push(entryName);
categories[category] = categoryPages;
}
}
}
}
fs.writeFileSync(outFile, JSON.stringify(categories));
return categories;
}
if (require.main === module) {
// Called directly in console
const outFile = process.argv[2] || 'public/categories.json';
buildCategories(outFile);
} else {
// Called in build.js or dev-server.js
module.exports = buildCategories('public/categories.json');
}