diff options
Diffstat (limited to 'includes/libs/CSSMin.php')
-rw-r--r-- | includes/libs/CSSMin.php | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php index c0e78112..4012b695 100644 --- a/includes/libs/CSSMin.php +++ b/includes/libs/CSSMin.php @@ -1,24 +1,24 @@ <?php /* * Copyright 2010 Wikimedia Foundation - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS * OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. + * specific language governing permissions and limitations under the License. */ /** * Transforms CSS data - * + * * This class provides minification, URL remapping, URL extracting, and data-URL embedding. - * + * * @file * @version 0.1.1 -- 2010-09-11 * @author Trevor Parscal <tparscal@wikimedia.org> @@ -26,9 +26,9 @@ * @license http://www.apache.org/licenses/LICENSE-2.0 */ class CSSMin { - + /* Constants */ - + /** * Maximum file size to still qualify for in-line embedding as a data-URI * @@ -37,9 +37,9 @@ class CSSMin { */ const EMBED_SIZE_LIMIT = 24576; const URL_REGEX = 'url\(\s*[\'"]?(?P<file>[^\?\)\'"]*)(?P<query>\??[^\)\'"]*)[\'"]?\s*\)'; - + /* Protected Static Members */ - + /** @var array List of common image files extensions and mime-types */ protected static $mimeTypes = array( 'gif' => 'image/gif', @@ -51,9 +51,9 @@ class CSSMin { 'tiff' => 'image/tiff', 'xbm' => 'image/x-xbitmap', ); - + /* Static Methods */ - + /** * Gets a list of local file paths which are referenced in a CSS style sheet * @@ -78,7 +78,7 @@ class CSSMin { } return $files; } - + protected static function getMimeType( $file ) { $realpath = realpath( $file ); // Try a couple of different ways to get the mime-type of a file, in order of @@ -92,7 +92,7 @@ class CSSMin { // As of PHP 5.3, this is how you get the mime-type of a file; it uses the Fileinfo // PECL extension return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath ); - } else if ( function_exists( 'mime_content_type' ) ) { + } elseif ( function_exists( 'mime_content_type' ) ) { // Before this was deprecated in PHP 5.3, this was how you got the mime-type of a file return mime_content_type( $file ); } else { @@ -104,7 +104,7 @@ class CSSMin { } return false; } - + /** * Remaps CSS URL paths and automatically embeds data URIs for URL rules * preceded by an /* @embed * / comment @@ -130,12 +130,20 @@ class CSSMin { // URLs with absolute paths like /w/index.php need to be expanded // to absolute URLs but otherwise left alone if ( $match['file'][0] !== '' && $match['file'][0][0] === '/' ) { - // Replace the file path with an expanded URL - $source = substr_replace( $source, wfExpandUrl( $match['file'][0] ), - $match['file'][1], strlen( $match['file'][0] ) - ); + // Replace the file path with an expanded (possibly protocol-relative) URL + // ...but only if wfExpandUrl() is even available. + // This will not be the case if we're running outside of MW + $lengthIncrease = 0; + if ( function_exists( 'wfExpandUrl' ) ) { + $expanded = wfExpandUrl( $match['file'][0], PROTO_RELATIVE ); + $origLength = strlen( $match['file'][0] ); + $lengthIncrease = strlen( $expanded ) - $origLength; + $source = substr_replace( $source, $expanded, + $match['file'][1], $origLength + ); + } // Move the offset to the end of the match, leaving it alone - $offset = $match[0][1] + strlen( $match[0][0] ); + $offset = $match[0][1] + strlen( $match[0][0] ) + $lengthIncrease; continue; } // Shortcuts @@ -175,9 +183,9 @@ class CSSMin { } if ( $replacement === false ) { // Assume that all paths are relative to $remote, and make them absolute - $replacement = "{$embed}{$pre}url({$url}){$post};"; + $replacement = "{$embed}{$pre}url({$url}){$post};"; } - } else if ( $local === false ) { + } elseif ( $local === false ) { // Assume that all paths are relative to $remote, and make them absolute $replacement = "{$embed}{$pre}url({$url}{$query}){$post};"; } |