Created
April 17, 2018 15:19
-
-
Save akerouanton/dc5d2c71723f2d36338d81767078dc82 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node | |
const Remarkable = require('remarkable'); | |
const toc = require('markdown-toc'); | |
const fs = require('fs'); | |
const puppeteer = require('puppeteer'); | |
const express = require('express'); | |
const generateHtml = (file, serverAddress) => { | |
const md = new Remarkable({ | |
html: true, | |
linkify: true, | |
typographer: true, | |
quotes: '«»', | |
}); | |
// @see https://github.com/jonschlinkert/remarkable/issues/122#issuecomment-150011254 | |
md.use(function(remarkable) { | |
remarkable.renderer.rules.heading_open = (tokens, idx) => | |
'<h' + tokens[idx].hLevel + ' id=' + toc.slugify(tokens[idx + 1].content) + '>'; | |
}); | |
const content = toc.insert(fs.readFileSync(file, 'utf8')); | |
return ` | |
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8" /> | |
<link rel="stylesheet" href="${serverAddress}/dist/css/style.css"> | |
<title>YOLO</title> | |
<style> | |
@page { margin: 5% 5%; } | |
body { padding: 20px; } | |
.page-break { page-break-after: always; } | |
table { page-break-inside:auto } | |
thead, tbody { display: table-row-group; } | |
tr { page-break-inside:avoid; page-break-after:auto } | |
.version td { height: 37px; } | |
.version tr td:nth-of-type(3) { width: 60%; } | |
</style> | |
</head> | |
<body class="markdown-body">${md.render(content)}</body> | |
</html>`; | |
} | |
const argv = process.argv.slice(2); | |
if (argv.length !== 2) { | |
console.error('Usage: md2pdf <md-file> <pdf-dest>'); | |
process.exit(1); | |
} | |
const html = generateHtml(argv[0]); | |
const server = express(); | |
const listener = server.listen(0); // Let the kernel pick a random port | |
const address = `http://localhost:${listener.address().port}`; | |
console.log(address); | |
server.get('/', (req, res) => | |
res.send(generateHtml(argv[0], address)) | |
); | |
server.use('/dist', express.static(__dirname + '/dist')); | |
server.use('/resources', express.static('resources')); | |
(async () => { | |
const browser = await puppeteer.launch(); | |
const page = await browser.newPage(); | |
await page.goto(address); | |
await page.pdf({ | |
path: argv[1], | |
displayHeaderFooter: true, | |
headerTemplate: '<p style="text-align: center; font-size: 9px; width: 100%; margin-top: -4px;"><span class="title"></span></p>', | |
footerTemplate: '<p style="text-align: right; font-size: 9px; width: 100%; margin-bottom: -4px; padding-right: 3%;"><span class="pageNumber"></span> / <span class="totalPages"></span></p>', | |
printBackground: true, | |
}); | |
await browser.close(); | |
listener.close(); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment