| 37 | /** |
| 38 | * Implements hook_file_url_alter(). |
| 39 | * |
| 40 | * Make all URLs be protocol relative. |
| 41 | * Note: protocol relatice URLs will cause IE7/8 to download stylesheets twice. |
| 42 | */ |
| 43 | function dmtheme_file_url_alter(&$url) { |
| 44 | |
| 45 | global $base_url; |
| 46 | |
| 47 | static $relative_base_url = NULL, $relative_base_length = NULL; |
| 48 | |
| 49 | $scheme = file_uri_scheme($url); |
| 50 | |
| 51 | // For some things (e.g., images) hook_file_url_alter can be called multiple |
| 52 | // times. So, we have to be sure not to alter it multiple times. If we already |
| 53 | // are relative protocol we can just return. |
| 54 | // Only setup the and parse this stuff once. |
| 55 | if (!$relative_base_url || !$relative_base_length) { |
| 56 | $relative_base_url = '//' . file_uri_target($base_url); |
| 57 | $relative_base_length = strlen($relative_base_url); |
| 58 | } |
| 59 | if (!$scheme && substr($url, 0, $relative_base_length) == $relative_base_url) { |
| 60 | return; |
| 61 | } |
| 62 | |
| 63 | // Handle the case where we have public files with the scheme public:// or |
| 64 | // the case the relative path doesn't start with a /. Internal relative urls |
| 65 | // have the base url prepended to them. |
| 66 | if (!$scheme || $scheme == 'public') { |
| 67 | |
| 68 | // Internal Drupal paths. |
| 69 | if (!$scheme) { |
| 70 | $path = $url; |
| 71 | } |
| 72 | else { |
| 73 | $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme); |
| 74 | $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($url); |
| 75 | } |
| 76 | |
| 77 | // Clean up Windows paths. |
| 78 | $path = str_replace('\\', '/', $path); |
| 79 | |
| 80 | $url = $base_url . '/' . $path; |
| 81 | } |
| 82 | |
| 83 | // Convert full URLs to relative protocol. |
| 84 | $protocols = array('http', 'https'); |
| 85 | $scheme = file_uri_scheme($url); |
| 86 | if ($scheme && in_array($scheme, $protocols)) { |
| 87 | $url = '//' . file_uri_target($url); |
| 88 | } |
| 89 | } |