/** * Set up groups of files as sources * * @param array $options controller and Minify options * @return array Minify options * */ public function setupSources($options) { self::_setupDefines(); if (MINIFY_USE_CACHE) { $cacheDir = defined('MINIFY_CACHE_DIR') ? MINIFY_CACHE_DIR : ''; Diglin_Minify::setCache($cacheDir); } $options['badRequestHeader'] = 'HTTP/1.0 404 Not Found'; $options['contentTypeCharset'] = MINIFY_ENCODING; // The following restrictions are to limit the URLs that minify will // respond to. Ideally there should be only one way to reference a file. if (!isset($_GET['files']) || !preg_match('/^[^,]+\\.(css|js)(,[^,]+\\.\\1)*$/', $_GET['files'], $m) || strpos($_GET['files'], '//') !== false || strpos($_GET['files'], '\\') !== false || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['files'])) { return $options; } $extension = $m[1]; $files = explode(',', $_GET['files']); if (count($files) > MINIFY_MAX_FILES) { return $options; } // strings for prepending to relative/absolute paths $prependRelPaths = dirname($_SERVER['SCRIPT_FILENAME']) . DIRECTORY_SEPARATOR; $prependAbsPaths = $_SERVER['DOCUMENT_ROOT']; $sources = array(); $goodFiles = array(); $hasBadSource = false; $allowDirs = isset($options['allowDirs']) ? $options['allowDirs'] : MINIFY_BASE_DIR; foreach ($files as $file) { // prepend appropriate string for abs/rel paths $file = ($file[0] === '/' ? $prependAbsPaths : $prependRelPaths) . $file; // make sure a real file! $file = realpath($file); // don't allow unsafe or duplicate files if (parent::_fileIsSafe($file, $allowDirs) && !in_array($file, $goodFiles)) { $goodFiles[] = $file; $srcOptions = array('filepath' => $file); $this->sources[] = new Diglin_Minify_Source($srcOptions); } else { $hasBadSource = true; break; } } if ($hasBadSource) { $this->sources = array(); } if (!MINIFY_REWRITE_CSS_URLS) { $options['rewriteCssUris'] = false; } return $options; }
/** * Compress JS files and write them to media/js folders * * @param string $name * @param string|array $mergeCallback * @param bool $static * @return string */ protected function _prepareJsCompression($name, $mergeCallback = null, $static = false) { $config = Mage::getStoreConfig('uioptimization/jscompression'); $uiHelper = Mage::helper('uioptimization'); $options = array(); $info = $uiHelper->getCompressedInfo($name, 'js', $static); if (!isset($info['result']) || $info['result'] != false) { $info['result'] = true; } if (!file_exists($info['targetPathFile']) && $info['result'] || !Mage::getStoreConfigFlag('uioptimization/general/cronupdate') && $info['result'] && filemtime($info['orgskin_path']) > filemtime($info['targetPathFile'])) { switch ($config['type']) { case 'packer': $minifier = 'Diglin_Minify_Packer'; $method = 'minify'; break; case 'yuicompressor': $minifier = 'Diglin_Minify_YUICompressor'; $method = 'minifyJs'; Diglin_Minify_YUICompressor::$jarFile = Mage::getBaseDir('lib') . DS . 'Diglin' . DS . 'yuicompressor' . DS . 'yuicompressor.jar'; Diglin_Minify_YUICompressor::$tempDir = Mage::getBaseDir('tmp'); if (strlen($config['java_path']) > 0) { Diglin_Minify_YUICompressor::$javaExecutable = $config['java_path']; } $options = array('minifierOptions' => array(Diglin_Minify::TYPE_JS => array('disable-optimizations' => $config['disable_alloptimisation'], 'preserve-semi' => $config['preserve_semic'], 'nomunge' => $config['minify_only']))); break; case 'jsmin': default: $minifier = 'Diglin_JSMin'; $method = 'minify'; break; } $options += array('quiet' => true, 'minifiers' => array(Diglin_Minify::TYPE_JS => array($minifier, $method)), 'files' => array($info['orgskin_path']), 'encodeMethod' => ''); $results = Diglin_Minify::serve('Files', $options); if ($results['success']) { $io = new Diglin_Io_File(); $info['result'] = $io->write($info['targetPathFile'], $results['content'], 0644); } else { $info['result'] = false; } } return $uiHelper->getResultPath($info, $mergeCallback); }
/** * Return combined minified content for a set of sources * * No internal caching will be used and the content will not be HTTP encoded. * * @param array $sources array of filepaths and/or Minify_Source objects * * @param array $options (optional) array of options for serve. By default * these are already set: quiet = true, encodeMethod = '', lastModifiedTime = 0. * * @return string */ public static function combine($sources, $options = array()) { $cache = self::$_cache; self::$_cache = null; $options = array_merge(array('files' => (array) $sources, 'quiet' => true, 'encodeMethod' => '', 'lastModifiedTime' => 0), $options); $out = self::serve('Files', $options); self::$_cache = $cache; return $out['content']; }