summaryrefslogtreecommitdiff
path: root/plugins/Minify/minify.php
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Minify/minify.php')
-rw-r--r--plugins/Minify/minify.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/plugins/Minify/minify.php b/plugins/Minify/minify.php
new file mode 100644
index 000000000..2de2d6d26
--- /dev/null
+++ b/plugins/Minify/minify.php
@@ -0,0 +1,122 @@
+<?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); }
+
+// 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';
+ 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';
+
+ const cacheKey = 'minify';
+
+ var $file;
+
+ 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)) {
+ $out = $c->get(common_cache_key(self::cacheKey . ':' . $this->file));
+ }
+ if(empty($out)) {
+ $out = $this->minify($this->file);
+ }
+ if (!empty($c)) {
+ $c->set(common_cache_key(self::cacheKey . ':' . $this->file), $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':
+ require_once('JSMin.php');
+ $out = JSMin::minify(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);
+ header('Content-Type: ' . self::TYPE_CSS);
+ break;
+ default:
+ $this->clientError(_('File type not supported'),500);
+ return false;
+ }
+ return $out;
+ }
+}
+