homepage/dist/main.js

99 lines
3.5 KiB
JavaScript
Raw Normal View History

2018-05-09 14:31:22 +02:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const config = require("./config");
const logger = require("./log");
const express = require("express");
2018-05-10 23:38:46 +02:00
function getPageOptions(contentStr) {
let pageOptions = {};
try {
let lines = contentStr.split("\n");
let firstLine = lines[0];
2018-05-11 12:24:52 +02:00
let pageOptionsStr = firstLine.replace(/^\s*<!-- (\{.+\}) -->[\s\S]*$/, "\$1");
2018-05-10 23:38:46 +02:00
pageOptions = JSON.parse(pageOptionsStr);
}
catch (_a) {
2018-05-24 01:20:18 +02:00
logger.info("No pageOptions found");
2018-05-10 23:38:46 +02:00
}
return pageOptions;
}
function getToc() {
logger.info("building toc");
let toc = "";
let posts = fs.readdirSync('./docroot/posts');
2018-05-24 01:02:39 +02:00
posts.sort().reverse().forEach((v) => {
2018-05-10 23:38:46 +02:00
let content = fs.readFileSync(`./docroot/posts/${v}/article.pag`);
let contentStr = content.toString();
let pageOptions = getPageOptions(contentStr);
toc += `<li><a href="posts/${v}">${v} - ${pageOptions.title}</a></li>`;
});
return toc;
}
2018-05-09 14:31:22 +02:00
logger.info("Homepage starting");
let app = express();
let masterTmpl;
2018-05-10 23:38:46 +02:00
let toc;
let cache = {};
2018-05-09 14:31:22 +02:00
app.engine('pag', (filePath, options, callback) => {
2018-05-25 13:48:08 +02:00
// logger.info(JSON.stringify(options))
2018-05-10 23:38:46 +02:00
if (!(filePath in cache)) {
logger.info(`${filePath} not yet in cache`);
fs.readFile(filePath, (err, content) => {
if (err) {
return callback(new Error(err.message));
}
let contentStr = content.toString();
let pageOptions = getPageOptions(contentStr);
let renderedPhase1 = contentStr
2018-05-11 14:39:55 +02:00
.replace(/#bla#/g, 'blu');
2018-05-10 23:38:46 +02:00
let renderedPhase2 = masterTmpl
2018-05-11 14:39:55 +02:00
.replace(/#maincontent#/g, renderedPhase1)
.replace(/#base#/g, options.base);
2018-05-10 23:38:46 +02:00
for (let key in pageOptions) {
let value = pageOptions[key];
if (key == 'toc' && value == 'compute') {
value = toc;
}
2018-05-11 14:39:55 +02:00
renderedPhase2 = renderedPhase2.replace(new RegExp(`#${key}#`, 'g'), value);
2018-05-10 23:38:46 +02:00
}
cache[filePath] = renderedPhase2;
return callback(null, renderedPhase2);
});
}
else {
logger.info(`${filePath} served from cache`);
return callback(null, cache[filePath]);
}
2018-05-09 14:31:22 +02:00
});
app.set('views', './docroot');
app.set('view engine', 'pag');
app.get('/index', (req, res) => {
2018-05-11 14:39:55 +02:00
res.render('index', { "base": req.headers['x-proxy-original-url'] || "/" });
2018-05-09 14:31:22 +02:00
});
2018-05-10 22:23:31 +02:00
app.get('/posts/:date', (req, res) => {
2018-05-11 14:39:55 +02:00
res.render(`posts/${req.params.date}/article`, { "base": req.headers['x-proxy-original-url'] || "/" });
2018-05-10 22:23:31 +02:00
});
2018-05-11 15:13:25 +02:00
app.get('/pages/:file', (req, res) => {
res.render(`pages/${req.params.file}`, { "base": req.headers['x-proxy-original-url'] || "/" });
});
2018-05-09 14:31:22 +02:00
app.get('/', (req, res) => {
2018-05-11 17:45:19 +02:00
logger.info('redirecting / to /index');
let base = req.headers['x-proxy-original-url'] || "/";
res.redirect(`${base}index`);
2018-05-09 14:31:22 +02:00
});
2018-05-10 23:38:46 +02:00
app.get('/reload', (req, res) => {
logger.info('truncating cache');
cache = {};
toc = getToc();
2018-05-11 14:39:55 +02:00
masterTmpl = fs.readFileSync('./docroot/master.tmpl').toString();
2018-05-24 01:02:39 +02:00
let base = req.headers['x-proxy-original-url'] || "/";
res.redirect(`${base}index`);
2018-05-10 23:38:46 +02:00
});
app.use('/files', express.static('files'));
2018-05-11 12:24:52 +02:00
masterTmpl = fs.readFileSync('./docroot/master.tmpl').toString();
2018-05-10 23:38:46 +02:00
toc = getToc();
2018-05-09 14:31:22 +02:00
app.listen(config.dict.httpPort, () => {
logger.info("Homepage is listening");
});
logger.info("Homepage running");
//# sourceMappingURL=main.js.map