/** * 处理单条数据 * * @param string $path 路径 * @param array $files 文件列表 */ protected function _showSource($path, $files) { $extension = pathinfo($path, PATHINFO_EXTENSION); $type_constant = 'Minify::TYPE_' . strtoupper($extension); if (defined($type_constant)) { $content_type = constant($type_constant); } else { $content_type = Minify::TYPE_HTML; } $sources = array(); foreach ($files as $value) { $source_path = str_replace('//', ROOT_PATH, $value); if (!is_file($source_path)) { echo "[Not Found] {$source_path}<br />\r\n"; continue; } $content = file_get_contents($source_path); $sources[] = new Minify_Source(array('id' => $value, 'contentType' => $content_type, 'filepath' => $source_path)); } $minify = new Minify(new Minify_Cache_Null()); $combined = $minify->combine($sources, $this->_minify_config); $to_file_path = ROOT_PATH . "static/{$extension}/{$path}"; $to_dir = dirname($to_file_path); if (!is_dir($to_dir)) { mkdir($to_dir, 0775, true); } file_put_contents($to_file_path, $combined); chmod($to_file_path, 0777); }
/** * @param $sources * @param $extension * @param $use_cache * @param $options * @return array */ public function filter($sources, $extension, $use_cache, $options) { $files = array(); // handle request if (!$options['combine']) { foreach ($sources as $file) { $cache_filename = basename($file) . '.' . md5($file) . '.' . $extension; $destination_file = $this->cache_path . $cache_filename; if (!file_exists($destination_file) || !$use_cache) { $this->cache->write($destination_file, \Minify::combine($file, array('minifiers' => array('application/x-javascript' => '')))); } if (file_exists($destination_file)) { $files[] = $this->host . $this->fileUtility->getRelativePath($this->storeRootDir, $destination_file); } } } else { $cache_filename = md5(serialize($sources)) . '.' . $extension; $destination_file = $this->cache_path . $cache_filename; if (($cache_file = $this->cache->exists($destination_file)) === false || !$use_cache) { // Todo: what to do if we do not turn on the minify? $cache_file = $this->cache->write($destination_file, \Minify::combine($sources, $options)); } if (file_exists($destination_file)) { $files[] = $this->fileUtility->getRelativePath($this->storeRootDir, $destination_file); } } return $files; }
private function handleStatic($filenames, $type) { /* Fix to prevent debug bar from rendering on this page */ $config = Kohana::config('debug_toolbar'); if ($config) { $config->set('auto_render', false); } /* end fix */ if ($filenames === null) { $this->response = "/* No {$type} TO BE FOUND */"; return; } if (Kohana_Core::$environment != Kohana::DEVELOPMENT && self::check(300) === FALSE) { self::set(300); } $this->response->headers('Content-Type', File::mime_by_ext($type)); $body = ""; $filenames = preg_replace("/\\.{$type}\$/", '', $filenames); foreach (explode(',', $filenames) as $key) { $key = basename($key, ".{$type}"); $file = Kohana::find_file('views/' . $type, $key, $type); if (!$file) { $body .= "/* No such file or directory ({$key}.{$type}) */\n"; continue; } $body .= implode('', array('/* (', str_replace(DOCROOT, '', $file), ") */\n")); $body .= file_get_contents($file); } /* Play nice with minify module if its enabled */ if (Kohana::config('minify.enabled', false) && class_exists('Minify')) { $body = Minify::factory($type)->set($body)->min(); } $this->response->body($body); }
public function actionIndex() { $incPath = get_include_path(); $docRoot = $_SERVER['DOCUMENT_ROOT']; $_SERVER['DOCUMENT_ROOT'] = dirname(Yii::app()->request->getScriptFile()); set_include_path(Yii::app()->getExtensionPath()."/minify" . PATH_SEPARATOR . $incPath); require 'Minify.php'; $option['debug'] = $this->_debug; $option['maxAge'] = $this->_maxAge; $option['bubbleCssImports'] = $this->_bubbleCssImports; $option['encodeOutput'] = $this->_encodeOutput; $option['encodeMethod'] = $this->_encodeMethod; foreach ($this->_symlinks as $link => $target) { $link = str_replace('//', realpath($_SERVER['DOCUMENT_ROOT'])."/", $link); $link = strtr($link, '/', DIRECTORY_SEPARATOR); $option['minifierOptions']['text/css']['symlinks'][$link] = realpath($target); } Minify::setCache(Yii::app()->getRuntimePath(), $this->_cacheFileLocking); if ($this->_errorLogger) { require_once 'Minify/Logger.php'; require_once 'FirePHP.php'; Minify_Logger::setLogger(FirePHP::getInstance(true)); } $mgv = Yii::app()->getRuntimePath()."/minifyGroups.var"; $minifyGroups = unserialize(file_get_contents($mgv)); $option['files'] = $minifyGroups[$_GET['group']]; Minify::serve('Files', $option); set_include_path($incPath); $_SERVER['DOCUMENT_ROOT'] = $docRoot; }
function test_Lines() { global $thisDir; $exp = file_get_contents("{$thisDir}/_test_files/minify/lines_output.js"); $env = new Minify_Env(); $sourceFactory = new Minify_Source_Factory($env, array(), new Minify_Cache_Null()); $controller = new Minify_Controller_Files($env, $sourceFactory); $minify = new Minify(new Minify_Cache_Null()); $ret = $minify->serve($controller, array('debug' => true, 'quiet' => true, 'encodeOutput' => false, 'files' => array("{$thisDir}/_test_files/js/before.js"))); $passed = assertTrue($exp === $ret['content'], 'Minify_Lines'); if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) { echo "\n---Output: " . countBytes($ret['content']) . " bytes\n\n{$ret['content']}\n\n"; if (!$passed) { echo "---Expected: " . countBytes($exp) . " bytes\n\n{$exp}\n\n\n"; } } }
/** * Get last modified * * @return string */ public function getLastModified() { if (0 === stripos(PHP_OS, 'win')) { Minify::setDocRoot(); // we may be on IIS } return $this->lastModified; }
public function initialize() { $assets = $this->request->getQuery('r'); if ($assets != null) { $this->assetsList = explode(',', $assets); } set_include_path(LIB_PATH . 'Minify/' . PATH_SEPARATOR . get_include_path()); \Minify::setCache(new \Minify_Cache_APC()); }
public function init() { self::$css = []; self::$js = []; $ci =& get_instance(); $config = empty($ci->config->config) ? [] : $ci->config->config; $auto_pick = empty($config['minify_auto']) ? true : (bool) $config['minify_auto']; $this->auto_pick = $auto_pick === null ? true : $this->auto_pick; }
public function action_minify() { // load config $config = Kohana::config('minify'); //require MINIFY_MIN_DIR.'/Minify.php'; Minify::$uploaderHoursBehind = $config['uploaderHoursBehind']; Minify::setCache(isset($config['cachePath']) ? $config['cachePath'] : '', $config['cacheFileLocking']); if ($config['documentRoot']) { $_SERVER['DOCUMENT_ROOT'] = $config['documentRoot']; } elseif (0 === stripos(PHP_OS, 'win')) { Minify::setDocRoot(); // IIS may need help } $config['serveOptions']['minifierOptions']['text/css']['symlinks'] = $config['symlinks']; // auto-add targets to allowDirs foreach ($config['symlinks'] as $uri => $target) { $config['serveOptions']['minApp']['allowDirs'][] = $target; } if ($config['allowDebugFlag']) { if (!empty($_COOKIE['minDebug'])) { foreach (preg_split('/\\s+/', $_COOKIE['minDebug']) as $debugUri) { if (false !== strpos($_SERVER['REQUEST_URI'], $debugUri)) { $config['serveOptions']['debug'] = true; break; } } } // allow GET to override if (isset($_GET['debug'])) { $config['serveOptions']['debug'] = true; } } if ($config['errorLogger']) { //require _once MINIFY_MIN_DIR . '/Minify/Logger.php'; if (true === $config['errorLogger']) { //require _once MINIFY_MIN_DIR . '/FirePHP.php'; Minify_Logger::setLogger(FirePHP::getInstance(true)); } else { Minify_Logger::setLogger($config['errorLogger']); } } // check for URI versioning if (preg_match('/&\\d/', $_SERVER['QUERY_STRING'])) { $config['serveOptions']['maxAge'] = 31536000; } if (isset($_GET['g'])) { // well need groups config $config['serveOptions']['minApp']['groups'] = $config['groupsConfig']; } if (isset($_GET['f']) || isset($_GET['g'])) { // serve! Minify::serve('MinApp', $config['serveOptions']); exit; } }
public function serve_css($files) { $opt = array('files' => $this->get_css_files($files), 'contentTypeCharset' => $this->charset); /* * Bazı sunucularda fpassthru engelli olduğundan problem çıkarabiliyor. * Bu durumda fonksiyonun kullanıldığı filelocking seçeneğini FALSE gönderiyoruz. * Bu işlemi de function_exists(fpassthru) ile otomatik yapıyoruz. */ Minify::setCache($this->cache_path, function_exists('fpassthru')); Minify::serve('Files', $opt); }
/** * Set up groups of files as sources * * @param array $options controller and Minify options * @return array Minify options * */ public function setupSources($options) { // PHP insecure by default: realpath() and other FS functions can't handle null bytes. if (isset($_GET['files'])) { $_GET['files'] = str_replace("", '', (string) $_GET['files']); } self::_setupDefines(); if (MINIFY_USE_CACHE) { $cacheDir = defined('MINIFY_CACHE_DIR') ? MINIFY_CACHE_DIR : ''; 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 Minify_Source($srcOptions); } else { $hasBadSource = true; break; } } if ($hasBadSource) { $this->sources = array(); } if (!MINIFY_REWRITE_CSS_URLS) { $options['rewriteCssUris'] = false; } return $options; }
public function after() { if ($this->auto_render) { $styles = array('base.css', 'master.css'); $scripts = array('jquery-1.4.1.js'); $this->template->styles = array_merge($styles, $this->template->styles); $this->template->scripts = array_merge($scripts, $this->template->scripts); $this->template->styles = Minify::factory('css')->minify($this->template->styles); $this->template->scripts = Minify::factory('js')->minify($this->template->scripts); } parent::after(); }
/** * Runs minify */ function process() { require_once W3TC_LIB_MINIFY_DIR . '/Minify.php'; require_once W3TC_LIB_MINIFY_DIR . '/HTTP/Encoder.php'; HTTP_Encoder::$encodeToIe6 = $this->_config->get_boolean('minify.comprss.ie6'); Minify::$uploaderHoursBehind = $this->_config->get_integer('minify.fixtime'); Minify::setCache($this->_get_cache()); $serve_options = $this->_config->get_array('minify.options'); $serve_options['maxAge'] = $this->_config->get_integer('minify.maxage'); $serve_options['encodeOutput'] = $this->_config->get_boolean('minify.compress'); $serve_options['postprocessor'] = array(&$this, 'postprocessor'); if (stripos(PHP_OS, 'win') === 0) { Minify::setDocRoot(); } foreach ($this->_config->get_array('minify.symlinks') as $link => $target) { $link = str_replace('//', realpath($_SERVER['DOCUMENT_ROOT']), $link); $link = strtr($link, '/', DIRECTORY_SEPARATOR); $serve_options['minifierOptions']['text/css']['symlinks'][$link] = realpath($target); } if ($this->_config->get_boolean('minify.debug')) { $serve_options['debug'] = true; } if ($this->_config->get('minify.debug')) { require_once W3TC_LIB_MINIFY_DIR . '/Minify/Logger.php'; Minify_Logger::setLogger($this); } if (isset($_GET['f']) || isset($_GET['gg']) && isset($_GET['g']) && isset($_GET['t'])) { if (isset($_GET['gg']) && isset($_GET['g']) && isset($_GET['t'])) { $serve_options['minApp']['groups'] = $this->get_groups($_GET['gg'], $_GET['t']); if ($_GET['t'] == 'js' && (in_array($_GET['g'], array('include', 'include-nb')) && $this->_config->get_boolean('minify.js.combine.header') || in_array($_GET['g'], array('include-footer', 'include-footer-nb')) && $this->_config->get_boolean('minify.js.combine.footer'))) { $serve_options['minifiers']['application/x-javascript'] = array($this, 'minify_stub'); } /** * Setup user-friendly cache ID for disk cache */ if ($this->_config->get_string('minify.engine') == 'file') { $cacheId = sprintf('%s.%s.%s', $_GET['gg'], $_GET['g'], $_GET['t']); Minify::setCacheId($cacheId); } } @header('Pragma: public'); try { Minify::serve('MinApp', $serve_options); } catch (Exception $exception) { printf('<strong>W3 Total Cache Error:</strong> Minify error: %s', $exception->getMessage()); } } else { die('This file cannot be accessed directly'); } }
/** * Generate minified HTML code * * @param string $content * @param array $options * * - `html` - boolean - Minify HTML code * - `js` - boolean - Minify JS * - `css` - boolean - Minify CSS * * @return string modified content if avaible, otherwise origin content */ public static function minify($content, $options = array()) { $options += array('html' => true, 'js' => true, 'css' => true); $minifyOptions = array(); if ($options['html'] === true) { App::uses('Minify', 'Tidy.Vendor/Minify'); $minifyOptions['xhtml'] = false; if ($options['js'] === true) { App::uses('JSMin', 'Tidy.Vendor/Minify'); $minifyOptions['jsMinifier'] = array("JSMin", "minify"); } if ($options['css'] === true) { App::uses('Minify_CSS', 'Tidy.Vendor/Minify'); $minifyOptions['cssMinifier'] = array("Minify_CSS", "minify"); } $Minify = new Minify(); $minified = $Minify->process($content, $minifyOptions); if (!empty($minified)) { return $minified; } } return $content; }
function test_Lines() { global $thisDir; $exp = file_get_contents("{$thisDir}/_test_files/minify/lines_output.js"); Minify::setCache(null); // no cache $ret = Minify::serve('Files', array('debug' => true, 'quiet' => true, 'encodeOutput' => false, 'files' => array("{$thisDir}/_test_files/minify/email.js", "{$thisDir}/_test_files/minify/lines_bugs.js", "{$thisDir}/_test_files/minify/QueryString.js", "{$thisDir}/_test_files/js/before.js"))); $passed = assertTrue($exp === $ret['content'], 'Minify_Lines'); if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) { echo "\n---Output: " . countBytes($ret['content']) . " bytes\n\n{$ret['content']}\n\n"; if (!$passed) { echo "---Expected: " . countBytes($exp) . " bytes\n\n{$exp}\n\n\n"; } } }
public function get() { $_assetsList = array(); for ($i = 0; $i < count($this->assetsList); $i++) { if (file_exists(PUBLIC_PATH . 'css/' . $this->assetsList[$i])) { $_assetsList[] = '//css/' . $this->assetsList[$i]; } } unset($this->assetsList); if (count($_assetsList) > 0) { $options = array('files' => $_assetsList, 'maxAge' => \Application::$config['assets']['maxAge'], 'debug' => \Application::$config['assets']['debug']); \Minify::serve('Files', $options); unset($options); } }
/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $container = $this->getContainer(); $assetHelper = $container->get('mautic.helper.assetgeneration'); $factory = $container->get('mautic.factory'); // Combine and minify bundle assets $assetHelper->getAssets(true); // Minify Mautic Form SDK file_put_contents($factory->getSystemPath('assets') . '/js/mautic-form.js', \Minify::combine(array($factory->getSystemPath('assets') . '/js/mautic-form-src.js'))); /** @var \Symfony\Bundle\FrameworkBundle\Translation\Translator $translator */ $translator = $this->getContainer()->get('translator'); $translator->setLocale($this->getContainer()->get('mautic.factory')->getParameter('locale')); // Update successful $output->writeln('<info>' . $translator->trans('mautic.core.command.asset_generate_success') . '</info>'); return 0; }
public function serve() { // Adapted from index.php and config.php in the Minify distribution $min_serveOptions = array(); $min_uploaderHoursBehind = isset($this->_config['min_uploaderHoursBehind']) ? $this->_config['min_uploaderHoursBehind'] : 0; Minify::$uploaderHoursBehind = $min_uploaderHoursBehind; $min_cacheFileLocking = isset($this->_config['min_cacheFileLocking']) ? $this->_config['min_cacheFileLocking'] : true; $min_cachePath = $this->_config['cache_dir']; Minify::setCache($min_cachePath, $min_cacheFileLocking); $min_symlinks = isset($this->_config['min_symlinks']) ? $this->_config['min_symlinks'] : array(); foreach ($min_symlinks as $link => $target) { $link = str_replace('//', realpath($_SERVER['DOCUMENT_ROOT']), $link); $link = strtr($link, '/', DIRECTORY_SEPARATOR); $min_serveOptions['minifierOptions']['text/css']['symlinks'][$link] = realpath($target); } $min_serveOptions['minifierOptions']['text/css']['symlinks'] = $min_symlinks; if (isset($this->_config['debug_minify_logger'])) { require_once 'Minify/Logger.php'; if (true === $this->_config['debug_minify_logger']) { require_once 'FirePHP.php'; Minify_Logger::setLogger(FirePHP::getInstance(true)); } else { Minify_Logger::setLogger($this->_config['debug_minify_logger']); } } // check for URI versioning if (!empty($this->_version)) { $min_serveOptions['maxAge'] = 31536000; } else { # don't cache if we are not using a version number $min_serveOptions['maxAge'] = 0; } $min_serveOptions['swift']['files'] = array(); foreach ($this->_current_modules as $module) { if (!empty($this->_config['debug_use_alt_resources']) && !empty($this->_config['modules'][$module]['debug_path'])) { $min_serveOptions['swift']['files'][] = $this->_config['modules'][$module]['debug_path']; } else { $min_serveOptions['swift']['files'][] = $this->_config['modules'][$module]['path']; } } # check what format we're working on by looking at the extension on the first file # if we are in debug mode for the current type of files use Minify's debug mode if (!empty($this->_config['debug_minify_js_off']) && pathinfo($min_serveOptions['swift']['files'][0], PATHINFO_EXTENSION) == 'js' || !empty($this->_config['debug_minify_css_off']) && pathinfo($min_serveOptions['swift']['files'][0], PATHINFO_EXTENSION) == 'css') { $min_serveOptions['debug'] = true; } Minify::serve('Swift', $min_serveOptions); }
public static function serve() { // try to disable output_compression (may not have an effect) ini_set('zlib.output_compression', '0'); Minify::setCache(OX_PATH . '/var/cache', true); if (isset($_GET['g'])) { // serve! $options = array(); $options['minApp']['groupsOnly'] = true; $options['rewriteCssUris'] = false; $options['minApp']['groups'] = self::prepareGroups(); Minify::serve('MinApp', $options); } else { header("Location: /"); exit; } }
public function action_template_header() { $modified = Stack::get_sorted_stack('template_header_javascript'); foreach ($modified as $key => $value) { Stack::remove('template_header_javascript', $key); } Stack::add('template_header_javascript', Site::get_url('user') . "/files/minified.js", 'Minified'); if (!Cache::has(self::$cache_name . '_js') || !Cache::has(self::$cache_name . '_css')) { set_include_path(dirname(__FILE__) . '/min/lib' . PATH_SEPARATOR . get_include_path()); require_once 'Minify/Source.php'; require_once 'Minify/HTML.php'; require_once 'Minify/CSS.php'; require_once 'Minify/HTML.php'; require_once 'Minify.php'; require_once 'Minify/Cache/File.php'; } if (!Cache::has(self::$cache_name . '_js')) { $js_stack = array(); foreach ($modified as $js) { $js_stack[] = Site::get_path('base') . str_replace(Site::get_url('habari') . '/', '', $js); } $options = array('files' => $js_stack, 'encodeOutput' => false, 'quiet' => true, 'maxAge' => 86400); $result = Minify::serve('Files', $options); file_put_contents(site::get_dir('user') . '/files/minified.js', $result['content']); Cache::set(self::$cache_name . '_js', 'true'); } /* CSS */ $modified = Stack::get_sorted_stack('template_stylesheet'); $tmp = array(); foreach ($modified as $key => $value) { $tmp[] = $value[0]; Stack::remove('template_stylesheet', $key); } Stack::add('template_stylesheet', array(Site::get_url('user') . "/files/minified.css", 'screen'), 'style'); if (!Cache::has(self::$cache_name . '_css')) { $css_stack = array(); foreach ($tmp as $css) { $css_stack[] = Site::get_path('base') . str_replace(Site::get_url('habari') . '/', '', $css); } $options = array('files' => $css_stack, 'encodeOutput' => false, 'quiet' => true, 'maxAge' => 86400); // handle request $result = Minify::serve('Files', $options); file_put_contents(site::get_dir('user') . '/files/minified.css', $result['content']); Cache::set(self::$cache_name . '_css', 'true'); } }
function minify($files) { global $CFG; $cachedir = $CFG->cachedir . '/js'; // make sure the cache dir exist if (!file_exists($cachedir)) { @mkdir($cachedir, $CFG->directorypermissions, true); } if (0 === stripos(PHP_OS, 'win')) { Minify::setDocRoot(); // IIS may need help } Minify::setCache($cachedir, true); $options = array('maxAge' => 60 * 60 * 24 * 20, 'files' => $files); Minify::serve('Files', $options); die; }
public function action_index() { $group = $this->request->param('group'); if (!empty($group)) { $_GET['g'] = $group; } $config = Kohana::$config->load('minify'); Minify::$uploaderHoursBehind = $config['uploaderHoursBehind']; Minify::setCache(isset($config['cachePath']) ? $config['cachePath'] : '', $config['cacheFileLocking']); if ($config['documentRoot']) { $_SERVER['DOCUMENT_ROOT'] = $config['documentRoot']; Minify::$isDocRootSet = TRUE; } $serve_options = $config['serveOptions']; $serve_options['minifierOptions']['text/css']['symlinks'] = $config['symlinks']; foreach ($config['symlinks'] as $uri => $target) { $serve_options['minApp']['allowDirs'][] = $target; } if ($config['allowDebugFlag']) { $serve_options['debug'] = Minify_DebugDetector::shouldDebugRequest($_COOKIE, $_GET, $_SERVER['REQUEST_URI']); } if ($config['errorLogger']) { if (TRUE === $config['errorLogger']) { Minify_Logger::setLogger(FirePHP::getInstance(true)); } else { Minify_Logger::setLogger($config['errorLogger']); } } // Check for URI versioning if (preg_match('/&\\d/', Arr::get($_SERVER, 'QUERY_STRING'))) { $serve_options['maxAge'] = 31536000; } if (isset($_GET['g'])) { // well need groups config $serve_options['minApp']['groups'] = $config['groupsConfig']; } if (isset($_GET['f']) or isset($_GET['g'])) { $response = Minify::serve(new Minify_Controller_MinApp(), array('quiet' => TRUE) + $serve_options); $this->response->headers($response['headers'])->status($response['statusCode'])->body($response['content']); } }
/** * @param string $id * @param string $script * @param bool|string $cacheKey * @param null $position * @param array $htmlOptions * @return MinifyClientScript */ public function registerScriptCache($id, $script, $cacheKey = false, $position = null, array $htmlOptions = array()) { $script = self::registerScript($id, $script, $position, $htmlOptions); if (!$cacheKey) { return $script; } $files = array(); $path = Yii::getPathOfAlias('webroot.assets') . '/' . $cacheKey; @mkdir($path); @chmod($path, 0777); foreach ($script->scripts as $scriptKey => $scriptVal) { foreach ($scriptVal as $scriptItemKey => $scriptItem) { $file = $id . '.js'; file_put_contents($path . '/' . $file, $scriptItem); @chmod($file, 0777); $files[] = $path . '/' . $file; } } $file = $cacheKey . '.js'; file_put_contents($path . '/' . $file, Minify::combine($files)); return self::registerScriptFile('/assets/' . $cacheKey . '/' . $file); }
public function action_index() { extract(Kohana::$config->load('minify')->as_array(), EXTR_SKIP); if ($this->request->param('group')) { $_GET['g'] = $this->request->param('group'); } Minify::$uploaderHoursBehind = $uploaderHoursBehind; Minify::setCache(isset($cachePath) ? $cachePath : '', $cacheFileLocking); if ($documentRoot) { $_SERVER['DOCUMENT_ROOT'] = $documentRoot; Minify::$isDocRootSet = TRUE; } $serveOptions['minifierOptions']['text/css']['symlinks'] = $symlinks; $serveOptions['minApp']['allowDirs'] += array_values($symlinks); if ($allowDebugFlag) { $serveOptions['debug'] = Minify_DebugDetector::shouldDebugRequest($_COOKIE, $_GET, $_SERVER['REQUEST_URI']); } if ($errorLogger) { if (TRUE === $errorLogger) { $errorLogger = FirePHP::getInstance(TRUE); } Minify_Logger::setLogger($errorLogger); } // Check for URI versioning if (preg_match('/&\\d/', $_SERVER['QUERY_STRING'])) { $serveOptions['maxAge'] = 31536000; } if (isset($_GET['g'])) { // Well need groups config $serveOptions['minApp']['groups'] = $groupsConfig; } if (isset($_GET['f']) or isset($_GET['g'])) { set_time_limit(0); // Serve! $response = Minify::serve(new Minify_Controller_MinApp(), array('quiet' => TRUE) + $serveOptions); $this->response->headers($response['headers'])->body($response['content'])->status($response['statusCode']); } }
function minify($files) { global $CFG; $cachedir = $CFG->cachedir . '/js'; // make sure the cache dir exist if (!file_exists($cachedir)) { @mkdir($cachedir, $CFG->directorypermissions, true); } if (0 === stripos(PHP_OS, 'win')) { Minify::setDocRoot(); // IIS may need help } Minify::setCache($cachedir, true); $options = array('maxAge' => 60 * 60 * 24 * 20, 'files' => $files); try { Minify::serve('Files', $options); die; } catch (Exception $e) { $error = $e->getMessage(); $error = str_replace("\r", ' ', $error); $error = str_replace("\n", ' ', $error); } // minification failed - try to inform the developer and include the non-minified version $js = <<<EOD try {console.log('Error: Minimisation of javascript failed!');} catch (e) {} // Error: {$error} // Problem detected during javascript minimisation, please review the following code // ================================================================================= EOD; echo $js; foreach ($files as $jsfile) { echo file_get_contents($jsfile) . "\n"; } }
/** * Runs minify * * @param string|null $file * * @return void */ function process($file = NULL) { w3_require_once(W3TC_LIB_W3_DIR . '/Request.php'); /** * Check for rewrite test request */ $rewrite_test = W3_Request::get_boolean('w3tc_rewrite_test'); if ($rewrite_test) { echo 'OK'; exit; } $rewrite_test = W3_Request::get_string('test_file'); if ($rewrite_test) { $cache = $this->_get_cache(); header('Content-type: text/css'); if ($cache->store(basename($rewrite_test), 'content ok')) { if (function_exists('gzencode') && $this->_config->get_boolean('browsercache.enabled') && $this->_config->get_boolean('browsercache.cssjs.compression')) { if (!$cache->store(basename($rewrite_test) . '.gzip', gzencode('content ok'))) { echo 'error storing'; exit; } } if ($this->_config->get_string('minify.engine') != 'file') { if ($cache->fetch(basename($rewrite_test)) == 'content ok') { echo 'content ok'; } else { echo 'error storing'; } } else { echo 'retry'; } } else { echo 'error storing'; } exit; } if (is_null($file)) { $file = W3_Request::get_string('file'); } if (!$file) { $this->error('File param is missing', false); return; } // remove blog_id $levels = ''; if (defined('W3TC_BLOG_LEVELS')) { for ($n = 0; $n < W3TC_BLOG_LEVELS; $n++) { $levels .= '[0-9]+\\/'; } } if (preg_match('~^(' . $levels . '[0-9]+)\\/(.+)$~', $file, $matches)) { $file = $matches[2]; } // parse file $hash = ''; $matches = null; $location = ''; $type = ''; if (preg_match('~^' . MINIFY_AUTO_FILENAME_REGEX . '$~', $file, $matches)) { list(, $hash, $type) = $matches; } elseif (preg_match('~^' . MINIFY_MANUAL_FILENAME_REGEX . '$~', $file, $matches)) { list(, $theme, $template, $location, , , $type) = $matches; } else { $this->error(sprintf('Bad file param format: "%s"', $file), false); return; } w3_require_once(W3TC_LIB_MINIFY_DIR . '/Minify.php'); w3_require_once(W3TC_LIB_MINIFY_DIR . '/HTTP/Encoder.php'); /** * Fix DOCUMENT_ROOT */ $_SERVER['DOCUMENT_ROOT'] = w3_get_document_root(); /** * Set cache engine */ Minify::setCache($this->_get_cache()); /** * Set cache ID */ $cache_id = $this->get_cache_id($file); Minify::setCacheId($cache_id); /** * Set logger */ w3_require_once(W3TC_LIB_MINIFY_DIR . '/Minify/Logger.php'); Minify_Logger::setLogger(array(&$this, 'error')); /** * Set options */ $browsercache = $this->_config->get_boolean('browsercache.enabled'); $serve_options = array_merge($this->_config->get_array('minify.options'), array('debug' => $this->_config->get_boolean('minify.debug'), 'maxAge' => $this->_config->get_integer('browsercache.cssjs.lifetime'), 'encodeOutput' => $browsercache && $this->_config->get_boolean('browsercache.cssjs.compression'), 'bubbleCssImports' => $this->_config->get_string('minify.css.imports') == 'bubble', 'processCssImports' => $this->_config->get_string('minify.css.imports') == 'process', 'cacheHeaders' => array('use_etag' => $browsercache && $this->_config->get_boolean('browsercache.cssjs.etag'), 'expires_enabled' => $browsercache && $this->_config->get_boolean('browsercache.cssjs.expires'), 'cacheheaders_enabled' => $browsercache && $this->_config->get_boolean('browsercache.cssjs.cache.control'), 'cacheheaders' => $this->_config->get_string('browsercache.cssjs.cache.policy')))); /** * Set sources */ if ($hash) { $_GET['f'] = $this->get_custom_files($hash, $type); } else { $_GET['g'] = $location; $serve_options['minApp']['groups'] = $this->get_groups($theme, $template, $type); } /** * Set minifier */ $w3_minifier = w3_instance('W3_Minifier'); if ($type == 'js') { $minifier_type = 'application/x-javascript'; switch (true) { case ($hash || $location == 'include') && $this->_config->get_boolean('minify.js.combine.header'): case $location == 'include-body' && $this->_config->get_boolean('minify.js.combine.body'): case $location == 'include-footer' && $this->_config->get_boolean('minify.js.combine.footer'): $engine = 'combinejs'; break; default: $engine = $this->_config->get_string('minify.js.engine'); if (!$w3_minifier->exists($engine) || !$w3_minifier->available($engine)) { $engine = 'js'; } break; } } elseif ($type == 'css') { $minifier_type = 'text/css'; if (($hash || $location == 'include') && $this->_config->get_boolean('minify.css.combine')) { $engine = 'combinecss'; } else { $engine = $this->_config->get_string('minify.css.engine'); if (!$w3_minifier->exists($engine) || !$w3_minifier->available($engine)) { $engine = 'css'; } } } /** * Initialize minifier */ $w3_minifier->init($engine); $serve_options['minifiers'][$minifier_type] = $w3_minifier->get_minifier($engine); $serve_options['minifierOptions'][$minifier_type] = $w3_minifier->get_options($engine); /** * Send X-Powered-By header */ if ($browsercache && $this->_config->get_boolean('browsercache.cssjs.w3tc')) { @header('X-Powered-By: ' . W3TC_POWERED_BY); } /** * Minify! */ try { Minify::serve('MinApp', $serve_options); } catch (Exception $exception) { $this->error($exception->getMessage()); } if (!$this->_error_occurred && $this->_config_admin->get_boolean('notes.minify_error')) { $error_file = $this->_config_admin->get_string('minify.error.file'); if ($error_file == $file) { $this->_config_admin->set('notes.minify_error', false); $this->_config_admin->save(); } } }
/** * check_files_folders * This checks for filer or folders existence * If the folder doesn't exists the script will attempt to create it. */ function check_files_folders($elements, $type) { global $install_errors; $type = strtolower($type); foreach ($elements as $element) { if ($type == 'directory') { @mkdir($element); } if (preg_match('/.+\\.min\\.(js|css)$/i', $element)) { if (conditional_config('minify') && !file_exists($element)) { require_once __CHV_PATH_CLASSES__ . 'class.minify.php'; $minify = new Minify(); try { $minify->addSource(preg_replace('/(.+)\\.min(\\.(js|css))$/i', '$1$2', $element)); $minify->exec(); } catch (MinifyException $e) { if (conditional_config('error_reporting')) { debug($e->getMessage()); } } } } if (!file_exists($element)) { $install_errors[] = '<code>' . absolute_to_relative($element) . '</code>'; } } if (count($install_errors) == 0) { return true; } }
public function save($content, $path) { $content = '<?php if(extension_loaded(\'zlib\')){ ob_start(\'ob_gzhandler\'); } header ("content-type: text/javascript; charset: utf-8"); header ("cache-control: must-revalidate"); $last_modified_time = filemtime(__FILE__); header("Last-Modified: ".date("D, d M Y H:i:s", $last_modified_time)." GMT"); $offset = 60 * 60 * 24 * 7; $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT"; header ($expire); ?> ' . $content . ' <?php if(extension_loaded(\'zlib\')){ ob_end_flush(); }?>'; parent::save($content, $path); }
/** * Set $_SERVER['DOCUMENT_ROOT']. On IIS, the value is created from SCRIPT_FILENAME and SCRIPT_NAME. * * @param string $docRoot value to use for DOCUMENT_ROOT */ public static function setDocRoot($docRoot = '') { self::$isDocRootSet = true; if ($docRoot) { $_SERVER['DOCUMENT_ROOT'] = $docRoot; } elseif (isset($_SERVER['SERVER_SOFTWARE']) && 0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/')) { $_SERVER['DOCUMENT_ROOT'] = substr($_SERVER['SCRIPT_FILENAME'], 0, strlen($_SERVER['SCRIPT_FILENAME']) - strlen($_SERVER['SCRIPT_NAME'])); $_SERVER['DOCUMENT_ROOT'] = rtrim($_SERVER['DOCUMENT_ROOT'], '\\'); } }
/** * Generates and returns assets * * @param bool $forceRegeneration * * @return array */ public function getAssets($forceRegeneration = false) { static $assets = array(); if (empty($assets)) { $loadAll = true; $env = $forceRegeneration ? 'prod' : $this->factory->getEnvironment(); $rootPath = $this->factory->getSystemPath('assets_root'); $assetsPath = $this->factory->getSystemPath('assets'); $assetsFullPath = "{$rootPath}/{$assetsPath}"; if ($env == 'prod') { $loadAll = false; //by default, loading should not be required //check for libraries and app files and generate them if they don't exist if in prod environment $prodFiles = array('css/libraries.css', 'css/app.css', 'js/libraries.js', 'js/app.js'); foreach ($prodFiles as $file) { if (!file_exists("{$assetsFullPath}/{$file}")) { $loadAll = true; //it's missing so compile it break; } } } if ($loadAll || $forceRegeneration) { if ($env == 'prod') { ini_set('max_execution_time', 300); $inProgressFile = "{$assetsFullPath}/generation_in_progress.txt"; if (!$forceRegeneration) { while (file_exists($inProgressFile)) { //dummy loop to prevent conflicts if one process is actively regenerating assets } } file_put_contents($inProgressFile, date('r')); } $modifiedLast = array(); //get a list of all core asset files $bundles = $this->factory->getParameter('bundles'); $fileTypes = array('css', 'js'); foreach ($bundles as $bundle) { foreach ($fileTypes as $ft) { if (!isset($modifiedLast[$ft])) { $modifiedLast[$ft] = array(); } $dir = "{$bundle['directory']}/Assets/{$ft}"; if (file_exists($dir)) { $modifiedLast[$ft] = array_merge($modifiedLast[$ft], $this->findAssets($dir, $ft, $env, $assets)); } } } $modifiedLast = array_merge($modifiedLast, $this->findOverrides($env, $assets)); //combine the files into their corresponding name and put in the root media folder if ($env == "prod") { $checkPaths = array($assetsFullPath, "{$assetsFullPath}/css", "{$assetsFullPath}/js"); array_walk($checkPaths, function ($path) { if (!file_exists($path)) { mkdir($path); } }); $useMinify = class_exists('\\Minify'); foreach ($assets as $type => $groups) { foreach ($groups as $group => $files) { $assetFile = "{$assetsFullPath}/{$type}/{$group}.{$type}"; //only refresh if a change has occurred $modified = $forceRegeneration || !file_exists($assetFile) ? true : filemtime($assetFile) < $modifiedLast[$type][$group]; if ($modified) { if (file_exists($assetFile)) { //delete it unlink($assetFile); } if ($type == 'css') { $out = fopen($assetFile, 'w'); foreach ($files as $relPath => $details) { $cssRel = '../../' . dirname($relPath) . '/'; if ($useMinify) { $content = \Minify::combine(array($details['fullPath']), array('rewriteCssUris' => false, 'minifierOptions' => array('text/css' => array('currentDir' => '', 'prependRelativePath' => $cssRel)))); } else { $content = file_get_contents($details['fullPath']); $search = '#url\\((?!\\s*([\'"]?(((?:https?:)?//)|(?:data\\:?:))))\\s*([\'"])?#'; $replace = "url(\$4{$cssRel}"; $content = preg_replace($search, $replace, $content); } fwrite($out, $content); } fclose($out); } else { array_walk($files, function (&$file) { $file = $file['fullPath']; }); file_put_contents($assetFile, \Minify::combine($files)); } } } } unlink($inProgressFile); } } if ($env == 'prod') { //return prod generated assets $assets = array('css' => array("{$assetsPath}/css/libraries.css?v{$this->version}", "{$assetsPath}/css/app.css?v{$this->version}"), 'js' => array("{$assetsPath}/js/libraries.js?v{$this->version}", "{$assetsPath}/js/app.js?v{$this->version}")); } else { foreach ($assets as $type => &$typeAssets) { $typeAssets = array_keys($typeAssets); } } } return $assets; }