From c08d7f1aa4ac235f524da3994c2f1aef3b0fd079 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 5 Dec 2009 00:41:22 -0500 Subject: [PATCH] Minify inline JS and CSS (can be disable in configuration) --- plugins/Minify/MinifyPlugin.php | 57 +++++++++++++++++++++++++++++++++ plugins/Minify/README | 15 ++++++++- plugins/Minify/minify.php | 13 ++------ 3 files changed, 74 insertions(+), 11 deletions(-) diff --git a/plugins/Minify/MinifyPlugin.php b/plugins/Minify/MinifyPlugin.php index 77fd76a849..71fade19a5 100644 --- a/plugins/Minify/MinifyPlugin.php +++ b/plugins/Minify/MinifyPlugin.php @@ -33,8 +33,15 @@ Author URI: http://candrews.integralblue.com/ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +// We bundle the minify library... +set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib'); + class MinifyPlugin extends Plugin { + private $minifyInlineJs = true; + private $minifyInlineCss = true; + + const cacheKey = 'minify'; /** * Add Minification related paths to the router table @@ -104,8 +111,58 @@ class MinifyPlugin extends Plugin } } + function onStartInlineScriptElement($action,&$code,&$type) + { + if($this->minifyInlineJs && $type=='text/javascript'){ + $c = common_memcache(); + if (!empty($c)) { + $cacheKey = common_cache_key(self::cacheKey . ':' . crc32($code)); + $out = $c->get($cacheKey); + } + if(empty($out)) { + $out = $this->minifyJs($code); + } + if (!empty($c)) { + $c->set($cacheKey, $out); + } + if(!empty($out)) { + $code = $out; + } + } + } + + function onStartStyleElement($action,&$code,&$type,&$media) + { + if($this->minifyInlineCss && $type=='text/css'){ + $c = common_memcache(); + if (!empty($c)) { + $cacheKey = common_cache_key(self::cacheKey . ':' . crc32($code)); + $out = $c->get($cacheKey); + } + if(empty($out)) { + $out = $this->minifyCss($code); + } + if (!empty($c)) { + $c->set($cacheKey, $out); + } + if(!empty($out)) { + $code = $out; + } + } + } + function minifyUrl($src) { return common_local_url('minify',null,array('f' => $src ,v => STATUSNET_VERSION)); } + + static function minifyJs($code) { + require_once('JSMin.php'); + return JSMin::minify($code); + } + + static function minifyCss($code, $options = array()) { + require_once('Minify/CSS.php'); + return Minify_CSS::minify($code,$options); + } } diff --git a/plugins/Minify/README b/plugins/Minify/README index 8f2eefa2c7..f7763735ed 100644 --- a/plugins/Minify/README +++ b/plugins/Minify/README @@ -4,6 +4,10 @@ Note that if enabled this plugin and use a theme server, (if any of $config['theme']['server'], $config['theme']['path'], $config['theme']['dir'] are set) theme CSS will not be minified. +This plugin will use memcache, if it is available, for storing minified inline + and file javascript and css. Because minification is non-trivial, using + memcache is recommended. + Installation ============ add "addPlugin('minify', @@ -12,7 +16,16 @@ to the bottom of your config.php Settings ======== -None at the moment +minifyInlineJs (true): Minify inline javascript. + Because caching isn'tas effective for inline resources (due to its more + dynamic nature) than static files, minifying inline resources may adversely + affect performance for higher volume sites. Testing (and memcache usage) + are highly recommended. +minifyInlineCss (true): Minify inline CSS. + Because caching isn'tas effective for inline resources (due to its more + dynamic nature) than static files, minifying inline resources may adversely + affect performance for higher volume sites. Testing (and memcache usage) + are highly recommended. Example ======= diff --git a/plugins/Minify/minify.php b/plugins/Minify/minify.php index f8c17767c3..64727f5e7e 100644 --- a/plugins/Minify/minify.php +++ b/plugins/Minify/minify.php @@ -19,9 +19,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -// We bundle the minify library... -set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib'); - class MinifyAction extends Action { const TYPE_CSS = 'text/css'; @@ -30,8 +27,6 @@ class MinifyAction extends Action // Apache default and what Yahoo! uses.. const TYPE_JS = 'application/x-javascript'; - const cacheKey = 'minify'; - var $file; var $v; @@ -81,7 +76,7 @@ class MinifyAction extends Action $c = common_memcache(); if (!empty($c)) { - $cacheKey = common_cache_key(self::cacheKey . ':' . $this->file . '?v=' . empty($this->v)?'':$this->v); + $cacheKey = common_cache_key(MinifyPlugin::cacheKey . ':' . $this->file . '?v=' . empty($this->v)?'':$this->v); $out = $c->get($cacheKey); } if(empty($out)) { @@ -102,16 +97,14 @@ class MinifyAction extends Action $info = pathinfo($file); switch(strtolower($info['extension'])){ case 'js': - require_once('JSMin.php'); - $out = JSMin::minify(file_get_contents($file)); + $out = MinifyPlugin::minifyJs(file_get_contents($file)); header('Content-Type: ' . self::TYPE_JS); break; case 'css': - require_once('Minify/CSS.php'); $options = array(); $options['currentDir'] = dirname($file); $options['docRoot'] = INSTALLDIR; - $out = Minify_CSS::minify(file_get_contents($file),$options); + $out = MinifyPlugin::minifyCss(file_get_contents($file),$options); header('Content-Type: ' . self::TYPE_CSS); break; default: