. */ 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; } }