From 8e7951a20aa0946b195dc743220d9805bc44a2b3 Mon Sep 17 00:00:00 2001 From: gardenapple Date: Mon, 13 Jul 2020 22:59:05 +0300 Subject: [PATCH] Output specific properties --- index.js | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 6ac3cd6..f09d1cd 100644 --- a/index.js +++ b/index.js @@ -29,22 +29,40 @@ Usage: (where SOURCE is a file, an http(s) URL, or '-' for standard input) Options: - --help Print help - -o --output OUTPUT_FILE Output to OUTPUT_FILE`); + --help Print help + -o --output OUTPUT_FILE Output to OUTPUT_FILE + -p --properties PROP1,[PROP2,...] Output specific properties of the parsed article + +The --properties option accepts a comma-separated list of values (with no spaces in-between). Suitable values are: + html-title Outputs the article's title, wrapped in an

tag. + title Outputs the title in the format "Title: $TITLE". + excerpt Article description, or short excerpt from the content in the format "Excerpt: $EXCERPT" + byline Author metadata, in the format "Author: $AUTHOR" + length Length of the article in characters, in the format "Length: $LENGTH" + dir Content direction, in the format "Direction: ltr" or "Direction: rtl" + html-content Outputs the article's main content as HTML. + text-content Outputs the article's main content as plain text. + +Text-content and Html-content are mutually exclusive, and are always printed last. +Default value is "html-title,html-content"`); } -const stringArgParams = ['_', '--', "output"]; +const stringArgParams = ['_', '--', "output", "properties"]; const boolArgParams = ["help"]; const alias = { "output": 'o', + "properties": 'p' } let args = parseArgs(process.argv.slice(2), { - "string": stringArgParams, - "boolean": boolArgParams, - "alias": alias, + string: stringArgParams, + boolean: boolArgParams, + default: { + "properties": "html-title,html-content" + }, + alias: alias, "--": true }); @@ -114,9 +132,39 @@ const outputArg = args['output']; +const Properties = { + htmlTitle: "html-title", + title: "title", + excerpt: "excerpt", + byline: "byline", + length: "length", + dir: "dir", + htmlContent: "html-content", + textContent: "text-content" +} +let wantedProperties = []; + +if (args.properties) { + for (var property of args.properties.split(',')) { + if (Object.values(Properties).includes(property)) { + wantedProperties.push(property); + } else { + console.error(`Invalid property: ${property}`); + setErrored(ExitCodes.badUsageCLI); + } + } + if (errored) { + printUsage(); + return; + } +} + + + if (inputIsFromStdin) { onLoadDOM(new JSDOM(fs.readFileSync(0, 'utf-8'))); } else { + console.error("Retrieving..."); let promiseGetHTML; if (inputURL) promiseGetHTML = JSDOM.fromURL(inputURL); @@ -128,6 +176,7 @@ if (inputIsFromStdin) { } function onLoadDOM(dom) { + console.error("Parsing..."); let reader = new Readability(dom.window.document); let article = reader.parse(); if (!article) { @@ -136,12 +185,36 @@ function onLoadDOM(dom) { return; } + let writeStream; if (outputArg) { - fs.writeFileSync(outputArg, article.content); + writeStream = fs.createWriteStream(outputArg); } else { - console.log(article.content); + writeStream = process.stdout; + } + + if (wantedProperties.includes(Properties.title)) { + writeStream.write(`Title: ${article.title}\n`); + } + if (wantedProperties.includes(Properties.excerpt)) { + writeStream.write(`Excerpt: ${article.excerpt}\n`); + } + if (wantedProperties.includes(Properties.byline)) { + writeStream.write(`Author: ${article.byline}\n`); + } + if (wantedProperties.includes(Properties.length)) { + writeStream.write(`Length: ${article.length}\n`); + } + if (wantedProperties.includes(Properties.dir)) { + writeStream.write(`Direction: ${article.dir}\n`); + } + if (wantedProperties.includes(Properties.htmlTitle)) { + writeStream.write(`

${article.title}

\n`); + } + if (wantedProperties.includes(Properties.htmlContent)) { + writeStream.write(article.content); + } else if (wantedProperties.includes(Properties.textContent)) { + writeStream.write(article.textContent); } -// console.log(chalk.blue(article.textContent)); } function onLoadDOMError(error) { @@ -159,5 +232,7 @@ function onLoadDOMError(error) { setErrored(ExitCodes.noHost); } else { console.error(error); + if (error.stack) + console.error(error.stack); } }