import { IChannel } from "~/types"; export default function parseBody(body: string, activeChannel: IChannel) { if (!activeChannel.id) throw new Error("No active channel") body = escape(body); const rules = [ //bold, italics and paragragh rules [/\*\*\s?([^\n]+)\*\*/g, "$1"], [/\*\s?([^\n]+)\*/g, "$1"], [/\_\_\s?([^\n]+)\_\_/g, "$1"], [/\~\~\s?([^\n]+)\~\~/g, "$1"], // code lines and blocks [/```(.+?)```/g, "
$1
"], [/(?$1"], ]; rules.forEach(([rule, template]) => { body = body.replace(rule, template); }) const mentions = body.match(/<@([a-z]|[0-9]){25}>/g); if (mentions) { const participants = (activeChannel.DM) ? activeChannel.dmParticipants : activeChannel.server.participants; if (!participants) throw new Error(`participants in channel "${activeChannel.id}" not found"`) mentions.forEach((e: string) => { if (!e) return const id = e.split('<@')[1]?.split('>')[0]; if (!id) return; const user = participants.find((e) => e.id === id) if (!user) return; body = body.split(e).join(`@${user.username}`) }); } return body } function escape(s: string) { return s.replace( /[^0-9A-Za-z ]/g, c => "&#" + c.charCodeAt(0) + ";" ); }