(function () { 'use strict'; const textarea = document.querySelector('#body'); if (!textarea) return; const previewBox = document.createElement('div'); previewBox.id = 'live-preview'; previewBox.style.border = '1px solid #999'; previewBox.style.padding = '6px'; previewBox.style.marginTop = '6px'; previewBox.style.background = '#f8f8f8'; previewBox.style.maxHeight = '200px'; previewBox.style.overflowY = 'auto'; previewBox.innerHTML = 'Live preview…'; textarea.parentNode.insertBefore(previewBox, textarea.nextSibling); const soyMojiCodes = [ 'a24', 'ack', 'amerimutt', 'army', 'army2', 'baby', 'babyjak', 'bernd', 'chud', 'coal', 'cob', 'colorjak', 'cry', 'dancingswede', 'doctos', 'euromutt', 'fact', 'feral_animated', 'feralrage', 'gem', 'gigachad', 'impish', 'jacobson', 'jew', 'jig', 'med', 'microjaklover', 'neutralplier', 'nojak', 'over', 'itsover', 'pepe', 'pepetux', 'pepetwerk', 'perrojak', 'posteditagain', 'sisa', 'slf', 'selfish', 'smug', 'smugsoyak', 'soot', 'soyak', 'soyberg', 'soytan', 'sprokejak', 'squirrel', 'squirreljak', 'swede', 'though', 'transheart', 'trio', 'trvke', 'wew', 'wholesome', 'wholesomegem', 'wholesomeheart' ]; function applyFormatting(text) { const temp = document.createElement('div'); const lines = text.split('\n'); for (let i = 0; i < lines.length; i++) { let line = lines[i]; let span = document.createElement('span'); let arrowPrefix = ''; if (line.startsWith('>')) { arrowPrefix = '>'; line = line.substring(1); span.style.color = '#789922'; // Green } else if (line.startsWith('<')) { arrowPrefix = '<'; line = line.substring(1); span.style.color = '#F6750B'; // Orange } else if (line.startsWith('^')) { arrowPrefix = '^'; line = line.substring(1); span.style.color = '#6577E6'; // Light blue } line = line.replace(/~-~(.*?)~-~/g, function(match, p1) { let inner = p1; inner = inner.replace(/==([^=]+)==/g, '$1'); inner = inner.replace(/--([^-]+)--/g, '$1'); inner = inner.replace(/-=([^-]+)-=/g, '$1'); inner = inner.replace(/%%(.*?)%%/g, '$1'); inner = inner.replace(/::(.*?)::/g, '$1'); inner = inner.replace(/!!(.*?)!!/g, '$1'); inner = inner.replace(/;;(.*?);;/g, '$1'); return `${inner}`; }); line = line.replace(/==([^=]+)==/g, '$1'); line = line.replace(/--([^-]+)--/g, '$1'); line = line.replace(/-=([^-]+)-=/g, '$1'); line = line.replace(/==\+=(.+?)=\+==/g, '$1'); line = line.replace(/--\+=(.+?)=\+--/g, '$1'); line = line.replace(/-=\+=(.+?)=\+-=/g, '$1'); line = line.replace(/\+=([^+]+)=\+/g, '$1'); line = line.replace(/\(\(\(([^)]+)\)\)\)/g, '((($1)))'); line = line.replace(/-~-([^-]+)-~-/g, '$1'); line = line.replace(/%%([^%]+)%%/g, '$1'); line = line.replace(/::([^:]+)::/g, '$1'); line = line.replace(/!!([^!]+)!!/g, '$1'); line = line.replace(/;;([^;]+);;/g, '$1'); line = line.replace(/'''([^']+)'''/g, '$1'); line = line.replace(/''([^']+)''/g, '$1'); line = line.replace(/~~([^~]+)~~/g, '$1'); line = line.replace(/\*\*([^*]+)\*\*/g, '$1'); line = line.replace(/__([^_]+)__/g, '$1'); line = line.replace(/```([^`]+)```/g, '$1'); line = line.replace(/\[([^\]]+)\]/g, function(match, p1) { return soyMojiCodes.includes(p1.toLowerCase()) ? `[${p1}]` : `[${p1}]`; }); if (arrowPrefix) { const arrowSpan = document.createElement('span'); arrowSpan.textContent = arrowPrefix; arrowSpan.style.color = span.style.color; temp.appendChild(arrowSpan); } span.innerHTML = line || ' '; temp.appendChild(span); if (i < lines.length - 1) temp.appendChild(document.createElement('br')); } return temp.innerHTML; } function renderPreview() { const text = textarea.value; previewBox.innerHTML = text ? applyFormatting(text) : 'Live preview…'; } textarea.addEventListener('input', renderPreview); renderPreview(); })();