import { Random } from 'meteor/random'; import _ from 'underscore'; import _marked from 'marked'; import createDOMPurify from 'dompurify'; import { unescapeHTML, escapeHTML } from '@rocket.chat/string-helpers'; import hljs, { register } from '../../hljs'; import { getGlobalWindow } from '../../getGlobalWindow'; const renderer = new _marked.Renderer(); let msg = null; renderer.code = function (code, lang, escaped) { if (this.options.highlight) { const out = this.options.highlight(code, lang); if (out != null && out !== code) { escaped = true; code = out; } } let text = null; if (!lang) { text = `
${escaped ? code : escapeHTML(code)}
`; } else { text = `
${escaped ? code : escapeHTML(code)}
`; } if (_.isString(msg)) { return text; } const token = `=!=${Random.id()}=!=`; msg.tokens.push({ highlight: true, token, text, }); return token; }; renderer.codespan = function (text) { text = `${text}`; if (_.isString(msg)) { return text; } const token = `=!=${Random.id()}=!=`; msg.tokens.push({ token, text, }); return token; }; renderer.blockquote = function (quote) { return `
${quote}
`; }; const linkRenderer = renderer.link; renderer.link = function (href, title, text) { const html = linkRenderer.call(renderer, href, title, text); return html.replace(/^ { msg = message; if (!message.tokens) { message.tokens = []; } message.html = _marked(unescapeHTML(message.html), { gfm, tables, breaks, pedantic, smartLists, smartypants, renderer, highlight, }); const window = getGlobalWindow(); const DomPurify = createDOMPurify(window); message.html = DomPurify.sanitize(message.html, { ADD_ATTR: ['target'] }); return message; };