diff --git a/app.js b/app.js index c7b1fb1..827d510 100644 --- a/app.js +++ b/app.js @@ -12,27 +12,52 @@ 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(renderPage) 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) +//TODO: allow static content +function renderPage(req, res, next){ + let path = req.path.split('/') + let cur = siteMap + + // search for the page in siteMap + for (let i = 1; i < path.length; i++) { + const page = path[i]; + + if(cur.type == 'directory'){ + // if page is not found render 404 + if(typeof cur.subPages[page] == 'undefined'){ + console.log(`404 - ${req.path}`) //TODO: add a logging system + return render404(req, res, next) + } + + cur = cur.subPages[page] + continue + } + + // page is not a directory so it's a page! + cur = cur.subPages[page] + break } + + let page = cur + delete cur, path + + if(page.type == 'directory'){ + page = page.index + } + + compile(page, function(html){ + if(typeof html != 'string') return render500() //TODO: add a logging system + + res.render('main', { + siteMap, + path: req.path, + page: page, + main: html + }) + }) } /** Render static content @@ -43,102 +68,17 @@ function onError404(req, res, next){ * @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] +// 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}` +// 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)) -} +// 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 +//TODO: add a custom and/or smarter 404 page /** Render the 404 page * * renders a simple 404 page. @@ -149,17 +89,35 @@ function renderIndex(req, res, next){ */ 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.render('main', { + // siteMap, + // main: "

404 - Page not found

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

404 - Page not found

") - } - }) + // } + // }) +} + +//TODO: add a custom 500 page +/** Render the 500 page + * + * renders a simple 500 page. + * + * @param {Req} req Request object from Express. + * @param {Res} res Responce object from Express. + * @param {Function} next The next function from Espress. + */ +function render500(req, res, next){ + res.status(500) + // res.render('main', { + // siteMap, + // main: "

500 - Internal server error

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

500 - Internal server error

") + // } + // }) } // start the actial web server diff --git a/views/main.ejs b/views/main.ejs index 051c13b..85ba63d 100755 --- a/views/main.ejs +++ b/views/main.ejs @@ -1,4 +1,36 @@ - +<% + +/* title =================== */ +var title = '' +let p = path.split('/') +let cur = siteMap + +// search for the page in siteMap +for (let i = 1; i < p.length; i++) { + const page = p[i]; + + title = page.title + ' - ' + title + + if(cur.type == 'directory'){ + cur = cur.subPages[page] + continue + } + + // page is not a directory so it's a page! + cur = cur.subPages[page] + break +} + +const page = cur +delete cur + + +/* sideNav =================== */ +var sideNav = siteMap.subPages[p[1]] + +delete p + +%> @@ -27,12 +59,12 @@