diff --git a/doctoc.js b/doctoc.js index 50adb78..bd783b3 100755 --- a/doctoc.js +++ b/doctoc.js @@ -16,13 +16,13 @@ function cleanPath(path) { return homeExpanded.replace(/\s/g, '\\ '); } -function transformAndSave(files, mode, maxHeaderLevel, title, notitle, entryPrefix, stdOut) { +function transformAndSave(files, mode, maxHeaderLevel, title, notitle, entryPrefix, entire, stdOut) { console.log('\n==================\n'); var transformed = files .map(function (x) { var content = fs.readFileSync(x.path, 'utf8') - , result = transform(content, mode, maxHeaderLevel, title, notitle, entryPrefix); + , result = transform(content, mode, maxHeaderLevel, title, notitle, entryPrefix, entire); result.path = x.path; return result; }); @@ -54,7 +54,7 @@ function printUsageAndExit(isErr) { var outputFunc = isErr ? console.error : console.info; - outputFunc('Usage: doctoc [mode] [--entryprefix prefix] [--notitle | --title title] [--maxlevel level] (where path is some path to a directory (e.g., .) or a file (e.g., README.md))'); + outputFunc('Usage: doctoc [mode] [--entryprefix prefix] [--notitle | --title title] [--maxlevel level] [--entire] (where path is some path to a directory (e.g., .) or a file (e.g., README.md))'); outputFunc('\nAvailable modes are:'); for (var key in modes) { outputFunc(' --%s\t%s', key, modes[key]); @@ -75,7 +75,7 @@ var modes = { var mode = modes['github']; var argv = minimist(process.argv.slice(2) - , { boolean: [ 'h', 'help', 'T', 'notitle', 's', 'stdout'].concat(Object.keys(modes)) + , { boolean: [ 'h', 'help', 'T', 'notitle', 's', 'stdout', 'entire' ].concat(Object.keys(modes)) , string: [ 'title', 't', 'maxlevel', 'm', 'entryprefix' ] , unknown: function(a) { return (a[0] == '-' ? (console.error('Unknown option(s): ' + a), printUsageAndExit(true)) : true); } }); @@ -93,6 +93,7 @@ for (var key in modes) { var title = argv.t || argv.title; var notitle = argv.T || argv.notitle; var entryPrefix = argv.entryprefix || '-'; +var entire = argv.entire; var stdOut = argv.s || argv.stdout var maxHeaderLevel = argv.m || argv.maxlevel; @@ -110,7 +111,7 @@ for (var i = 0; i < argv._.length; i++) { files = [{ path: target }]; } - transformAndSave(files, mode, maxHeaderLevel, title, notitle, entryPrefix, stdOut); + transformAndSave(files, mode, maxHeaderLevel, title, notitle, entryPrefix, entire, stdOut); console.log('\nEverything is OK.'); } diff --git a/lib/transform.js b/lib/transform.js index 5b1370d..352743a 100644 --- a/lib/transform.js +++ b/lib/transform.js @@ -85,8 +85,8 @@ function countHeaders (headers) { return headers; } -function getLinesToToc (lines, currentToc, info) { - if (!currentToc) return lines; +function getLinesToToc (lines, currentToc, info, entire) { + if (entire || !currentToc) return lines; var tocableStart = 0; @@ -106,7 +106,7 @@ function determineTitle(title, notitle, lines, info) { return info.hasStart ? lines[info.startIdx + 2] : defaultTitle; } -exports = module.exports = function transform(content, mode, maxHeaderLevel, title, notitle, entryPrefix) { +exports = module.exports = function transform(content, mode, maxHeaderLevel, title, notitle, entryPrefix, entire) { mode = mode || 'github.com'; entryPrefix = entryPrefix || '-'; @@ -119,7 +119,7 @@ exports = module.exports = function transform(content, mode, maxHeaderLevel, tit var inferredTitle = determineTitle(title, notitle, lines, info); var currentToc = info.hasStart && lines.slice(info.startIdx, info.endIdx + 1).join('\n') - , linesToToc = getLinesToToc(lines, currentToc, info); + , linesToToc = getLinesToToc(lines, currentToc, info, entire); var headers = getMarkdownHeaders(linesToToc, maxHeaderLevel) .concat(getHtmlHeaders(linesToToc, maxHeaderLevelHtml)) diff --git a/test/transform.js b/test/transform.js index 9a46cc5..0304ba5 100644 --- a/test/transform.js +++ b/test/transform.js @@ -8,9 +8,9 @@ function inspect(obj, depth) { console.log(require('util').inspect(obj, false, depth || 5, true)); } -function check(md, anchors, mode, maxHeaderLevel, title, notitle, entryPrefix) { +function check(md, anchors, mode, maxHeaderLevel, title, notitle, entryPrefix, entire) { test('transforming', function (t) { - var res = transform(md, mode, maxHeaderLevel, title, notitle, entryPrefix) + var res = transform(md, mode, maxHeaderLevel, title, notitle, entryPrefix, entire) // remove wrapper var data = res.data.split('\n'); @@ -284,6 +284,75 @@ test('transforming when old toc exists', function (t) { t.end() }) +test('transforming when old toc exists and --entire flag is set', function (t) { + var md = [ + '# Header above' + , '' + , 'The above header should be ignored since it is above the existing toc' + , '' + , '' + , '' + , '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*' + , '' + , '- [OldHeader](#oldheader)' + , '' + , '' + , '## Header' + , 'some content' + , '' + ].join('\n') + + var res = transform(md, undefined, undefined, undefined, undefined, undefined, true) + + t.ok(res.transformed, 'transforms it') + + t.deepEqual( + res.toc.split('\n') + , [ '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*', + '', + '- [Header above](#header-above)', + ' - [Header](#header)', + '' ] + , 'replaces old toc' + ) + + t.deepEqual( + res.wrappedToc.split('\n') + , [ '', + '', + '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*', + '', + '- [Header above](#header-above)', + ' - [Header](#header)', + '', + '' + ] + , 'wraps old toc' + ) + + t.deepEqual( + res.data.split('\n') + , [ '# Header above', + '', + 'The above header should be ignored since it is above the existing toc', + '', + '', + '', + '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*', + '', + '- [Header above](#header-above)', + ' - [Header](#header)', + '', + '', + '## Header', + 'some content', + '' ] + , 'updates the content with the new toc and ignores header before existing toc' + ) + t.end() +}) + + // bigbucket.org check( [ '# My Module'