5180 fichiers 38.5 Mo 0 téléchargements 398 vues mis à jour il y a 7 heures ui
nitro-v36-with-renderer-v36 / src / components / room / widgets / chat / highlightMentions.tsx
highlightMentions.tsx 1.9 Ko Télécharger le fichier
import { segmentMentionText } from '../../../../api/mentions/mentionSegments';
import { MENTION_ROOM_ALIASES } from '../../../../api/mentions/mentionTokens';

const TAG_CLASS = 'mention-tag';
const SELF_CLASS = 'mention-tag mention-tag--self';

const highlightTextChunk = (chunk: string, ownUsername: string, aliases: ReadonlyArray<string>): string => {
    if (chunk.indexOf('@') < 0) return chunk;

    return segmentMentionText(chunk, ownUsername, aliases)
        .map((segment) => (segment.kind ? `<span class="${segment.kind === 'self' ? SELF_CLASS : TAG_CLASS}">${segment.text}</span>` : segment.text))
        .join('');
};

/**
 * Wrap every @mention token in chat HTML with a `.mention-tag` span. Tokens
 * that target the viewer or a broadcast alias additionally get the
 * `.mention-tag--self` modifier so "I was mentioned" stands out. Walks around
 * formatter HTML (`<...>`) so tags inside markup are never touched.
 */
export const highlightMentions = (formattedHtml: string, ownUsername: string, aliases: ReadonlyArray<string> = MENTION_ROOM_ALIASES): string => {
    if (!formattedHtml || formattedHtml.indexOf('@') < 0) return formattedHtml;

    let result = '';
    let cursor = 0;

    while (cursor < formattedHtml.length) {
        const tagStart = formattedHtml.indexOf('<', cursor);

        if (tagStart < 0) {
            result += highlightTextChunk(formattedHtml.slice(cursor), ownUsername, aliases);
            break;
        }

        if (tagStart > cursor) {
            result += highlightTextChunk(formattedHtml.slice(cursor, tagStart), ownUsername, aliases);
        }

        const tagEnd = formattedHtml.indexOf('>', tagStart);

        if (tagEnd < 0) {
            result += formattedHtml.slice(tagStart);
            break;
        }

        result += formattedHtml.slice(tagStart, tagEnd + 1);
        cursor = tagEnd + 1;
    }

    return result;
};
15Sujets
1Dépôts
20Membres
3En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser