namibia
df0489e1eeeeab5a9bd44e1d84fce49924fe1bac
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
<?php /** * Class Minify_JS_ClosureCompiler * @package Minify */ /** * Minify Javascript using Google's Closure Compiler API * * @link http://code.google.com/closure/compiler/ * @package Minify * @author Stephen Clay <steve@mrclay.org> * * @todo can use a stream wrapper to unit test this? */ class Minify_JS_ClosureCompiler { const URL = 'http://closure-compiler.appspot.com/compile'; /** * Minify Javascript code via HTTP request to the Closure Compiler API * * @param string $js input code * @param array $options unused at this point * @return string */ public static function minify($js, array $options = array()) { $obj = new self($options); return $obj->min($js); } /** * * @param array $options * * fallbackFunc : default array($this, 'fallback'); */ public function __construct(array $options = array()) { $this->_fallbackFunc = isset($options['fallbackMinifier']) ? $options['fallbackMinifier'] : array($this, '_fallback'); } public function min($js) { $postBody = $this->_buildPostBody($js); $bytes = (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) ? mb_strlen($postBody, '8bit') : strlen($postBody); if ($bytes > 200000) { throw new Minify_JS_ClosureCompiler_Exception( 'POST content larger than 200000 bytes' ); } $response = $this->_getResponse($postBody); if (preg_match('/^Error\(\d\d?\):/', $response)) { if (is_callable($this->_fallbackFunc)) { $response = "/* Received errors from Closure Compiler API:\n$response" . "\n(Using fallback minifier)\n*/\n"; $response .= call_user_func($this->_fallbackFunc, $js); } else { throw new Minify_JS_ClosureCompiler_Exception($response); } } if ($response === '') { $errors = $this->_getResponse($this->_buildPostBody($js, true)); throw new Minify_JS_ClosureCompiler_Exception($errors); } return $response; } protected $_fallbackFunc = null; protected function _getResponse($postBody) { $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); if ($allowUrlFopen) { $contents = file_get_contents(self::URL, false, stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n", 'content' => $postBody, 'max_redirects' => 0, 'timeout' => 15, ) ))); } elseif (defined('CURLOPT_POST')) { $ch = curl_init(self::URL); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); $contents = curl_exec($ch); curl_close($ch); } else { throw new Minify_JS_ClosureCompiler_Exception( "Could not make HTTP request: allow_url_open is false and cURL not available" ); } if (false === $contents) { throw new Minify_JS_ClosureCompiler_Exception( "No HTTP response from server" ); } return trim($contents); } protected function _buildPostBody($js, $returnErrors = false) { return http_build_query(array( 'js_code' => $js, 'output_info' => ($returnErrors ? 'errors' : 'compiled_code'), 'output_format' => 'text', 'compilation_level' => 'SIMPLE_OPTIMIZATIONS' ), null, '&'); } /** * Default fallback function if CC API fails * @param string $js * @return string */ protected function _fallback($js) { return JSMin::minify($js); } } class Minify_JS_ClosureCompiler_Exception extends Exception {} |
Commits for namibiapublic/min/lib/Minify/JS/ClosureCompiler.php
Revision | Author | Commited | Message |
---|---|---|---|
df0489 ... | Mark | Fri 14 Oct, 2016 10:01:00 +0000 | initial commit |