示例#1
0
 /**
  * Minify JS.
  * 
  * @param string|array $source_filename
  * @param string $target_filename
  * @return bool
  */
 public static function minifyJS($source_filename, $target_filename)
 {
     $minifier = new \MatthiasMullie\Minify\JS();
     if (is_array($source_filename)) {
         foreach ($source_filename as $filename) {
             $minifier->add($filename);
         }
     } else {
         $minifier->add($source_filename);
     }
     $content = $minifier->execute($target_filename);
     Storage::write($target_filename, $content);
     return strlen($content) ? true : false;
 }
 /**
  * Get file information
  *
  * @param string $fileName The file name
  * @param string $targetIe Target IE of file
  * @param string $media Media of file
  * @param bool $forceMinify Whether this file should be minified
  * @return stdClass The file information
  */
 private function getFileInfo($fileName, $targetIe = '', $media = 'all', $forceMinify = false)
 {
     static $existsInfo = array();
     if (self::$minify === null) {
         self::$minify = Context::getDBInfo()->minify_scripts ?: 'common';
     }
     if (isset($existsInfo[$existsKey])) {
         return $existsInfo[$existsKey];
     }
     $pathInfo = pathinfo($fileName);
     $file = new stdClass();
     $file->fileName = $pathInfo['basename'];
     $file->filePath = $this->_getAbsFileUrl($pathInfo['dirname']);
     $file->fileRealPath = FileHandler::getRealPath($pathInfo['dirname']);
     $file->fileExtension = strtolower($pathInfo['extension']);
     if (preg_match('/^(.+)\\.min$/', $pathInfo['filename'], $matches)) {
         $file->fileNameNoExt = $matches[1];
         $file->isMinified = true;
     } else {
         $file->fileNameNoExt = $pathInfo['filename'];
         $file->isMinified = false;
     }
     $file->isExternalURL = preg_match('@^(https?:)?//@i', $file->filePath) ? true : false;
     $file->isCachedScript = !$file->isExternalURL && strpos($file->filePath, 'files/cache/') !== false;
     $file->keyName = $file->fileNameNoExt . '.' . $file->fileExtension;
     $file->cdnPath = $this->_normalizeFilePath($pathInfo['dirname']);
     $originalFilePath = $file->fileRealPath . '/' . $pathInfo['basename'];
     // Fix incorrectly minified URL
     if ($file->isMinified && !$file->isExternalURL && (!file_exists($originalFilePath) || is_link($originalFilePath) || filesize($originalFilePath) < 32 && trim(file_get_contents($originalFilePath)) === $file->keyName)) {
         if (file_exists($file->fileRealPath . '/' . $file->fileNameNoExt . '.' . $file->fileExtension)) {
             $file->fileName = $file->fileNameNoExt . '.' . $file->fileExtension;
             $file->isMinified = false;
             $originalFilePath = $file->fileRealPath . '/' . $file->fileNameNoExt . '.' . $file->fileExtension;
         }
     }
     // Decide whether to minify this file
     if (self::$minify === 'all') {
         $minify_enabled = true;
     } elseif (self::$minify === 'none') {
         $minify_enabled = false;
     } else {
         $minify_enabled = $forceMinify;
     }
     // Minify file
     if ($minify_enabled && !$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && strpos($file->filePath, 'common/js/plugins') === false) {
         if (($file->fileExtension === 'css' || $file->fileExtension === 'js') && file_exists($originalFilePath)) {
             $minifiedFileName = $file->fileNameNoExt . '.min.' . $file->fileExtension;
             $minifiedFileHash = ltrim(str_replace(array('/', '\\'), '.', $pathInfo['dirname']), '.');
             $minifiedFilePath = _XE_PATH_ . 'files/cache/minify/' . $minifiedFileHash . '.' . $minifiedFileName;
             if (!file_exists($minifiedFilePath) || filemtime($minifiedFilePath) < filemtime($originalFilePath)) {
                 if ($file->fileExtension === 'css') {
                     $minifier = new MatthiasMullie\Minify\CSS($originalFilePath);
                     $content = $minifier->execute($minifiedFilePath);
                 } else {
                     $minifier = new MatthiasMullie\Minify\JS($originalFilePath);
                     $content = $minifier->execute($minifiedFilePath);
                 }
                 FileHandler::writeFile($minifiedFilePath, $content);
             }
             $file->fileName = $minifiedFileHash . '.' . $minifiedFileName;
             $file->filePath = $this->_getAbsFileUrl('./files/cache/minify');
             $file->fileRealPath = _XE_PATH_ . 'files/cache/minify';
             $file->keyName = $minifiedFileHash . '.' . $file->fileNameNoExt . '.' . $file->fileExtension;
             $file->cdnPath = $this->_normalizeFilePath('./files/cache/minify');
             $file->isMinified = true;
         }
     }
     // Process targetIe and media attributes
     $file->targetIe = $targetIe;
     if ($file->fileExtension == 'css') {
         $file->media = $media;
         if (!$file->media) {
             $file->media = 'all';
         }
         $file->key = $file->filePath . $file->keyName . "\t" . $file->targetIe . "\t" . $file->media;
     } else {
         if ($file->fileExtension == 'js') {
             $file->key = $file->filePath . $file->keyName . "\t" . $file->targetIe;
         }
     }
     return $file;
 }
示例#3
0
 /**
  * import common .js and .css files for (both desktop and mobile)
  */
 private function _loadCommonJSCSS()
 {
     Context::loadFile(array('./common/css/xe.css', '', '', -1600000), true);
     $original_file_list = array('x', 'common', 'js_app', 'xml_handler', 'xml_js_filter');
     $jquery_version = preg_match('/MSIE [5-8]\\./', $_SERVER['HTTP_USER_AGENT']) ? '1.11.3' : '2.1.4';
     if (config('view.minify_scripts') === 'none') {
         Context::loadFile(array('./common/js/jquery-' . $jquery_version . '.js', 'head', '', -1730000), true);
         Context::loadFile(array('./common/js/plugins/jquery.migrate/jquery-migrate-1.2.1.js', 'head', '', -1720000), true);
         foreach ($original_file_list as $filename) {
             Context::loadFile(array('./common/js/' . $filename . '.js', 'head', '', -1700000), true);
         }
     } else {
         Context::loadFile(array('./common/js/jquery-' . $jquery_version . '.min.js', 'head', '', -1730000), true);
         Context::loadFile(array('./common/js/plugins/jquery.migrate/jquery-migrate-1.2.1.min.js', 'head', '', -1720000), true);
         $concat_target_filename = 'files/cache/minify/xe.min.js';
         if (file_exists(_XE_PATH_ . $concat_target_filename)) {
             $concat_target_mtime = filemtime(_XE_PATH_ . $concat_target_filename);
             $original_mtime = 0;
             foreach ($original_file_list as $filename) {
                 $original_mtime = max($original_mtime, filemtime(_XE_PATH_ . 'common/js/' . $filename . '.js'));
             }
             if ($concat_target_mtime > $original_mtime) {
                 Context::loadFile(array('./' . $concat_target_filename, 'head', '', -100000), true);
                 return;
             }
         }
         $minifier = new MatthiasMullie\Minify\JS();
         foreach ($original_file_list as $filename) {
             $minifier->add(_XE_PATH_ . 'common/js/' . $filename . '.js');
         }
         FileHandler::writeFile(_XE_PATH_ . $concat_target_filename, $minifier->execute());
         Context::loadFile(array('./' . $concat_target_filename, 'head', '', -100000), true);
     }
 }