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 a.sortOrder - 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;
}
|