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.
		
		
		
		
		
			
		
			
				
					
					
						
							42 lines
						
					
					
						
							1.1 KiB
						
					
					
				
			
		
		
	
	
							42 lines
						
					
					
						
							1.1 KiB
						
					
					
				import Inline from '../blots/inline'; | 
						|
 | 
						|
 | 
						|
class Link extends Inline { | 
						|
  static create(value) { | 
						|
    let node = super.create(value); | 
						|
    value = this.sanitize(value); | 
						|
    node.setAttribute('href', value); | 
						|
    node.setAttribute('rel', 'noopener noreferrer'); | 
						|
    node.setAttribute('target', '_blank'); | 
						|
    return node; | 
						|
  } | 
						|
 | 
						|
  static formats(domNode) { | 
						|
    return domNode.getAttribute('href'); | 
						|
  } | 
						|
 | 
						|
  static sanitize(url) { | 
						|
    return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL; | 
						|
  } | 
						|
 | 
						|
  format(name, value) { | 
						|
    if (name !== this.statics.blotName || !value) return super.format(name, value); | 
						|
    value = this.constructor.sanitize(value); | 
						|
    this.domNode.setAttribute('href', value); | 
						|
  } | 
						|
} | 
						|
Link.blotName = 'link'; | 
						|
Link.tagName = 'A'; | 
						|
Link.SANITIZED_URL = 'about:blank'; | 
						|
Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']; | 
						|
 | 
						|
 | 
						|
function sanitize(url, protocols) { | 
						|
  let anchor = document.createElement('a'); | 
						|
  anchor.href = url; | 
						|
  let protocol = anchor.href.slice(0, anchor.href.indexOf(':')); | 
						|
  return protocols.indexOf(protocol) > -1; | 
						|
} | 
						|
 | 
						|
 | 
						|
export { Link as default, sanitize };
 | 
						|
 |