// Copyright 2019-2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React from 'react'; import { MessageBody } from './conversation/MessageBody'; import { Emojify } from './conversation/Emojify'; import { AddNewLines } from './conversation/AddNewLines'; import { SizeClassType } from './emoji/lib'; import { LocalizerType, RenderTextCallbackType } from '../types/Util'; export type Props = { text: string; i18n: LocalizerType; }; const renderNewLines: RenderTextCallbackType = ({ text, key }) => ( ); const renderEmoji = ({ text, key, sizeClass, renderNonEmoji, }: { i18n: LocalizerType; text: string; key: number; sizeClass?: SizeClassType; renderNonEmoji: RenderTextCallbackType; }) => ( ); export class MessageBodyHighlight extends React.Component { public render(): JSX.Element | Array { const { text, i18n } = this.props; const results: Array = []; const FIND_BEGIN_END = /<>(.+?)<>/g; let match = FIND_BEGIN_END.exec(text); let last = 0; let count = 1; if (!match) { return ( ); } const sizeClass = ''; while (match) { if (last < match.index) { const beforeText = text.slice(last, match.index); count += 1; results.push( renderEmoji({ text: beforeText, sizeClass, key: count, i18n, renderNonEmoji: renderNewLines, }) ); } const [, toHighlight] = match; count += 2; results.push( {renderEmoji({ text: toHighlight, sizeClass, key: count, i18n, renderNonEmoji: renderNewLines, })} ); last = FIND_BEGIN_END.lastIndex; match = FIND_BEGIN_END.exec(text); } if (last < text.length) { count += 1; results.push( renderEmoji({ text: text.slice(last), sizeClass, key: count, i18n, renderNonEmoji: renderNewLines, }) ); } return results; } }