import * as fs from 'fs' import * as config from './config' import * as logger from './log' import * as express from 'express' function getPageOptions(contentStr: string) : any { let pageOptions : any = {} try { let lines = contentStr.split("\n") let firstLine = lines[0] let pageOptionsStr = firstLine.replace(/^\s*[\s\S]*$/, "\$1") pageOptions = JSON.parse(pageOptionsStr) } catch { logger.info("No pageOptions found") } return pageOptions } function getToc() : string { logger.info("building toc") let toc : string = "" let posts = fs.readdirSync('./docroot/posts') posts.sort().reverse().forEach((v) => { let content = fs.readFileSync(`./docroot/posts/${v}/article.pag`) let contentStr = content.toString() let pageOptions = getPageOptions(contentStr) toc += `
  • ${v} - ${pageOptions.title}
  • ` }) return toc } logger.info("Homepage starting") let app = express() let masterTmpl: string let toc: string let cache: any = {} app.engine('pag', (filePath: string, options: any, callback: any) => { // logger.info(JSON.stringify(options)) if (! (filePath in cache)) { logger.info(`${filePath} not yet in cache`) fs.readFile(filePath, (err, content) => { if (err) { return callback(new Error(err.message)) } let contentStr = content.toString() let pageOptions = getPageOptions(contentStr) let renderedPhase1 = contentStr .replace(/#bla#/g, 'blu') let renderedPhase2 = masterTmpl .replace(/#maincontent#/g, renderedPhase1) .replace(/#base#/g, options.base) for (let key in pageOptions) { let value = pageOptions[key] if (key == 'toc' && value == 'compute') { value = toc } renderedPhase2 = renderedPhase2.replace(new RegExp(`#${key}#`, 'g'), value) } cache[filePath] = renderedPhase2 return callback(null, renderedPhase2) }) } else { logger.info(`${filePath} served from cache`) return callback(null, cache[filePath]) } }) app.set('views', './docroot') app.set('view engine', 'pag') app.get('/index', (req, res) => { res.render('index', { "base": req.headers['x-proxy-original-url'] || "/"}) }) app.get('/posts/:date', (req, res) => { res.render(`posts/${req.params.date}/article`, { "base": req.headers['x-proxy-original-url'] || "/"}) }) app.get('/pages/:file', (req, res) => { res.render(`pages/${req.params.file}`, { "base": req.headers['x-proxy-original-url'] || "/"}) }) app.get('/', (req, res) => { logger.info('redirecting / to /index') let base = req.headers['x-proxy-original-url'] || "/" res.redirect(`${base}index`) }) app.get('/reload', (req, res) => { logger.info('truncating cache') cache = {} toc = getToc() masterTmpl = fs.readFileSync('./docroot/master.tmpl').toString() let base = req.headers['x-proxy-original-url'] || "/" res.redirect(`${base}index`) }) app.use('/files', express.static('files')) masterTmpl = fs.readFileSync('./docroot/master.tmpl').toString() toc = getToc() app.listen(config.dict.httpPort, () => { logger.info("Homepage is listening") }) logger.info("Homepage running")