/** * Convert legacy mention shortcodes [@ id="UUID" label="LABEL"] to the * standard markdown link format [@LABEL](mention://member/UUID). * * These shortcodes exist in older database records from a previous mention * serialization format. This function normalises them so downstream parsers * (Tiptap @tiptap/markdown, react-markdown) only need to handle one syntax. */ export function preprocessMentionShortcodes(text: string): string { if (!text.includes("[@ ")) return text; return text.replace( /\[@\s+([^\]]*)\]/g, (match, attrString: string) => { const attrs: Record = {}; const re = /(\w+)="([^"]*)"/g; let m; while ((m = re.exec(attrString)) !== null) { if (m[1] && m[2] !== undefined) attrs[m[1]] = m[2]; } const { id, label } = attrs; if (!id || !label) return match; return `[@${label}](mention://member/${id})`; }, ); }