Patch showdown for span nesting limit Closes #2722 #2714

3da79ebcff065eccc3ccc10cb9e447762268cf33

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

2 files changed, +25 -0Ignore whitespace
public/index.html+1 -0
@@ -6540,6 +6540,7 @@
65406540 <script src="lib/jquery-cookie-1.4.1.min.js"></script>
65416541 <script src="lib/jquery.ui.touch-punch.min.js"></script>
65426542 <script src="lib/showdown.min.js"></script>
6543+ <script src="lib/showdown-patch.js"></script>
65436544 <script src="lib/showdown-katex.min.js"></script>
65446545 <script src="lib/popper.js"></script>
65456546 <script src="lib/purify.min.js"></script>
public/lib/showdown-patch.js+24 -0
@@ -0,0 +1,24 @@
1+showdown.subParser('makehtml.unhashHTMLSpans', function (text, options, globals) {
2+ 'use strict';
3+ text = globals.converter._dispatch('makehtml.unhashHTMLSpans.before', text, options, globals).getText();
4+
5+ for (var i = 0; i < globals.gHtmlSpans.length; ++i) {
6+ var repText = globals.gHtmlSpans[i],
7+ // limiter to prevent infinite loop (assume 10 as limit for recurse)
8+ limit = 0;
9+
10+ while (/¨C(\d+)C/.test(repText)) {
11+ var num = RegExp.$1;
12+ repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);
13+ if (limit === 10000) {
14+ console.error('maximum nesting of 10000 spans reached!!!');
15+ break;
16+ }
17+ ++limit;
18+ }
19+ text = text.replace('¨C' + i + 'C', repText);
20+ }
21+
22+ text = globals.converter._dispatch('makehtml.unhashHTMLSpans.after', text, options, globals).getText();
23+ return text;
24+});