#!/usr/bin/env node import { ArgumentParser } from 'argparse'; import chokidar from 'chokidar'; import express, { Request, Response } from 'express'; import Remarkable from 'remarkable'; import WebSocket from 'ws'; import * as fs from 'fs'; import * as path from 'path'; import template from './template'; const parser = new ArgumentParser({ version: '0.1.0', addHelp: true, description: 'Realtime Markdown preview', }); parser.addArgument('file'); parser.addArgument( ['-p', '--port'], { defaultValue: 1729, help: 'The port to run on', type: 'int' } ); const { file, port } = parser.parseArgs(); const filepath = path.resolve(file); const getRenderedHTML = () => { const md = new Remarkable(); const fileContents = fs.readFileSync(filepath, 'utf-8'); return md.render(fileContents); }; const wss = new WebSocket.Server({ port: 40510, }); wss.on('connection', (ws) => { chokidar.watch(filepath).on('change', () => { ws.send(getRenderedHTML(), (err) => { if (err) console.log(err); }); }); }); const app = express(); app.get('/', (_req: Request, res: Response) => { res.send(template(path.basename(file), getRenderedHTML())); }); app.listen(port, () => { console.log(`Listening at http://localhost:${port}`); });