/libraries/gantry/core/gantrygzipper.class.php
PHP | 253 lines | 192 code | 37 blank | 24 comment | 29 complexity | 253ea0681ac2df931c55355a941aada1 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.0, JSON, GPL-2.0, BSD-3-Clause, LGPL-2.1, MIT
- <?php
- /**
- * @package gantry
- * @subpackage core
- * @version 3.2.22 August 3, 2012
- * @author RocketTheme http://www.rockettheme.com
- * @copyright Copyright (C) 2007 - 2012 RocketTheme, LLC
- * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
- *
- * Gantry uses the Joomla Framework (http://www.joomla.org), a GNU/GPLv2 content management system
- *
- */
- defined('GANTRY_VERSION') or die();
- gantry_import('core.gantrysingleton');
- /**
- * @package gantry
- * @subpackage core
- */
- class GantryGZipper {
- function process() {
- }
- function processCSSFiles() {
- global $gantry;
- $cache_time = $gantry->get("gzipper-time");
- $expires_time = $gantry->get("gzipper-expirestime", 1440);
- $strip_css = $gantry->get("gzipper-stripwhitespace", 1);
- $grouped_priories = array();
- $output = array();
- foreach ($gantry->_styles as $priorities) {
- foreach ($priorities as $links) {
- $css_links[$links->path] = $links->url;
- }
- }
- // $css_links = $gantry->_styles;
- ksort($gantry->_styles);
- foreach ($gantry->_styles as $style_priority => $styles) {
- $order_keeper = 0;
- $bump_ok = false;
- foreach ($styles as $style_entry) {
- if ($style_entry->type == 'url') {
- $directory = 'REMOTE_URL';
- $filename = $style_entry->url;
- $bump_ok = true;
- }
- else {
- $directory = dirname($style_entry->path);
- $filename = basename($style_entry->path);
- }
- $grouped_priories[$style_priority][$order_keeper][$directory][$filename] = $style_entry;
- if ($bump_ok) {
- $order_keeper++;
- $bump_ok = false;
- }
- }
- }
- foreach ($grouped_priories as $priority => $order_kept_entries) {
- foreach ($order_kept_entries as $ordered_files) {
- foreach ($ordered_files as $dir => $files) {
- // Process full urls
- if ($dir == 'REMOTE_URL') {
- foreach ($files as $file => $link) {
- $gantry->document->addStyleSheet($link->url);
- }
- continue;
- }
- // Process
- else {
- if (!is_writable($dir)) {
- foreach ($files as $css_file) {
- $gantry->document->addStyleSheet($css_file->url);
- }
- continue;
- }
- $md5sum = "";
- $path = "";
- jimport('joomla.filesystem.file');
- //first trip through to build filename
- foreach ($files as $file => $details) {
- $md5sum .= md5($details->url);
- $detailspath = $dir . DS . $file;
- if (JFile::exists($detailspath)) {
- $path = dirname($details->url);
- }
- }
- $cache_filename = "css-" . md5($md5sum) . ".php";
- $cache_fullpath = $dir . DS . $cache_filename;
- //see if file is stale
- if (JFile::exists($cache_fullpath)) {
- $diff = (time() - filectime($cache_fullpath));
- } else {
- $diff = $cache_time + 1;
- }
- if ($diff > $cache_time) {
- $outfile = GantryGZipper::_getOutHeader("css", $expires_time);
- foreach ($files as $file => $details) {
- $detailspath = $dir . DS . $file;
- if (JFile::exists($detailspath)) {
- $css_content = JFile::read($detailspath);
- if ($strip_css) {
- $css_content = GantryGZipper::_stripCSSWhiteSpace($css_content);
- }
- $outfile .= "\n\n/*** " . $file . " ***/\n\n" . $css_content;
- }
- }
- JFile::write($cache_fullpath, $outfile);
- }
- $cache_file_name = $path . "/" . $cache_filename;
- $gantry->document->addStyleSheet($cache_file_name);
- }
- }
- }
- }
- }
- function processJsFiles() {
- global $gantry;
- $path = $gantry->basePath;
- $cache_time = $gantry->get("gzipper-time");
- $expires_time = $gantry->get("gzipper-expirestime", 1440);
- $ordered_files = array();
- $output = array();
- $md5sum = "";
- $script_tags = $gantry->_scripts;
- foreach ($script_tags as $filepath => $file) {
- $md5sum .= md5($filepath);
- $ordered_files[] = array(dirname($filepath), basename($filepath), $file);
- }
- if (!is_writable(JPATH_CACHE)) {
- foreach ($this->_scripts as $js_file) {
- $gantry->document->addScript($js_file);
- }
- return;
- }
- if (count($ordered_files) > 0) {
- $cache_filename = "js-" . md5($md5sum) . ".php";
- $cache_fullpath = JPATH_CACHE . DS . $cache_filename;
- //see if file is stale
- if (JFile::exists($cache_fullpath)) {
- $diff = (time() - filectime($cache_fullpath));
- } else {
- $diff = $cache_time + 1;
- }
- if ($diff > $cache_time) {
- $outfile = GantryGZipper::_getOutHeader("js", $expires_time);
- foreach ($ordered_files as $files) {
- $dir = $files[0];
- $filename = $files[1];
- $details = $files[2];
- $detailspath = $dir . DS . $filename;
- if (JFile::exists($detailspath)) {
- $jsfile = JFile::read($detailspath);
- // fix for stupid joolma code
- if (strpos($filename, 'joomla.javascript.js')!==false or strpos($filename, 'mambojavascript.js')!==false) {
- $jsfile = str_replace("// <?php !!", "// ", $jsfile);
- }
- $jsfile = self::cleanEndLines($jsfile);
- $outfile .= "\n\n/*** " . $filename . " ***/\n\n" . $jsfile;
- }
- }
- JFile::write($cache_fullpath, $outfile);
- }
- $cache_file_name = $path . "/cache/" . $cache_filename;
- $cache_url_name = $gantry->baseUrl . "cache/" . $cache_filename;
- $gantry->document->addScript($cache_url_name);
- }
- }
- function cleanEndLines($data){
- $file_lines = explode("\n",$data);
- while (($line = array_pop($file_lines)) != null){
- $clean_line = rtrim($line);
- if (strlen($clean_line) > 0){
- $end_char = substr($line, strlen($clean_line), 1);
- array_push($file_lines,$line);
- if ($end_char != ';'){
- array_push($file_lines, ";");
- }
- break;
- }
- }
- return implode($file_lines,"\n");
- }
- function _getOutHeader($type = "css", $expires_time = 1440) {
- if ($type == "css") {
- $header = '<?php
- ob_start ("ob_gzhandler");
- header("Content-type: text/css; charset: UTF-8");
- header("Cache-Control: must-revalidate");
- $expires_time = ' . $expires_time . ';
- $offset = 60 * $expires_time ;
- $ExpStr = "Expires: " .
- gmdate("D, d M Y H:i:s",
- time() + $offset) . " GMT";
- header($ExpStr);
- ?>';
- } else {
- $header = '<?php
- ob_start ("ob_gzhandler");
- header("Content-type: application/x-javascript; charset: UTF-8");
- header("Cache-Control: must-revalidate");
- $expires_time = ' . $expires_time . ';
- $offset = 60 * $expires_time ;
- $ExpStr = "Expires: " .
- gmdate("D, d M Y H:i:s",
- time() + $offset) . " GMT";
- header($ExpStr);
- ?>';
- }
- return $header;
- }
- function _stripCSSWhiteSpace($css_content) {
- // remove comments
- $css_content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css_content);
- // remove tabs, spaces, newlines, etc.
- $css_content = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $css_content);
- return $css_content;
- }
- }