You are here

public static function MimeMailFormatHelper::mimeMailUrl in Mime Mail 8

Helper function to format URLs.

Parameters

string $url: The file path.

bool $to_embed: (optional) Whether the URL is used to embed the file. Defaults to FALSE.

Return value

string A processed URL.

4 calls to MimeMailFormatHelper::mimeMailUrl()
MimeMailFormatHelper::mimeMailFile in src/Utility/MimeMailFormatHelper.php
Builds a manifest containing metadata about files attached to an email.
MimeMailFormatHelper::mimeMailHtmlBody in src/Utility/MimeMailFormatHelper.php
Generates a multipart message body with a plaintext alternative.
MimeMailFormatHelperTest::testUrl in tests/src/Kernel/MimeMailFormatHelperTest.php
Tests helper function for formatting URLs.
MimeMailWebTest::testUrl in tests/src/Functional/MimeMailWebTest.php
Tests that spaces in attachment filenames are properly URL-encoded.

File

src/Utility/MimeMailFormatHelper.php, line 454

Class

MimeMailFormatHelper
Utility methods for formatting MIME-encoded email messages.

Namespace

Drupal\mimemail\Utility

Code

public static function mimeMailUrl($url, $to_embed = FALSE) {

  /** @var \Drupal\Core\Config\ImmutableConfig $mimemail_config */
  $mimemail_config = \Drupal::config('mimemail.settings');

  /** @var \Drupal\Core\Language\LanguageManagerInterface $language_manager */
  $language_manager = \Drupal::languageManager();
  $url = urldecode($url);
  $to_link = $mimemail_config
    ->get('linkonly');
  $is_image = preg_match('!\\.(png|gif|jpg|jpeg)!i', $url);
  $is_absolute = StreamWrapperManager::getScheme($url) != FALSE || preg_match('!(mailto|callto|tel)\\:!', $url);

  // Strip the base path as Uri adds it again at the end.
  $base_path = rtrim(base_path(), '/');
  $url = preg_replace('!^' . $base_path . '!', '', $url, 1);
  if (!$to_embed) {
    if ($is_absolute) {
      return str_replace(' ', '%20', $url);
    }
  }
  else {
    if ($is_image) {
      if ($to_link) {

        // Exclude images from embedding if needed.
        $url = file_create_url($url);
        $url = str_replace(' ', '%20', $url);
      }
      else {

        // Remove security token from URL, this allows for styled image
        // embedding.
        // @see https://drupal.org/drupal-7.20-release-notes
        $url = preg_replace('/\\?itok=.*$/', '', $url);
      }
    }
    return $url;
  }
  $url = str_replace('?q=', '', $url);
  @(list($url, $fragment) = explode('#', $url, 2));
  @(list($path, $query) = explode('?', $url, 2));

  // If we're dealing with an intra-document reference, return it.
  if (empty($path)) {
    return '#' . $fragment;
  }

  // Get a list of enabled languages.
  $languages = $language_manager
    ->getLanguages(LanguageInterface::STATE_ALL);

  // Default language settings.
  $prefix = '';
  $language = $language_manager
    ->getDefaultLanguage();

  // Check for language prefix.
  $args = explode('/', $path);
  foreach ($languages as $lang) {
    if ($args[1] == $lang
      ->getId()) {
      $prefix = array_shift($args);
      $language = $lang;
      $path = implode('/', $args);
      break;
    }
  }
  parse_str($query, $arr);
  $options = [
    'query' => !empty($arr) ? $arr : [],
    'fragment' => $fragment,
    'absolute' => TRUE,
    'language' => $language,
    'prefix' => $prefix,
  ];
  $url = Url::fromUserInput($path, $options)
    ->toString();

  // If url() added a ?q= where there should not be one, remove it.
  if (preg_match('!^\\?q=*!', $url)) {
    $url = preg_replace('!\\?q=!', '', $url);
  }
  $url = str_replace('+', '%2B', $url);
  return $url;
}