Skip to content

Commit 0878100

Browse files
committed
Build categories script
1 parent 78384db commit 0878100

File tree

3 files changed

+57
-44
lines changed

3 files changed

+57
-44
lines changed

build-categories.js

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

build.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,15 @@ fse.writeFileSync('dist/css/style.css', sassResult.css.toString());
2525
fse.writeFileSync('dist/css/style.css.map', sassResult.map.toString());
2626

2727
// Build HTML
28-
const entryTemplate = ejs.compile(
29-
fse.readFileSync('src/views/pages/entry.ejs').toString(),
30-
{ filename: 'src/views/pages/entry.ejs' }
31-
);
28+
const categories = require('build-categories');
29+
const entryTemplate = ejs.compile(fse.readFileSync('src/views/pages/entry.ejs').toString(), {
30+
filename: 'src/views/pages/entry.ejs',
31+
});
3232
for (const dataDir of fse.readdirSync(`data`)) {
3333
for (const entryFile of fse.readdirSync(`data/${dataDir}`, {})) {
3434
const entryName =
35-
(entryData.config && entryData.config.title) ||
36-
titleCase(noCase(entryFile.split('.')[0]));
37-
const entryData = yaml.load(
38-
fse.readFileSync(`data/${dataDir}/${entryFile}`)
39-
);
35+
(entryData.config && entryData.config.title) || titleCase(noCase(entryFile.split('.')[0]));
36+
const entryData = yaml.load(fse.readFileSync(`data/${dataDir}/${entryFile}`));
4037

4138
const html = entryTemplate({
4239
entryData,

dev-server.js

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
const fse = require('fs-extra');
22
const path = require('path');
3-
const flatten = require('flat');
4-
const { get, set } = require('lodash');
53
const { paramCase, noCase } = require('change-case');
64
const { titleCase } = require('title-case');
75
const yaml = require('js-yaml');
@@ -25,43 +23,14 @@ app.get('/js/*.js', (req, res) => {
2523
});
2624

2725
app.get('/categories', (req, res) => {
28-
const categories = {};
29-
for (const dataDir of fse.readdirSync(`data`)) {
30-
for (const entryFile of fse.readdirSync(`data/${dataDir}`, {})) {
31-
const entryData = yaml.load(fse.readFileSync(`data/${dataDir}/${entryFile}`));
32-
const entryName =
33-
(entryData.config && entryData.config.title) || titleCase(noCase(entryFile.split('.')[0]));
34-
35-
if (entryData.config && entryData.config.categories) {
36-
const categoriesToAdd = flatten(entryData.config.categories, { delimiter: '~' });
37-
for (const category of Object.keys(categoriesToAdd)) {
38-
// make sure all upper categories exist
39-
for (const [index, subcategory] of category.split('~').entries()) {
40-
const subcategoryFullName = category
41-
.split('~')
42-
.slice(0, index + 1)
43-
.join('~');
44-
const subcategoryPages = categories[subcategoryFullName] || [];
45-
categories[subcategoryFullName] = subcategoryPages;
46-
}
47-
48-
const categoryPages = categories[category] || [];
49-
categoryPages.push(entryName);
50-
categories[category] = categoryPages;
51-
52-
// const categoryPath = category.split('~');
53-
// const categoryPages = get(categories, categoryPath, []);
54-
// categoryPages.push(entryName);
55-
// instead of set, we need array push
56-
// 'three': ['a', 'b', 'c', {deep: ['d', 'e', 'f']}, ],
57-
// set(categories, categoryPath, categoryPages);
58-
}
59-
}
60-
}
26+
if (!fse.existsSync('./public/categories.json')) {
27+
require('./build-categories');
6128
}
29+
const categories = require('./public/categories.json');
6230
res.render('pages/categories', { categories });
6331
});
6432

33+
app.get('/category/:categoryPath', (req, res) => {});
6534
app.get('/:entryPath', (req, res) => {
6635
const { entryPath } = req.params;
6736

0 commit comments

Comments
 (0)