#!/usr/local/bin/node /* * Copyright 2010-2020 Gildas Lormeau * contact : gildas.lormeau gmail.com * * This file is part of SingleFile. * * The code in this file is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * (GNU AGPL) as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * The code in this file is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero * General Public License for more details. * * As additional permission under GNU AGPL version 3 section 7, you may * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU * AGPL normally required by section 4, provided you include this license * notice and a URL through which recipients can access the Corresponding * Source. */ /* global require, process */ const fs = require("fs"); const nativeMessage = require("./lib/messaging.js"); const backend = require("./../cli/back-ends/puppeteer.js"); process.stdin .pipe(new nativeMessage.Input()) .pipe(new nativeMessage.Transform(function (msg, push, done) { capturePage(msg); push(JSON.stringify(msg)); done(); })) .pipe(new nativeMessage.Output()) .pipe(process.stdout); async function capturePage(options) { await backend.initialize(require("./options.json")); try { const pageData = await backend.getPageData(options); if (options.output) { fs.writeFileSync(getFilename(options.output), pageData.content); } else if (options.filenameTemplate && pageData.filename) { pageData.filename = "../" + pageData.filename; fs.writeFileSync(getFilename(pageData.filename), pageData.content); } return pageData; } catch (error) { if (options.errorFile) { const message = "URL: " + options.url + "\nStack: " + error.stack + "\n"; fs.writeFileSync(options.errorFile, message, { flag: "a" }); } } finally { await backend.closeBrowser(); process.exit(0); } } function getFilename(filename, index = 1) { let newFilename = filename; if (index > 1) { const regExpMatchExtension = /(\.[^.]+)$/; const matchExtension = newFilename.match(regExpMatchExtension); if (matchExtension && matchExtension[1]) { newFilename = newFilename.replace(regExpMatchExtension, " - " + index + matchExtension[1]); } else { newFilename += " - " + index; } } if (fs.existsSync(newFilename)) { return getFilename(filename, index + 1); } else { return newFilename; } }