Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Wed, Apr 30, 1:53 AM

in-portal

Index: branches/5.2.x/core/units/helpers/minifiers/minify_helper.php
===================================================================
--- branches/5.2.x/core/units/helpers/minifiers/minify_helper.php (revision 14817)
+++ branches/5.2.x/core/units/helpers/minifiers/minify_helper.php (revision 14818)
@@ -1,264 +1,247 @@
<?php
/**
* @version $Id$
* @package In-Portal
* @copyright Copyright (C) 1997 - 2010 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class MinifyHelper extends kHelper {
/**
* Debug mode mark
*
* @var bool
*/
var $debugMode = false;
/**
- * Path to compress information file
+ * Folder, that contains produced CSS/JS files
*
* @var string
+ * @access protected
*/
- var $infoFile = '';
-
- /**
- * Compress information
- *
- * @var Array
- */
- var $compressInfo = Array ();
+ protected $resourceFolder = '';
public function __construct()
{
parent::__construct();
$this->debugMode = $this->Application->isDebugMode(false);
- $this->infoFile = WRITEABLE . '/cache/compress_info.txt';
-
- if ( file_exists($this->infoFile) ) {
- $this->compressInfo = unserialize( file_get_contents($this->infoFile) );
- }
+ $this->resourceFolder = WRITEABLE . '/cache';
}
/**
* When used as non-block tag, then compress given files and return url to result
*
* @param Array $params
* @return string
* @access public
*/
public function CompressScriptTag($params)
{
// put to queue
if ( array_key_exists('to', $params) ) {
$files = $this->Application->GetVar($params['to'], '');
$this->Application->SetVar($params['to'], $files . '|' . $params['files']);
return '';
}
if ( array_key_exists('from', $params) ) {
// get from queue
$files = $this->Application->GetVar($params['from']);
}
else {
// get from tag
$files = $params['files'];
}
$files = $this->_getTemplatePaths( array_map('trim', explode('|', $files)) );
$extension = pathinfo($files[0], PATHINFO_EXTENSION);
- $hash = ($this->debugMode ? 'd' : 'c') . '_' . $this->_getHash($files);
- $file_mask = 'cache/' . $hash . '_%s.' . $extension;
+ $save_as = isset($params['save_as']) ? $params['save_as'] : false;
+ $dst_file = $this->resourceFolder . DIRECTORY_SEPARATOR . ($this->debugMode ? 'd' : 'c') . '_';
- $was_compressed = array_key_exists($hash, $this->compressInfo);
-
- if ( $was_compressed ) {
- $current_file = WRITEABLE . '/' . sprintf($file_mask, $this->compressInfo[$hash]);
-
- if ( !file_exists($current_file) ) {
- // when info exists, but file doesn't -> re-compress
- $was_compressed = false;
- }
-
- if ( $this->debugMode ) {
- // check if any of listed files was changed since compressed file was created (only, when in debug mode)
- foreach ($files as $file) {
- if ( filemtime($file) > $this->compressInfo[$hash] ) {
- $was_compressed = false;
- break;
- }
- }
- }
+ if ( $save_as ) {
+ $dst_file .= $save_as . ( strpos($save_as, '.') === false ? '.' . $extension : '' );
+ }
+ else {
+ $dst_file .= $this->_getHash($files) . '.' . $extension;
}
- if ( !$was_compressed ) {
+ $was_compressed = file_exists($dst_file);
+
+ if ( !$was_compressed || ($this->debugMode && filemtime($dst_file) < $this->_getMaxFileDate($files)) ) {
$string = '';
$path_length = strlen(FULL_PATH) + 1;
foreach ($files as $file) {
// add filename before for easier debugging
if ( $this->debugMode ) {
$string .= '/* === File: ' . substr($file, $path_length) . ' === */' . "\n";
$string .= '/* ' . str_repeat('=', strlen(substr($file, $path_length)) + 14) . ' */' . "\n\n";
}
// add file content
$string .= file_get_contents($file) . "\n\n";
}
- // remove previous version of compressed file
- if ( isset($current_file) ) {
- if ( file_exists($current_file) ) {
- unlink($current_file);
- }
- }
-
// replace templates base
$templates_base = $this->Application->ProcessParsedTag('m', 'TemplatesBase', Array ());
$templates_base = preg_replace('/^' . preg_quote($this->Application->BaseURL(), '/') . '/', BASE_PATH . '/', $templates_base);
$string = str_replace('@templates_base@', rtrim($templates_base, '/'), $string);
- // compress collected data
- $this->compressInfo[$hash] = adodb_mktime();
-
if ( !$this->debugMode ) {
// don't compress merged js/css file in debug mode to allow js/css debugging
$this->compressString($string, $extension);
}
// save compressed file
- $fp = fopen(WRITEABLE . '/' . sprintf($file_mask, $this->compressInfo[$hash]), 'w');
- fwrite($fp, $string);
- fclose($fp);
+ file_put_contents($dst_file, $string);
+ }
+
+ $file_helper =& $this->Application->recallObject('FileHelper');
+ /* @var $file_helper FileHelper */
- $this->_saveInfo();
+ return $file_helper->pathToUrl($dst_file) . '?ts=' . filemtime($dst_file);
+ }
+
+ /**
+ * Returns maximal modification date across given files
+ *
+ * @param Array $files
+ * @return int
+ * @access protected
+ */
+ protected function _getMaxFileDate($files)
+ {
+ $ret = 0;
+
+ foreach ($files as $file) {
+ $ret = max($ret, filemtime($file));
}
- // got compressed file -> use it
- return $this->Application->BaseURL( str_replace(DIRECTORY_SEPARATOR, '/', WRITEBALE_BASE)) . sprintf($file_mask, $this->compressInfo[$hash]);
+ return $ret;
}
/**
* Returns hash string based on given files
*
* @param Array $files
* @return int
+ * @access protected
*/
- function _getHash($files)
+ protected function _getHash($files)
{
$hash = $files;
if ($this->Application->isAdmin) {
array_unshift($hash, 'A:1');
}
else {
array_unshift($hash, 'A:0;T:' . $this->Application->GetVar('m_theme'));
}
return crc32( implode('|', $hash) );
}
/**
- * Saves file with compress information
- *
- */
- function _saveInfo()
- {
- $fp = fopen($this->infoFile, 'w');
- fwrite($fp, serialize($this->compressInfo));
- fclose($fp);
- }
-
- /**
* Deletes compression info file
*
* @todo also delete all listed there files
+ * @access public
*/
- function delete()
+ public function delete()
{
- if (file_exists($this->infoFile)) {
- unlink($this->infoFile);
+ $iterator = new DirectoryIterator($this->resourceFolder);
+ /* @var $file_info DirectoryIterator */
+
+ foreach ($iterator as $file_info) {
+ if ( !$file_info->isDir() && preg_match('/^(c|d)_.*.(css|js)$/', $file_info->getFilename()) ) {
+ unlink( $file_info->getPathname() );
+ }
}
}
/**
* Compress $string based on $extension
*
* @param string $string
* @param string $extension
+ * @return void
+ * @access protected
*/
- function compressString(&$string, $extension)
+ public function compressString(&$string, $extension)
{
$tmp_file = tempnam('/tmp', 'to_compress_');
$fp = fopen($tmp_file, 'w');
fwrite($fp, $string);
fclose($fp);
$command = 'java -jar ' . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'yuicompressor-2.4.2.jar --type ' . $extension . ' --charset utf-8 ' . $tmp_file;
$compressed_string = shell_exec($command);
unlink($tmp_file);
if (!is_null($compressed_string) && $compressed_string) {
$string = $compressed_string;
return ;
}
// failed to compress using YUICompressor (maybe java not installed)
if ($extension == 'js') {
$minifier =& $this->Application->makeClass('JsMinifyHelper');
/* @var $minifier JsMinifyHelper */
$string = $minifier->minify($string);
}
elseif ($extension == 'css') {
$minifier =& $this->Application->makeClass('CssMinifyHelper');
/* @var $minifier CssMinifyHelper */
$string = $minifier->minify($string);
}
}
/**
* Get full paths on disk for each of given templates
*
* @param Array $templates
* @return Array
+ * @access protected
*/
- function _getTemplatePaths($templates)
+ protected function _getTemplatePaths($templates)
{
$ret = Array ();
$reg_exp = '/^' . preg_quote($this->Application->BaseURL(), '/') . '(.*)/';
foreach ($templates as $template) {
- if (!$template) {
+ if ( !$template ) {
continue;
}
- if (preg_match($reg_exp, $template, $regs)) {
+ if ( preg_match($reg_exp, $template, $regs) ) {
// full url (from current domain) to a file
$path = FULL_PATH . '/' . $regs[1];
}
else {
list ($path, $module_filename) = $this->Application->TemplatesCache->GetTemplatePaths($template);
$path .= DIRECTORY_SEPARATOR . $module_filename;
}
$ret[] = $path;
}
return $ret;
}
}
\ No newline at end of file

Event Timeline