diff options
author | Evan Prodromou <evan@status.net> | 2009-12-22 16:44:19 -0800 |
---|---|---|
committer | Evan Prodromou <evan@status.net> | 2009-12-22 16:44:19 -0800 |
commit | f6bf9529805cd58fdd1671dd9b133bde05e8ae87 (patch) | |
tree | cf272bd1105da48f016b635db4d9c34810adcbda /plugins/Minify/minify.php | |
parent | f987273f118a12d443b6789c2ab59d7a4b01f678 (diff) | |
parent | 30c2e2ce83282f0bc268153d7ec465fbb5cf00ca (diff) |
Merge branch 'testing'
Diffstat (limited to 'plugins/Minify/minify.php')
-rw-r--r-- | plugins/Minify/minify.php | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/plugins/Minify/minify.php b/plugins/Minify/minify.php new file mode 100644 index 000000000..64727f5e7 --- /dev/null +++ b/plugins/Minify/minify.php @@ -0,0 +1,117 @@ +<?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; + } +} + |