|  |  |  |  | // Fork of https://github.com/uiureo/link-text with HTML escaping disabled as we leverage
 | 
					
						
							|  |  |  |  | // jQuery’s escaping mechanism:
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const linkify = require('linkify-it')(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | function createLink(url, text, attrs = {}) { | 
					
						
							|  |  |  |  |   const html = []; | 
					
						
							|  |  |  |  |   html.push('<a '); | 
					
						
							|  |  |  |  |   html.push(`href="${url}"`); | 
					
						
							|  |  |  |  |   Object.keys(attrs).forEach(key => { | 
					
						
							|  |  |  |  |     html.push(` ${key}="${attrs[key]}"`); | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   html.push('>'); | 
					
						
							|  |  |  |  |   html.push(decodeURIComponent(text)); | 
					
						
							|  |  |  |  |   html.push('</a>'); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   return html.join(''); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | module.exports = (text, attrs = {}) => { | 
					
						
							|  |  |  |  |   const matchData = linkify.match(text) || []; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   const result = []; | 
					
						
							|  |  |  |  |   let last = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   matchData.forEach(match => { | 
					
						
							|  |  |  |  |     if (last < match.index) { | 
					
						
							|  |  |  |  |       result.push(text.slice(last, match.index)); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     result.push(createLink(match.url, match.text, attrs)); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     last = match.lastIndex; | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   result.push(text.slice(last)); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   return result.join(''); | 
					
						
							|  |  |  |  | }; |