From 8dcab11beafb1a04b514a3beacc6113f29450d3c Mon Sep 17 00:00:00 2001 From: "ctrlaltca@gmail.com" <> Date: Tue, 20 Sep 2011 09:35:40 +0000 Subject: patch for #363: dropping clientscripts.php --- .gitattributes | 5 +- build.xml | 2 +- buildscripts/classtree/build.php | 2 +- framework/Web/Javascripts/TJavaScript.php | 12 + framework/Web/Javascripts/clientscripts.php | 573 -------------------------- framework/Web/Javascripts/jsmin.php | 290 +++++++++++++ framework/Web/Javascripts/packages.php | 109 +++++ framework/Web/Javascripts/source/.htaccess | 16 + framework/Web/Javascripts/source/packages.php | 109 ----- framework/Web/UI/TClientScriptManager.php | 135 ++---- 10 files changed, 475 insertions(+), 778 deletions(-) delete mode 100644 framework/Web/Javascripts/clientscripts.php create mode 100644 framework/Web/Javascripts/jsmin.php create mode 100644 framework/Web/Javascripts/packages.php create mode 100644 framework/Web/Javascripts/source/.htaccess delete mode 100644 framework/Web/Javascripts/source/packages.php diff --git a/.gitattributes b/.gitattributes index 64a342a8..d8c68e21 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2805,8 +2805,9 @@ framework/Util/TSimpleDateFormatter.php -text framework/Util/TVarDumper.php -text framework/Web/Javascripts/TJSON.php -text framework/Web/Javascripts/TJavaScript.php -text -framework/Web/Javascripts/clientscripts.php -text -framework/Web/Javascripts/source/packages.php -text +framework/Web/Javascripts/jsmin.php -text +framework/Web/Javascripts/packages.php -text +framework/Web/Javascripts/source/.htaccess -text framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js -text framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js -text framework/Web/Javascripts/source/prado/activecontrols/ajax3.js -text diff --git a/build.xml b/build.xml index 7f412865..9e197e61 100644 --- a/build.xml +++ b/build.xml @@ -513,7 +513,7 @@ the PRADO distribution: - + diff --git a/buildscripts/classtree/build.php b/buildscripts/classtree/build.php index ac79370d..f91bc629 100644 --- a/buildscripts/classtree/build.php +++ b/buildscripts/classtree/build.php @@ -11,7 +11,7 @@ Prado::using('System.Data.SqlMap.TSqlMapManager'); $exclusions=array( 'pradolite.php', 'prado-cli.php', - 'clientscripts.php', + 'jsmin.php', '.svn', '/I18N/core', '/3rdParty', diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php index 2df16816..c492c197 100644 --- a/framework/Web/Javascripts/TJavaScript.php +++ b/framework/Web/Javascripts/TJavaScript.php @@ -266,5 +266,17 @@ class TJavaScript self::$_json = Prado::createComponent('System.Web.Javascripts.TJSON'); return self::$_json->decode($value); } + + /** + * Minimize the size of a javascript script. + * This method is based on Douglas Crockford's JSMin. + * @param string code that you want to minimzie + * @return minimized version of the code + */ + public static function JSMin($code) + { + include_once('jsmin.php'); + return JSMin::minify($code); + } } diff --git a/framework/Web/Javascripts/clientscripts.php b/framework/Web/Javascripts/clientscripts.php deleted file mode 100644 index 18f4c41b..00000000 --- a/framework/Web/Javascripts/clientscripts.php +++ /dev/null @@ -1,573 +0,0 @@ - - * array('file1.js', 'file2.js'), - * 'package2' => array('file3.js', 'file4.js')); - * - * $dependencies = array( - * 'package1' => array('package1'), - * 'package2' => array('package1', 'package2')); //package2 requires package1 first. - * - * - * To serve up 'package1', specify the url, a maxium of 25 packages separated with commas is allows. - * - * clientscripts.php?js=package1 - * - * for 'package2' (automatically resolves 'package1') dependency - * - * clientscripts.php?js=package2 - * - * The scripts comments are removed and whitespaces removed appropriately. The - * scripts may be served as zipped if the browser and php server allows it. Cache - * headers are also sent to inform the browser and proxies to cache the file. - * Moreover, the post-processed (comments removed and zipped) are saved in this - * current directory for the next requests. - * - * If the url contains the parameter "mode=debug", the comments are not removed - * and headers invalidating the cache are sent. In debug mode, the script can still - * be zipped if the browser and server supports it. - * - * E.g. clientscripts.php?js=package2&mode=debug - * - * @link http://www.pradosoft.com/ - * @copyright Copyright © 2007 PradoSoft - * @license http://www.pradosoft.com/license/ - * @author Wei Zhuo - * @version $Id$ - * @package System.Web.Javascripts - * @since 3.1 - */ - -//run script for as long as needed -@set_time_limit(0); - -//set error_reporting directive -@error_reporting(E_ERROR | E_WARNING | E_PARSE); - -function get_client_script_files() -{ - $package_file = dirname(__FILE__).'/packages.php'; - if(is_file($package_file)) - return get_package_files($package_file, get_script_requests()); - else - return get_javascript_files(get_script_requests()); -} - -/** - * @param array list of requested libraries - */ -function get_script_requests($max=25) -{ - $param = isset($_GET['js']) ? $_GET['js'] : ''; - if(preg_match('/([a-zA-z0-9\-_])+(,[a-zA-z0-9\-_]+)*/', $param)) - return array_unique(explode(',', $param, $max)); - return array(); -} - -/** - * @param string packages.php filename - * @param array packages requests - */ -function get_package_files($package_file, $request) -{ - list($packages, $dependencies) = include($package_file); - if(!(is_array($packages) && is_array($dependencies))) - { - error_log('Prado client script: invalid package file '.$package_file); - return array(); - } - $result = array(); - $found = array(); - foreach($request as $library) - { - if(isset($dependencies[$library])) - { - foreach($dependencies[$library] as $dep) - { - if(isset($found[$dep])) - continue; - $result = array_merge($result, (array)$packages[$dep]); - $found[$dep]=true; - } - } - else - error_log('Prado client script: no such javascript library "'.$library.'"'); - } - return $result; -} - -/** - * @param string requested javascript files - * @array array list of javascript files. - */ -function get_javascript_files($request) -{ - $result = array(); - foreach($request as $file) - $result[] = $file.'.js'; - return $result; -} - -/** - * @param array list of javascript files. - * @return string combined the available javascript files. - */ -function combine_javascript($files) -{ - $content = ''; - $base = dirname(__FILE__); - foreach($files as $file) - { - $filename = $base.'/'.$file; - if(is_file($filename)) //relies on get_client_script_files() for security - $content .= "\x0D\x0A".file_get_contents($filename); //add CR+LF - else - error_log('Prado client script: missing file '.$filename); - } - return $content; -} - -/** - * @param string javascript code - * @param array files names - * @return string javascript code without comments. - */ -function minify_javascript($content, $files) -{ - return JSMin::minify($content); -} - -/** - * @param boolean true if in debug mode. - */ -function is_debug_mode() -{ - return isset($_GET['mode']) && $_GET['mode']==='debug'; -} - -/** - * @param string javascript code - * @param string gzip code - */ -function gzip_content($content) -{ - return gzencode($content, 9, FORCE_GZIP); -} - -/** - * @param string javascript code. - * @param string filename - */ -function save_javascript($content, $filename) -{ - file_put_contents($filename, $content); - if(supports_gzip_encoding()) - file_put_contents($filename.'.gz', gzip_content($content)); -} - -/** - * @param string comprssed javascript file to be read - * @param string javascript code, null if file is not found. - */ -function get_saved_javascript($filename) -{ - $fn=$filename; - if(supports_gzip_encoding()) - $fn .= '.gz'; - if(!is_file($fn)) - save_javascript(get_javascript_code(true), $filename); - return file_get_contents($fn); -} - -/** - * @return string compressed javascript file name. - */ -function compressed_js_filename() -{ - $files = get_client_script_files(); - if(count($files) > 0) - { - $filename = sprintf('%x',crc32(implode(',',($files)))); - return dirname(__FILE__).'/clientscript_'.$filename.'.js'; - } -} - -/** - * @param boolean true to strip comments from javascript code - * @return string javascript code - */ -function get_javascript_code($minify=false) -{ - $files = get_client_script_files(); - if(count($files) > 0) - { - $content = combine_javascript($files); - if($minify) - return minify_javascript($content, $files); - else - return $content; - } -} - -/** - * Prints headers to serve javascript - * - * @param string $filePath (default: NULL) - */ -function print_headers($filePath = null) -{ - $expiresOffset = is_debug_mode() ? -10000 : 3600 * 24 * 10; //no cache - header("Content-type: text/javascript"); - header("Vary: Accept-Encoding"); // Handle proxies - header("Expires: " . @gmdate("D, d M Y H:i:s", @time() + $expiresOffset) . " GMT"); - if(null !== $filePath && is_file($filePath)) { - header("Last-Modified: " . @gmdate("D, d M Y H:i:s", filectime($filePath)) . " GMT"); - } - if(($enc = supports_gzip_encoding()) !== null) - header("Content-Encoding: " . $enc); -} - -/** - * @return string 'x-gzip' or 'gzip' if php supports gzip and browser supports gzip response, null otherwise. - */ -function supports_gzip_encoding() -{ - if(isset($_GET['gzip']) && $_GET['gzip']==='false') - return false; - - if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) - { - $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); - $allowsZipEncoding = in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------']); - $hasGzip = function_exists('ob_gzhandler'); - $noZipBuffer = !ini_get('zlib.output_compression'); - $noZipBufferHandler = ini_get('output_handler') != 'ob_gzhandler'; - - if ( $allowsZipEncoding && $hasGzip && $noZipBuffer && $noZipBufferHandler) - $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; - return $enc; - } -} - -/** - * jsmin.php - PHP implementation of Douglas Crockford's JSMin. - * - * This is pretty much a direct port of jsmin.c to PHP with just a few - * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and - * outputs to stdout, this library accepts a string as input and returns another - * string as output. - * - * PHP 5 or higher is required. - * - * Permission is hereby granted to use this version of the library under the - * same terms as jsmin.c, which has the following license: - * - * -- - * Copyright (c) 2002 Douglas Crockford (www.crockford.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * The Software shall be used for Good, not Evil. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * -- - * - * @package JSMin - * @author Ryan Grove - * @copyright 2002 Douglas Crockford (jsmin.c) - * @copyright 2008 Ryan Grove (PHP port) - * @license http://opensource.org/licenses/mit-license.php MIT License - * @version 1.1.1 (2008-03-02) - * @link http://code.google.com/p/jsmin-php/ - */ - -class JSMin { - const ORD_LF = 10; - const ORD_SPACE = 32; - - protected $a = ''; - protected $b = ''; - protected $input = ''; - protected $inputIndex = 0; - protected $inputLength = 0; - protected $lookAhead = null; - protected $output = ''; - - // -- Public Static Methods -------------------------------------------------- - - public static function minify($js) { - $jsmin = new JSMin($js); - return $jsmin->min(); - } - - // -- Public Instance Methods ------------------------------------------------ - - public function __construct($input) { - $this->input = str_replace("\r\n", "\n", $input); - $this->inputLength = strlen($this->input); - } - - // -- Protected Instance Methods --------------------------------------------- - - protected function action($d) { - switch($d) { - case 1: - $this->output .= $this->a; - - case 2: - $this->a = $this->b; - - if ($this->a === "'" || $this->a === '"') { - for (;;) { - $this->output .= $this->a; - $this->a = $this->get(); - - if ($this->a === $this->b) { - break; - } - - if (ord($this->a) <= self::ORD_LF) { - throw new JSMinException('Unterminated string literal.'); - } - - if ($this->a === '\\') { - $this->output .= $this->a; - $this->a = $this->get(); - } - } - } - - case 3: - $this->b = $this->next(); - - if ($this->b === '/' && ( - $this->a === '(' || $this->a === ',' || $this->a === '=' || - $this->a === ':' || $this->a === '[' || $this->a === '!' || - $this->a === '&' || $this->a === '|' || $this->a === '?')) { - - $this->output .= $this->a . $this->b; - - for (;;) { - $this->a = $this->get(); - - if ($this->a === '/') { - break; - } elseif ($this->a === '\\') { - $this->output .= $this->a; - $this->a = $this->get(); - } elseif (ord($this->a) <= self::ORD_LF) { - throw new JSMinException('Unterminated regular expression '. - 'literal.'); - } - - $this->output .= $this->a; - } - - $this->b = $this->next(); - } - } - } - - protected function get() { - $c = $this->lookAhead; - $this->lookAhead = null; - - if ($c === null) { - if ($this->inputIndex < $this->inputLength) { - $c = $this->input[$this->inputIndex]; - $this->inputIndex += 1; - } else { - $c = null; - } - } - - if ($c === "\r") { - return "\n"; - } - - if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { - return $c; - } - - return ' '; - } - - protected function isAlphaNum($c) { - return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; - } - - protected function min() { - $this->a = "\n"; - $this->action(3); - - while ($this->a !== null) { - switch ($this->a) { - case ' ': - if ($this->isAlphaNum($this->b)) { - $this->action(1); - } else { - $this->action(2); - } - break; - - case "\n": - switch ($this->b) { - case '{': - case '[': - case '(': - case '+': - case '-': - $this->action(1); - break; - - case ' ': - $this->action(3); - break; - - default: - if ($this->isAlphaNum($this->b)) { - $this->action(1); - } - else { - $this->action(2); - } - } - break; - - default: - switch ($this->b) { - case ' ': - if ($this->isAlphaNum($this->a)) { - $this->action(1); - break; - } - - $this->action(3); - break; - - case "\n": - switch ($this->a) { - case '}': - case ']': - case ')': - case '+': - case '-': - case '"': - case "'": - $this->action(1); - break; - - default: - if ($this->isAlphaNum($this->a)) { - $this->action(1); - } - else { - $this->action(3); - } - } - break; - - default: - $this->action(1); - break; - } - } - } - - return $this->output; - } - - protected function next() { - $c = $this->get(); - - if ($c === '/') { - switch($this->peek()) { - case '/': - for (;;) { - $c = $this->get(); - - if (ord($c) <= self::ORD_LF) { - return $c; - } - } - - case '*': - $this->get(); - - for (;;) { - switch($this->get()) { - case '*': - if ($this->peek() === '/') { - $this->get(); - return ' '; - } - break; - - case null: - throw new JSMinException('Unterminated comment.'); - } - } - - default: - return $c; - } - } - - return $c; - } - - protected function peek() { - $this->lookAhead = $this->get(); - return $this->lookAhead; - } -} - -// -- Exceptions --------------------------------------------------------------- -class JSMinException extends Exception {} - - -/************** OUTPUT *****************/ - -if(count(get_script_requests()) > 0) -{ - if(is_debug_mode()) - { - if(($code = get_javascript_code()) !== null) - { - print_headers(); - echo supports_gzip_encoding() ? gzip_content($code) : $code; - } - } - else - { - if(($filename = compressed_js_filename()) !== null) - { - if(!is_file($filename)) - save_javascript(get_javascript_code(true), $filename); - print_headers($filename); - echo get_saved_javascript($filename); - } - } -} diff --git a/framework/Web/Javascripts/jsmin.php b/framework/Web/Javascripts/jsmin.php new file mode 100644 index 00000000..6ed24033 --- /dev/null +++ b/framework/Web/Javascripts/jsmin.php @@ -0,0 +1,290 @@ + + * @copyright 2002 Douglas Crockford (jsmin.c) + * @copyright 2008 Ryan Grove (PHP port) + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 1.1.1 (2008-03-02) + * @link http://code.google.com/p/jsmin-php/ + */ + +class JSMin { + const ORD_LF = 10; + const ORD_SPACE = 32; + + protected $a = ''; + protected $b = ''; + protected $input = ''; + protected $inputIndex = 0; + protected $inputLength = 0; + protected $lookAhead = null; + protected $output = ''; + + // -- Public Static Methods -------------------------------------------------- + + public static function minify($js) { + $jsmin = new JSMin($js); + return $jsmin->min(); + } + + // -- Public Instance Methods ------------------------------------------------ + + public function __construct($input) { + $this->input = str_replace("\r\n", "\n", $input); + $this->inputLength = strlen($this->input); + } + + // -- Protected Instance Methods --------------------------------------------- + + protected function action($d) { + switch($d) { + case 1: + $this->output .= $this->a; + + case 2: + $this->a = $this->b; + + if ($this->a === "'" || $this->a === '"') { + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === $this->b) { + break; + } + + if (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated string literal.'); + } + + if ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } + } + } + + case 3: + $this->b = $this->next(); + + if ($this->b === '/' && ( + $this->a === '(' || $this->a === ',' || $this->a === '=' || + $this->a === ':' || $this->a === '[' || $this->a === '!' || + $this->a === '&' || $this->a === '|' || $this->a === '?')) { + + $this->output .= $this->a . $this->b; + + for (;;) { + $this->a = $this->get(); + + if ($this->a === '/') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression '. + 'literal.'); + } + + $this->output .= $this->a; + } + + $this->b = $this->next(); + } + } + } + + protected function get() { + $c = $this->lookAhead; + $this->lookAhead = null; + + if ($c === null) { + if ($this->inputIndex < $this->inputLength) { + $c = $this->input[$this->inputIndex]; + $this->inputIndex += 1; + } else { + $c = null; + } + } + + if ($c === "\r") { + return "\n"; + } + + if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { + return $c; + } + + return ' '; + } + + protected function isAlphaNum($c) { + return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; + } + + protected function min() { + $this->a = "\n"; + $this->action(3); + + while ($this->a !== null) { + switch ($this->a) { + case ' ': + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } else { + $this->action(2); + } + break; + + case "\n": + switch ($this->b) { + case '{': + case '[': + case '(': + case '+': + case '-': + $this->action(1); + break; + + case ' ': + $this->action(3); + break; + + default: + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } + else { + $this->action(2); + } + } + break; + + default: + switch ($this->b) { + case ' ': + if ($this->isAlphaNum($this->a)) { + $this->action(1); + break; + } + + $this->action(3); + break; + + case "\n": + switch ($this->a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case "'": + $this->action(1); + break; + + default: + if ($this->isAlphaNum($this->a)) { + $this->action(1); + } + else { + $this->action(3); + } + } + break; + + default: + $this->action(1); + break; + } + } + } + + return $this->output; + } + + protected function next() { + $c = $this->get(); + + if ($c === '/') { + switch($this->peek()) { + case '/': + for (;;) { + $c = $this->get(); + + if (ord($c) <= self::ORD_LF) { + return $c; + } + } + + case '*': + $this->get(); + + for (;;) { + switch($this->get()) { + case '*': + if ($this->peek() === '/') { + $this->get(); + return ' '; + } + break; + + case null: + throw new JSMinException('Unterminated comment.'); + } + } + + default: + return $c; + } + } + + return $c; + } + + protected function peek() { + $this->lookAhead = $this->get(); + return $this->lookAhead; + } +} + +// -- Exceptions --------------------------------------------------------------- +class JSMinException extends Exception {} diff --git a/framework/Web/Javascripts/packages.php b/framework/Web/Javascripts/packages.php new file mode 100644 index 00000000..cff913f8 --- /dev/null +++ b/framework/Web/Javascripts/packages.php @@ -0,0 +1,109 @@ + array( + PROTOTYPE_DIR.'/prototype.js', + SCRIPTACULOUS_DIR.'/builder.js', + 'prado/prado.js', + 'prado/scriptaculous-adapter.js', + 'prado/controls/controls.js', + 'prado/ratings/ratings.js', + ), + + 'effects' => array( + SCRIPTACULOUS_DIR.'/effects.js' + ), + + 'logger' => array( + 'prado/logger/logger.js', + ), + + 'validator' => array( + 'prado/validator/validation3.js' + ), + + 'datepicker' => array( + 'prado/datepicker/datepicker.js' + ), + + 'colorpicker' => array( + 'prado/colorpicker/colorpicker.js' + ), + + 'ajax' => array( + SCRIPTACULOUS_DIR.'/controls.js', + 'prado/activecontrols/json2.js', + 'prado/activecontrols/ajax3.js', + 'prado/activecontrols/activecontrols3.js', + 'prado/activecontrols/inlineeditor.js' + ), + + 'dragdrop'=>array( + SCRIPTACULOUS_DIR.'/dragdrop.js', + 'prado/activecontrols/dragdrop.js' + ), + + 'dragdropextra'=>array( + 'prado/activecontrols/dragdropextra.js', + ), + + 'slider'=>array( + 'prado/controls/slider.js' + ), + + 'keyboard'=>array( + 'prado/controls/keyboard.js' + ), + + 'tabpanel'=>array( + 'prado/controls/tabpanel.js' + ), + + 'activedatepicker' => array( + 'prado/activecontrols/activedatepicker.js' + ), + + 'activefileupload' => array( + 'prado/activefileupload/activefileupload.js' + ), + + 'accordion'=>array( + 'prado/controls/accordion.js' + ), + + 'htmlarea'=>array( + 'prado/controls/htmlarea.js' + ), + +); + + +//package names and their dependencies +$dependencies = array( + 'prado' => array('prado'), + 'effects' => array('prado', 'effects'), + 'validator' => array('prado', 'validator'), + 'logger' => array('prado', 'logger'), + 'datepicker' => array('prado', 'datepicker'), + 'colorpicker' => array('prado', 'colorpicker'), + 'ajax' => array('prado', 'effects', 'ajax'), + 'dragdrop' => array('prado', 'effects', 'ajax', 'dragdrop'), + 'slider' => array('prado', 'slider'), + 'keyboard' => array('prado', 'keyboard'), + 'tabpanel' => array('prado', 'tabpanel'), + 'activedatepicker' => array('prado', 'datepicker', 'ajax', 'activedatepicker'), + 'activefileupload' => array('prado', 'effects', 'ajax', 'activefileupload'), + 'dragdropextra' => array('prado', 'effects', 'ajax', 'dragdrop','dragdropextra'), + 'accordion' => array('prado', 'effects', 'accordion'), + 'htmlarea' => array('prado', 'htmlarea'), +); + +return array($packages, $dependencies); + diff --git a/framework/Web/Javascripts/source/.htaccess b/framework/Web/Javascripts/source/.htaccess new file mode 100644 index 00000000..9ec96342 --- /dev/null +++ b/framework/Web/Javascripts/source/.htaccess @@ -0,0 +1,16 @@ + + mod_gzip_on Yes + mod_gzip_dechunk Yes + mod_gzip_item_include file \.js$ + mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* + + + + ExpiresActive On + ExpiresDefault "access plus 864000 seconds" + + + + Header set Cache-Control "max-age=864000, private" + + diff --git a/framework/Web/Javascripts/source/packages.php b/framework/Web/Javascripts/source/packages.php deleted file mode 100644 index cff913f8..00000000 --- a/framework/Web/Javascripts/source/packages.php +++ /dev/null @@ -1,109 +0,0 @@ - array( - PROTOTYPE_DIR.'/prototype.js', - SCRIPTACULOUS_DIR.'/builder.js', - 'prado/prado.js', - 'prado/scriptaculous-adapter.js', - 'prado/controls/controls.js', - 'prado/ratings/ratings.js', - ), - - 'effects' => array( - SCRIPTACULOUS_DIR.'/effects.js' - ), - - 'logger' => array( - 'prado/logger/logger.js', - ), - - 'validator' => array( - 'prado/validator/validation3.js' - ), - - 'datepicker' => array( - 'prado/datepicker/datepicker.js' - ), - - 'colorpicker' => array( - 'prado/colorpicker/colorpicker.js' - ), - - 'ajax' => array( - SCRIPTACULOUS_DIR.'/controls.js', - 'prado/activecontrols/json2.js', - 'prado/activecontrols/ajax3.js', - 'prado/activecontrols/activecontrols3.js', - 'prado/activecontrols/inlineeditor.js' - ), - - 'dragdrop'=>array( - SCRIPTACULOUS_DIR.'/dragdrop.js', - 'prado/activecontrols/dragdrop.js' - ), - - 'dragdropextra'=>array( - 'prado/activecontrols/dragdropextra.js', - ), - - 'slider'=>array( - 'prado/controls/slider.js' - ), - - 'keyboard'=>array( - 'prado/controls/keyboard.js' - ), - - 'tabpanel'=>array( - 'prado/controls/tabpanel.js' - ), - - 'activedatepicker' => array( - 'prado/activecontrols/activedatepicker.js' - ), - - 'activefileupload' => array( - 'prado/activefileupload/activefileupload.js' - ), - - 'accordion'=>array( - 'prado/controls/accordion.js' - ), - - 'htmlarea'=>array( - 'prado/controls/htmlarea.js' - ), - -); - - -//package names and their dependencies -$dependencies = array( - 'prado' => array('prado'), - 'effects' => array('prado', 'effects'), - 'validator' => array('prado', 'validator'), - 'logger' => array('prado', 'logger'), - 'datepicker' => array('prado', 'datepicker'), - 'colorpicker' => array('prado', 'colorpicker'), - 'ajax' => array('prado', 'effects', 'ajax'), - 'dragdrop' => array('prado', 'effects', 'ajax', 'dragdrop'), - 'slider' => array('prado', 'slider'), - 'keyboard' => array('prado', 'keyboard'), - 'tabpanel' => array('prado', 'tabpanel'), - 'activedatepicker' => array('prado', 'datepicker', 'ajax', 'activedatepicker'), - 'activefileupload' => array('prado', 'effects', 'ajax', 'activefileupload'), - 'dragdropextra' => array('prado', 'effects', 'ajax', 'dragdrop','dragdropextra'), - 'accordion' => array('prado', 'effects', 'accordion'), - 'htmlarea' => array('prado', 'htmlarea'), -); - -return array($packages, $dependencies); - diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php index 19a8090c..0a673b5b 100644 --- a/framework/Web/UI/TClientScriptManager.php +++ b/framework/Web/UI/TClientScriptManager.php @@ -29,10 +29,9 @@ class TClientScriptManager extends TApplicationComponent */ const SCRIPT_PATH='Web/Javascripts/source'; /** - * the PHP script for loading Prado javascript files + * file containing javascript packages and their cross dependencies */ - const SCRIPT_LOADER='Web/Javascripts/clientscripts.php'; - + const PACKAGES_FILE='Web/Javascripts/packages.php'; /** * @var TPage page who owns this manager */ @@ -74,12 +73,12 @@ class TClientScriptManager extends TApplicationComponent */ private $_registeredPradoScripts=array(); /** - * Client-side javascript library dependencies, loads from SCRIPT_PATH.'/packages.php'; + * Client-side javascript library dependencies, loads from PACKAGES_FILE; * @var array */ private static $_pradoScripts; /** - * Client-side javascript library packages, loads from SCRIPT_PATH.'/packages.php'; + * Client-side javascript library packages, loads from PACKAGES_FILE; * @var array */ private static $_pradoPackages; @@ -120,7 +119,7 @@ class TClientScriptManager extends TApplicationComponent } /** - * Registers Prado javascript by library name. See "Web/Javascripts/source/packages.php" + * Registers Prado javascript by library name. See "Web/Javascripts/packages.php" * for library names. * @param string script library name. */ @@ -141,7 +140,7 @@ class TClientScriptManager extends TApplicationComponent { if(self::$_pradoScripts === null) { - $packageFile = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH.'/packages.php'; + $packageFile = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::PACKAGES_FILE; list($packages,$deps)= include($packageFile); self::$_pradoScripts = $deps; self::$_pradoPackages = $packages; @@ -174,31 +173,38 @@ class TClientScriptManager extends TApplicationComponent $addedScripts = array_diff($this->_registeredPradoScripts,$this->_renderedPradoScripts); if(($packages=array_keys($addedScripts))!==array()) { - if (Prado::getApplication()->getMode()!==TApplicationMode::Debug) - { - $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; - $url = $this->registerJavascriptPackages($base, $packages); - $writer->write(TJavaScript::renderScriptFile($url)); - } - else + $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; + list($path,$baseUrl)=$this->getPackagePathUrl($base); + $packagesUrl=array(); + $isDebug=$this->getApplication()->getMode()===TApplicationMode::Debug; + foreach ($packages as $p) { - // In debug mode, we add 1