(function exposeChatFormat(root) { function escapeChatHtml(value) { return String(value ?? '') .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function formatChatText(value) { return escapeChatHtml(value) .replace(/\*\*([^*\n]+)\*\*/g, '$1') .replace(/\*([^*\n]+)\*/g, '$1'); } function tokenizeChatText(value) { const text = String(value ?? ''); const tokens = []; const pattern = /\*\*([^*\n]+)\*\*|\*([^*\n]+)\*/g; let cursor = 0; let match; while ((match = pattern.exec(text)) !== null) { if (match.index > cursor) tokens.push({ type: 'text', text: text.slice(cursor, match.index) }); tokens.push({ type: match[1] !== undefined ? 'strong' : 'em', text: match[1] ?? match[2] }); cursor = pattern.lastIndex; } if (cursor < text.length) tokens.push({ type: 'text', text: text.slice(cursor) }); return tokens; } root.KoalaSyncChatFormat = Object.freeze({ escapeChatHtml, formatChatText, tokenizeChatText }); })(globalThis);