You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.0 KiB
55 lines
2.0 KiB
var marked = require("marked"); |
|
var fs = require("fs"); |
|
var hljs = require("highlight.js"); |
|
|
|
var TOS = fs.readFileSync("resources/TOS.md", "utf-8"); |
|
var pageTemplate = fs.readFileSync("resources/template.html", "utf-8"); |
|
var footerTemplate = fs.readFileSync("resources/footer.html", "utf-8"); |
|
var editTemplate = fs.readFileSync("resources/edit.html", "utf-8"); |
|
var header = fs.readFileSync(process.env.HEADER || "/dev/null", "utf-8"); |
|
|
|
var deriveTitle = text => text |
|
.split(/[\n\r]/)[0].slice(0,25) |
|
.replace(/[`~!@#\$%^&\*_|\+=\?;:'",.<>\{\}\\\/]/g, ""); |
|
|
|
var renderPage = (id, title, content, footer, blackList) => pageTemplate |
|
.replace("%HEADER%", blackList && blackList.has(id) ? header : "") |
|
.replace("%TITLE%", title) |
|
.replace("%CONTENT%", content.replace(/<meta.*?>/gi, "").replace(/<script[\s\S.]*?\/script>/gi, "")) |
|
.replace("%FOOTER%", footer || ""); |
|
|
|
marked.setOptions({ |
|
langPrefix: "hljs lang-", |
|
highlight: code => hljs.highlightAuto(code).value, |
|
}); |
|
|
|
module.exports.renderPage = renderPage; |
|
|
|
module.exports.renderStats = note => renderPage(note.id, deriveTitle(note.text), |
|
`<h2>Statistics</h2> |
|
<table> |
|
<tr><td>Published</td><td>${note.published}</td></tr> |
|
<tr><td>Edited</td><td>${note.edited || "N/A"}</td></tr> |
|
<tr><td>Views</td><td>${note.views}</td></tr> |
|
</table>`); |
|
|
|
module.exports.renderTOS = () => renderPage("tos", "Terms of Service", marked(TOS)); |
|
|
|
module.exports.renderNote = (note, blackList) => renderPage(note.id, |
|
deriveTitle(note.text), |
|
marked(note.text), |
|
footerTemplate.replace(/%LINK%/g, note.id), |
|
blackList); |
|
|
|
module.exports.newNotePage = session => editTemplate |
|
.replace("%ACTION%", "POST") |
|
.replace("%SESSION%", session) |
|
.replace("%CONTENT%", "Loading..."); |
|
|
|
module.exports.editNotePage = (session, note) => editTemplate |
|
.replace("%ACTION%", "UPDATE") |
|
.replace("%SESSION%", session) |
|
.replace("%ID%", note.id) |
|
.replace("%CONTENT%", escape$(note.text)); |
|
|
|
var escape$ = s => s.split("").map(chr => chr == "$" ? "$$" : chr).join("");
|
|
|