12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #!/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}`);
- });
|