diff --git a/lib/rules.js b/lib/rules.js index 52a0999c..24ebe67a 100644 --- a/lib/rules.js +++ b/lib/rules.js @@ -147,8 +147,12 @@ rules.paragraph_close = function(tokens, idx /*, options, env */) { rules.link_open = function(tokens, idx, options /* env */) { var title = tokens[idx].title ? (' title="' + escapeHtml(replaceEntities(tokens[idx].title)) + '"') : ''; - var target = options.linkTarget ? (' target="' + options.linkTarget + '"') : ''; - return ''; + + var linkTarget = options.linkTarget; + var target = linkTarget ? (' target="' + options.linkTarget + '"') : ''; + var rel = linkTarget && linkTarget.indexOf('_blank') !== -1 ? ' rel="noopener noreferrer"' : ''; + + return ''; }; rules.link_close = function(/* tokens, idx, options, env */) { return ''; diff --git a/test/misc.js b/test/misc.js index 581246e8..296ff38d 100644 --- a/test/misc.js +++ b/test/misc.js @@ -200,11 +200,20 @@ describe('Link target', function () { }); it('Should add target to link when linkTarget is specified in options', function () { + var md = new Remarkable({ linkTarget: '_self' }); + + assert.strictEqual( + md.render('[test](http://example.com)'), + '

test

\n' + ); + }); + + it('Should add rel attr when linkTarget contains _blank', function () { var md = new Remarkable({ linkTarget: '_blank' }); assert.strictEqual( md.render('[test](http://example.com)'), - '

test

\n' + '

test

\n' ); });