You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					101 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					101 lines
				
				2.5 KiB
			| 
											3 years ago
										 | import { Options, tokenize } from 'linkifyjs'; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Convert strings of text into linkable HTML text | ||
|  | */ | ||
|  | 
 | ||
|  | function escapeText(text) { | ||
|  |   return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); | ||
|  | } | ||
|  | 
 | ||
|  | function escapeAttr(href) { | ||
|  |   return href.replace(/"/g, '"'); | ||
|  | } | ||
|  | 
 | ||
|  | function attributesToString(attributes) { | ||
|  |   if (!attributes) { | ||
|  |     return ''; | ||
|  |   } | ||
|  | 
 | ||
|  |   var result = []; | ||
|  | 
 | ||
|  |   for (var attr in attributes) { | ||
|  |     var val = attributes[attr] + ''; | ||
|  |     result.push("".concat(attr, "=\"").concat(escapeAttr(val), "\"")); | ||
|  |   } | ||
|  | 
 | ||
|  |   return result.join(' '); | ||
|  | } | ||
|  | /** | ||
|  |  * Convert a plan text string to an HTML string with links. Expects that the | ||
|  |  * given strings does not contain any HTML entities. Use the linkify-html | ||
|  |  * interface if you need to parse HTML entities. | ||
|  |  * | ||
|  |  * @param {string} str string to linkify | ||
|  |  * @param {object} [opts] overridable options | ||
|  |  * @returns {string} | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | function linkifyStr(str) { | ||
|  |   var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
|  |   opts = new Options(opts); | ||
|  |   var tokens = tokenize(str); | ||
|  |   var result = []; | ||
|  | 
 | ||
|  |   for (var i = 0; i < tokens.length; i++) { | ||
|  |     var token = tokens[i]; | ||
|  | 
 | ||
|  |     if (token.t === 'nl' && opts.nl2br) { | ||
|  |       result.push('<br>\n'); | ||
|  |       continue; | ||
|  |     } else if (!token.isLink || !opts.check(token)) { | ||
|  |       result.push(escapeText(token.toString())); | ||
|  |       continue; | ||
|  |     } | ||
|  | 
 | ||
|  |     var _opts$resolve = opts.resolve(token), | ||
|  |         formatted = _opts$resolve.formatted, | ||
|  |         formattedHref = _opts$resolve.formattedHref, | ||
|  |         tagName = _opts$resolve.tagName, | ||
|  |         className = _opts$resolve.className, | ||
|  |         target = _opts$resolve.target, | ||
|  |         rel = _opts$resolve.rel, | ||
|  |         attributes = _opts$resolve.attributes; | ||
|  | 
 | ||
|  |     var link = ["<".concat(tagName, " href=\"").concat(escapeAttr(formattedHref), "\"")]; | ||
|  | 
 | ||
|  |     if (className) { | ||
|  |       link.push(" class=\"".concat(escapeAttr(className), "\"")); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (target) { | ||
|  |       link.push(" target=\"".concat(escapeAttr(target), "\"")); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (rel) { | ||
|  |       link.push(" rel=\"".concat(escapeAttr(rel), "\"")); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (attributes) { | ||
|  |       link.push(" ".concat(attributesToString(attributes))); | ||
|  |     } | ||
|  | 
 | ||
|  |     link.push(">".concat(escapeText(formatted), "</").concat(tagName, ">")); | ||
|  |     result.push(link.join('')); | ||
|  |   } | ||
|  | 
 | ||
|  |   return result.join(''); | ||
|  | } | ||
|  | 
 | ||
|  | if (!String.prototype.linkify) { | ||
|  |   Object.defineProperty(String.prototype, 'linkify', { | ||
|  |     writable: false, | ||
|  |     value: function linkify(options) { | ||
|  |       return linkifyStr(this, options); | ||
|  |     } | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | export { linkifyStr as default }; |