aboutsummaryrefslogtreecommitdiffstats
path: root/app/directory.mjs
blob: 1fddf23e8e3459f8f8fea27c673954e634d60d6d (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
'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 = readFileSync(`${PAGES_DIR}/${path}.wiki`, 'utf-8'); 
    let result = parse(data);
    let title = result.metadata.displayTitle ?? 'Unnamed page';
    let content = `<h1>${title}</h1>${result.html}`;

    let page = {
        html: content,
        buildTime: result.metadata.buildTime,
        hidden: result.metadata.hidden,
        displayTitle: title
    };
    pages[path] = page;
}

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);
    });
    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] = {};
            buildPage(path);
            return true;
        }
    }
    return false;
}

export function getPages() {
    return pages;
}

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