aboutsummaryrefslogtreecommitdiffstats
path: root/app/directory.mjs
blob: 38b05cad5aebbe2135e136cb1371f1f929a9e1b9 (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
'use strict';

import { PAGES_DIR, PURGE_COOLDOWN_MIN } from './constants.mjs';
import { parse } from './wikiparser.mjs';
import { readFileSync, readdirSync } from 'fs';

const pages = {};
const metadata = {};

export function pageFor(path) {
    path = path.replace(/[^a-z0-9]/gi, '_').toLowerCase();
    let page = pages[path];
    if (!page) {
        return undefined;
    }

    if (!page.html) {
        buildPage(path);
        return pages[path];
    }

    return page;
}

export function buildPage(path) {
    let data;
    try {
        data = readFileSync(`${PAGES_DIR}/${path}.wiki`, 'utf-8'); 
    } catch {
        return false;
    }
    let result = parse(data);
    let title = result.metadata.displayTitle ?? 'Unnamed page';
    let content = `${result.metadata.notitle ? '' : `<h1>${title}</h1>`}${result.html}`;

    let page = {
        html: content,
        raw: data,
        buildTime: result.metadata.buildTime,
        primary: result.metadata.primary ?? false,
        sortOrder: result.metadata.sortOrder ?? -1,
        notitle: result.metadata.notitle ?? false,
        displayTitle: title
    };
    pages[path] = page;
    return true;
}

export function rebuild() {
    for (var page in pages) {
        delete pages[page];
    }

    readdirSync(PAGES_DIR).forEach(file => {
        if (!file.endsWith('.wiki')) {
            return;
        }
        file = file.replace('.wiki', '');
        buildPage(file);
    });

    let primaryPages = [];
    for (const page of Object.keys(pages)) {
        if (pages[page].primary) {
            primaryPages.push(page);
        }
    }
    primaryPages.sort((a, b) => {
        return pages[a].sortOrder - pages[b].sortOrder;
    });
    metadata.navbar = primaryPages;
    metadata.fileTreeBuildTime = new Date();
}

export function exists(path) {
    return !!pages[path];
}

export function rawDataFor(path) {
    return pages[path];
}

export function purge(path) {
    let page = pages[path];
    if (page) {
        if (page.buildTime.getTime() + PURGE_COOLDOWN_MIN * 60 * 1000 > Date.now()) {
            return false;
        } else {
            pages[path] = {};
            if (buildPage(path)) {
                return true;
            }
            delete pages[path];
        }
    }
    return false;
}

export function getPages() {
    return pages;
}

export function getNavbar(current = '') {
    if (!metadata.navbar) {
        return '';
    }
    let navbar = '';
    for (const page of metadata.navbar) {
        navbar = navbar + `<div class="navbar-element"><a href="/${page}"${current == page ? ' class="highlight"' : ''}>${pages[page].displayTitle}</a></div>`;
    }
    return navbar;
}