'use strict'; var assert = require('chai').assert; var markdownit = require('../'); describe('API', function () { it('constructor', function () { assert.throws(function () { markdownit('bad preset'); }); // options should override preset var md = markdownit('commonmark', { html: false }); assert.strictEqual(md.render(''), '

<!-- -->

\n'); }); it('configure coverage', function () { var md = markdownit(); // conditions coverage md.configure({}); assert.strictEqual(md.render('123'), '

123

\n'); assert.throws(function () { md.configure(); }); }); it('plugin', function () { var succeeded = false; function plugin(self, opts) { if (opts === 'bar') { succeeded = true; } } var md = markdownit(); md.use(plugin, 'foo'); assert.strictEqual(succeeded, false); md.use(plugin, 'bar'); assert.strictEqual(succeeded, true); }); it('highlight', function () { var md = markdownit({ highlight: function (str) { return '==' + str + '=='; } }); assert.strictEqual(md.render('```\nhl\n```'), '
==hl\n==
\n'); }); it('highlight escape by default', function () { var md = markdownit({ highlight: function () { return ''; } }); assert.strictEqual(md.render('```\n&\n```'), '
&\n
\n'); }); it('force hardbreaks', function () { var md = markdownit({ breaks: true }); assert.strictEqual(md.render('a\nb'), '

a
\nb

\n'); md.set({ xhtmlOut: true }); assert.strictEqual(md.render('a\nb'), '

a
\nb

\n'); }); it('xhtmlOut enabled', function () { var md = markdownit({ xhtmlOut: true }); assert.strictEqual(md.render('---'), '
\n'); assert.strictEqual(md.render('![]()'), '

\n'); assert.strictEqual(md.render('a \\\nb'), '

a
\nb

\n'); }); it('xhtmlOut disabled', function () { var md = markdownit(); assert.strictEqual(md.render('---'), '
\n'); assert.strictEqual(md.render('![]()'), '

\n'); assert.strictEqual(md.render('a \\\nb'), '

a
\nb

\n'); }); it('bulk enable/disable rules in different chains', function () { var md = markdownit(); var was = { core: md.core.ruler.getRules('').length, block: md.block.ruler.getRules('').length, inline: md.inline.ruler.getRules('').length }; // Disable 2 rule in each chain & compare result md.disable([ 'block', 'inline', 'code', 'fence', 'emphasis', 'entity' ]); var now = { core: md.core.ruler.getRules('').length + 2, block: md.block.ruler.getRules('').length + 2, inline: md.inline.ruler.getRules('').length + 2 }; assert.deepEqual(was, now); // Enable the same rules back md.enable([ 'block', 'inline', 'code', 'fence', 'emphasis', 'entity' ]); var back = { core: md.core.ruler.getRules('').length, block: md.block.ruler.getRules('').length, inline: md.inline.ruler.getRules('').length }; assert.deepEqual(was, back); }); it('bulk enable/disable with errors control', function () { var md = markdownit(); assert.throws(function () { md.enable([ 'link', 'code', 'invalid' ]); }); assert.throws(function () { md.disable([ 'link', 'code', 'invalid' ]); }); assert.doesNotThrow(function () { md.enable([ 'link', 'code' ]); }); assert.doesNotThrow(function () { md.disable([ 'link', 'code' ]); }); }); it('bulk enable/disable should understand strings', function () { var md = markdownit(); md.disable('emphasis'); assert(md.renderInline('_foo_'), '_foo_'); md.enable('emphasis'); assert(md.renderInline('_foo_'), 'foo'); }); }); describe('Misc', function () { it('Should replace NULL characters', function () { var md = markdownit(); assert.strictEqual(md.render('foo\u0000bar'), '

foo\uFFFDbar

\n'); }); it('Should correctly parse strings without tailing \\n', function () { var md = markdownit(); assert.strictEqual(md.render('123'), '

123

\n'); assert.strictEqual(md.render('123\n'), '

123

\n'); }); it('Should quickly exit on empty string', function () { var md = markdownit(); assert.strictEqual(md.render(''), ''); }); it('Should parse inlines only', function () { var md = markdownit(); assert.strictEqual(md.renderInline('a *b* c'), 'a b c'); }); it('Renderer should have pluggable inline and block rules', function () { var md = markdownit(); md.renderer.rules.em_open = function () { return ''; }; md.renderer.rules.em_close = function () { return ''; }; md.renderer.rules.paragraph_open = function () { return ''; }; md.renderer.rules.paragraph_close = function () { return ''; }; assert.strictEqual(md.render('*b*'), 'b'); }); it('Zero preset should disable everything', function () { var md = markdownit('zero'); assert.strictEqual(md.render('___foo___'), '

___foo___

\n'); assert.strictEqual(md.renderInline('___foo___'), '___foo___'); md.enable('emphasis'); assert.strictEqual(md.render('___foo___'), '

foo

\n'); assert.strictEqual(md.renderInline('___foo___'), 'foo'); }); it('Should correctly check block termination rules when those are disabled (#13)', function () { var md = markdownit('zero'); assert.strictEqual(md.render('foo\nbar'), '

foo\nbar

\n'); }); it('Should render link target attr', function () { var md = markdownit() .use(require('markdown-it-for-inline'), 'target', 'link_open', function (tokens, idx) { tokens[idx].target = '_blank'; }); assert.strictEqual(md.render('[foo](bar)'), '

foo

\n'); }); }); describe('Links validation', function () { it('Override validator, disable everything', function () { var md = markdownit({ linkify: true }); md.inline.validateLink = function () { return false; }; assert.strictEqual(md.render('foo@example.com'), '

foo@example.com

\n'); assert.strictEqual(md.render('http://example.com'), '

http://example.com

\n'); assert.strictEqual(md.render(''), '

<foo@example.com>

\n'); assert.strictEqual(md.render(''), '

<http://example.com>

\n'); assert.strictEqual(md.render('[test](http://example.com)'), '

[test](http://example.com)

\n'); }); }); describe('maxNesting', function () { it('Inline parser should not nest above limit', function () { var md = markdownit({ maxNesting: 2 }); assert.strictEqual(md.render('*foo *bar *baz* bar* foo*'), '

foo bar *baz* bar foo

\n'); }); it('Block parser should not nest above limit', function () { var md = markdownit({ maxNesting: 2 }); assert.strictEqual( md.render('>foo\n>>bar\n>>>baz'), '
\n

foo

\n
\n
\n
\n' ); }); });