fix: use delimited format for mention highlighting

This commit is contained in:
CREDO23 2026-01-16 20:10:09 +02:00
parent 80e19a52cb
commit 985f50b683
2 changed files with 9 additions and 5 deletions

View file

@ -38,14 +38,16 @@ def parse_mentions(content: str) -> list[UUID]:
def render_mentions(content: str, user_names: dict[UUID, str]) -> str: def render_mentions(content: str, user_names: dict[UUID, str]) -> str:
""" """
Replace @[uuid] mentions with @DisplayName in content. Replace @[uuid] mentions with @{DisplayName} in content.
Uses curly braces as delimiters for unambiguous frontend parsing.
Args: Args:
content: Comment text with @[uuid] mentions content: Comment text with @[uuid] mentions
user_names: Dict mapping user UUIDs to display names user_names: Dict mapping user UUIDs to display names
Returns: Returns:
Content with mentions rendered as @DisplayName Content with mentions rendered as @{DisplayName}
""" """
def replace_mention(match: re.Match) -> str: def replace_mention(match: re.Match) -> str:
@ -53,7 +55,7 @@ def render_mentions(content: str, user_names: dict[UUID, str]) -> str:
uuid = UUID(match.group(1)) uuid = UUID(match.group(1))
name = user_names.get(uuid) name = user_names.get(uuid)
if name: if name:
return f"@{name}" return f"@{{{name}}}"
# Keep original format if user not found # Keep original format if user not found
return match.group(0) return match.group(0)
except ValueError: except ValueError:

View file

@ -68,7 +68,8 @@ function formatTimestamp(dateString: string): string {
} }
function renderMentions(content: string): React.ReactNode { function renderMentions(content: string): React.ReactNode {
const mentionPattern = /@(\w+(?:\s+\w+)*)/g; // Match @{DisplayName} format from backend
const mentionPattern = /@\{([^}]+)\}/g;
const parts: React.ReactNode[] = []; const parts: React.ReactNode[] = [];
let lastIndex = 0; let lastIndex = 0;
let match: RegExpExecArray | null; let match: RegExpExecArray | null;
@ -78,9 +79,10 @@ function renderMentions(content: string): React.ReactNode {
parts.push(content.slice(lastIndex, match.index)); parts.push(content.slice(lastIndex, match.index));
} }
// Display as @DisplayName (without curly braces)
parts.push( parts.push(
<span key={match.index} className="rounded bg-primary/10 px-1 font-medium text-primary"> <span key={match.index} className="rounded bg-primary/10 px-1 font-medium text-primary">
{match[0]} @{match[1]}
</span> </span>
); );