forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/*
 | 
						|
 * StatusNet - the distributed open-source microblogging tool
 | 
						|
 * Copyright (C) 2008, 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/>.
 | 
						|
 */
 | 
						|
 | 
						|
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 | 
						|
 | 
						|
class MinifyAction extends Action
 | 
						|
{
 | 
						|
    const TYPE_CSS = 'text/css';
 | 
						|
    const TYPE_HTML = 'text/html';
 | 
						|
    // there is some debate over the ideal JS Content-Type, but this is the
 | 
						|
    // Apache default and what Yahoo! uses..
 | 
						|
    const TYPE_JS = 'application/x-javascript';
 | 
						|
 | 
						|
    var $file;
 | 
						|
    var $v;
 | 
						|
 | 
						|
    function isReadOnly($args)
 | 
						|
    {
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    function prepare($args)
 | 
						|
    {
 | 
						|
        parent::prepare($args);
 | 
						|
        $this->v = $args['v'];
 | 
						|
 | 
						|
        $f = $this->arg('f');
 | 
						|
        if(isset($f)) {
 | 
						|
            $this->file = INSTALLDIR.'/'.$f;
 | 
						|
            if(file_exists($this->file)) {
 | 
						|
                return true;
 | 
						|
            } else {
 | 
						|
                $this->clientError(_('f parameter is not a valid path'),404);
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }else{
 | 
						|
            $this->clientError(_('f parameter is required'),500);
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function etag() 
 | 
						|
    {
 | 
						|
        if(isset($this->v)) {
 | 
						|
            return "\"" . crc32($this->file . $this->v) . "\"";
 | 
						|
        }else{
 | 
						|
            $stat = stat($this->file);
 | 
						|
            return '"' . $stat['ino'] . '-' . $stat['size'] . '-' . $stat['mtime'] . '"';
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function lastModified()
 | 
						|
    {
 | 
						|
        return filemtime($this->file);
 | 
						|
    }
 | 
						|
 | 
						|
    function handle($args)
 | 
						|
    {
 | 
						|
        parent::handle($args);
 | 
						|
        
 | 
						|
        $c = common_memcache();
 | 
						|
        if (!empty($c)) {
 | 
						|
            $cacheKey = common_cache_key(MinifyPlugin::cacheKey . ':' . $this->file . '?v=' . empty($this->v)?'':$this->v);
 | 
						|
            $out = $c->get($cacheKey);
 | 
						|
        }
 | 
						|
        if(empty($out)) {
 | 
						|
            $out = $this->minify($this->file);
 | 
						|
        }
 | 
						|
        if (!empty($c)) {
 | 
						|
            $c->set($cacheKey, $out);
 | 
						|
        }
 | 
						|
 | 
						|
        $sec = session_cache_expire() * 60;
 | 
						|
        header('Cache-Control: public, max-age=' . $sec);
 | 
						|
        header('Pragma: public');
 | 
						|
        $this->raw($out);
 | 
						|
    }
 | 
						|
 | 
						|
    function minify($file)
 | 
						|
    {
 | 
						|
        $info = pathinfo($file);
 | 
						|
        switch(strtolower($info['extension'])){
 | 
						|
            case 'js':
 | 
						|
                $out = MinifyPlugin::minifyJs(file_get_contents($file));
 | 
						|
                header('Content-Type: ' . self::TYPE_JS);
 | 
						|
                break;
 | 
						|
            case 'css':
 | 
						|
                $options = array();
 | 
						|
                $options['currentDir'] = dirname($file);
 | 
						|
                $options['docRoot'] = INSTALLDIR;
 | 
						|
                $out = MinifyPlugin::minifyCss(file_get_contents($file),$options);
 | 
						|
                header('Content-Type: ' . self::TYPE_CSS);
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                $this->clientError(_('File type not supported'),500);
 | 
						|
                return false;
 | 
						|
        }
 | 
						|
        return $out;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |