You are here

function url_to_absolute in TMGMT Translator Smartling 8

Combine a base URL and a relative URL to produce a new absolute URL. The base URL is often the URL of a page, and the relative URL is a URL embedded on that page.

This function implements the "absolutize" algorithm from the RFC3986 specification for URLs.

This function supports multi-byte characters with the UTF-8 encoding, per the URL specification.

Parameters: baseUrl the absolute base URL.

url the relative URL to convert.

Return values: An absolute URL that combines parts of the base and relative URLs, or FALSE if the base URL is not absolute or if either URL cannot be parsed.

1 call to url_to_absolute()
HtmlAssetInliner::getFullUrl in src/Context/HtmlAssetInliner.php
Converts relative URLs to absolute URLs

File

includes/url_to_absolute.inc, line 70
Edited by Nitin Kr. Gupta, publicmind.in

Code

function url_to_absolute($base_url, $relative_url) {

  // If relative URL has a scheme, clean path and return.
  $r = split_url($relative_url);
  if ($r === FALSE) {
    return FALSE;
  }
  if (!empty($r['scheme'])) {
    if (!empty($r['path']) && $r['path'][0] == '/') {
      $r['path'] = url_remove_dot_segments($r['path']);
    }
    return join_url($r);
  }

  // Make sure the base URL is absolute.
  $b = split_url($base_url);
  if ($b === FALSE || empty($b['scheme']) || empty($b['host'])) {
    return FALSE;
  }
  $r['scheme'] = $b['scheme'];

  // If relative URL has an authority, clean path and return.
  if (isset($r['host'])) {
    if (!empty($r['path'])) {
      $r['path'] = url_remove_dot_segments($r['path']);
    }
    return join_url($r);
  }
  unset($r['port']);
  unset($r['user']);
  unset($r['pass']);

  // Copy base authority.
  $r['host'] = $b['host'];
  if (isset($b['port'])) {
    $r['port'] = $b['port'];
  }
  if (isset($b['user'])) {
    $r['user'] = $b['user'];
  }
  if (isset($b['pass'])) {
    $r['pass'] = $b['pass'];
  }

  // If relative URL has no path, use base path
  if (empty($r['path'])) {
    if (!empty($b['path'])) {
      $r['path'] = $b['path'];
    }
    if (!isset($r['query']) && isset($b['query'])) {
      $r['query'] = $b['query'];
    }
    return join_url($r);
  }

  // If relative URL path doesn't start with /, merge with base path
  if (isset($b['path']) && $r['path'][0] != '/') {
    $base = mb_strrchr($b['path'], '/', TRUE, 'UTF-8');
    if ($base === FALSE) {
      $base = '';
    }
    $r['path'] = $base . '/' . $r['path'];
  }
  $r['path'] = url_remove_dot_segments($r['path']);
  return join_url($r);
}