/** * Begin gather up scripts or css files so that they can be combined into a single request. * * @param $types a comma separated list of types to combine, eg "script,css" */ public function start_combining($types) { if (gallery::allow_css_and_js_combining()) { foreach (explode(",", $types) as $type) { $this->combine_queue[$type] = array(); } } }
/** * Combine a series of files into a single one and cache it in the database. * @param $type the data type (script or css) * @param $group the group of scripts or css we want (null will combine all groups) */ public function get_combined($type, $group = null) { if (is_null($group)) { $groups = array_keys($this->combine_queue[$type]); } else { $groups = array($group); } $buf = ""; foreach ($groups as $group) { if (empty($this->combine_queue[$type][$group])) { continue; } // Include the url in the cache key so that if the Gallery moves, we don't use old cached // entries. $key = array(url::abs_file("")); foreach (array_keys($this->combine_queue[$type][$group]) as $path) { $stats = stat($path); // 7 == size, 9 == mtime, see http://php.net/stat $key[] = "{$path} {$stats['7']} {$stats['9']}"; } $key = md5(join(" ", $key)) . ($type == "css" ? ".css" : ".js"); if (gallery::allow_css_and_js_combining()) { // Combine enabled - if we're at the start of the buffer, add a comment. if (!$buf) { $type_text = $type == "css" ? "CSS" : "JS"; $buf .= "<!-- LOOKING FOR YOUR {$type_text}? It's all been combined into the link(s) below -->\n"; } $cache = Cache::instance(); $contents = $cache->get($key); if (empty($contents)) { $combine_data = new stdClass(); $combine_data->type = $type; $combine_data->contents = $this->combine_queue[$type][$group]; module::event("before_combine", $combine_data); $contents = ""; foreach (array_keys($this->combine_queue[$type][$group]) as $path) { if ($type == "css") { $contents .= "/* {$path} */\n" . $this->process_css($path) . "\n"; } else { $contents .= "/* {$path} */\n" . file_get_contents($path) . "\n"; } } $combine_data = new stdClass(); $combine_data->type = $type; $combine_data->contents = $contents; module::event("after_combine", $combine_data); $cache->set($key, $combine_data->contents, array($type), 30 * 84600); $use_gzip = function_exists("gzencode") && (int) ini_get("zlib.output_compression") === 0; if ($use_gzip) { $cache->set("{$key}_gz", gzencode($combine_data->contents, 9, FORCE_GZIP), array($type, "gzip"), 30 * 84600); } } if ($type == "css") { $buf .= html::stylesheet("combined/css/{$key}", "screen,print,projection", true); } else { $buf .= html::script("combined/javascript/{$key}", true); } } else { // Don't combine - just return the CSS and JS links (with the key as a cache buster). $key_base = substr($key, 0, $type == "css" ? -4 : -3); // key without extension foreach (array_keys($this->combine_queue[$type][$group]) as $path) { if ($type == "css") { $buf .= html::stylesheet("{$path}?m={$key_base}", "screen,print,projection", false); } else { $buf .= html::script("{$path}?m={$key_base}", false); } } } unset($this->combine_queue[$type][$group]); if (empty($this->combine_queue[$type])) { unset($this->combine_queue[$type]); } } return $buf; }