diff --git a/lib/Util/CSS.php b/lib/Util/CSS.php index 435388eef4..62ce3e379a 100644 --- a/lib/Util/CSS.php +++ b/lib/Util/CSS.php @@ -29,51 +29,13 @@ use csstidy; */ class CSS { - - private $cssFiles = array(); private $parsed_css = array(); - /* - * Retrieves a CSS stylesheet and caches it before returning it. - */ - public function getCSS($url) - { - if(!isset($cssFiles[$url])) - { - $cssFiles[$url] = file_get_contents($url); - } - return $cssFiles[$url]; - } - - /* - * Take a list of absolute URLs pointing to CSS stylesheets, - * retrieve the CSS, parse it, sort the rules by increasing order of specificity, - * cache the rules, return them. - */ - public function getCSSFromFiles($urls) - { - $key = implode('::', $urls); - if(!isset($this->parsed_css[$key])) - { - $texts = array(); - foreach($urls as $url) - { - $texts[] = $this->getCSS($url); - } - $text = implode("\n\n", $texts); - $this->parsed_css[$key] = $text; - } - return $this->parsed_css[$key]; - } - - public static function splitMediaQueries($css) - { - + public static function splitMediaQueries($css) { $start = 0; $queries = ''; - while (($start = strpos($css, "@media", $start)) !== false) - { + while(($start = strpos($css, "@media", $start)) !== false) { // stack to manage brackets $s = array(); @@ -81,23 +43,18 @@ class CSS { $i = strpos($css, "{", $start); // if $i is false, then there is probably a css syntax error - if ($i !== false) - { + if($i !== false) { // push bracket onto stack array_push($s, $css[$i]); // move past first bracket $i++; - while (!empty($s)) - { + while(!empty($s)) { // if the character is an opening bracket, push it onto the stack, otherwise pop the stack - if ($css[$i] == "{") - { + if($css[$i] == "{") { array_push($s, "{"); - } - elseif ($css[$i] == "}") - { + } else if($css[$i] == "}") { array_pop($s); } @@ -113,8 +70,7 @@ class CSS { return array($css, $queries); } - public function parseCSS($text) - { + public function parseCSS($text) { $css = new csstidy(); $css->settings['compress_colors'] = false; $css->parse($text); @@ -122,41 +78,30 @@ class CSS { $rules = array(); $position = 0; - foreach($css->css as $declarations) - { - foreach($declarations as $selectors => $properties) - { - foreach(explode(",", $selectors) as $selector) - { + foreach($css->css as $declarations) { + foreach($declarations as $selectors => $properties) { + foreach(explode(",", $selectors) as $selector) { $rules[] = array( 'position' => $position, 'specificity' => self::calculateCSSSpecifity($selector), 'selector' => $selector, 'properties' => $properties - ); + ); } $position += 1; } } - usort($rules, function($a, $b){ - if($a['specificity'] > $b['specificity']) - { + usort($rules, function($a, $b) { + if($a['specificity'] > $b['specificity']) { return 1; - } - else if($a['specificity'] < $b['specificity']) - { + } else if($a['specificity'] < $b['specificity']) { return -1; - } - else - { - if($a['position'] > $b['position']) - { + } else { + if($a['position'] > $b['position']) { return 1; - } - else - { + } else { return -1; } } @@ -176,8 +121,7 @@ class CSS { * @license BSD License */ - public static function calculateCSSSpecifity($selector) - { + public static function calculateCSSSpecifity($selector) { // cleanup selector $selector = str_replace(array('>', '+'), array(' > ', ' + '), $selector); @@ -207,16 +151,15 @@ class CSS { * Turns a CSS style string (like: "border: 1px solid black; color:red") * into an array of properties (like: array("border" => "1px solid black", "color" => "red")) */ - public static function styleToArray($str) - { + public static function styleToArray($str) { $array = array(); - if(trim($str) === '')return $array; + if(trim($str) === '') return $array; - foreach(explode(';', $str) as $kv) - { - if ($kv === '') + foreach(explode(';', $str) as $kv) { + if($kv === '') { continue; + } $key_value = explode(':', $kv); $array[trim($key_value[0])] = trim($key_value[1]); @@ -229,52 +172,14 @@ class CSS { * Reverses what styleToArray does, see above. * array("border" => "1px solid black", "color" => "red") yields "border: 1px solid black; color:red" */ - public static function arrayToStyle($array) - { + public static function arrayToStyle($array) { $parts = array(); - foreach($array as $k => $v) - { + foreach($array as $k => $v) { $parts[] = "$k:$v"; } return implode(';', $parts); } - /* - * Get an absolute URL from an URL ($relative_url, but relative or not actually!) - * that is found on the page with url $page_url. - * Determine it as a browser would do. For instance if "hi" - * (here '/bob/hello.html' is the $relative_url) - * is found on a page at $page_url := "http://example.com/stuff/index.html" - * then the function returns "http://example.com/bob/hello.html" - * because that's where you'd go to if you clicked on the link in your browser. - * This is used to find where to download the CSS files from when inlining. - */ - public static function absolutify($page_url, $relative_url) - { - $parsed_url = parse_url($page_url); - - $absolute_url = ''; - $parsed_relative_url = parse_url($relative_url); - - // If $relative_url has a host it is actually absolute, return it. - if(isset($parsed_relative_url['host'])) - { - $absolute_url = $relative_url; - } - // If $relative_url begins with / then it is a path relative to the $page_url's host - else if(preg_match('/^\//', $parsed_relative_url['path'])) - { - $absolute_url = $parsed_url['scheme'].'://'.$parsed_url['host'].$parsed_relative_url['path']; - } - // No leading slash: append the path of $relative_url to the 'folder' path of $page_url - else - { - $absolute_url = $parsed_url['scheme'].'://'.$parsed_url['host'].dirname($parsed_url['path']).'/'.$parsed_relative_url['path']; - } - - return $absolute_url; - } - /* * The core of the algorithm, takes a URL and returns the HTML found there with the CSS inlined. * If you pass $contents then the original HTML is not downloaded and $contents is used instead. @@ -283,38 +188,24 @@ class CSS { function inlineCSS($url, $contents=null) { // Download the HTML if it was not provided - if($contents === null) - { + if($contents === null) { $html = HtmlDomParser::file_get_html($url, false, null, -1, -1, true, true, DEFAULT_TARGET_CHARSET, false, DEFAULT_BR_TEXT, DEFAULT_SPAN_TEXT); - } - // Else use the data provided! - else - { + } else { + // use the data provided! $html = HtmlDomParser::str_get_html($contents, true, true, DEFAULT_TARGET_CHARSET, false, DEFAULT_BR_TEXT, DEFAULT_SPAN_TEXT); } - if(!is_object($html)) - { + if(!is_object($html)) { return false; } - $css_urls = array(); - - // Find all stylesheets and determine their absolute URLs to retrieve them - foreach($html->find('link[rel="stylesheet"]') as $style) - { - $css_urls[] = self::absolutify($url, $style->href); - $style->outertext = ''; - } - $css_blocks = ''; // Find all