(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();
})();