Skip to content

Commit 5a5aff6

Browse files
committed
feat(backslashEscapesHTMLTags): backslash escapes HTML tags
Add support for HTML tag escaping with backslash Closes #374
1 parent 4109aae commit 5a5aff6

File tree

10 files changed

+48
-8
lines changed

10 files changed

+48
-8
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ var defaultOptions = showdown.getDefaultOptions();
198198
199199
* **noHeaderId**: (boolean) [default false] Disable the automatic generation of header ids. Setting to true overrides **prefixHeaderId**
200200
201-
* **customizedHeaderId**: (boolean) [default false] Use text in curly braces as header id.
201+
* **customizedHeaderId**: (boolean) [default false] Use text in curly braces as header id. (since v1.7.0)
202202
Example:
203203
```
204204
## Sample header {real-id} will use real-id as id
@@ -328,7 +328,9 @@ var defaultOptions = showdown.getDefaultOptions();
328328
329329
NOTE: Prior to version 1.6.1, emails would always be obfuscated through dec and hex encoding.
330330
331-
* **openLinksInNewWindow**: (boolean) [default false] Open all links in new windows (by adding the attribute `target="_blank"` to `<a>` tags)
331+
* **openLinksInNewWindow**: (boolean) [default false] Open all links in new windows (by adding the attribute `target="_blank"` to `<a>` tags) (since v1.7.0)
332+
333+
* **backslashEscapesHTMLTags**: (boolean) [default false] Support for HTML Tag escaping. ex: `\<div>foo\</div>` (since v1.7.2)
332334
333335
**NOTE**: Please note that until version 1.6.0, all of these options are ***DISABLED*** by default in the cli tool.
334336

dist/showdown.js

Lines changed: 18 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/showdown.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/showdown.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/showdown.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/options.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ function getDefaultOpts (simple) {
125125
defaultValue: false,
126126
description: 'Open all links in new windows',
127127
type: 'boolean'
128+
},
129+
backslashEscapesHTMLTags: {
130+
defaultValue: false,
131+
description: 'Support for HTML Tag escaping. ex: \<div>foo\</div>',
132+
type: 'boolean'
128133
}
129134
};
130135
if (simple === false) {

src/subParsers/hashHTMLBlocks.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,26 @@ showdown.subParser('hashHTMLBlocks', function (text, options, globals) {
4848
return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
4949
};
5050

51+
if (options.backslashEscapesHTMLTags) {
52+
// encode backslash escaped HTML tags
53+
text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) {
54+
return '&lt;' + inside + '&gt;';
55+
});
56+
}
57+
58+
// hash HTML Blocks
5159
for (var i = 0; i < blockTags.length; ++i) {
5260

5361
var opTagPos,
54-
rgx1 = new RegExp('^ {0,3}<' + blockTags[i] + '\\b[^>]*>', 'im'),
62+
rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'),
5563
patLeft = '<' + blockTags[i] + '\\b[^>]*>',
5664
patRight = '</' + blockTags[i] + '>';
5765
// 1. Look for the first position of the first opening HTML tag in the text
5866
while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {
67+
68+
// if the HTML tag is \ escaped, we need to escape it and break
69+
70+
5971
//2. Split the text in that position
6072
var subTexts = showdown.helper.splitAtIndex(text, opTagPos),
6173
//3. Match recursively
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<p>&lt;div&gt;foo&lt;/div&gt;</p>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
\<div>foo\</div>

test/node/testsuite.features.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ describe('makeHtml() features testsuite', function () {
8080
converter = new showdown.Converter({customizedHeaderId: true});
8181
} else if (testsuite[i].name === '#378.simplifiedAutoLinks-with-excludeTrailingPunctuationFromURLs') {
8282
converter = new showdown.Converter({simplifiedAutoLink: true, excludeTrailingPunctuationFromURLs: true});
83+
} else if (testsuite[i].name === '#374.escape-html-tags') {
84+
converter = new showdown.Converter({backslashEscapesHTMLTags: true});
8385
} else if (testsuite[i].name === '#379.openLinksInNewWindow-breaks-em-markdup') {
8486
converter = new showdown.Converter({openLinksInNewWindow: true});
8587
} else {

0 commit comments

Comments
 (0)