diff --git a/dist/main.js b/dist/main.js index 145e1f5..a9e6aaa 100644 --- a/dist/main.js +++ b/dist/main.js @@ -4,26 +4,68 @@ const fs = require("fs"); const config = require("./config"); const logger = require("./log"); const express = require("express"); +function getPageOptions(contentStr) { + let pageOptions = {}; + // logger.info(`contentStr: ${contentStr}`) + try { + let lines = contentStr.split("\n"); + let firstLine = lines[0]; + // logger.info(`firstLine: ${firstLine}`) + let pageOptionsStr = firstLine.replace(/^\s*.*$/, "\$1"); + // logger.info(`pageOptionsStr: ${pageOptionsStr}`) + pageOptions = JSON.parse(pageOptionsStr); + // logger.info(JSON.stringify(pageOptions)) + } + catch (_a) { + // logger.info("No pageOptions found") + } + return pageOptions; +} +function getToc() { + logger.info("building toc"); + let toc = ""; + 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; +let toc; +let cache = {}; app.engine('pag', (filePath, options, callback) => { - fs.readFile(filePath, (err, content) => { - if (err) { - return callback(new Error(err.message)); - } - let contentStr = content.toString(); - let pageOptionsStr = contentStr.replace(/^\s+.*$/, "\$1"); - logger.info(`contentStr: ${contentStr}`); - logger.info(`pageOptionsStr: ${pageOptionsStr}`); - let pageOptions = JSON.parse(pageOptionsStr); - let renderedPhase1 = contentStr - .replace('#bla#', 'blu'); - let renderedPhase2 = masterTmpl - .replace('#maincontent#', renderedPhase1) - .replace('#title#', pageOptions.title); - return callback(null, renderedPhase2); - }); + 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'); @@ -36,7 +78,15 @@ app.get('/posts/:date', (req, res) => { 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(config.dict.masterTmpl).toString(); +toc = getToc(); app.listen(config.dict.httpPort, () => { logger.info("Homepage is listening"); }); diff --git a/dist/main.js.map b/dist/main.js.map index e00021d..944bf13 100644 --- a/dist/main.js.map +++ b/dist/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,yBAAwB;AAExB,mCAAkC;AAClC,gCAA+B;AAE/B,mCAAkC;AAIlC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;AAEhC,IAAI,GAAG,GAAG,OAAO,EAAE,CAAA;AAEnB,IAAI,UAAkB,CAAA;AAEtB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,QAAgB,EAAE,OAAY,EAAE,QAAa,EAAE,EAAE;IAChE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,GAAG,EAAE;YACL,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;SAC1C;QAED,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QACnC,IAAI,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAC1E,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAA;QAChD,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAC5C,IAAI,cAAc,GAAG,UAAU;aAC9B,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAExB,IAAI,cAAc,GAAG,UAAU;aAC9B,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;aACxC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtC,OAAO,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;AAC7B,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;AAE7B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,OAAO,EAAE,yBAAyB,EAAC,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACtB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;AAE/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AACF,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docroot/index.pag b/docroot/index.pag index ca00e87..ae28d86 100644 --- a/docroot/index.pag +++ b/docroot/index.pag @@ -1,3 +1,5 @@ +

    Index

    BlaBla -#bla# \ No newline at end of file +#bla# +#toc# \ No newline at end of file diff --git a/docroot/master.tmpl b/docroot/master.tmpl index 0173115..a92433c 100644 --- a/docroot/master.tmpl +++ b/docroot/master.tmpl @@ -1,6 +1,7 @@ #title# +
    diff --git a/files/default.css b/files/default.css new file mode 100644 index 0000000..ec96aa4 --- /dev/null +++ b/files/default.css @@ -0,0 +1,7 @@ +body { + background-color: white; + font-family: "verdana", sans-serif; + font-size: 16px; +} + + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index fef6038..a99b444 100644 --- a/src/main.ts +++ b/src/main.ts @@ -6,33 +6,82 @@ 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*.*$/, "\$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) => { - fs.readFile(filePath, (err, content) => { - if (err) { - return callback(new Error(err.message)) - } - - let contentStr = content.toString() - let pageOptionsStr = contentStr.replace(/^\s+.*$/, "\$1") - logger.info(`contentStr: ${contentStr}`) - logger.info(`pageOptionsStr: ${pageOptionsStr}`) - let pageOptions = JSON.parse(pageOptionsStr) - let renderedPhase1 = contentStr - .replace('#bla#', 'blu') + if (! (filePath in cache)) { + logger.info(`${filePath} not yet in cache`) - let renderedPhase2 = masterTmpl - .replace('#maincontent#', renderedPhase1) - .replace('#title#', pageOptions.title) + 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) + } - return callback(null, renderedPhase2) - }) + cache[filePath] = renderedPhase2 + + return callback(null, renderedPhase2) + }) + } else { + logger.info(`${filePath} served from cache`) + return callback(null, cache[filePath]) + } }) app.set('views', './docroot') @@ -50,7 +99,18 @@ 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(config.dict.masterTmpl).toString() +toc = getToc() app.listen(config.dict.httpPort, () => { logger.info("Homepage is listening")