class RenderSymbols{ constructor(){ } renderAll(elem){ this.renderText(elem); this.renderCode(elem); this.renderMath(elem); elem.scrollIntoView({behavior: "smooth", block: "end"}); } renderMath(elem) { let content = elem.innerHTML; MathJax.typesetPromise([elem]) .then(() => { }) .catch((err) => { }); } renderText(elem){ elem.innerHTML = elem.innerHTML.replace(/<br\s*\/?>/g, '\n'); elem.innerHTML = elem.innerHTML.replace(/\#\#\#(.*?)\#\#\#/g, '<span class="heading">$1</span>'); elem.innerHTML = elem.innerHTML.replace(/\*\*\*(.*?)\*\*\*/g, '<span class="boldText">$1</span>'); elem.innerHTML = elem.innerHTML.replace(/\*\*(.*?)\*\*/g, '<span class="subHeading">$1</span>'); elem.innerHTML = elem.innerHTML.replace(/\n/g, '<br>'); } renderCode(element) { let content = element.innerHTML; if (content.includes("```") && content.split("```").length >= 3) { content = content.replace(/```(\w*)<br>([\s\S]*?)```/g, (match, language, code) => { code = code.replace(/<br>/g, '\n').trim(); language = language.trim() || 'text'; code = this.escapeHTML(code); return `<pre class="code-block"><code class="language-${language}">${code}</code></pre>`; }); element.innerHTML = content; element.querySelectorAll('code:not(.hljs)').forEach(block => { hljs.highlightElement(block); }); } } escapeHTML(str) { return str.replace(/[&<>"']/g, function (char) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', }; return map[char] || char; }); } } export default RenderSymbols