Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. #!/usr/bin/node
  2.  
  3. // Install dependencies: npm install mozilla/readability jsdom axios argparse
  4. // Usage: node mkebook.js --title Test url1 url2 > test.epub
  5.  
  6. const fs = require('fs').promises;
  7. const { spawn } = require('child_process');
  8.  
  9. const { JSDOM } = require('jsdom');
  10. const Readability = require('readability');
  11. const axios = require('axios');
  12. const { ArgumentParser } = require('argparse');
  13.  
  14. const parser = new ArgumentParser();
  15. parser.addArgument(['-t', '--title'], { required: true });
  16. parser.addArgument(['urls'], { nargs: '*' });
  17.  
  18. async function main(args) {
  19. const { title, urls } = args;
  20. const files = await Promise.all(urls.map(async (url, i) => {
  21. const filename = (i + 1).toString().padStart(3, '0') + '.html';
  22. const { data } = await axios.get(url);
  23. const { title, content } = new Readability((new JSDOM(data)).window.document).parse();
  24. const doc = new JSDOM('<html><head><title></title></head><body><h1></h1><div></div></body></html>');
  25. doc.window.document.querySelector('title').textContent = title;
  26. doc.window.document.querySelector('h1').textContent = title;
  27. doc.window.document.querySelector('div').innerHTML = content;
  28. await fs.writeFile(filename, doc.serialize());
  29. return filename;
  30. }));
  31.  
  32. await new Promise((resolve, reject) => {
  33. spawn('pandoc', [`-Mtitle=${title}`, '-t', 'epub', '-o', '-', ...files], { stdio: 'inherit' })
  34. .on('error', reject)
  35. .on('exit', resolve);
  36. });
  37.  
  38. await Promise.all(files.map(file => fs.unlink(file)));
  39. }
  40.  
  41. main(parser.parseArgs()).catch(console.error);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement