serve-lunasqu.ee/applications/highlight-termbin/index.js

87 lines
2.3 KiB
JavaScript

const express = require('express')
const path = require('path')
const fs = require('fs')
const fsp = fs.promises
const router = express.Router()
const cfgLoader = require(path.join('..', '..', 'config-loader'))(path.join(__dirname, 'config.json'), {
root: path.join(process.cwd(), '..', 'fiche', 'code'),
style: 'tomorrow-night',
index: 'index.html'
})
async function init () {
let config = await cfgLoader
let root = path.resolve(config.root)
await fsp.access(root, fs.constants.F_OK)
router.get('/:name', async (req, res, next) => {
let name = req.params.name
if (name.length > 5) {
try {
let text = await fsp.readFile(path.join(root, 'index.html'))
res.send(text)
} catch (e) {
res.status(403)
}
return res.end()
}
let fichePath = path.join(root, name, 'index.txt')
let reqRaw = req.query.raw != null
let ua = req.get('User-Agent')
if (!reqRaw && ua && (ua.match(/curl\//i) != null || ua.match(/wget\//i) != null)) reqRaw = true
let text
try {
text = await fsp.readFile(fichePath, {encoding: 'utf8'})
} catch (e) {
return res.status(404).end()
}
res.header('Cache-Control', 'max-age=' + 7 * 24 * 60 * 60 * 1000)
if (reqRaw) {
return res.set('Content-Type', 'text/plain').send(text)
}
let etext = text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')
let payload =
'<?xml version="1.0" encoding="UTF-8"?>' +
'<html xmlns="http://www.w3.org/1999/xhtml" class="hljs">' +
'<head>' +
'<link rel="stylesheet" href="/assets/css/t.css" />' +
'<link rel="stylesheet" href="/assets/css/t-styles/' + config.style + '.css" />' +
'<script src="/assets/js/highlight.min.js"></script>' +
'</head>' +
'<body>' +
'<pre><code>' + etext + '</code></pre>' +
'<script>hljs.initHighlightingOnLoad();</script>' +
'</body>' +
'</html>'
res.set('Content-Type', 'application/xhtml+xml').send(payload)
})
router.get('/', (req, res, next) => {
if (!config.index) {
return next()
}
let inp = config.index
if (inp.indexOf('/') !== 0) {
inp = path.join(__dirname, inp)
} else {
inp = path.resolve(inp)
}
res.sendFile(inp)
})
return router
}
module.exports = init