| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | StatusNet Plugin: 0.9 | 
					
						
							|  |  |  | Plugin Name: Minify | 
					
						
							|  |  |  | Description: Minifies resources (Javascript and CSS) | 
					
						
							|  |  |  | Version: 0.1 | 
					
						
							|  |  |  | Author: Craig Andrews <candrews@integralblue.com> | 
					
						
							|  |  |  | Author URI: http://candrews.integralblue.com/ | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2009, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @package MinifyPlugin | 
					
						
							|  |  |  |  * @maintainer Craig Andrews <candrews@integralblue.com> | 
					
						
							| 
									
										
										
										
											2010-05-27 18:26:47 -04:00
										 |  |  |  * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  | // We bundle the minify library...
 | 
					
						
							|  |  |  | set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  | class MinifyPlugin extends Plugin | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |     private $minifyInlineJs = true; | 
					
						
							|  |  |  |     private $minifyInlineCss = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const cacheKey = 'minify'; | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add Minification related paths to the router table | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Hook for RouterInitialized event. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartInitializeRouter($m) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $m->connect('main/min', | 
					
						
							|  |  |  |                     array('action' => 'minify')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch ($cls) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |          case 'MinifyAction': | 
					
						
							|  |  |  |             require_once(INSTALLDIR.'/plugins/Minify/' . strtolower(mb_substr($cls, 0, -6)) . '.php'); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |          default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onLoginAction($action, &$login) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch ($action) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |          case 'minify': | 
					
						
							|  |  |  |             $login = true; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |          default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onStartScriptElement($action,&$src,&$type) { | 
					
						
							|  |  |  |         $url = parse_url($src); | 
					
						
							| 
									
										
										
										
											2010-01-06 17:13:09 -05:00
										 |  |  |         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment'])) | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2010-02-17 12:03:14 -05:00
										 |  |  |             if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) { | 
					
						
							|  |  |  |                 $src = $this->minifyUrl($src); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $src = $this->minifyUrl('js/'.$src); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onStartCssLinkElement($action,&$src,&$theme,&$media) { | 
					
						
							| 
									
										
										
										
											2009-12-04 23:17:46 -05:00
										 |  |  |         $allowThemeMinification = | 
					
						
							|  |  |  |             is_null(common_config('theme', 'dir')) | 
					
						
							|  |  |  |             && is_null(common_config('theme', 'path')) | 
					
						
							|  |  |  |             && is_null(common_config('theme', 'server')); | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |         $url = parse_url($src); | 
					
						
							| 
									
										
										
										
											2010-02-17 12:02:59 -05:00
										 |  |  |         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment'])) | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2009-12-04 23:17:46 -05:00
										 |  |  |             if(!isset($theme)) { | 
					
						
							|  |  |  |                 $theme = common_config('site', 'theme'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if($allowThemeMinification && file_exists(INSTALLDIR.'/local/theme/'.$theme.'/'.$src)) { | 
					
						
							|  |  |  |                 $src = $this->minifyUrl('local/theme/'.$theme.'/'.$src); | 
					
						
							|  |  |  |             } else if($allowThemeMinification && file_exists(INSTALLDIR.'/theme/'.$theme.'/'.$src)) { | 
					
						
							|  |  |  |                 $src = $this->minifyUrl('theme/'.$theme.'/'.$src); | 
					
						
							|  |  |  |             }else if(file_exists(INSTALLDIR.'/'.$src)){ | 
					
						
							|  |  |  |                 $src = $this->minifyUrl($src); | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-04 23:17:46 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |     function onStartInlineScriptElement($action,&$code,&$type) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if($this->minifyInlineJs && $type=='text/javascript'){ | 
					
						
							| 
									
										
										
										
											2010-09-06 09:56:45 -04:00
										 |  |  |             $c = Cache::instance(); | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |             if (!empty($c)) { | 
					
						
							| 
									
										
										
										
											2010-09-06 10:07:43 -04:00
										 |  |  |                 $cacheKey = Cache::key(self::cacheKey . ':' . crc32($code)); | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |                 $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'){ | 
					
						
							| 
									
										
										
										
											2010-09-06 09:56:45 -04:00
										 |  |  |             $c = Cache::instance(); | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |             if (!empty($c)) { | 
					
						
							| 
									
										
										
										
											2010-09-06 10:07:43 -04:00
										 |  |  |                 $cacheKey = Cache::key(self::cacheKey . ':' . crc32($code)); | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  |                 $out = $c->get($cacheKey); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if(empty($out)) { | 
					
						
							|  |  |  |                 $out = $this->minifyCss($code); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if (!empty($c)) { | 
					
						
							|  |  |  |                 $c->set($cacheKey, $out); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if(!empty($out)) { | 
					
						
							|  |  |  |                 $code = $out; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 23:17:46 -05:00
										 |  |  |     function minifyUrl($src) { | 
					
						
							|  |  |  |         return common_local_url('minify',null,array('f' => $src ,v => STATUSNET_VERSION)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-05 00:41:22 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-09 18:58:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'Minify', | 
					
						
							|  |  |  |                             'version' => STATUSNET_VERSION, | 
					
						
							|  |  |  |                             'author' => 'Craig Andrews', | 
					
						
							|  |  |  |                             'homepage' => 'http://status.net/wiki/Plugin:Minify', | 
					
						
							|  |  |  |                             'rawdescription' => | 
					
						
							| 
									
										
										
										
											2011-04-25 19:12:26 +02:00
										 |  |  |                             // TRANS: Plugin description.
 | 
					
						
							| 
									
										
										
										
											2010-09-18 10:25:13 +02:00
										 |  |  |                             _m('The Minify plugin minifies StatusNet\'s CSS and JavaScript, removing whitespace and comments.')); | 
					
						
							| 
									
										
										
										
											2010-01-09 18:58:40 -05:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-04 12:36:00 -05:00
										 |  |  | } |