diff --git a/.gitignore b/.gitignore index 5171c54..170253a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -npm-debug.log \ No newline at end of file +npm-debug.log +out \ No newline at end of file diff --git a/jsdoc_conf.json b/jsdoc_conf.json new file mode 100644 index 0000000..17b13a4 --- /dev/null +++ b/jsdoc_conf.json @@ -0,0 +1,3 @@ +{ + "plugins": ["lib/jsdoc-codesnippet"] +} \ No newline at end of file diff --git a/lib/jsdoc-codesnippet.js b/lib/jsdoc-codesnippet.js index c48d15e..e14a0b3 100644 --- a/lib/jsdoc-codesnippet.js +++ b/lib/jsdoc-codesnippet.js @@ -20,7 +20,7 @@ exports.handlers = { if (doclet.description && doclet.description.indexOf("{@snippet ") > -1) { doclet.description = doclet.description.replace(/{@snippet\s+(\w+?)(?:\s+(.*?))?}/g, function (matched, snippetCode, label) { if (snippets[snippetCode]) { - return '
' + snippets[snippetCode].content.replace(new RegExp(doclet.name, "g"), '' + doclet.name + '') + '
'; + return '\n
\n' + snippets[snippetCode].content + '\n
\n'; } else { logger.error('Reference to inexistant snippet "' + snippetCode + '"'); return ""; @@ -41,16 +41,24 @@ exports.defineTags = function (dictionary) { dictionary.defineTag("snippetStart", { mustHaveValue: true, onTagged: function onTagged(doclet, tag) { + // only include the last doclet tagged + if (!(doclet.meta.code && Object.keys(doclet.meta.code).length > 0)) { + return; + } if (snippets[doclet.value] != null) { logger.error('Redefinition of snippet name "' + doclet.value + '"'); } else { - snippets[tag.value] = { start: doclet.meta.range[1] }; + snippets[tag.value] = { start: doclet.meta.range[0] }; } } }); dictionary.defineTag("snippetEnd", { mustHaveValue: true, onTagged: function onTagged(doclet, tag) { + // only include the first doclet tagged + if (!(doclet.meta.code && Object.keys(doclet.meta.code).length === 0)) { + return; + } if (snippets[tag.value] == null) { logger.error('End of snippet name "' + doclet.value + '" found before its beginning. Did you forget the "@snippetStart ' + doclet.value + '" doclet?'); } else { diff --git a/package.json b/package.json index 037ef9e..ccd3467 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ }, "scripts": { "compile": "babel -d lib/ src/", - "prepublish": "npm run compile" + "prepublish": "npm run compile", + "test": "jsdoc -c jsdoc_conf.json tests/test_parse.js && comm -12 out/global.html tests/expected.js | diff -w - tests/expected.js" }, "keywords": [ "jsdoc", @@ -29,7 +30,8 @@ "devDependencies": { "babel": "^5.8.23", "babel-preset-es2015": "^6.6.0", - "babel-runtime": "^5.8.24" + "babel-runtime": "^5.8.24", + "jsdoc": "^3.4.3" }, "babel": { "presets": [ diff --git a/src/jsdoc-codesnippet.js b/src/jsdoc-codesnippet.js index e451465..40fcbb8 100644 --- a/src/jsdoc-codesnippet.js +++ b/src/jsdoc-codesnippet.js @@ -18,7 +18,7 @@ exports.handlers = { if(doclet.description && doclet.description.indexOf("{@snippet ") > -1){ doclet.description = doclet.description.replace(/{@snippet\s+(\w+?)(?:\s+(.*?))?}/g, function(matched, snippetCode, label){ if(snippets[snippetCode]){ - return `
${ snippets[snippetCode].content.replace(new RegExp(doclet.name,"g"), `${ doclet.name }`) }
`; + return `\n
\n${ snippets[snippetCode].content }\n
\n`; } else { logger.error(`Reference to inexistant snippet "${ snippetCode }"`); return ""; @@ -40,16 +40,24 @@ exports.defineTags = function(dictionary) { dictionary.defineTag("snippetStart",{ mustHaveValue:true, onTagged: function(doclet, tag){ + // only include the last doclet tagged + if (!(doclet.meta.code && Object.keys(doclet.meta.code).length > 0)) { + return; + } if(snippets[doclet.value] != null){ logger.error(`Redefinition of snippet name "${ doclet.value }"`); } else { - snippets[tag.value] = {start:doclet.meta.range[1]}; + snippets[tag.value] = {start:doclet.meta.range[0]}; } } }); dictionary.defineTag("snippetEnd",{ mustHaveValue:true, onTagged: function(doclet, tag){ + // only include the first doclet tagged + if (!(doclet.meta.code && Object.keys(doclet.meta.code).length === 0)) { + return; + } if(snippets[tag.value] == null){ logger.error(`End of snippet name "${ doclet.value }" found before its beginning. Did you forget the "@snippetStart ${ doclet.value }" doclet?`); } else { diff --git a/tests/expected.js b/tests/expected.js new file mode 100644 index 0000000..7889479 --- /dev/null +++ b/tests/expected.js @@ -0,0 +1,3 @@ +output = { + 'hello': 'world' +}; diff --git a/tests/test_parse.js b/tests/test_parse.js new file mode 100644 index 0000000..d89000a --- /dev/null +++ b/tests/test_parse.js @@ -0,0 +1,16 @@ +/** + * @snippetStart bar + */ +var output = { + 'hello': 'world' +}; +/** + * @snippetEnd bar + */ + +/** + * @description Snippet: {@snippet bar} + */ +function testDocs() { + return; +}