Sort les tags @pseudo du texte des questions du Char en métadonnée
Build and deploy / deploy (push) Successful in 37s
Build and deploy / deploy (push) Successful in 37s
Le "@Priape" écrit en composant une question n'apparaît plus dans la phrase affichée — stripMentions() le retire du texte (nettoyage des espaces qu'il laisse) et le montre à part sous forme de badges (MentionTags, avatar + pseudo), un peu comme une réponse, à la fois dans la liste des Archontes et sur la question projetée sur /char. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -41,3 +41,35 @@ export function findMentionRanges(text: string, pseudos: string[]): MentionRange
|
||||
export function extractMentionedPseudos(text: string, pseudos: string[]): string[] {
|
||||
return findMentionRanges(text, pseudos).map((range) => range.pseudo);
|
||||
}
|
||||
|
||||
// Retire les "@Pseudo" du texte affiché (ils vivent à part, en métadonnée à
|
||||
// côté de la question — un peu comme une réponse — plutôt qu'au milieu de
|
||||
// la phrase) et renvoie les pseudos visés, dans leur ordre d'apparition et
|
||||
// sans doublon si une même personne est taguée plusieurs fois.
|
||||
export function stripMentions(text: string, pseudos: string[]): { cleanText: string; mentioned: string[] } {
|
||||
const ranges = findMentionRanges(text, pseudos);
|
||||
if (ranges.length === 0) return { cleanText: text, mentioned: [] };
|
||||
|
||||
let cleanText = "";
|
||||
let cursor = 0;
|
||||
const seen = new Set<string>();
|
||||
const mentioned: string[] = [];
|
||||
for (const range of ranges) {
|
||||
cleanText += text.slice(cursor, range.start);
|
||||
if (!seen.has(range.pseudo)) {
|
||||
seen.add(range.pseudo);
|
||||
mentioned.push(range.pseudo);
|
||||
}
|
||||
cursor = range.end;
|
||||
}
|
||||
cleanText += text.slice(cursor);
|
||||
|
||||
// Nettoie les espaces laissés par les mentions retirées (double espace
|
||||
// au milieu de la phrase, espace parasite avant une ponctuation, bords).
|
||||
cleanText = cleanText
|
||||
.replace(/[ \t]{2,}/g, " ")
|
||||
.replace(/\s+([,.!?;:])/g, "$1")
|
||||
.trim();
|
||||
|
||||
return { cleanText, mentioned };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user