Skip to content

Commit

Permalink
fix(italicsAndBold): fix double emphasis edge case
Browse files Browse the repository at this point in the history
  • Loading branch information
tivie committed Jan 31, 2017
1 parent ab54933 commit 1832b7f
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 18 deletions.
20 changes: 13 additions & 7 deletions dist/showdown.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/showdown.js.map

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/showdown.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/showdown.min.js.map

Large diffs are not rendered by default.

18 changes: 12 additions & 6 deletions src/subParsers/italicsAndBold.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,36 @@ showdown.subParser('italicsAndBold', function (text, options, globals) {

text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);

// it's faster to have 2 separate regexes for each case than have just one
// it's faster to have 3 separate regexes for each case than have just one
// because of backtracing, in some cases, it could lead to an exponential effect
// called "catastrophic backtrace". Ominous!

// Parse underscores
if (options.literalMidWordUnderscores) {
text = text.replace(/\b__(\S[\s\S]*?)__\b/gm, '<strong>$1</strong>');
text = text.replace(/\b_(\S[\s\S]*?)_\b/gm, '<em>$1</em>');
text = text.replace(/\b___(\S[\s\S]*)___\b/g, '<strong><em>$1</em></strong>');
text = text.replace(/\b__(\S[\s\S]*)__\b/g, '<strong>$1</strong>');
text = text.replace(/\b_(\S[\s\S]*?)_\b/g, '<em>$1</em>');
} else {
text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
return (/\S$/.test(m)) ? '<strong><em>' + m + '</em></strong>' : wm;
});
text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
return (/\S$/.test(m)) ? '<strong>' + m + '</strong>' : wm;
});
text = text.replace(/_(\S[\s\S]*?)_/g, function (wm, m) {
text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) {
// !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)
return (/\S$/.test(m)) ? '<em>' + m + '</em>' : wm;
});
}

// Now parse asterisks
text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) {
return (/\S$/.test(m)) ? '<strong><em>' + m + '</em></strong>' : wm;
});
text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) {
return (/\S$/.test(m)) ? '<strong>' + m + '</strong>' : wm;
});

text = text.replace(/\*(\S[\s\S]*?)\*/g, function (wm, m) {
text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) {
// !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)
return (/\S$/.test(m)) ? '<em>' + m + '</em>' : wm;
});
Expand Down
4 changes: 4 additions & 0 deletions test/cases/double-emphasis.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<p>a <strong><em>strong and em</em></strong> thingy</p>
<p>bar<strong><em>bazinga</em></strong>bar</p>
<p>a <strong><em>strong and em</em></strong> thingy</p>
<p>bar<strong><em>bazinga</em></strong>bar</p>
7 changes: 7 additions & 0 deletions test/cases/double-emphasis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
a ___strong and em___ thingy

bar___bazinga___bar

a ***strong and em*** thingy

bar***bazinga***bar
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
<p>foo *bar *baz</p>
<p>foo **bar **baz</p>
<p>foo ***bar ***baz</p>
<p>foo _bar _baz</p>
<p>foo __bar __baz</p>
<p>foo ___bar ___baz</p>
<p>foo *bar *baz *bazinga</p>
<p>foo **bar **baz **bazinga</p>
<p>foo ***bar ***baz ***bazinga</p>
<p>foo _bar _baz __bazinga</p>
<p>foo __bar __baz __bazinga</p>
<p>foo ___bar ___baz ___bazinga</p>
<p><em>f</em></p>
<p><strong>f</strong></p>
<p><em>f</em></p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,26 @@ foo *bar *baz

foo **bar **baz

foo ***bar ***baz

foo _bar _baz

foo __bar __baz

foo ___bar ___baz

foo *bar *baz *bazinga

foo **bar **baz **bazinga

foo ***bar ***baz ***bazinga

foo _bar _baz __bazinga

foo __bar __baz __bazinga

foo ___bar ___baz ___bazinga

*f*

**f**
Expand Down

0 comments on commit 1832b7f

Please sign in to comment.