import type { SpaceEmoji } from '../api/client'; /** * Troca `:nome:` pela sintaxe de imagem do markdown, para o renderizador * existente desenhar o emoji próprio sem precisar de plugin. * * Trechos de código são preservados: `:nome:` dentro de crase é texto que a * pessoa quis mostrar literalmente, e virar imagem ali seria destruir o que ela * escreveu. */ export function renderCustomEmojis( content: string, lookup: (name: string) => SpaceEmoji | undefined, urlOf: (filename: string) => string, ): string { if (!content.includes(':')) return content; // Divide preservando blocos cercados (```) e código em linha (`) — // os delimitadores ficam nos pedaços ímpares e passam intactos. const parts = content.split(/(```[\s\S]*?```|`[^`]*`)/g); return parts .map((part, i) => { if (i % 2 === 1) return part; return part.replace(/:([a-z0-9_]{2,32}):/gi, (whole, name: string) => { const emoji = lookup(name.toLowerCase()); if (!emoji) return whole; // O alt conserva `:nome:` para que copiar a mensagem devolva o texto // original, e é por ele que o renderizador reconhece o emoji. return `![:${emoji.name}:](${urlOf(emoji.filename)})`; }); }) .join(''); } /** O renderizador usa isto para dar tamanho de emoji em vez de imagem normal. */ export function isCustomEmojiAlt(alt: string | undefined): boolean { return !!alt && /^:[a-z0-9_]{2,32}:$/i.test(alt); }