Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/node
- // Install dependencies: npm install mozilla/readability jsdom axios argparse
- // Usage: node mkebook.js --title Test url1 url2 > test.epub
- const fs = require('fs').promises;
- const { spawn } = require('child_process');
- const { JSDOM } = require('jsdom');
- const Readability = require('readability');
- const axios = require('axios');
- const { ArgumentParser } = require('argparse');
- const parser = new ArgumentParser();
- parser.addArgument(['-t', '--title'], { required: true });
- parser.addArgument(['urls'], { nargs: '*' });
- async function main(args) {
- const { title, urls } = args;
- const files = await Promise.all(urls.map(async (url, i) => {
- const filename = (i + 1).toString().padStart(3, '0') + '.html';
- const { data } = await axios.get(url);
- const { title, content } = new Readability((new JSDOM(data)).window.document).parse();
- const doc = new JSDOM('<html><head><title></title></head><body><h1></h1><div></div></body></html>');
- doc.window.document.querySelector('title').textContent = title;
- doc.window.document.querySelector('h1').textContent = title;
- doc.window.document.querySelector('div').innerHTML = content;
- await fs.writeFile(filename, doc.serialize());
- return filename;
- }));
- await new Promise((resolve, reject) => {
- spawn('pandoc', [`-Mtitle=${title}`, '-t', 'epub', '-o', '-', ...files], { stdio: 'inherit' })
- .on('error', reject)
- .on('exit', resolve);
- });
- await Promise.all(files.map(file => fs.unlink(file)));
- }
- main(parser.parseArgs()).catch(console.error);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement