public static function url($files) { $ident = self::ident($files); if (!\SYSTEM\CACHE\cache_js::get($ident)) { \LIB\lib_minify::php(); $minifier = new \MatthiasMullie\Minify\JS(); foreach ($files as $f) { $minifier->add($f->SERVERPATH()); } \SYSTEM\CACHE\cache_js::put($ident, $minifier->minify()); } return './api.php?call=cache&id=' . self::CACHE_JS . '&ident=' . $ident; }
public static function createConfigJs($objConfig, $debug = false) { if (!static::isJQueryEnabled()) { return false; } $cache = !$GLOBALS['TL_CONFIG']['debugMode']; $objT = new \FrontendTemplate('jquery.slick'); $arrData = static::createConfig($objConfig); $objT->setData($arrData['config']); $objT->config = static::createConfigJSON($objConfig); $objT->selector = static::getSlickContainerSelectorFromModel($objConfig); $objT->wrapperClass = static::getSlickCssClassFromModel($objConfig); if ($objConfig->initCallback) { $objT->initCallback = $objConfig->initCallback; } if ($objConfig->afterInitCallback) { $objT->afterInitCallback = $objConfig->afterInitCallback; } $strFile = 'assets/js/' . $objT->wrapperClass . '.js'; $strFileMinified = 'assets/js/' . $objT->wrapperClass . '.min.js'; $objFile = new \File($strFile, file_exists(TL_ROOT . '/' . $strFile)); $objFileMinified = new \File($strFileMinified, file_exists(TL_ROOT . '/' . $strFileMinified)); $minify = $cache && class_exists('\\MatthiasMullie\\Minify\\JS'); // simple file caching if (static::doRewrite($objConfig, $objFile, $objFileMinified, $cache, $debug)) { $strChunk = $objT->parse(); $objFile->write($objT->parse()); $objFile->close(); // minify js if ($minify) { $objFileMinified = new \File($strFileMinified); $objMinify = new \MatthiasMullie\Minify\JS(); $objMinify->add($strChunk); $objFileMinified->write(rtrim($objMinify->minify(), ";") . ";"); // append semicolon, otherwise "(intermediate value)(...) is not a function" $objFileMinified->close(); } } $GLOBALS['TL_JAVASCRIPT']['slick'] = 'system/modules/slick/assets/vendor/slick-carousel/slick/slick' . ($cache ? '.min.js|static' : '.js'); $GLOBALS['TL_JAVASCRIPT']['slick-functions'] = 'system/modules/slick/assets/js/jquery.slick-functions' . ($cache ? '.min.js|static' : '.js'); $GLOBALS['TL_JAVASCRIPT'][$objT->wrapperClass] = $minify ? $strFileMinified . '|static' : $strFile; }
public static function createConfigJs($objConfig, $debug = false) { if (!static::isJQueryEnabled()) { return false; } $objInstance = new static($objConfig); $cache = !$GLOBALS['TL_CONFIG']['debugMode']; $objT = new \FrontendTemplate('datamap.defaults'); $objT->config = $objInstance->getConfigJs(); $objT->bubbles = $objInstance->getConfigBubblesJs(); $objT->states = $objInstance->getConfigStateJs(); $objT->cssID = static::getCssIDFromModel($objConfig); $strName = $objT->cssID; $strFile = 'assets/js/' . $strName . '.js'; $strFileMinified = 'assets/js/' . $strName . '.min.js'; $objFile = new \File($strFile, file_exists(TL_ROOT . '/' . $strFile)); $objFileMinified = new \File($strFileMinified, file_exists(TL_ROOT . '/' . $strFileMinified)); $minify = $cache && class_exists('\\MatthiasMullie\\Minify\\JS'); // simple file caching if (static::doRewrite($objConfig, $objFile, $objFileMinified, $cache, $debug)) { $strChunk = $objT->parse(); $objFile->write($objT->parse()); $objFile->close(); // minify js if ($minify) { $objFileMinified = new \File($strFileMinified); $objMinify = new \MatthiasMullie\Minify\JS(); $objMinify->add($strChunk); $objFileMinified->write(rtrim($objMinify->minify(), ";") . ";"); // append semicolon, otherwise "(intermediate value)(...) is not a function" $objFileMinified->close(); } } $GLOBALS['TL_JAVASCRIPT']['d3.js'] = 'system/modules/datamaps/assets/vendor/d3/d3' . (!$GLOBALS['TL_CONFIG']['debugMode'] ? '.min' : '') . '.js|static'; $GLOBALS['TL_JAVASCRIPT']['topojson'] = 'system/modules/datamaps/assets/vendor/topojson/topojson.js|static'; $GLOBALS['TL_JAVASCRIPT']['datamaps.all'] = 'system/modules/datamaps/assets/vendor/datamaps/dist/datamaps.all' . ($GLOBALS['TL_CONFIG']['debugMode'] ? '.min' : '') . '.js|static'; $GLOBALS['TL_JAVASCRIPT'][$strName] = $minify ? $strFileMinified . '|static' : $strFile; }
/** * 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; }
/** * Minify and concatenate JS files. * * @param string $group * * @return string */ protected function pipelineJs($group = 'head') { // temporary list of assets to pipeline $temp_js = []; // clear no-pipeline assets lists $this->js_no_pipeline = []; // Compute uid based on assets and timestamp $uid = md5(json_encode($this->js) . $this->js_minify . $group); $file = $uid . '.js'; $inline_file = $uid . '-inline.js'; $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; // If inline files exist set them on object if (file_exists($this->assets_dir . $inline_file)) { $this->js_no_pipeline = json_decode(file_get_contents($this->assets_dir . $inline_file), true); } // If pipeline exist return it if (file_exists($this->assets_dir . $file)) { return $relative_path . $this->getTimestamp(); } // Remove any non-pipeline files foreach ($this->js as $id => $asset) { if ($asset['group'] == $group) { if (!$asset['pipeline'] || $asset['remote'] && $this->js_pipeline_include_externals === false) { $this->js_no_pipeline[] = $asset; } else { $temp_js[$id] = $asset; } } } //if nothing found get out of here! if (count($temp_js) == 0) { return false; } // Write non-pipeline files out if (!empty($this->js_no_pipeline)) { file_put_contents($this->assets_dir . $inline_file, json_encode($this->js_no_pipeline)); } // Concatenate files $buffer = $this->gatherLinks($temp_js, JS_ASSET); if ($this->js_minify) { $minifier = new \MatthiasMullie\Minify\JS(); $minifier->add($buffer); $buffer = $minifier->minify(); } // Write file if (strlen(trim($buffer)) > 0) { file_put_contents($this->assets_dir . $file, $buffer); return $relative_path . $this->getTimestamp(); } else { return false; } }
/** * 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); } }
protected function parseExtJs($objLayout, &$arrReplace) { $arrJs = array(); $objJs = ExtJsModel::findMultipleByIds(deserialize($objLayout->extjs)); if ($objJs === null) { return false; } $cache = !$GLOBALS['TL_CONFIG']['debugMode']; while ($objJs->next()) { $objFiles = ExtJsFileModel::findMultipleByPid($objJs->id); if ($objFiles === null) { continue; } $strChunk = ''; $strFile = 'assets/js/' . $objJs->title . '.js'; $strFileMinified = str_replace('.js', '.min.js', $strFile); $objGroup = new \File($strFile, file_exists(TL_ROOT . '/' . $strFile)); $objGroupMinified = new \File($strFileMinified, file_exists(TL_ROOT . '/' . $strFile)); $rewrite = $objJs->tstamp > $objGroup->mtime || $objGroup->size == 0 || $cache && $objGroupMinified->size == 0; while ($objFiles->next()) { $objFileModel = \FilesModel::findByPk($objFiles->src); if ($objFileModel === null || !file_exists(TL_ROOT . '/' . $objFileModel->path)) { continue; } $objFile = new \File($objFileModel->path); $strChunk .= $objFile->getContent() . "\n"; if ($objFile->mtime > $objGroup->mtime) { $rewrite = true; } } // simple file caching if ($rewrite) { $objGroup->write($strChunk); $objGroup->close(); // minify js if ($cache) { $objGroup = new \File($strFileMinified); $objMinify = new \MatthiasMullie\Minify\JS(); $objMinify->add($strChunk); $objGroup->write(rtrim($objMinify->minify(), ";") . ";"); // append semicolon, otherwise "(intermediate value)(...) is not a function" $objGroup->close(); } } $arrJs[] = $cache ? "{$strFileMinified}|static" : "{$strFile}"; } // HOOK: add custom css if (isset($GLOBALS['TL_HOOKS']['parseExtJs']) && is_array($GLOBALS['TL_HOOKS']['parseExtJs'])) { foreach ($GLOBALS['TL_HOOKS']['parseExtJs'] as $callback) { $arrJs = static::importStatic($callback[0])->{$callback}[1]($arrJs); } } if ($objJs->addBootstrap) { $this->addTwitterBootstrap(); } // inject extjs before other plugins, otherwise bootstrap may not work $GLOBALS['TL_JAVASCRIPT'] = is_array($GLOBALS['TL_JAVASCRIPT']) ? array_merge($GLOBALS['TL_JAVASCRIPT'], $arrJs) : $arrJs; }
function hm_custom_css_js_publish() { if (!current_user_can('edit_theme_options') || empty($_POST['mode']) || !isset($_POST['rev']) || !is_numeric($_POST['rev'])) { wp_send_json_error(); } $_POST['mode'] = strtolower($_POST['mode']); if ($_POST['mode'] != 'css' && $_POST['mode'] != 'javascript') { wp_send_json_error(); } $post = get_post($_POST['rev']); if ($post->post_type != 'hm_custom_' . $_POST['mode']) { wp_send_json_error(); } $uploadDir = wp_upload_dir(); if (!is_dir($uploadDir['basedir'] . '/hm_custom_css_js')) { mkdir($uploadDir['basedir'] . '/hm_custom_css_js') or wp_send_json_error(); } $outputFile = $uploadDir['basedir'] . '/hm_custom_css_js/custom.' . ($_POST['mode'] == 'css' ? 'css' : 'js'); if (file_put_contents($outputFile, $post->post_content) === false) { wp_send_json_error(); } if (empty($_POST['minify'])) { update_option('hm_custom_' . $_POST['mode'] . '_minify', false); } else { update_option('hm_custom_' . $_POST['mode'] . '_minify', true); require_once __DIR__ . '/minify/src/Minify.php'; require_once __DIR__ . '/minify/src/Exception.php'; if ($_POST['mode'] == 'css') { require_once __DIR__ . '/minify/src/CSS.php'; require_once __DIR__ . '/minify/src/Converter.php'; $minifier = new MatthiasMullie\Minify\CSS(); } else { require_once __DIR__ . '/minify/src/JS.php'; $minifier = new MatthiasMullie\Minify\JS(); } $minifier->add($outputFile); $minifier->minify($outputFile); } update_option('hm_custom_' . $_POST['mode'] . '_ver', time()); // Unpublish previous revisions $wp_query = new WP_Query(array('post_type' => 'hm_custom_' . $_POST['mode'], 'post_status' => 'publish', 'fields' => 'ids', 'nopaging' => true)); $posts = $wp_query->get_posts(); foreach ($posts as $postId) { if (!wp_update_post(array('ID' => $postId, 'post_status' => 'draft'))) { wp_send_json_error(); } } if (!wp_update_post(array('ID' => $_POST['rev'], 'post_status' => 'publish', 'post_date' => current_time('Y-m-d H:i:s')))) { wp_send_json_error(); } wp_send_json_success(); }