fix(italicsAndBold): fix double emphasis edge case

This commit is contained in:
Estevao Soares dos Santos 2017-01-31 01:48:03 +00:00
parent ab54933b16
commit 1832b7f721
9 changed files with 53 additions and 18 deletions

20
dist/showdown.js vendored
View File

@ -1,4 +1,4 @@
;/*! showdown 30-01-2017 */
;/*! showdown 31-01-2017 */
(function(){
/**
* Created by Tivie on 13-07-2015.
@ -2089,30 +2089,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;
});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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;
});

View File

@ -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>

View File

@ -0,0 +1,7 @@
a ___strong and em___ thingy
bar___bazinga___bar
a ***strong and em*** thingy
bar***bazinga***bar

View File

@ -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>

View File

@ -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**