You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			112 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
 | 
						|
import { MessageBody } from './conversation/MessageBody';
 | 
						|
import { Emojify } from './conversation/Emojify';
 | 
						|
import { AddNewLines } from './conversation/AddNewLines';
 | 
						|
 | 
						|
import { SizeClassType } from '../util/emoji';
 | 
						|
 | 
						|
import { LocalizerType, RenderTextCallbackType } from '../types/Util';
 | 
						|
 | 
						|
interface Props {
 | 
						|
  text: string;
 | 
						|
  i18n: LocalizerType;
 | 
						|
}
 | 
						|
 | 
						|
const renderNewLines: RenderTextCallbackType = ({ text, key }) => (
 | 
						|
  <AddNewLines key={key} text={text} />
 | 
						|
);
 | 
						|
 | 
						|
const renderEmoji = ({
 | 
						|
  i18n,
 | 
						|
  text,
 | 
						|
  key,
 | 
						|
  sizeClass,
 | 
						|
  renderNonEmoji,
 | 
						|
}: {
 | 
						|
  i18n: LocalizerType;
 | 
						|
  text: string;
 | 
						|
  key: number;
 | 
						|
  sizeClass?: SizeClassType;
 | 
						|
  renderNonEmoji: RenderTextCallbackType;
 | 
						|
}) => (
 | 
						|
  <Emojify
 | 
						|
    i18n={i18n}
 | 
						|
    key={key}
 | 
						|
    text={text}
 | 
						|
    sizeClass={sizeClass}
 | 
						|
    renderNonEmoji={renderNonEmoji}
 | 
						|
  />
 | 
						|
);
 | 
						|
 | 
						|
export class MessageBodyHighlight extends React.Component<Props> {
 | 
						|
  public render() {
 | 
						|
    const { text, i18n } = this.props;
 | 
						|
    const results: Array<any> = [];
 | 
						|
    const FIND_BEGIN_END = /<<left>>(.+?)<<right>>/g;
 | 
						|
 | 
						|
    let match = FIND_BEGIN_END.exec(text);
 | 
						|
    let last = 0;
 | 
						|
    let count = 1;
 | 
						|
 | 
						|
    if (!match) {
 | 
						|
      return (
 | 
						|
        <MessageBody
 | 
						|
          disableJumbomoji={true}
 | 
						|
          disableLinks={true}
 | 
						|
          text={text}
 | 
						|
          i18n={i18n}
 | 
						|
        />
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    const sizeClass = '';
 | 
						|
 | 
						|
    while (match) {
 | 
						|
      if (last < match.index) {
 | 
						|
        const beforeText = text.slice(last, match.index);
 | 
						|
        results.push(
 | 
						|
          renderEmoji({
 | 
						|
            text: beforeText,
 | 
						|
            sizeClass,
 | 
						|
            key: count++,
 | 
						|
            i18n,
 | 
						|
            renderNonEmoji: renderNewLines,
 | 
						|
          })
 | 
						|
        );
 | 
						|
      }
 | 
						|
 | 
						|
      const [, toHighlight] = match;
 | 
						|
      results.push(
 | 
						|
        <span className="module-message-body__highlight" key={count++}>
 | 
						|
          {renderEmoji({
 | 
						|
            text: toHighlight,
 | 
						|
            sizeClass,
 | 
						|
            key: count++,
 | 
						|
            i18n,
 | 
						|
            renderNonEmoji: renderNewLines,
 | 
						|
          })}
 | 
						|
        </span>
 | 
						|
      );
 | 
						|
 | 
						|
      // @ts-ignore
 | 
						|
      last = FIND_BEGIN_END.lastIndex;
 | 
						|
      match = FIND_BEGIN_END.exec(text);
 | 
						|
    }
 | 
						|
 | 
						|
    if (last < text.length) {
 | 
						|
      results.push(
 | 
						|
        renderEmoji({
 | 
						|
          text: text.slice(last),
 | 
						|
          sizeClass,
 | 
						|
          key: count++,
 | 
						|
          i18n,
 | 
						|
          renderNonEmoji: renderNewLines,
 | 
						|
        })
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    return results;
 | 
						|
  }
 | 
						|
}
 |