const express = require('express'); // A genareted db with all the pages const siteMap = require('./siteMap'); // All compilers for all page source types const compile = require('./compile'); const settings = require('./settings'); console.log("siteMap:", siteMap) //DEBUG // create webserver const app = express() app.set('view engine', 'ejs'); app.set('views', __dirname + '/views') //TODO: make the uri routing more universal. Probebly ad the siteMap creation // routing app.use('/:vak/static', renderStatic) app.use('/:vak/:page', renderPage) app.use('/:vak', renderVak) app.use('/', renderIndex) app.use(render404) /** This function can be used for as callback for errors * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. * * @returns {Function(err)} a function that renders the 404 page if err is true. */ function onError404(req, res, next){ return function(err){ if(err) render404(req, res, next) } } /** Render static content * * looks for the content in the folder static * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. */ function renderStatic(req, res, next){ if(typeof siteMap[req.params.vak] == 'undefined') return next(); vak = siteMap[req.params.vak] dir = __dirname.split('/'); dir.pop() // remove dir of this code dir = `${dir.join('/')}/${vak.title}/notes/static${req.path}` res.sendFile(dir, onError404(req, res, next)) } /** Render a normal page * * lookup the page in siteMap db and renders the page * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. */ function renderPage(req, res, next){ if(typeof siteMap[req.params.vak] == 'undefined') return next(); vak = siteMap[req.params.vak] if(typeof vak.pages[req.params.page] == 'undefined') return next(); page = vak.pages[req.params.page] compile(page, function(html){ if(typeof html != 'string'){ return next() } res.render('main', { siteMap, title: "notes", topNav: vak.pages, vak: req.params.vak, page: req.params.page, main: html }) }) } /** Render the index of a topic * * lookup the topic in siteMap db and renders the index. * if the index is not set it set the topic name as headers on the page. * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. */ function renderVak(req, res, next){ if(typeof siteMap[req.params.vak] == 'undefined') return next(); vak = siteMap[req.params.vak] if(vak.index == null){ // no index page for this topic res.render('main', { siteMap, title: "notes", topNav: vak.pages, vak: req.params.vak, main: `

${vak.title}

` // default index page }) }else{ compile(vak.index, function(html){ if(typeof html != 'string'){ return next() } res.render('main', { siteMap, title: "notes", topNav: vak.pages, vak: req.params.vak, main: html }, onError404(req, res, next)) }) } } //TODO: remove playholder and acualy create the renderIndex function /** Render the index of the site * * lookup the index in siteMap db and renders the index. * if the index is not set it set the topic name as headers on the page. * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. */ function renderIndex(req, res, next){ res.render('main', { siteMap, title: "notes", topNav: siteMap, main: "

Hoi

" }, onError404(req, res, next)) } //TODO: add a custom or smarter 404 page /** Render the 404 page * * renders a simple 404 page. * * @param {Req} req Request object from Express. * @param {Res} res Responce object from Express. * @param {Function} next The next function from Espress. */ function render404(req, res, next){ res.status(404) res.render('main', { siteMap, title: "notes", topNav: vak.pages, vak: req.params.vak, main: "

404 - Page not found

" }, (err) => { if(err){ res.send("

404 - Page not found

") } }) } // start the actial web server app.listen(settings.serverPort, ()=>{console.log("server listening on port", settings.serverPort)})