Merge branch '3.0' of github.com:calzoneman/sync into 3.0
[KisSync.git] / src / web / pug.js
blob94ee042b371f825937b2370b0d4c2a77421382fc
1 var pug = require("pug");
2 var fs = require("fs");
3 var path = require("path");
4 var Config = require("../config");
5 var templates = path.join(__dirname, "..", "..", "templates");
7 const cache = new Map();
8 const LOGGER = require('@calzoneman/jsli')('web/pug');
10 /**
11  * Merges locals with globals for pug rendering
12  */
13 function merge(locals, res) {
14     var _locals = {
15         siteTitle: Config.get("html-template.title"),
16         siteDescription: Config.get("html-template.description"),
17         csrfToken: typeof res.req.csrfToken === 'function' ? res.req.csrfToken() : '',
18         baseUrl: getBaseUrl(res),
19         channelPath: Config.get("channel-path"),
20     };
21     if (typeof locals !== "object") {
22         return _locals;
23     }
24     for (var key in locals) {
25         _locals[key] = locals[key];
26     }
27     return _locals;
30 function getBaseUrl(res) {
31     var req = res.req;
32     return req.realProtocol + "://" + req.header("host");
35 /**
36  * Renders and serves a pug template
37  */
38 function sendPug(res, view, locals) {
39     if (!locals) {
40         locals = {};
41     }
42     locals.loggedIn = nvl(locals.loggedIn, res.locals.loggedIn);
43     locals.loginName = nvl(locals.loginName, res.locals.loginName);
44     locals.superadmin = nvl(locals.superadmin, res.locals.superadmin);
46     let renderFn = cache.get(view);
48     if (!renderFn || Config.get("debug")) {
49         LOGGER.debug("Loading template %s", view);
51         var file = path.join(templates, view + ".pug");
52         renderFn = pug.compile(fs.readFileSync(file), {
53             filename: file,
54             pretty: !Config.get("http.minify")
55         });
57         cache.set(view, renderFn);
58     }
60     res.send(renderFn(merge(locals, res)));
63 function nvl(a, b) {
64     if (typeof a === 'undefined') return b;
65     return a;
68 function clearCache() {
69     let removed = 0;
71     for (const key of cache.keys()) {
72         cache.delete(key);
73         removed++;
74     }
76     LOGGER.info('Removed %d compiled templates from the cache', removed);
79 module.exports = {
80     sendPug: sendPug,
81     clearCache: clearCache