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