Index: branches/5.1.x/core/units/helpers/minifiers/yuicompressor-2.4.2.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: branches/5.1.x/core/units/helpers/minifiers/yuicompressor-2.4.2.jar
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: branches/5.1.x/core/units/helpers/minifiers/minify_helper.php
===================================================================
--- branches/5.1.x/core/units/helpers/minifiers/minify_helper.php	(revision 13888)
+++ branches/5.1.x/core/units/helpers/minifiers/minify_helper.php	(revision 13889)
@@ -1,246 +1,263 @@
 <?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
 		 *
 		 * @var string
 		 */
 		var $infoFile = '';
 
 		/**
 		 * Compress information
 		 *
 		 * @var Array
 		 */
 		var $compressInfo = Array ();
 
 		function MinifyHelper()
 		{
 			parent::kHelper();
 
 			$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) );
 			}
 		}
 
 		/**
 		 * When used as non-block tag, then compress given files and return url to result
 		 *
 		 * @param Array $files
 		 * @return string
 		 */
 		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;
 
 			$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 (!$was_compressed) {
 				$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);
 
 				$this->_saveInfo();
 			}
 
 			// got compressed file -> use it
 			return $this->Application->BaseURL( str_replace(DIRECTORY_SEPARATOR, '/', WRITEBALE_BASE)) . sprintf($file_mask, $this->compressInfo[$hash]);
 		}
 
 		/**
 		 * Returns hash string based on given files
 		 *
 		 * @param Array $files
 		 * @return int
 		 */
 		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
 		 */
 		function delete()
 		{
 			if (file_exists($this->infoFile)) {
 				unlink($this->infoFile);
 			}
 		}
 
 		/**
 		 * Compress $string based on $extension
 		 *
 		 * @param string $string
 		 * @param string $extension
 		 */
 		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)) {
+				$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
 		 */
 		function _getTemplatePaths($templates)
 		{
 			$ret = Array ();
 			$reg_exp = '/^' . preg_quote($this->Application->BaseURL(), '/') . '(.*)/';
 
 			foreach ($templates as $template) {
 				if (!$template) {
 					continue;
 				}
 
 				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