From b96e264cc7d5cc0da30596466d53c40e3066427a Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 8 Oct 2018 13:56:46 -0600 Subject: [PATCH] Fixed pipeline + remote url rewrites #2216 --- CHANGELOG.md | 1 + system/src/Grav/Common/Assets/Pipeline.php | 19 +++++++++--------- .../Common/Assets/Traits/AssetUtilsTrait.php | 20 +++++++++++-------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9492441d1..074f2746b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * Fixed asset manager to not add empty assets when they don't exist in the filesystem * Regression: Fixed asset manager methods with default legacy attributes * Update `script` and `style` Twig tags to use the new `Assets` classes + * Fixed asset pipeline to rewrite remote URLs as well as local [#2216](https://github.com/getgrav/grav/issues/2216) # v1.6.0-beta.1 ## 10/01/2018 diff --git a/system/src/Grav/Common/Assets/Pipeline.php b/system/src/Grav/Common/Assets/Pipeline.php index 367e3d290..ea603ccdb 100644 --- a/system/src/Grav/Common/Assets/Pipeline.php +++ b/system/src/Grav/Common/Assets/Pipeline.php @@ -130,7 +130,7 @@ class Pipeline extends PropertyObject } // Concatenate files - $buffer = $this->gatherLinks($assets, self::CSS_ASSET); + $buffer = $this->gatherLinks($assets, self::CSS_ASSET, $no_pipeline); // Minify if required if ($this->shouldMinify('css')) { @@ -160,7 +160,8 @@ class Pipeline extends PropertyObject * * @param array $assets * @param string $group - * @param array $attributes + * @param array $attributes + * @param array $no_pipeline * * @return bool|string URL or generated content if available, else false */ @@ -202,7 +203,7 @@ class Pipeline extends PropertyObject } // Concatenate files - $buffer = $this->gatherLinks($assets, self::JS_ASSET); + $buffer = $this->gatherLinks($assets, self::JS_ASSET, $no_pipeline); // Minify if required if ($this->shouldMinify('js')) { @@ -228,23 +229,23 @@ class Pipeline extends PropertyObject } - /** * Finds relative CSS urls() and rewrites the URL with an absolute one * - * @param string $file the css source file - * @param string $relative_path relative path to the css file + * @param string $file the css source file + * @param string $dir , $local relative path to the css file + * @param boolean $local is this a local or remote asset * * @return mixed */ - protected function cssRewrite($file, $relative_path) + protected function cssRewrite($file, $dir, $local) { // Strip any sourcemap comments $file = preg_replace(self::CSS_SOURCEMAP_REGEX, '', $file); // Find any css url() elements, grab the URLs and calculate an absolute path // Then replace the old url with the new one - $file = (string)preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($relative_path) { + $file = (string)preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($dir, $local) { $old_url = $matches[2]; @@ -253,7 +254,7 @@ class Pipeline extends PropertyObject return $matches[0]; } - $new_url = $this->base_url . ltrim(Utils::normalizePath($relative_path . '/' . $old_url), '/'); + $new_url = ($local ? $this->base_url: '') . ltrim(Utils::normalizePath($dir . '/' . $old_url), '/'); return str_replace($old_url, $new_url, $matches[0]); }, $file); diff --git a/system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php b/system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php index 5928e9064..876a0839c 100644 --- a/system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php +++ b/system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php @@ -35,18 +35,18 @@ trait AssetUtilsTrait /** * Download and concatenate the content of several links. * - * @param array $links - * @param bool $css + * @param array $assets + * @param bool $css + * @param array $no_pipeline * * @return string */ - protected function gatherLinks(array $links, $css = true) + protected function gatherLinks(array $assets, $css = true, &$no_pipeline = []) { $buffer = ''; - foreach ($links as $asset) { - $relative_dir = ''; + foreach ($assets as $id => $asset) { $local = true; $link = $asset->getAsset(); @@ -57,9 +57,10 @@ trait AssetUtilsTrait if (0 === strpos($link, '//')) { $link = 'http:' . $link; } + $relative_dir = dirname($relative_path); } else { // Fix to remove relative dir if grav is in one - if (($this->base_url !== '/') && strpos($this->base_url, $link) === 0) { + if (($this->base_url !== '/') && Utils::startsWith($relative_path, $this->base_url)) { $base_url = '#' . preg_quote($this->base_url, '#') . '#'; $relative_path = ltrim(preg_replace($base_url, '/', $link, 1), '/'); } @@ -72,6 +73,9 @@ trait AssetUtilsTrait // No file found, skip it... if ($file === false) { + if (!$local) { // Assume we coudln't download this file for some reason assume it's not pipeline compatible + $no_pipeline[$id] = $asset; + } continue; } @@ -81,8 +85,8 @@ trait AssetUtilsTrait } // If this is CSS + the file is local + rewrite enabled - if ($css && $local && $this->css_rewrite) { - $file = $this->cssRewrite($file, $relative_dir); + if ($css && $this->css_rewrite) { + $file = $this->cssRewrite($file, $relative_dir, $local); } $file = rtrim($file) . PHP_EOL;