Add <svg> to list of Showdown block tags (#4998) Fixes #4898

f79ee5a1b18ebadc4f3afb524b4f0a0cced27448

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
1 files changed, +102 -0Ignore whitespace
public/scripts/util/showdown-patch.js+102 -0
@@ -27,4 +27,106 @@ export function addShowdownPatch(showdown) {
2727 text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals);
2828 return text;
2929 });
30+
31+ showdown.subParser('hashHTMLBlocks', function (text, options, globals) {
32+ 'use strict';
33+ text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals);
34+
35+ var blockTags = [
36+ 'pre',
37+ 'div',
38+ 'h1',
39+ 'h2',
40+ 'h3',
41+ 'h4',
42+ 'h5',
43+ 'h6',
44+ 'blockquote',
45+ 'table',
46+ 'dl',
47+ 'ol',
48+ 'ul',
49+ 'script',
50+ 'noscript',
51+ 'form',
52+ 'fieldset',
53+ 'iframe',
54+ 'math',
55+ 'style',
56+ 'section',
57+ 'header',
58+ 'footer',
59+ 'nav',
60+ 'article',
61+ 'aside',
62+ 'address',
63+ 'audio',
64+ 'canvas',
65+ 'figure',
66+ 'hgroup',
67+ 'output',
68+ 'video',
69+ 'details',
70+ 'p',
71+ // New additions
72+ 'svg',
73+ ],
74+ repFunc = function (wholeMatch, match, left, right) {
75+ var txt = wholeMatch;
76+ // check if this html element is marked as markdown
77+ // if so, it's contents should be parsed as markdown
78+ if (left.search(/\bmarkdown\b/) !== -1) {
79+ txt = left + globals.converter.makeHtml(match) + right;
80+ }
81+ return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
82+ };
83+
84+ if (options.backslashEscapesHTMLTags) {
85+ // encode backslash escaped HTML tags
86+ text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) {
87+ return '&lt;' + inside + '&gt;';
88+ });
89+ }
90+
91+ // hash HTML Blocks
92+ for (var i = 0; i < blockTags.length; ++i) {
93+
94+ var opTagPos,
95+ rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'),
96+ patLeft = '<' + blockTags[i] + '\\b[^>]*>',
97+ patRight = '</' + blockTags[i] + '>';
98+ // 1. Look for the first position of the first opening HTML tag in the text
99+ while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {
100+
101+ // if the HTML tag is \ escaped, we need to escape it and break
102+
103+
104+ //2. Split the text in that position
105+ var subTexts = showdown.helper.splitAtIndex(text, opTagPos),
106+ //3. Match recursively
107+ newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');
108+
109+ // prevent an infinite loop
110+ if (newSubText1 === subTexts[1]) {
111+ break;
112+ }
113+ text = subTexts[0].concat(newSubText1);
114+ }
115+ }
116+ // HR SPECIAL CASE
117+ text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,
118+ showdown.subParser('hashElement')(text, options, globals));
119+
120+ // Special case for standalone HTML comments
121+ text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {
122+ return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
123+ }, '^ {0,3}<!--', '-->', 'gm');
124+
125+ // PHP and ASP-style processor instructions (<?...?> and <%...%>)
126+ text = text.replace(/\n\n( {0,3}<([?%])[^\r]*?\2>[ \t]*(?=\n{2,}))/g,
127+ showdown.subParser('hashElement')(text, options, globals));
128+
129+ text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals);
130+ return text;
131+ });
30132}