/* eslint-disable max-lines */ const _ = require('lodash'); const Markdown = require('marked'); const renderer = new Markdown.Renderer(); //Processes the markdown within an HTML block if it's just a class-wrapper renderer.html = function (html) { if(_.startsWith(_.trim(html), '')){ const openTag = html.substring(0, html.indexOf('>')+1); html = html.substring(html.indexOf('>')+1); html = html.substring(0, html.lastIndexOf('')); return `${openTag} ${Markdown(html)} `; } return html; }; // Don't wrap {{ Divs or {{ empty Spans in

tags renderer.paragraph = function(text){ let match; if(text.startsWith('${text}

\n`; }; // Mustache-style Divs {{class \n content ... \n}} let blockCount = 0; const blockRegex = /^ *{{(?:="[\w,\-. ]*"|[^"'\s])*$|^ *}}$/gm; const inlineFullRegex = /{{[^\n]*}}/g; const inlineRegex = /{{(?:="[\w,\-. ]*"|[^"'{}}\s])*\s*|}}/g; renderer.text = function(text){ const newText = text.replaceAll('"', '"'); let matches; if(matches = newText.match(inlineFullRegex)) { //SPAN - INLINE matches = newText.match(inlineRegex); let matchIndex = 0; const res = _.reduce(newText.split(inlineRegex), (r, splitText)=>{ if(splitText) r.push(Markdown.parseInline(splitText, { renderer: renderer })); const block = matches[matchIndex] ? matches[matchIndex].trimLeft() : ''; if(block && block.startsWith('{{')) { const values = processStyleTags(block.substring(2)); r.push(``); blockCount++; } else if(block == '}}' && blockCount !== 0){ r.push(''); blockCount--; } matchIndex++; return r; }, []).join(''); return res; } else { if(!matches) { return `${text}`; } } }; //Fix local links in the Preview iFrame to link inside the frame renderer.link = function (href, title, text) { let self = false; if(href[0] == '#') { self = true; } href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); if(href === null) { return text; } let out = `${text}`; return out; }; const nonWordAndColonTest = /[^\w:]/g; const cleanUrl = function (sanitize, base, href) { if(sanitize) { let prot; try { prot = decodeURIComponent(unescape(href)) .replace(nonWordAndColonTest, '') .toLowerCase(); } catch (e) { return null; } if(prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { return null; } } try { href = encodeURI(href).replace(/%25/g, '%'); } catch (e) { return null; } return href; }; const escapeTest = /[&<>"']/; const escapeReplace = /[&<>"']/g; const escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; const escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; const escapeReplacements = { '&' : '&', '<' : '<', '>' : '>', '"' : '"', '\'' : ''' }; const getEscapeReplacement = (ch)=>escapeReplacements[ch]; const escape = function (html, encode) { if(encode) { if(escapeTest.test(html)) { return html.replace(escapeReplace, getEscapeReplacement); } } else { if(escapeTestNoEncode.test(html)) { return html.replace(escapeReplaceNoEncode, getEscapeReplacement); } } return html; }; const sanatizeScriptTags = (content)=>{ return content .replace(/