From aaaea76b67fa3425d51d4bee4eccf7dcf571c78f Mon Sep 17 00:00:00 2001 From: Lucas Cimon <925560+Lucas-C@users.noreply.github.com> Date: Mon, 8 Nov 2021 20:28:21 +0100 Subject: [PATCH] Handle multiple input files - close #162 --- .verb.md | 4 ++-- README.md | 4 ++-- cli.js | 35 ++++++++++++++++++----------------- test/test.js | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/.verb.md b/.verb.md index bdd7611..6075df0 100644 --- a/.verb.md +++ b/.verb.md @@ -9,10 +9,10 @@ Assuming you want to add a TOC to README.md: ``` Usage: markdown-toc [options] - input: The Markdown file to parse for table of contents, + input: The Markdown files to parse for table of contents, or "-" to read from stdin. - -i: Edit the file directly, injecting the TOC at ; + -i: Edit the files directly, injecting the TOC at ; (Without this flag, the default is to print the TOC to stdout.) --json: Print the TOC in JSON format diff --git a/README.md b/README.md index b8766c4..9cc0e82 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,10 @@ $ npm install --save markdown-toc ``` Usage: markdown-toc [options] - input: The Markdown file to parse for table of contents, + input: The Markdown files to parse for table of contents, or "-" to read from stdin. - -i: Edit the file directly, injecting the TOC at ; + -i: Edit the files directly, injecting the TOC at ; (Without this flag, the default is to print the TOC to stdout.) --json: Print the TOC in JSON format diff --git a/cli.js b/cli.js index 87dd4c0..db1fcb2 100755 --- a/cli.js +++ b/cli.js @@ -12,14 +12,14 @@ var args = utils.minimist(process.argv.slice(2), { } }); -if (args._.length !== 1) { +if (args._.length === 0) { console.error([ 'Usage: markdown-toc [options] ', '', - ' input: The Markdown file to parse for table of contents,', + ' input: The Markdown files to parse for table of contents,', ' or "-" to read from stdin.', '', - ' -i: Edit the file directly, injecting the TOC at ', + ' -i: Edit the files directly, injecting the TOC at ', ' (Without this flag, the default is to print the TOC to stdout.)', '', ' --json: Print the TOC in JSON format', @@ -54,22 +54,23 @@ if (args.i && args._[0] === '-') { process.exit(1); } -var input = process.stdin; -if (args._[0] !== '-') input = fs.createReadStream(args._[0]); +args._.forEach(function(filepath) { + var input = (filepath === '-') ? process.stdin : fs.createReadStream(filepath); -input.pipe(utils.concat(function(input) { - if (args.i) { - var newMarkdown = toc.insert(input.toString(), args); - fs.writeFileSync(args._[0], newMarkdown); - } else { - var parsed = toc(input.toString(), args); - output(parsed); - } -})); + input.pipe(utils.concat(function(input) { + if (args.i) { + var newMarkdown = toc.insert(input.toString(), args); + fs.writeFileSync(filepath, newMarkdown); + } else { + var parsed = toc(input.toString(), args); + output(parsed); + } + })); -input.on('error', function onErr(err) { - console.error(err); - process.exit(1); + input.on('error', function onErr(err) { + console.error(err); + process.exit(1); + }); }); function output(parsed) { diff --git a/test/test.js b/test/test.js index e93e41b..c12dc59 100644 --- a/test/test.js +++ b/test/test.js @@ -427,3 +427,43 @@ describe('toc.insert', function() { assert.equal(strip(toc.insert(str, { linkify: false })), read('test/expected/insert-no-links.md')); }); }); + +describe('cli.js', function() { + describe('when provided two Markdon files', function() { + var hook; + beforeEach(function(){ + hook = captureStream(process.stdout); + }); + it('should build a ToC for both files"', function() { + process.argv= ["node", "cli.js", "test/fixtures/basic.md", "test/fixtures/levels.md"]; + require('../cli'); + setTimeout(function() { + hook.unhook(); + assert.equal(hook.captured(), `- [AAA](#aaa) +- [BBB](#bbb) +- [CCC](#ccc) +- [DDD](#ddd)- [AAA](#aaa) + * [a.1](#a1) + + [a.2](#a2) + - [a.3](#a3)`); + }); + }); + }); +}); + +function captureStream(stream){ + var oldWrite = stream.write; + var buf = ''; + stream.write = function(chunk, encoding, callback){ + buf += chunk.toString(); // chunk is a String or Buffer + oldWrite.apply(stream, arguments); + } + return { + unhook: function unhook() { + stream.write = oldWrite; + }, + captured: function() { + return buf; + } + }; +}