fix(headings): inconsistent behavior in lists

In text, headings only require a single linebreak to be treated as such.
However, in lists, they would require a double linebreak.
Now, the behavior in lists and text is consistent, requiring only a single
linebreak.

Closes #495
This commit is contained in:
Estevao Soares dos Santos 2018-09-15 14:44:48 +01:00
parent d9eea64794
commit 26abc7a795
7 changed files with 50 additions and 15 deletions

BIN
dist/showdown.js vendored

Binary file not shown.

BIN
dist/showdown.js.map vendored

Binary file not shown.

BIN
dist/showdown.min.js vendored

Binary file not shown.

Binary file not shown.

View File

@ -46,6 +46,7 @@ showdown.subParser('makehtml.lists', function (text, options, globals) {
// Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation, // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,
// which is a syntax breaking change // which is a syntax breaking change
// activating this option reverts to old behavior // activating this option reverts to old behavior
// This will be removed in version 2.0
if (options.disableForced4SpacesIndentedSublists) { if (options.disableForced4SpacesIndentedSublists) {
rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm; rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm;
} }
@ -81,13 +82,25 @@ showdown.subParser('makehtml.lists', function (text, options, globals) {
return '¨A' + wm2; return '¨A' + wm2;
}); });
// SPECIAL CASE: an heading followed by a paragraph of text that is not separated by a double newline
// or/nor indented. ex:
//
// - # foo
// bar is great
//
// While this does now follow the spec per se, not allowing for this might cause confusion since
// header blocks don't need double newlines after
if (/^#+.+\n.+/.test(item)) {
item = item.replace(/^(#+.+)$/m, '$1\n');
}
// m1 - Leading line or // m1 - Leading line or
// Has a double return (multi paragraph) or // Has a double return (multi paragraph)
// Has sublist
if (m1 || (item.search(/\n{2,}/) > -1)) { if (m1 || (item.search(/\n{2,}/) > -1)) {
item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals); item = showdown.subParser('makehtml.githubCodeBlocks')(item, options, globals);
item = showdown.subParser('makehtml.blockGamut')(item, options, globals); item = showdown.subParser('makehtml.blockGamut')(item, options, globals);
} else { } else {
// Recursion for sub-lists: // Recursion for sub-lists:
item = showdown.subParser('makehtml.lists')(item, options, globals); item = showdown.subParser('makehtml.lists')(item, options, globals);
item = item.replace(/\n$/, ''); // chomp(item) item = item.replace(/\n$/, ''); // chomp(item)
@ -95,6 +108,7 @@ showdown.subParser('makehtml.lists', function (text, options, globals) {
// Colapse double linebreaks // Colapse double linebreaks
item = item.replace(/\n\n+/g, '\n\n'); item = item.replace(/\n\n+/g, '\n\n');
if (isParagraphed) { if (isParagraphed) {
item = showdown.subParser('makehtml.paragraphs')(item, options, globals); item = showdown.subParser('makehtml.paragraphs')(item, options, globals);
} else { } else {
@ -174,26 +188,25 @@ showdown.subParser('makehtml.lists', function (text, options, globals) {
return result; return result;
} }
/** Start of list parsing **/ // Start of list parsing
var subListRgx = /^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
var mainListRgx = /(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
text = globals.converter._dispatch('lists.before', text, options, globals).getText(); text = globals.converter._dispatch('lists.before', text, options, globals).getText();
// add sentinel to hack around khtml/safari bug: // add sentinel to hack around khtml/safari bug:
// http://bugs.webkit.org/show_bug.cgi?id=11231 // http://bugs.webkit.org/show_bug.cgi?id=11231
text += '¨0'; text += '¨0';
if (globals.gListLevel) { if (globals.gListLevel) {
text = text.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, text = text.replace(subListRgx, function (wholeMatch, list, m2) {
function (wholeMatch, list, m2) {
var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
return parseConsecutiveLists(list, listType, true); return parseConsecutiveLists(list, listType, true);
} });
);
} else { } else {
text = text.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, text = text.replace(mainListRgx, function (wholeMatch, m1, list, m3) {
function (wholeMatch, m1, list, m3) {
var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol'; var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
return parseConsecutiveLists(list, listType, false); return parseConsecutiveLists(list, listType, false);
} });
);
} }
// strip sentinel // strip sentinel

View File

@ -0,0 +1,12 @@
<ul>
<li>Increase the number of water changes.</li>
<li><h1 id="proteinskimmers">Protein skimmers:</h1>
<p>This remove dissolved</p></li>
<li><h1 id="chemicalfiltermedia">Chemical filter media:</h1>
<p>When placed in your filter</p></li>
<li>#</li>
<li>something</li>
<li>#
something</li>
<li># something</li>
</ul>

View File

@ -0,0 +1,10 @@
- Increase the number of water changes.
- # Protein skimmers:
This remove dissolved
- # Chemical filter media:
When placed in your filter
- #
- something
- #
something
- \# something