'use-strict'; const fs = require('fs'); const path = require('path'); const dirTree = require('directory-tree'); const express = require('express'); const report = require('vfile-reporter'); const hmd = require('./tohtml'); const pathMD = 'md'; const app = express(); process.on('uncaughtException', err => { console.error(`[${new Date()}] > Error - ${err}`); }); const useLandScript = ''; const rawButton = ''; const editButton = ''; app.use(express.static('public')); app.use('/edit', express.json()); app.get(`/${pathMD}/*`, (req, res) => { const url = decodeURI(req._parsedUrl.pathname); const {query} = req; console.log(`[${new Date()}] > ${200} - ${url}`); if (query && query.edit === 'true') { res.redirect(`/edit${url.slice(3)}`); } else if (query && query.raw === 'true') { res.sendFile(url, { root: '.', dotfiles: 'deny', headers: { 'x-timestamp': Date.now(), 'x-sent': true, }, }, err => { if (err) { console.error(`Error: ${err}`); } else { console.log(`Sent: ${url}`); } }); return; } fs.readFile(url.substr(1), 'utf8', (err, data) => { if (err) { return console.error(err); } hmd(data, (err, file) => { res.send(`${String(file) + useLandScript }${rawButton}${editButton}`); console.error(report(err || file)); }); }); }); app.get('/data', (req, res) => { console.log(`[${new Date()}] > ${200} - ${req.url}`); res.send(dirTree(pathMD, {extensions: /\.md/})); }); app.get('/img/*', (req, res) => { console.log(`[${new Date()}] > ${200} - ${req.url}`); const pathR = req.url; if (pathR === '/img/ic_info_black_48px.svg' || pathR === '/imr/ic_error_black_48px.svg' || pathR === '/imr/ic_good_black_48px.svg' || pathR === '/imr/ic_bad_black_48px.svg' || pathR === '/imr/ic_comment_black_48px.svg' || pathR === '/imr/ic_help_black_48px.svg') { const img = fs.readFileSync(pathR); res.writeHead(200, {'Content-Type': 'image/svg'}); res.end(img, 'binary'); } else { const img = fs.readFileSync(req.url.replace('/img', pathR)); res.writeHead(200, {'Content-Type': 'image/gif'}); res.end(img, 'binary'); } }); app.get('/', (req, res) => { console.log(`[${new Date()}] > ${200} - ${req.url}`); fs.readFile('public/index.html', 'utf8', (err, data) => { if (err) { return console.error(err); } res.send(data); }); }); app.get('/edit/?*', (req, res) => { console.log(`[${new Date()}] > ${200} - ${req.url}`); const pathReq = decodeURIComponent(path.normalize(`md/${req.url.slice(5)}`)); console.log(`[${new Date()}] > ${200} - ${pathReq}`); fs.readFile('public/edit.html', 'utf8', (err, d) => { if (err) { return console.error(err); } res.send(d); }); }); app.put('/edit/?*', (req, res) => { const pathR = decodeURIComponent(path.normalize(`md${req.url.slice(5)}`)); console.log('PUT !'); console.log(pathR); if (pathR.startsWith('md/public') || (pathR.startsWith('md/') && req.body.password === 'renard crétin')) { fs.writeFile(pathR, req.body.text, err => { if (err) { res.status(404).send('Not found'); return console.log(err); } }); res.send('Saved !'); return; } console.log("Send error !"); res.status(500).send('Error'); }); app.get('*', (req, res) => { console.error(`[${new Date()}] > ${404} - ${req.url}`); fs.readFile('public/404.md', 'utf8', (err, data) => { if (err) { return console.error(err); } fs.readFile('public/css/style.css', 'utf8', (err, style) => { if (err) { let html = ''; html += ''; html += '

500 - Internal Server Error

'; html += `Debug : ${err}`; html += ''; html += ''; res.status(500).send(html); return; } hmd(data, (err, file) => { if (err) { let html = ''; html += ''; html += '

500 - Internal Server Error

'; html += 'Debug : 404 page can\'t be converted to HTML
'; html += `Debug : ${err}`; html += ''; html += ''; res.status(404).send(html); } let html = ''; html += ''; html += ``; html += ''; html += ''; html += String(file); html += ''; html += ''; res.status(404).send(html); }); }); }); }); const server = app.listen(8090, () => { const host = server.address().address; const {port} = server.address(); console.log(`[${new Date()}] > App listening at http://%s:%s`, host, port); });