diff --git a/core/page.class.php b/core/page.class.php index 6547c3f2..dd28bd75 100644 --- a/core/page.class.php +++ b/core/page.class.php @@ -245,222 +245,46 @@ class Page { # 404/static handler will map these to themes/foo/bar.ico or lib/static/bar.ico $this->add_html_header(""); $this->add_html_header(""); - - /* Attempt to cache the CSS & JavaScript files */ - if ($this->add_cached_auto_html_headers() === FALSE) { - // caching failed, add all files to html_headers. - - foreach(glob("lib/*.css") as $css) { - $this->add_html_header(''); - } - $css_files = glob("ext/*/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $this->add_html_header(''); - } - } - $css_files = glob("themes/$theme_name/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $this->add_html_header(''); - } - } - - foreach(glob("lib/*.js") as $js) { - $this->add_html_header(''); - } - $js_files = glob("ext/*/script.js"); - if($js_files) { - foreach($js_files as $js_file) { - $this->add_html_header(''); - } - } - } - } - /** - * Automatic caching of CSS and Javascript files - * - * Allows site admins to have Shimmie automatically cache and minify all CSS and JS files. - * This is done to reduce the number of HTTP requests (recommended by the Yahoo high-performance - * guidelines). It combines all of the CSS and JavaScript files into one for each type, and - * stores them in cached files to serve the client. Changes to the CSS or JavaScript files are - * caught by taking the md5sum of the concatenated files. - * - * Note: This can be somewhat problematic, as it edits the links to your CSS files (as well - * as the links to images inside them). - * Also, the directory cache directory needs to be writeable by the php/webserver user. - * PLEASE: Ensure that you test your site out throughly after enabling this module! - * Either that, or don't use this module unless you are sure of what it is doing. - * - * TODO: Add support for minify-ing CSS and Javascript files. (similar to Minify. See: http://code.google.com/p/minify/ or https://github.com/mrclay/minify) - * TODO: For performance reasons: Before performing the regex's, compute the md5 of the CSS & JS files and store somewhere to check later. - * - * @return - * This function returns FALSE if it failed to cache the files, - * and returns TRUE if it was successful. - */ - private function add_cached_auto_html_headers() { - global $config; - - // store local copy for speed. - $autocache_css = $config->get_bool("autocache_css"); - $autocache_js = $config->get_bool("autocache_js"); - $theme_name = $config->get_string('theme', 'default'); - - if (!$autocache_css && !$autocache_js) { - return false; // caching disabled + if(!file_exists("data/cache")) { + mkdir("data/cache"); } - $cache_location = $config->get_string("autocache_location", 'data/cache'); - // Detect is there is a trailing slash, and add one if not. - $cache_location = ((strrpos($cache_location, '/') + 1) == strlen($cache_location)) ? $cache_location : $cache_location.'/'; - - // Create directory if needed. - if(!file_exists($cache_location)) { - if (!mkdir($cache_location, 0750, true)) { - return false; // failed to create directory - } + $css_files = array(); + $css_latest = 0; + foreach(array_merge(zglob("lib/*.css"), zglob("ext/*/style.css"), zglob("themes/$theme_name/style.css")) as $css) { + $css_files[] = $css; + $css_latest = max($css_latest, filemtime($css)); } - - $data_href = get_base_href(); - - /* ----- CSS Files ----- */ - if($autocache_css) { - // First get all the CSS from the lib directory - $contents_from_lib = ''; - $css_files = glob("lib/*.css"); - if($css_files) { - foreach($css_files as $css_file) { - $contents_from_lib .= file_get_contents($css_file); - } - // Can't directly cache the CSS files, as they might have relative locations to images, etc. in them. - // We have to adjust the URLs accordingly before saving the cached file. + $css_cache_file = "data/cache/style.$css_latest.css"; + if(!file_exists($css_cache_file)) { + $css_data = ""; + foreach($css_files as $file) { + $file_data = file_get_contents($file); $pattern = '/url[\s]*\([\s]*["\']?([^"\'\)]+)["\']?[\s]*\)/'; - $replace = 'url("../../lib/${1}")'; - $contents_from_lib = preg_replace($pattern, $replace, $contents_from_lib); - } - // Next get all the CSS from the extensions - $contents_from_extensions = ''; - $css_files = glob("ext/*/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $contents_from_extensions .= file_get_contents($css_file); - } - // Can't directly cache the CSS files, as they might have relative locations to images, etc. in them. - // We have to adjust the URLs accordingly before saving the cached file. - $pattern = '/url[\s]*\([\s]*["\']?([^"\'\)]+)["\']?[\s]*\)/'; - $replace = 'url("../../${1}")'; - $contents_from_extensions = preg_replace($pattern, $replace, $contents_from_extensions); - } - // Get CSS from theme - $contents_from_theme = ''; - $css_files = glob("themes/$theme_name/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $contents_from_theme .= file_get_contents($css_file); - } - // Can't directly cache the CSS files, as they might have relative locations to images, etc. in them. - // We have to adjust the URLs accordingly before saving the cached file. - $pattern = '/url[\s]*\([\s]*["\']?([^"\'\)]+)["\']?[\s]*\)/'; - $replace = 'url("../../${1}")'; - $contents_from_theme = preg_replace($pattern, $replace, $contents_from_theme); - } - // Combine the three - $data = $contents_from_lib .' '. $contents_from_extensions .' '. $contents_from_theme; - - // Minify the CSS if enabled. - if($config->get_bool("autocache_min_css")) { - // not supported yet. - // TODO: add support for Minifying CSS files. + $replace = 'url("../../'.dirname($file).'/$1")'; + $file_data = preg_replace($pattern, $replace, $file_data); + $css_data .= $file_data . "\n"; } + file_put_contents($css_cache_file, $css_data) + } + $this->add_html_header(""); - // compute the MD5 sum of the concatenated CSS files - $md5sum = md5($data); - - if(!file_exists($cache_location.$md5sum.'.css')) { - // remove any old cached CSS files. - $mask = '*.css'; - array_map( 'unlink', glob( $mask ) ); - - // output the combined file - if(file_put_contents($cache_location.$md5sum.'.css', $data, LOCK_EX) === FALSE) { - return false; // failed to write the file - } - } - // tell the client where to get the css cache file - $this->add_html_header(''); + $js_files = array(); + $js_latest = 0; + foreach(array_merge(zglob("lib/*.js"), zglob("ext/*/style.js"), zglob("themes/$theme_name/style.js")) as $js) { + $js_files[] = $js; + $js_latest = max($js_latest, filemtime($js)); } - else { - // Caching of CSS disabled. - foreach(glob("lib/*.css") as $css) { - $this->add_html_header(''); - } - $css_files = glob("ext/*/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $this->add_html_header(''); - } - } - $css_files = glob("themes/$theme_name/style.css"); - if($css_files) { - foreach($css_files as $css_file) { - $this->add_html_header(''); - } + $js_cache_file = "data/cache/style.$js_latest.js"; + if(!file_exists($js_cache_file)) { + $js_data = ""; + foreach($js_files as $file) { + $js_data .= file_get_contents($file) . "\n"; } + file_put_contents($js_cache_file, $js_data) } - - - /* ----- JavaScript Files ----- */ - if($autocache_js) { - $data = ''; - $js_files = glob("lib/*.js"); - if($js_files) { - foreach($js_files as $js_file) { - $data .= file_get_contents($js_file); - } - } - $js_files = glob("ext/*/script.js"); - if($js_files) { - foreach($js_files as $js_file) { - $data .= file_get_contents($js_file); - } - } - // Minify the JS if enabled. - if ($config->get_bool("autocache_min_js")){ - // not supported yet. - // TODO: add support for Minifying JS files. - } - - // compute the MD5 sum of the concatenated JavaScript files - $md5sum = md5($data); - - if (!file_exists($cache_location.$md5sum.'.js')) { - // remove any old cached js files. - $mask = '*.js'; - array_map( 'unlink', glob( $mask ) ); - // output the combined file - if (file_put_contents($cache_location.$md5sum.'.js', $data, LOCK_EX) === FALSE) { - return false; - } - } - // tell the client where to get the js cache file - $this->add_html_header(''); - } - else { - // Caching of Javascript disabled. - foreach(glob("lib/*.js") as $js) { - $this->add_html_header(''); - } - $js_files = glob("ext/*/script.js"); - if($js_files) { - foreach($js_files as $js_file) { - $this->add_html_header(''); - } - } - } - - return true; + $this->add_html_header(""); } } ?> diff --git a/core/util.inc.php b/core/util.inc.php index b9b5e905..5111ff3c 100644 --- a/core/util.inc.php +++ b/core/util.inc.php @@ -361,6 +361,11 @@ function mtimefile($file) { return "$data_href/$file?$mtime"; } +function zglob($pattern) { + $r = glob($pattern); + if($r) return $r; + else return array(); +} /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ diff --git a/ext/setup/main.php b/ext/setup/main.php index b20e8b45..195c0904 100644 --- a/ext/setup/main.php +++ b/ext/setup/main.php @@ -166,12 +166,6 @@ class Setup extends Extension { $config->set_default_string("theme", "default"); $config->set_default_bool("word_wrap", true); $config->set_default_bool("comment_captcha", false); - // Automatic caching is disabled by default - $config->set_default_string("autocache_location", "data/cache"); - $config->set_default_bool("autocache_css", false); - $config->set_default_bool("autocache_jss", false); - $config->set_default_bool("autocache_min_css", false); - $config->set_default_bool("autocache_min_js", false); } public function onPageRequest(PageRequestEvent $event) { @@ -279,19 +273,6 @@ class Setup extends Extension { $sb->add_text_option("api_recaptcha_privkey", "
Private key: "); $sb->add_text_option("api_recaptcha_pubkey", "
Public key: "); $event->panel->add_block($sb); - - - $sb = new SetupBlock("Automatic Caching of CSS & JS"); - // the default is fine for just about everyone - //$sb->add_text_option("autocache_location", "Location: "); - //$sb->add_label("
This location needs to be writeable by the webserver."); - $sb->add_bool_option("autocache_css", "Automatic caching of CSS: "); - $sb->add_bool_option("autocache_js", "
Automatic caching of JS: "); - // if the option does nothing, there's no point showing a - // "hey look, nothing!" message... - //$sb->add_bool_option("autocache_min_css", "
Minimize CSS files: "); - //$sb->add_bool_option("autocache_min_js", "
Minimize JS files: "); - $event->panel->add_block($sb); } public function onConfigSave(ConfigSaveEvent $event) {