srd/routes/index.js

140 lines
4.6 KiB
JavaScript

var router = require('express').Router();
var mcache = require('memory-cache');
var FileSet = require('file-set');
var md = require('markdown-it')({ typographer: true });
md.use(require('markdown-it-anchor'), {permalink: true, level: 2, permalinkBefore: true, permalinkSymbol: "§"});
md.use(require('markdown-it-title'), 0);
md.use(require('markdown-it-custom-block'), {
importTable: function(arg) {
/*var filepath = arg.substring(0, arg.indexOf(' '));
var fileset = new FileSet(path.join('srd', filepath));
for (var i = 0; i < fileset.files.length; i++) {
var data = fs.readFileSync(fileset.files[i], { encoding: 'utf8' });
var parsed = md.parse(data);
var args = arg.substring(filepath.length).split(' ');
var parts = {}
for (var j = 0; j < args.length; j++) {
var key = args[j].substring(0, args[j].indexOf('='));
var value = args[j].substring(key.length+1);
parts[key] = value;
}
console.log(parts);
var table = {}
var state = 0;
for (var j = 0; j < parsed.length; j++) {
switch(state) {
case 0:
if (parsed[j].type == 'heading_open') {
state = 1;
}
break;
case 1:
if (parsed[j].type == 'heading_close') {
state = 2;
} else if (parsed[j].type == 'inline') {
table.title = parsed[j].content;
}
break;
}
}
console.log(fileset.files[i]);
//console.log(parsed);
}
console.log(fileset)*/
return '';
}
});
var fs = require('fs');
var path = require('path');
var chokidar = require('chokidar');
var dictionary = require('../srd/sys/dictionary.js');
var conf = require('../srd/sys/conf.js');
var menu = require('../srd/sys/menu.js');
var cache = function(duration) {
return function(req, res, next) {
var key = '__'+conf['shortname']+'__' + req.originalUrl || req.url;
var cached = mcache.get(key);
if (cached) {
res.send(cached);
return;
} else {
res.sendResponse = res.send;
res.send = function(body) {
mcache.put(key, body, duration * 60 * 1000 );
res.sendResponse(body);
}
next();
}
}
};
router.get('*', cache(1), function(req, res) {
var target = req.path;
if (target === "/") { // Root
target = '/index';
} else if (target.charAt(target.length-1) == '/') { // Directory Index
target = target.substring(0, target.length-1);
}
var file = path.join(__dirname, '..', 'srd', target+'.md');
var crumbs = target.split('/');
fs.readFile(file, (err, data) => {
if (err) {
res.render('index', {content: '404'});
return;
//throw err;
}
// make a local copy of our dictionary and remove the current page, if existing
var local_dictionary = Object.assign({}, dictionary);
delete local_dictionary[crumbs[crumbs.length-1]];
var text;
if (Object.keys(local_dictionary).length !== 0) {
// replace words using our local dictionary
var regexp = RegExp ('[^\[(]\\b(' + Object.keys (local_dictionary).join ('|') + ')\\b', 'g');
text = data.toString().replace(regexp, function (_, word) { return _.charAt(0)+local_dictionary[word]; });
} else {
text = data.toString();
}
// render out the md
var env = {}
var rendered = md.render(text, env);
// build the location
var loc = '<a href="/">'+conf['shortname']+'</a>';
for (var i = 1; i < crumbs.length; i++) {
if (crumbs[i] == '') continue;
loc += ' &#8594; <a href="'+crumbs.slice(0,i).join('/')+'/'+crumbs[i]+'">'+(i == crumbs.length-1 ? env.title : crumbs[i].replace('-', ' '))+'</a>';
}
//var title = crumbs[crumbs.length-1].replace('-', ' ');
var title = env.title
// render with the engine
res.render('index', {content: rendered, menu: menu, location: loc, title: (title != 'index' ? title : ''), www_name: conf.www_name, www_copyright: conf.www_copyright });
});
});
// watch the sys folder and reload requires on change
var watcher = chokidar.watch('../srd/sys/', {ignored: /^./, persistent: true});
watcher.on('change', function(path) {
console.log('Reloading sys files');
delete require.cache['../srd/sys/dictionary.js'];
delete require.cache['../srd/sys/conf.js'];
delete require.cache['../srd/sys/menu.js'];
dictionary = require('../srd/sys/dictionary.js');
conf = require('../srd/sys/conf.js');
menu = require('../srd/sys/menu.js');
});
module.exports = router;