123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- /**
- * Class Minify_YUICompressor
- * @package Minify
- */
- /**
- * Compress Javascript/CSS using the YUI Compressor
- *
- * You must set $jarFile and $tempDir before calling the minify functions.
- * Also, depending on your shell's environment, you may need to specify
- * the full path to java in $javaExecutable or use putenv() to setup the
- * Java environment.
- *
- * <code>
- * Minify_YUICompressor::$jarFile = '/path/to/yuicompressor-2.4.6.jar';
- * Minify_YUICompressor::$tempDir = '/tmp';
- * $code = Minify_YUICompressor::minifyJs(
- * $code
- * ,array('nomunge' => true, 'line-break' => 1000)
- * );
- * </code>
- *
- * Note: In case you run out stack (default is 512k), you may increase stack size in $options:
- * array('stack-size' => '2048k')
- *
- * @todo unit tests, $options docs
- *
- * @package Minify
- * @author Stephen Clay <steve@mrclay.org>
- */
- class Minify_YUICompressor {
- /**
- * Filepath of the YUI Compressor jar file. This must be set before
- * calling minifyJs() or minifyCss().
- *
- * @var string
- */
- public static $jarFile = null;
-
- /**
- * Writable temp directory. This must be set before calling minifyJs()
- * or minifyCss().
- *
- * @var string
- */
- public static $tempDir = null;
-
- /**
- * Filepath of "java" executable (may be needed if not in shell's PATH)
- *
- * @var string
- */
- public static $javaExecutable = 'java';
-
- /**
- * Minify a Javascript string
- *
- * @param string $js
- *
- * @param array $options (verbose is ignored)
- *
- * @see http://www.julienlecomte.net/yuicompressor/README
- *
- * @return string
- */
- public static function minifyJs($js, $options = array())
- {
- return self::_minify('js', $js, $options);
- }
-
- /**
- * Minify a CSS string
- *
- * @param string $css
- *
- * @param array $options (verbose is ignored)
- *
- * @see http://www.julienlecomte.net/yuicompressor/README
- *
- * @return string
- */
- public static function minifyCss($css, $options = array())
- {
- return self::_minify('css', $css, $options);
- }
-
- private static function _minify($type, $content, $options)
- {
- self::_prepare();
- if (! ($tmpFile = tempnam(self::$tempDir, 'yuic_'))) {
- throw new Exception('Minify_YUICompressor : could not create temp file in "'.self::$tempDir.'".');
- }
- file_put_contents($tmpFile, $content);
- exec(self::_getCmd($options, $type, $tmpFile), $output, $result_code);
- unlink($tmpFile);
- if ($result_code != 0) {
- throw new Exception('Minify_YUICompressor : YUI compressor execution failed.');
- }
- return implode("\n", $output);
- }
-
- private static function _getCmd($userOptions, $type, $tmpFile)
- {
- $o = array_merge(
- array(
- 'charset' => ''
- ,'line-break' => 5000
- ,'type' => $type
- ,'nomunge' => false
- ,'preserve-semi' => false
- ,'disable-optimizations' => false
- ,'stack-size' => ''
- )
- ,$userOptions
- );
- $cmd = self::$javaExecutable
- . (!empty($o['stack-size'])
- ? ' -Xss' . $o['stack-size']
- : '')
- . ' -jar ' . escapeshellarg(self::$jarFile)
- . " --type {$type}"
- . (preg_match('/^[\\da-zA-Z0-9\\-]+$/', $o['charset'])
- ? " --charset {$o['charset']}"
- : '')
- . (is_numeric($o['line-break']) && $o['line-break'] >= 0
- ? ' --line-break ' . (int)$o['line-break']
- : '');
- if ($type === 'js') {
- foreach (array('nomunge', 'preserve-semi', 'disable-optimizations') as $opt) {
- $cmd .= $o[$opt]
- ? " --{$opt}"
- : '';
- }
- }
- return $cmd . ' ' . escapeshellarg($tmpFile);
- }
-
- private static function _prepare()
- {
- if (! is_file(self::$jarFile)) {
- throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not a valid file.');
- }
- if (! is_readable(self::$jarFile)) {
- throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not readable.');
- }
- if (! is_dir(self::$tempDir)) {
- throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not a valid direcotry.');
- }
- if (! is_writable(self::$tempDir)) {
- throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not writable.');
- }
- }
- }
|