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]) => { if (!rule || !template || typeof template !== 'string') throw new Error('Rule or template is undefined or a regexp (how the actual)'); body = body.replace(rule, template); }); /* * Matches string in the format of: <@[cuid]> * for example: "<@clfhiwt920003fb4jd5dbo2sy>", "<@clfhiwiah0000fb4jenr3j6l1>", and "<@clfhizvyt000nfb4j16kjnell>" would all be matched */ const mentionRegex = /<@(([a-z]|[0-9]){25})>/g; const mentions = body.match(mentionRegex); 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) => { 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) + ';' ); }