From 2fd96d2bb7e4fe5a9210d924d8670ffad78a73e2 Mon Sep 17 00:00:00 2001 From: mathematicalcoffee Date: Fri, 28 Dec 2012 15:03:35 +1000 Subject: [PATCH 1/4] fix: env.conf.markdown.hardwrap is now respected. --- .../scripts/showdown.js | 2 +- test/specs/jsdoc/util/markdown.js | 74 ++++++++++++++----- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/node_modules/github-flavored-markdown/scripts/showdown.js b/node_modules/github-flavored-markdown/scripts/showdown.js index 0f506eb0..4efc3e0f 100644 --- a/node_modules/github-flavored-markdown/scripts/showdown.js +++ b/node_modules/github-flavored-markdown/scripts/showdown.js @@ -151,7 +151,7 @@ this.makeHtml = function(text, gh) { g_html_blocks = new Array(); // benblank - Allow hardwrapping to be disabled. - g_hardwrap = typeof this.hardwrap === "undefined" || this.hardwrap; + g_hardwrap = (typeof exports.hardwrap === "undefined" || exports.hardwrap); // attacklab: Replace ~ with ~T // This lets us use tilde as an escape char to avoid md5 hashes diff --git a/test/specs/jsdoc/util/markdown.js b/test/specs/jsdoc/util/markdown.js index f6ae402a..ba759861 100644 --- a/test/specs/jsdoc/util/markdown.js +++ b/test/specs/jsdoc/util/markdown.js @@ -13,6 +13,31 @@ describe('jsdoc/util/markdown', function() { }); describe('getParser', function() { + // couple of convenience functions letting me set conf variables and restore + // them back to the originals later. + function setMarkdownConf(hash) { + if (!env.conf.markdown) { + env.conf.markdown = {}; + } + var keys = Object.keys(hash); + var storage = {}; + for (var i = 0; i < keys.length; ++i) { + storage[keys[i]] = env.conf.markdown[keys[i]]; + // works because hash[key] is a scalar not an array/object + env.conf.markdown[keys[i]] = hash[keys[i]]; + } + return storage; + } + + function restoreMarkdownConf(storage) { + var keys = Object.keys(storage); + for (var i = 0; i < keys.length; ++i) { + env.conf.markdown[keys[i]] = storage[keys[i]]; + } + if (keys.length === 0) { + delete env.conf.markdown; + } + } xit('should retrieve a function when called with default settings', function() { // TODO }); @@ -30,39 +55,52 @@ describe('jsdoc/util/markdown', function() { }); it('should not apply formatting to inline tags when the evilstreak parser is enabled', function() { - // store the old configuration - var old = (env.conf.markdown ? env.conf.markdown.parser : undefined); - env.conf.markdown = {parser: 'evilstreak'}; + var storage = setMarkdownConf({parser: 'evilstreak'}); // get the evilstreak parser and do the test var parser = markdown.getParser(); expect(parser('{@link MyClass#_x} and {@link MyClass#_y}')).toEqual( '

{@link MyClass#_x} and {@link MyClass#_y}

'); - // restore the old value - if (old === undefined) { - env.conf.markdown.parser = old; - } else { - delete env.conf.markdown; - } + restoreMarkdownConf(storage); }); it('should not apply formatting to inline tags when the GFM parser is enabled', function() { - // store the old configuration - var old = (env.conf.markdown ? env.conf.markdown.parser : undefined); - env.conf.markdown = {parser: 'gfm'}; + var storage = setMarkdownConf({parser: 'gfm'}); // get the gfm parser and do the test var parser = markdown.getParser(); expect(parser('{@link MyClass#_x} and {@link MyClass#_y}')).toEqual( '

{@link MyClass#_x} and {@link MyClass#_y}

'); - // restore the old value - if (old === undefined) { - env.conf.markdown.parser = old; - } else { - delete env.conf.markdown; - } + restoreMarkdownConf(storage); }); + + it('GFM parser with no conf.markdown.hardwrap has it to false', function() { + var storage = setMarkdownConf({parser: 'gfm'}); + + var parser = markdown.getParser(); + expect(parser('Testing\nhardwrap')).toEqual('

Testing\nhardwrap

'); + + restoreMarkdownConf(storage); + }); + + it('GFM parser respects conf.markdown.hardwrap=false', function() { + var storage = setMarkdownConf({parser: 'gfm', hardwrap: false}); + + var parser = markdown.getParser(); + expect(parser('Testing\nhardwrap')).toEqual('

Testing\nhardwrap

'); + + restoreMarkdownConf(storage); + }); + + it('GFM parser respects conf.markdown.hardwrap=true', function() { + var storage = setMarkdownConf({parser: 'gfm', hardwrap: true}); + + var parser = markdown.getParser(); + expect(parser('Testing\nhardwrap')).toEqual('

Testing
hardwrap

'); + + restoreMarkdownConf(storage); + }); }); }); From 24a3c6b448332986ef45c3126ef1f9ef2d2b1e72 Mon Sep 17 00:00:00 2001 From: mathematicalcoffee Date: Fri, 28 Dec 2012 23:53:07 +1000 Subject: [PATCH 2/4] filled out markdown tests for getParser to test asking for specific parsers --- lib/jsdoc/util/markdown.js | 9 +++- test/specs/jsdoc/util/markdown.js | 70 +++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/lib/jsdoc/util/markdown.js b/lib/jsdoc/util/markdown.js index 0711d4d9..ae1350e5 100644 --- a/lib/jsdoc/util/markdown.js +++ b/lib/jsdoc/util/markdown.js @@ -48,6 +48,7 @@ function escapeUnderscores(source) { */ function getParseFunction(parser, conf) { conf = conf || {}; + var parse; if (parser === parsers.gfm) { parser = require(parser); @@ -61,19 +62,23 @@ function getParseFunction(parser, conf) { parser.hardwrap = !!conf.hardwrap; - return function(source) { + parse = function(source) { source = escapeUnderscores(source); return parser.parse(source, githubConf); }; + parse._parser = parsers.gfm; + return parse; } else if (parser === parsers.evilstreak) { parser = require(parser).markdown; - return function(source) { + parse = function(source) { source = escapeUnderscores(source); // evilstreak parser expects line endings to be \n source = source.replace(/\r\n|\r/g, '\n'); return parser.toHTML(source, conf.dialect); }; + parse._parser = parsers.evilstreak; + return parse; } else { throw new Error("unknown Markdown parser: '" + parser + "'"); } diff --git a/test/specs/jsdoc/util/markdown.js b/test/specs/jsdoc/util/markdown.js index ba759861..f4b2fe24 100644 --- a/test/specs/jsdoc/util/markdown.js +++ b/test/specs/jsdoc/util/markdown.js @@ -38,20 +38,74 @@ describe('jsdoc/util/markdown', function() { delete env.conf.markdown; } } - xit('should retrieve a function when called with default settings', function() { - // TODO + + it('should retrieve a function when called with default settings', function() { + var storage = setMarkdownConf({parser: 'evilstreak'}); + + var parser = markdown.getParser(); + expect(typeof parser).toEqual('function'); + + setMarkdownConf({parser: 'gfm'}); + parser = markdown.getParser(); + expect(typeof parser).toEqual('function'); + + restoreMarkdownConf(storage); }); - xit('should use the evilstreak parser when requested', function() { - // TODO + it('should use the evilstreak parser when requested', function() { + var storage = setMarkdownConf({parser: 'evilstreak'}); + var parser = markdown.getParser(); + expect(parser._parser).toEqual('markdown'); + restoreMarkdownConf(storage); }); - xit('should use the GFM parser when requested', function() { - // TODO + it('should use the GFM parser when requested', function() { + var storage = setMarkdownConf({parser: 'gfm'}); + var parser = markdown.getParser(); + expect(parser._parser).toEqual('github-flavored-markdown'); + restoreMarkdownConf(storage); }); - xit('should convert GitHub repo references to links when the correct options are defined', function() { - // TODO + it('should use GFM parser when parser is not specified but github owner and repo are', function() { + var storage = setMarkdownConf({githubRepoOwner: 'jsdoc', githubRepoName: 'jsdoc3'}); + var parser = markdown.getParser(); + expect(parser._parser).toEqual('github-flavored-markdown'); + restoreMarkdownConf(storage); + }); + + it('should convert GitHub repo references to links when the correct options are defined', function() { + var storage = setMarkdownConf({parser: 'gfm', githubRepoOwner: 'jsdoc', githubRepoName: 'jsdoc3'}); + var parser = markdown.getParser(); + expect(parser._parser).toEqual('github-flavored-markdown'); + + var sha = '228c940816b5f799a12f83f071a1c67cbb478f39'; + var sha7 = sha.substr(0, 7); + + // Auto-link sha1 if GitHub.nameWithOwner is defined + expect(parser(sha)).toEqual( + "

" + sha7 + "

"); + + // ** GFM ** Auto-link user@sha1 if GitHub.nameWithOwner is defined + expect(parser('mathematicalcoffee@' + sha)).toEqual( + "

mathematicalcoffee@" + sha7 + "

"); + + // ** GFM ** Auto-link user/repo@sha1 + expect(parser('jsdoc/jsdoc3@' + sha)).toEqual( + "

jsdoc/jsdoc3@" + sha7 + "

"); + + // ** GFM ** Auto-link #issue if GitHub.nameWithOwner is defined + expect(parser('Fixes #1')).toEqual( + "

Fixes #1

"); + + // ** GFM ** Auto-link user#issue if GitHub.nameWithOwner is defined + expect(parser('mathematicalcoffee#12')).toEqual( + "

mathematicalcoffee#12

"); + + // ** GFM ** Auto-link user/repo#issue + expect(parser('jsdoc/jsdoc3#1')).toEqual( + "

jsdoc/jsdoc3#1

"); + + restoreMarkdownConf(storage); }); it('should not apply formatting to inline tags when the evilstreak parser is enabled', function() { From ac14eda6681feeee1696b7e776257eda6504c857 Mon Sep 17 00:00:00 2001 From: mathematicalcoffee Date: Fri, 18 Jan 2013 10:16:41 +1000 Subject: [PATCH 3/4] added --version switch. --- jsdoc.js | 4 ++++ lib/jsdoc/opts/args.js | 1 + test/specs/jsdoc/opts/args.js | 9 ++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/jsdoc.js b/jsdoc.js index 472931a2..6cef8476 100644 --- a/jsdoc.js +++ b/jsdoc.js @@ -215,6 +215,10 @@ function main() { } else if (env.opts.test) { include('test/runner.js'); process.exit(0); + } else if (env.opts.version) { + var info = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); + console.log(info.version); + process.exit(0); } if (env.conf.plugins) { diff --git a/lib/jsdoc/opts/args.js b/lib/jsdoc/opts/args.js index 6683c67f..3e6d8a86 100644 --- a/lib/jsdoc/opts/args.js +++ b/lib/jsdoc/opts/args.js @@ -79,6 +79,7 @@ argParser.addOption('h', 'help', false, 'Print this message and quit.'); argParser.addOption('X', 'explain', false, 'Dump all found doclet internals to console and quit.'); argParser.addOption('q', 'query', true, 'A query string to parse and store in env.opts.query. Example: foo=bar&baz=true', false, parseQuery); argParser.addOption('u', 'tutorials', true, 'Directory in which JSDoc should search for tutorials.'); +argParser.addOption(null,'version', false, 'Display the version number and quit.'); //TODO [-R, recurseonly] = a number representing the depth to recurse //TODO [-f, filter] = a regex to filter on <-- this can be better defined in the configs? diff --git a/test/specs/jsdoc/opts/args.js b/test/specs/jsdoc/opts/args.js index cf672a71..8d1da0fc 100644 --- a/test/specs/jsdoc/opts/args.js +++ b/test/specs/jsdoc/opts/args.js @@ -233,6 +233,13 @@ describe("jsdoc/opts/args", function() { expect(r.nocolor).toEqual(true); }); + it("should accept a '--version' option and return an object with a 'version' property", function() { + args.parse(['--version']); + var r = args.get(); + + expect(r.version).toEqual(true); + }); + it("should accept a naked option (i.e. no '-') and return an object with a '_' property", function() { args.parse(['myfile1', 'myfile2']); var r = args.get(); @@ -242,4 +249,4 @@ describe("jsdoc/opts/args", function() { //TODO: tests for args that must have values }); -}); \ No newline at end of file +}); From b814da3e8b02e3ed644b00723c5507fe23d63953 Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Thu, 17 Jan 2013 18:06:31 -0800 Subject: [PATCH 4/4] support -v option; provide more detailed version info (#303) --- jsdoc.js | 6 ++++-- lib/jsdoc/opts/args.js | 2 +- test/specs/jsdoc/opts/args.js | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/jsdoc.js b/jsdoc.js index 6cef8476..b717479b 100644 --- a/jsdoc.js +++ b/jsdoc.js @@ -113,6 +113,7 @@ function main() { var exampleConf; var filter; var i; + var info; var l; var packageDocs; var packageJson; @@ -216,8 +217,9 @@ function main() { include('test/runner.js'); process.exit(0); } else if (env.opts.version) { - var info = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); - console.log(info.version); + info = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')); + info.revision = new Date(parseInt(info.revision, 10)).toUTCString(); + console.log('JSDoc ' + info.version + ' (' + info.revision + ')'); process.exit(0); } diff --git a/lib/jsdoc/opts/args.js b/lib/jsdoc/opts/args.js index 3e6d8a86..ba32a172 100644 --- a/lib/jsdoc/opts/args.js +++ b/lib/jsdoc/opts/args.js @@ -79,7 +79,7 @@ argParser.addOption('h', 'help', false, 'Print this message and quit.'); argParser.addOption('X', 'explain', false, 'Dump all found doclet internals to console and quit.'); argParser.addOption('q', 'query', true, 'A query string to parse and store in env.opts.query. Example: foo=bar&baz=true', false, parseQuery); argParser.addOption('u', 'tutorials', true, 'Directory in which JSDoc should search for tutorials.'); -argParser.addOption(null,'version', false, 'Display the version number and quit.'); +argParser.addOption('v', 'version', false, 'Display the version number and quit.'); //TODO [-R, recurseonly] = a number representing the depth to recurse //TODO [-f, filter] = a regex to filter on <-- this can be better defined in the configs? diff --git a/test/specs/jsdoc/opts/args.js b/test/specs/jsdoc/opts/args.js index 8d1da0fc..bf924547 100644 --- a/test/specs/jsdoc/opts/args.js +++ b/test/specs/jsdoc/opts/args.js @@ -233,6 +233,13 @@ describe("jsdoc/opts/args", function() { expect(r.nocolor).toEqual(true); }); + it("should accept a '-v' option and return an object with a 'version' property", function() { + args.parse(['-v']); + var r = args.get(); + + expect(r.version).toEqual(true); + }); + it("should accept a '--version' option and return an object with a 'version' property", function() { args.parse(['--version']); var r = args.get();