140 lines
4.6 KiB
JavaScript
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 += ' → <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;
|