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 = {} // logger.info(`contentStr: ${contentStr}`) try { let lines = contentStr.split("\n") let firstLine = lines[0] // logger.info(`firstLine: ${firstLine}`) let pageOptionsStr = firstLine.replace(/^\s*[\s\S]*$/, "\$1") // logger.info(`pageOptionsStr: ${pageOptionsStr}`) pageOptions = JSON.parse(pageOptionsStr) // logger.info(JSON.stringify(pageOptions)) } 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.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) => { 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#', 'blu') let renderedPhase2 = masterTmpl .replace('#maincontent#', renderedPhase1) for (let key in pageOptions) { let value = pageOptions[key] if (key == 'toc' && value == 'compute') { value = toc } renderedPhase2 = renderedPhase2.replace(`#${key}#`, 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) => { logger.info(req.url) logger.info(req.baseUrl) logger.info(req.originalUrl) res.render('index', {}) }) app.get('/posts/:date', (req, res) => { res.render(`posts/${req.params.date}/article`, {}) }) app.get('/', (req, res) => { res.send('Hello world!') }) app.get('/reload', (req, res) => { logger.info('truncating cache') cache = {} toc = getToc() res.send('reload triggered') }) 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")