. */ 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(array $args=array()) { return true; } function prepare(array $args=array()) { 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 { // TRANS: Client error displayed when not providing a valid path in parameter "f". $this->clientError(_m('The parameter "f" is not a valid path.'),404); } }else{ // TRANS: Client error displayed when not providing parameter "f". $this->clientError(_m('The parameter "f" is required but missing.'),500); } } 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(array $args=array()) { parent::handle($args); $c = Cache::instance(); if (!empty($c)) { $cacheKey = 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: // TRANS: Client error displayed when trying to minify an unsupported file type. $this->clientError(_m('File type not supported.'),500); } return $out; } }