summaryrefslogtreecommitdiffstats
path: root/build.js
blob: 1a472fc9e2b715e4e0f87751a1efb8835faee6c7 (plain)
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
51
52
53
54
55
56
57
const fs = require("fs");
const path = require('path');
const M = require("mustache");

// https://stackabuse.com/how-to-split-an-array-into-even-chunks-in-javascript/
function sliceIntoChunks(arr, chunkSize) {
    const res = [];
    for (let i = 0; i < arr.length; i += chunkSize) {
        const chunk = arr.slice(i, i + chunkSize);
        res.push(chunk);
    }
    return res;
}

// https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript
function transpose(matrix) {
    return matrix[0].map((col, i) => matrix.map(row => row[i]));
}

const GALLERY_DIR = "_gallery";
const SRC_DIR = "src";
const DIST_DIR = "dist";
const HTML_TEMP_PATH = path.join(SRC_DIR, "index.html.mustache");
const HTML_OUT_PATH = path.join(DIST_DIR, "index.html");

fs.rmSync(DIST_DIR, { recursive: true, force: true });
fs.cpSync(SRC_DIR, DIST_DIR, { recursive: true });

const htmlTemplate = fs.readFileSync(HTML_TEMP_PATH, "utf-8");

let galleryJsonList = [];
try {
    galleryJsonList = fs.readdirSync(GALLERY_DIR);
} catch (err) {
    if (err.message?.includes("ENOENT")) {
        console.warn("Could not read galleries, using empty list.");
    } else {
        throw err;
    }
}

const galleryViews = galleryJsonList
    .map((fileName) => fs.readFileSync(path.join(GALLERY_DIR, fileName), "utf-8"))
    .map(JSON.parse)
    .map((gallery) => {
        const rows = sliceIntoChunks(gallery["images"], gallery["column_count"]);
        const columns = transpose(rows);
        return {
            ...gallery,
            columns,
        };
    });

const renderedHtml = M.render(htmlTemplate, { galleries: galleryViews} );
fs.writeFileSync(HTML_OUT_PATH, renderedHtml);

console.log("Done.");