37 lines
1008 B
TypeScript
37 lines
1008 B
TypeScript
export interface CommentMentionMember {
|
|
id: string;
|
|
name: string;
|
|
}
|
|
|
|
export interface MergeMentionMemberIdsInput {
|
|
content: string;
|
|
explicitMemberIds: string[];
|
|
members: CommentMentionMember[];
|
|
}
|
|
|
|
export function extractMentionNames(content: string): string[] {
|
|
const names: string[] = [];
|
|
const pattern = /@([\p{L}\p{N}_\-.]+)/gu;
|
|
for (const match of content.matchAll(pattern)) {
|
|
if (match[1]) names.push(match[1]);
|
|
}
|
|
return names;
|
|
}
|
|
|
|
export function mergeMentionMemberIds(input: MergeMentionMemberIdsInput): string[] {
|
|
const ids = new Set<string>();
|
|
const names = new Set(extractMentionNames(input.content).map(normalizeName));
|
|
for (const member of input.members) {
|
|
if (names.has(normalizeName(member.name))) ids.add(member.id);
|
|
}
|
|
for (const id of input.explicitMemberIds) {
|
|
const normalized = id.trim();
|
|
if (normalized) ids.add(normalized);
|
|
}
|
|
return Array.from(ids);
|
|
}
|
|
|
|
function normalizeName(name: string): string {
|
|
return name.trim().toLowerCase();
|
|
}
|