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
		
	
| 
								 
											7 years ago
										 
									 | 
							
								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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |