pageOptions working, toc introduced
This commit is contained in:
parent
88b2cf4212
commit
e24c4e9901
82
dist/main.js
vendored
82
dist/main.js
vendored
@ -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 += `<li><a href="posts/${v}">${v} - ${pageOptions.title}</a></li>`;
|
||||
});
|
||||
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");
|
||||
});
|
||||
|
2
dist/main.js.map
vendored
2
dist/main.js.map
vendored
@ -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"}
|
||||
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
@ -1,3 +1,5 @@
|
||||
<!-- { "toc": "compute" } -->
|
||||
<h1>Index</h1>
|
||||
BlaBla
|
||||
#bla#
|
||||
#bla#
|
||||
#toc#
|
@ -1,6 +1,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>#title#</title>
|
||||
<link rel="stylesheet" type="text/css" href="/files/default.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
|
7
files/default.css
Normal file
7
files/default.css
Normal file
@ -0,0 +1,7 @@
|
||||
body {
|
||||
background-color: white;
|
||||
font-family: "verdana", sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
|
94
src/main.ts
94
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 += `<li><a href="posts/${v}">${v} - ${pageOptions.title}</a></li>`
|
||||
})
|
||||
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")
|
||||
|
Loading…
x
Reference in New Issue
Block a user