diff -r de56132c008d -r bdac73ed481e includes/js-compressor.php --- a/includes/js-compressor.php Sun Mar 28 21:49:26 2010 -0400 +++ b/includes/js-compressor.php Sun Mar 28 23:10:46 2010 -0400 @@ -84,8 +84,8 @@ /** * public variables - * stats:string after every compression has some informations - * version:string version of this class + * stats:string after every compression has some informations + * version:string version of this class */ var $stats = '', $version = '0.8'; @@ -104,7 +104,7 @@ /** * public constructor - * creates a new BaseConvert class variable (base 36) + * creates a new BaseConvert class variable (base 36) */ function __construct() { $this->__SourceMap = new SourceMap(); @@ -120,9 +120,9 @@ /** * public method - * getClean(mixed [, bool]):string - * compress JavaScript removing comments and somespaces (on by default) - * @param mixed view example and notes on class comments + * getClean(mixed [, bool]):string + * compress JavaScript removing comments and somespaces (on by default) + * @param mixed view example and notes on class comments */ function getClean($jsSource) { return $this->__commonInitMethods($jsSource, false); @@ -130,9 +130,9 @@ /** * public method - * getPacked(mixed):string - * compress JavaScript replaceing words and removing comments and some spaces - * @param mixed view example and notes on class comments + * getPacked(mixed):string + * compress JavaScript replaceing words and removing comments and some spaces + * @param mixed view example and notes on class comments */ function getPacked($jsSource) { return $this->__commonInitMethods($jsSource, true); @@ -373,124 +373,124 @@ * @Application Last version of JavaScriptCompressor class use this one to map source code. */ class SourceMap { - - /** - * public method - * getMap(&$source:string, &$delimeters:array):array - * Maps the source code using $delimeters rules and returns map as an array - * NOTE: read comments to know more about map and delimeter - * - * @param string generic source code - * @param array array with nested array with code rules - */ - function getMap(&$source, &$delimeters) { - - # "unsigned" integer variables - $sourcePosition = 0; - $delimetersPosition = 0; - $findLength = 0; - $len = 0; - $tempIndex = 0; - $sourceLength = strlen($source); - $delimetersLength = count($delimeters); - - # integer variables - $tempPosition = -1; - $endPosition = -1; - - # array variables - $map = array(); - $tempMap = array(); - $tempDelimeter = array(); - - while($sourcePosition < $sourceLength) { - $endPosition = -1; - for($delimetersPosition = 0; $delimetersPosition < $delimetersLength; $delimetersPosition++) { - $tempPosition = strpos($source, $delimeters[$delimetersPosition]['start'], $sourcePosition); - if($tempPosition !== false && ($tempPosition < $endPosition || $endPosition === -1)) { - $endPosition = $tempPosition; - $tempIndex = $delimetersPosition; - } - } - if($endPosition !== -1) { - $sourcePosition = $endPosition; - $tempDelimeter = &$delimeters[$tempIndex]; - $findLength = strlen($tempDelimeter['start']); - if(is_array($tempDelimeter['end'])) { - $delimetersPosition = 0; - $endPosition = -1; - for($len = count($tempDelimeter['end']); $delimetersPosition < $len; $delimetersPosition++) { - $tempPosition = strpos($source, $tempDelimeter['end'][$delimetersPosition], $sourcePosition + $findLength); - if($tempPosition !== false && ($tempPosition < $endPosition || $endPosition === -1)) { - $endPosition = $tempPosition; - $tempIndex = $delimetersPosition; - } - } - if($endPosition !== -1) - $endPosition = $endPosition + strlen($tempDelimeter['end'][$tempIndex]); - else - $endPosition = $sourceLength; - array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); - $sourcePosition = $endPosition - 1; - } - elseif(isset($tempDelimeter['match'])) { - $tempPosition = strpos($source, $tempDelimeter['end'], $sourcePosition + $findLength); - $len = strlen($tempDelimeter['end']); - if($tempPosition !== false && preg_match($tempDelimeter['match'], substr($source, $sourcePosition, $tempPosition - $sourcePosition + $len))) { - $endPosition = isset($tempDelimeter['noslash']) ? $this->__endCharNoSlash($source, $sourcePosition, $tempDelimeter['end'], $sourceLength) : $tempPosition + $len; - array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); - $sourcePosition = $endPosition - 1; - } - } - else { - if(isset($tempDelimeter['noslash'])) - $endPosition = $this->__endCharNoSlash($source, $sourcePosition, $tempDelimeter['end'], $sourceLength); - else { - $tempPosition = strpos($source, $tempDelimeter['end'], $sourcePosition + $findLength); - if($tempPosition !== false) - $endPosition = $tempPosition + strlen($tempDelimeter['end']); - else - $endPosition = $sourceLength; - } - array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); - $sourcePosition = $endPosition - 1; - } - } - else - $sourcePosition = $sourceLength - 1; - ++$sourcePosition; - } - $len = count($map); - if($len === 0) - array_push($tempMap, array('name'=>'code', 'start'=>0, 'end'=>$sourceLength)); - else { - for($tempIndex = 0; $tempIndex < $len; $tempIndex++) { - if($tempIndex === 0 && $map[$tempIndex]['start'] > 0) - array_push($tempMap, array('name'=>'code', 'start'=>0, 'end'=>$map[$tempIndex]['start'])); - elseif($tempIndex > 0 && $map[$tempIndex]['start'] > $map[$tempIndex-1]['end']) - array_push($tempMap, array('name'=>'code', 'start'=>$map[$tempIndex-1]['end'], 'end'=>$map[$tempIndex]['start'])); - array_push($tempMap, array('name'=>$map[$tempIndex]['name'], 'start'=>$map[$tempIndex]['start'], 'end'=>$map[$tempIndex]['end'])); - if($tempIndex + 1 === $len && $map[$tempIndex]['end'] < $sourceLength) - array_push($tempMap, array('name'=>'code', 'start'=>$map[$tempIndex]['end'], 'end'=>$sourceLength)); - } - } - return $tempMap; - } - - function __endCharNoSlash(&$source, $position, &$find, &$len) { - $temp = strlen($find); - do { - $position = strpos($source, $find, $position + 1); - }while($position !== false && !$this->__charNoSlash($source, $position)); - if($position === false) $position = $len - $temp; - return $position + $temp; - } - - function __charNoSlash(&$source, &$position) { - $next = 1; $len = $position - $next; - while($len > 0 && $source{$len} === '\\') $len = $position - (++$next); - return (($next - 1) % 2 === 0); - } + + /** + * public method + * getMap(&$source:string, &$delimeters:array):array + * Maps the source code using $delimeters rules and returns map as an array + * NOTE: read comments to know more about map and delimeter + * + * @param string generic source code + * @param array array with nested array with code rules + */ + function getMap(&$source, &$delimeters) { + + # "unsigned" integer variables + $sourcePosition = 0; + $delimetersPosition = 0; + $findLength = 0; + $len = 0; + $tempIndex = 0; + $sourceLength = strlen($source); + $delimetersLength = count($delimeters); + + # integer variables + $tempPosition = -1; + $endPosition = -1; + + # array variables + $map = array(); + $tempMap = array(); + $tempDelimeter = array(); + + while($sourcePosition < $sourceLength) { + $endPosition = -1; + for($delimetersPosition = 0; $delimetersPosition < $delimetersLength; $delimetersPosition++) { + $tempPosition = strpos($source, $delimeters[$delimetersPosition]['start'], $sourcePosition); + if($tempPosition !== false && ($tempPosition < $endPosition || $endPosition === -1)) { + $endPosition = $tempPosition; + $tempIndex = $delimetersPosition; + } + } + if($endPosition !== -1) { + $sourcePosition = $endPosition; + $tempDelimeter = &$delimeters[$tempIndex]; + $findLength = strlen($tempDelimeter['start']); + if(is_array($tempDelimeter['end'])) { + $delimetersPosition = 0; + $endPosition = -1; + for($len = count($tempDelimeter['end']); $delimetersPosition < $len; $delimetersPosition++) { + $tempPosition = strpos($source, $tempDelimeter['end'][$delimetersPosition], $sourcePosition + $findLength); + if($tempPosition !== false && ($tempPosition < $endPosition || $endPosition === -1)) { + $endPosition = $tempPosition; + $tempIndex = $delimetersPosition; + } + } + if($endPosition !== -1) + $endPosition = $endPosition + strlen($tempDelimeter['end'][$tempIndex]); + else + $endPosition = $sourceLength; + array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); + $sourcePosition = $endPosition - 1; + } + elseif(isset($tempDelimeter['match'])) { + $tempPosition = strpos($source, $tempDelimeter['end'], $sourcePosition + $findLength); + $len = strlen($tempDelimeter['end']); + if($tempPosition !== false && preg_match($tempDelimeter['match'], substr($source, $sourcePosition, $tempPosition - $sourcePosition + $len))) { + $endPosition = isset($tempDelimeter['noslash']) ? $this->__endCharNoSlash($source, $sourcePosition, $tempDelimeter['end'], $sourceLength) : $tempPosition + $len; + array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); + $sourcePosition = $endPosition - 1; + } + } + else { + if(isset($tempDelimeter['noslash'])) + $endPosition = $this->__endCharNoSlash($source, $sourcePosition, $tempDelimeter['end'], $sourceLength); + else { + $tempPosition = strpos($source, $tempDelimeter['end'], $sourcePosition + $findLength); + if($tempPosition !== false) + $endPosition = $tempPosition + strlen($tempDelimeter['end']); + else + $endPosition = $sourceLength; + } + array_push($map, array('name'=>$tempDelimeter['name'], 'start'=>$sourcePosition, 'end'=>$endPosition)); + $sourcePosition = $endPosition - 1; + } + } + else + $sourcePosition = $sourceLength - 1; + ++$sourcePosition; + } + $len = count($map); + if($len === 0) + array_push($tempMap, array('name'=>'code', 'start'=>0, 'end'=>$sourceLength)); + else { + for($tempIndex = 0; $tempIndex < $len; $tempIndex++) { + if($tempIndex === 0 && $map[$tempIndex]['start'] > 0) + array_push($tempMap, array('name'=>'code', 'start'=>0, 'end'=>$map[$tempIndex]['start'])); + elseif($tempIndex > 0 && $map[$tempIndex]['start'] > $map[$tempIndex-1]['end']) + array_push($tempMap, array('name'=>'code', 'start'=>$map[$tempIndex-1]['end'], 'end'=>$map[$tempIndex]['start'])); + array_push($tempMap, array('name'=>$map[$tempIndex]['name'], 'start'=>$map[$tempIndex]['start'], 'end'=>$map[$tempIndex]['end'])); + if($tempIndex + 1 === $len && $map[$tempIndex]['end'] < $sourceLength) + array_push($tempMap, array('name'=>'code', 'start'=>$map[$tempIndex]['end'], 'end'=>$sourceLength)); + } + } + return $tempMap; + } + + function __endCharNoSlash(&$source, $position, &$find, &$len) { + $temp = strlen($find); + do { + $position = strpos($source, $find, $position + 1); + }while($position !== false && !$this->__charNoSlash($source, $position)); + if($position === false) $position = $len - $temp; + return $position + $temp; + } + + function __charNoSlash(&$source, &$position) { + $next = 1; $len = $position - $next; + while($len > 0 && $source{$len} === '\\') $len = $position - (++$next); + return (($next - 1) % 2 === 0); + } } /** @@ -502,25 +502,25 @@ function perform_js_compress($text_or_file, $aggressive = false) { - static $compressor = false; - - if ( !is_object($compressor) ) - $compressor = new JavaScriptCompressor(); - - if ( strpos($text_or_file, "\n") ) - { - $text =& $text_or_file; - } - else if ( file_exists($text_or_file) ) - { - $text = file_get_contents($text_or_file); - } - else - { - $text =& $text_or_file; - } - - return ( $aggressive ) ? $compressor->getPacked($text) : $compressor->getClean($text); + static $compressor = false; + + if ( !is_object($compressor) ) + $compressor = new JavaScriptCompressor(); + + if ( strpos($text_or_file, "\n") ) + { + $text =& $text_or_file; + } + else if ( file_exists($text_or_file) ) + { + $text = file_get_contents($text_or_file); + } + else + { + $text =& $text_or_file; + } + + return ( $aggressive ) ? $compressor->getPacked($text) : $compressor->getClean($text); } ?> \ No newline at end of file