     
     if let linkResult = linkResult(with: touches) {
       selectedLinkResult = linkResult
-      didTouch(TouchResult(linkResult: linkResult, touches: touches, event: event, state: .began))
+      let touchResult = TouchResult(linkResult: linkResult, touches: touches, event: event, state: .began)
+      if let delegate = delegate {
+        delegate.contextLabel(self, didTouchWithTouchResult: touchResult)
+      } else {
+        didTouch(touchResult)
+      }
     } else {
       selectedLinkResult = nil
-      didTouch(TouchResult(linkResult: nil, touches: touches, event: event, state: .began))
+      let touchResult = TouchResult(linkResult: nil, touches: touches, event: event, state: .began)
+      if let delegate = delegate {
+        delegate.contextLabel(self, didTouchWithTouchResult: touchResult)
+      } else {
+        didTouch(touchResult)
+      }
     }
     
     addLinkAttributesToLinkResult(withTouches: touches, highlighted: true)

    addLinkAttributesToLinkResult(withTouches: touches, highlighted: false)
    
    if let selectedLinkResult = selectedLinkResult {
      didTouch(TouchResult(linkResult: selectedLinkResult, touches: touches, event: event, state: .ended))
      selectedLinkResult.textLink?.action()
    } else {
      didTouch(TouchResult(linkResult: nil, touches: touches, event: event, state: .ended))
    }
    
    selectedLinkResult = nil

    if let text = text {
      let mutableAttributedString = NSMutableAttributedString(string: text, attributes: attributesFromProperties())
      
      textAttachments.forEach { [weak self] (textAttachment) in
        guard let _self = self else {
          return
        }
        
        var prefix = _self.textAttachmentPrefix(textAttachment)
        if let delegate = self?.delegate {
          prefix = delegate.contextLabel(_self, prefixForTextAttachment: textAttachment)
        }
        
        var suffix = _self.textAttachmentSuffix(textAttachment)
        if let delegate = self?.delegate {
          suffix = delegate.contextLabel(_self, suffixForTextAttachment: textAttachment)
        }
        
        var _attributes = attributesFromProperties()
        if let delegate = self?.delegate {
          _attributes[.foregroundColor] = delegate.contextLabel(_self, colorForTextAttachment: textAttachment)
        } else {
          _attributes[.foregroundColor] = _self.textAttachmentColor(textAttachment)
        }
        
        let _mutableAttributedString = NSMutableAttributedString(string: prefix, attributes: _attributes)
        _mutableAttributedString.append(NSAttributedString(attachment: textAttachment))
        _mutableAttributedString.append(NSAttributedString(string: suffix, attributes: _attributes))
        
        mutableAttributedString.append(_mutableAttributedString)
      }
      
      let _linkResults = linkResults(in: mutableAttributedString)
      var attributedString = addLinkAttributesTo(mutableAttributedString, with: _linkResults)
      
      if let delegate = delegate {
        attributedString = delegate.contextLabel(self, modifiedAttributedString: attributedString)
      } else if let modifiedAttributedString = modifiedAttributedString?(attributedString) {
        attributedString = modifiedAttributedString
      }
      
