From af620762f5004f2a0430a1ac5f552e1003c67353 Mon Sep 17 00:00:00 2001 From: Kyle Smith Date: Thu, 28 Jan 2016 17:24:36 -0600 Subject: [PATCH 1/2] Add more robust CLI that provides rendering options --- bin/marky-markdown.js | 61 ++++++++++++++++++++++++++++++++++++++----- package.json | 3 ++- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/bin/marky-markdown.js b/bin/marky-markdown.js index 8016b15..3272e1b 100755 --- a/bin/marky-markdown.js +++ b/bin/marky-markdown.js @@ -2,16 +2,65 @@ var fs = require('fs') var path = require('path') var marky = require('..') +var yargs = require('yargs') +var omit = require('lodash').omit -if (process.argv.length < 3) { - console.log('Usage:\n\nmarky-markdown some.md > some.html') - process.exit() -} +var argv = yargs + .usage([ + 'npm\'s markdown parser', + '', + 'Usage: $0 [options] some.md > some.html' + ].join('\n')) + .version(function () { + return require('../package.json').version + }) + .example( + '$0 --no-sanitize some.md > some.html', + 'Parse "some.md" without sanitizing and redirect result to "some.html"' + ) + .example( + '$0 --no-highlight README.md > index.html', + 'Parse "README.md" without highlighting fenced code blocks and redirect result to "index.html"' + ) + .option('sanitize', { + default: true, + describe: 'remove script tags and stuff', + type: 'boolean' + }) + .option('linkify', { + default: true, + describe: 'turn orphan URLs into hyperlinks', + type: 'boolean' + }) + .option('highlightSyntax', { + alias: 'highlight', + default: true, + describe: 'run highlights on fenced code blocks', + type: 'boolean' + }) + .option('prefixHeadingIds', { + alias: 'prefix', + default: true, + describe: 'prevent DOM id collisions', + type: 'boolean' + }) + .option('serveImagesWithCDN', { + alias: 'cdn', + default: false, + describe: 'use npm\'s CDN to proxy images over HTTPS', + type: 'boolean' + }) + .demand(1) + .wrap(Math.min(125, yargs.terminalWidth())) + .argv -var filePath = path.resolve(process.cwd(), process.argv[2]) + +var options = omit(argv, ['_', 'version', 'highlight', 'prefix', 'cdn', '$0']); + +var filePath = path.resolve(process.cwd(), argv._[0]) fs.readFile(filePath, function (err, data) { if (err) throw err - var $ = marky(data.toString()) + var $ = marky(data.toString(), options) process.stdout.write($.html()) }) diff --git a/package.json b/package.json index 973a2f9..ac950bc 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "markdown-it-expand-tabs": "^1.0.7", "property-ttl": "^1.0.0", "sanitize-html": "^1.6.1", - "similarity": "^1.0.1" + "similarity": "^1.0.1", + "yargs": "^3.32.0" }, "devDependencies": { "glob": "^7.0.0", From 76b6cdf96d4a51d587ef3ef44b63faa7615bcdf7 Mon Sep 17 00:00:00 2001 From: Kyle Smith Date: Sat, 19 Mar 2016 21:57:09 -0500 Subject: [PATCH 2/2] rebase, update dep versions, make code easier to test, add some test coverage --- bin/marky-markdown.js | 51 +++++++++++------- package.json | 6 ++- test/cli.js | 121 ++++++++++++++++++++++++++++++++++++++++++ test/index.js | 1 + 4 files changed, 159 insertions(+), 20 deletions(-) create mode 100644 test/cli.js diff --git a/bin/marky-markdown.js b/bin/marky-markdown.js index 3272e1b..d51050b 100755 --- a/bin/marky-markdown.js +++ b/bin/marky-markdown.js @@ -3,13 +3,13 @@ var fs = require('fs') var path = require('path') var marky = require('..') var yargs = require('yargs') -var omit = require('lodash').omit +var omit = require('lodash.omit') -var argv = yargs +var parser = yargs .usage([ - 'npm\'s markdown parser', - '', - 'Usage: $0 [options] some.md > some.html' + "npm's markdown parser", + '', + 'Usage: $0 [options] some.md > some.html' ].join('\n')) .version(function () { return require('../package.json').version @@ -17,11 +17,11 @@ var argv = yargs .example( '$0 --no-sanitize some.md > some.html', 'Parse "some.md" without sanitizing and redirect result to "some.html"' - ) +) .example( - '$0 --no-highlight README.md > index.html', - 'Parse "README.md" without highlighting fenced code blocks and redirect result to "index.html"' - ) + '$0 --no-highlight README.md > index.html', + 'Parse "README.md" without highlighting fenced code blocks and redirect result to "index.html"' +) .option('sanitize', { default: true, describe: 'remove script tags and stuff', @@ -47,20 +47,35 @@ var argv = yargs .option('serveImagesWithCDN', { alias: 'cdn', default: false, - describe: 'use npm\'s CDN to proxy images over HTTPS', + describe: "use npm's CDN to proxy images over HTTPS", type: 'boolean' }) .demand(1) .wrap(Math.min(125, yargs.terminalWidth())) - .argv +function argvToMarkyArgs (argv, cb) { + var options = omit(argv, ['_', 'version', 'highlight', 'prefix', 'cdn', '$0']) + var filePath = path.resolve(process.cwd(), argv._[0]) -var options = omit(argv, ['_', 'version', 'highlight', 'prefix', 'cdn', '$0']); + fs.readFile(filePath, function (err, data) { + if (err) { + cb(err) + } else { + cb(null, [data.toString(), options]) + } + }) +} -var filePath = path.resolve(process.cwd(), argv._[0]) +// invoked via CLI +if (require.main === module) { + argvToMarkyArgs(parser.argv, function (err, markyArgs) { + if (err) throw err + var $ = marky.apply(null, markyArgs) + process.stdout.write($.html()) + }) +} -fs.readFile(filePath, function (err, data) { - if (err) throw err - var $ = marky(data.toString(), options) - process.stdout.write($.html()) -}) +module.exports = function (rawArgv, cb) { + var argv = parser.parse(rawArgv) + argvToMarkyArgs(argv, cb) +} diff --git a/package.json b/package.json index ac950bc..aad74f1 100644 --- a/package.json +++ b/package.json @@ -43,20 +43,22 @@ "language-stylus": "^0.5.2", "lodash.assign": "^4.0.2", "lodash.defaults": "^4.0.1", + "lodash.omit": "^4.1.0", "lodash.pickby": "^4.2.1", "markdown-it": "^5.1.0", - "markdown-it-lazy-headers": "^0.1.3", "markdown-it-emoji": "^1.1.0", "markdown-it-expand-tabs": "^1.0.7", + "markdown-it-lazy-headers": "^0.1.3", "property-ttl": "^1.0.0", "sanitize-html": "^1.6.1", "similarity": "^1.0.1", - "yargs": "^3.32.0" + "yargs": "^4.3.1" }, "devDependencies": { "glob": "^7.0.0", "intercept-stdout": "^0.1.2", "mocha": "^2.0.1", + "mock-fs": "^3.8.0", "standard": "^6.0.4", "standard-format": "^2.1.0" }, diff --git a/test/cli.js b/test/cli.js new file mode 100644 index 0000000..7d081ef --- /dev/null +++ b/test/cli.js @@ -0,0 +1,121 @@ +/* globals describe, it, before, after */ + +var assert = require('assert') +var cli = require('../bin/marky-markdown') +var fixtures = require('./fixtures') +var mock = require('mock-fs') + +var filename = '/some/file.md' +var fileContents = fixtures.basic + +describe('$ marky-markdown', function () { + before(function () { + var mockObj = {} + mockObj[filename] = fileContents + mock(mockObj) + }) + + after(function () { + mock.restore() + }) + + describe('exported properly', function () { + it('is specified in package.json', function () { + assert(require('../package.json').bin === './bin/marky-markdown.js') + }) + + it('is a function', function () { + assert(cli) + assert(typeof cli === 'function') + }) + }) + + describe('handles options', function () { + it("doesn't require any options", function (cb) { + cli([filename], function (err, args) { + assert(!err) + cb() + }) + }) + + it('--sanitize', function (cb) { + cli(['--sanitize', filename], function (err, args) { + assert(!err) + assert(args[1].sanitize) + cb() + }) + }) + + it('--no-sanitize', function (cb) { + cli(['--no-sanitize', filename], function (err, args) { + assert(!err) + assert(!args[1].sanitize) + cb() + }) + }) + + it('--linkify', function (cb) { + cli(['--linkify', filename], function (err, args) { + assert(!err) + assert(args[1].linkify) + cb() + }) + }) + + it('--no-linkify', function (cb) { + cli(['--no-linkify', filename], function (err, args) { + assert(!err) + assert(!args[1].linkify) + cb() + }) + }) + + it('--highlight', function (cb) { + cli(['--highlight', filename], function (err, args) { + assert(!err) + assert(args[1].highlightSyntax) + cb() + }) + }) + + it('--no-highlight', function (cb) { + cli(['--no-highlight', filename], function (err, args) { + assert(!err) + assert(!args[1].highlightSyntax) + cb() + }) + }) + + it('--prefix', function (cb) { + cli(['--prefix', filename], function (err, args) { + assert(!err) + assert(args[1].prefixHeadingIds) + cb() + }) + }) + + it('--no-prefix', function (cb) { + cli(['--no-prefix', filename], function (err, args) { + assert(!err) + assert(!args[1].prefixHeadingIds) + cb() + }) + }) + + it('--cdn', function (cb) { + cli(['--cdn', filename], function (err, args) { + assert(!err) + assert(args[1].serveImagesWithCDN) + cb() + }) + }) + + it('--no-cdn', function (cb) { + cli(['--no-cdn', filename], function (err, args) { + assert(!err) + assert(!args[1].serveImagesWithCDN) + cb() + }) + }) + }) +}) diff --git a/test/index.js b/test/index.js index 6984d3f..e7a782f 100644 --- a/test/index.js +++ b/test/index.js @@ -1,5 +1,6 @@ // the unit test suite lives in these modules require('./marky') +require('./cli') require('./markdown') require('./sanitize') require('./badges')