single-file-puppeteer.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright 2010-2019 Gildas Lormeau
  3. * contact : gildas.lormeau <at> gmail.com
  4. *
  5. * This file is part of SingleFile.
  6. *
  7. * The code in this file is free software: you can redistribute it and/or
  8. * modify it under the terms of the GNU Affero General Public License
  9. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  10. * of the License, or (at your option) any later version.
  11. *
  12. * The code in this file is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  15. * General Public License for more details.
  16. *
  17. * As additional permission under GNU AGPL version 3 section 7, you may
  18. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  19. * AGPL normally required by section 4, provided you include this license
  20. * notice and a URL through which recipients can access the Corresponding
  21. * Source.
  22. */
  23. /* global require, exports, SingleFileBrowser */
  24. const fs = require("fs");
  25. const puppeteer = require("puppeteer-core");
  26. const SCRIPTS = [
  27. "./lib/single-file/util/doc-util.js",
  28. "./lib/single-file/util/doc-helper.js",
  29. "./lib/single-file/vendor/css-tree.js",
  30. "./lib/single-file/vendor/html-srcset-parser.js",
  31. "./lib/single-file/vendor/css-minifier.js",
  32. "./lib/single-file/vendor/css-font-property-parser.js",
  33. "./lib/single-file/vendor/css-media-query-parser.js",
  34. "./lib/single-file/modules/html-minifier.js",
  35. "./lib/single-file/modules/css-fonts-minifier.js",
  36. "./lib/single-file/modules/css-fonts-alt-minifier.js",
  37. "./lib/single-file/modules/css-matched-rules.js",
  38. "./lib/single-file/modules/css-medias-alt-minifier.js",
  39. "./lib/single-file/modules/css-rules-minifier.js",
  40. "./lib/single-file/modules/html-images-alt-minifier.js",
  41. "./lib/single-file/modules/html-serializer.js",
  42. "./lib/single-file/single-file-core.js",
  43. "./lib/single-file/single-file-browser.js"
  44. ];
  45. exports.getPageData = async options => {
  46. const browserOptions = {
  47. headless: options.puppeteerHeadless === undefined ? true : options.puppeteerHeadless
  48. };
  49. if (options.puppeteerExecutablePath) {
  50. browserOptions.executablePath = options.puppeteerExecutablePath;
  51. }
  52. const browser = await puppeteer.launch(browserOptions);
  53. const page = await browser.newPage();
  54. if (options.userAgent) {
  55. await page.setUserAgent(options.userAgent);
  56. }
  57. await page.goto(options.url, {
  58. waitUntil: options.puppeteerWaitUntil || "networkidle0"
  59. });
  60. await Promise.all(SCRIPTS.map(scriptPath => page.evaluate(fs.readFileSync(scriptPath).toString())));
  61. const pageData = await page.evaluate(async options => {
  62. options.removeFrames = true;
  63. const SingleFile = SingleFileBrowser.getClass();
  64. const singleFile = new SingleFile(options);
  65. await singleFile.initialize();
  66. await singleFile.run();
  67. return singleFile.getPageData();
  68. }, options);
  69. return pageData;
  70. };