diff --git a/dist/showdown.js b/dist/showdown.js index 41e65c9..ea4f9cf 100644 Binary files a/dist/showdown.js and b/dist/showdown.js differ diff --git a/dist/showdown.js.map b/dist/showdown.js.map index 6b620cb..09ce77c 100644 Binary files a/dist/showdown.js.map and b/dist/showdown.js.map differ diff --git a/dist/showdown.min.js b/dist/showdown.min.js index 3bc7372..f92d370 100644 Binary files a/dist/showdown.min.js and b/dist/showdown.min.js differ diff --git a/dist/showdown.min.js.map b/dist/showdown.min.js.map index 87d561d..942e67a 100644 Binary files a/dist/showdown.min.js.map and b/dist/showdown.min.js.map differ diff --git a/src/helpers.js b/src/helpers.js index 91a5d8f..d0cdae0 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -273,6 +273,43 @@ showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right return finalStr; }; +/** + * Returns the index within the passed String object of the first occurrence of the specified regex, + * starting the search at fromIndex. Returns -1 if the value is not found. + * + * @param {string} str string to search + * @param {RegExp} regex Regular expression to search + * @param {int} [fromIndex = 0] Index to start the search + * @returns {Number} + * @throws InvalidArgumentError + */ +showdown.helper.regexIndexOf = function (str, regex, fromIndex) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + if (regex instanceof RegExp === false) { + throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp'; + } + var indexOf = str.substring(fromIndex || 0).search(regex); + return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf; +}; + +/** + * Splits the passed string object at the defined index, and returns an array composed of the two substrings + * @param {string} str string to split + * @param {int} index index to split string at + * @returns {[string,string]} + * @throws InvalidArgumentError + */ +showdown.helper.splitAtIndex = function (str, index) { + 'use strict'; + if (!showdown.helper.isString(str)) { + throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string'; + } + return [str.substring(0, index), str.substring(index)]; +}; + /** * Obfuscate an e-mail address through the use of Character Entities, * transforming ASCII characters into their equivalent decimal or hex entities. diff --git a/src/subParsers/hashHTMLBlocks.js b/src/subParsers/hashHTMLBlocks.js index e4dd470..ab7992f 100644 --- a/src/subParsers/hashHTMLBlocks.js +++ b/src/subParsers/hashHTMLBlocks.js @@ -49,9 +49,20 @@ showdown.subParser('hashHTMLBlocks', function (text, options, globals) { }; for (var i = 0; i < blockTags.length; ++i) { - text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<' + blockTags[i] + '\\b[^>]*>', '' + blockTags[i] + '>', 'gim'); - } + var opTagPos, + rgx1 = new RegExp('^ {0,3}<' + blockTags[i] + '\\b[^>]*>', 'im'), + patLeft = '<' + blockTags[i] + '\\b[^>]*>', + patRight = '' + blockTags[i] + '>'; + // 1. Look for the first position of the first opening HTML tag in the text + while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) { + //2. Split the text in that position + var subTexts = showdown.helper.splitAtIndex(text, opTagPos); + //3. Match recursively + subTexts[1] = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im'); + text = subTexts[0].concat(subTexts[1]); + } + } // HR SPECIAL CASE text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals)); diff --git a/test/issues/deeply-nested-HTML-blocks.html b/test/issues/deeply-nested-HTML-blocks.html new file mode 100644 index 0000000..433c466 --- /dev/null +++ b/test/issues/deeply-nested-HTML-blocks.html @@ -0,0 +1,12 @@ +
<div>**foobar**</div>
+
diff --git a/test/issues/one-line-HTML-input.md b/test/issues/one-line-HTML-input.md
new file mode 100644
index 0000000..9fc4eef
--- /dev/null
+++ b/test/issues/one-line-HTML-input.md
@@ -0,0 +1,3 @@
+