Location: PHPKode > projects > PhpCodeGenie > phpCodeGenie3.0.2/app/common/utils/phpCodeBeautifier/beautify_php.class.php
<? 
include_once("genieConfiguration.inc.php");
require_once(CLASS_PEAR);
?>
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | hide@address.com so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Jens Bierkandt <hide@address.com>                        |
// +----------------------------------------------------------------------+
//
// $Id: beautify_php.class.php,v 1.1 2004/07/06 13:49:57 nileshd Exp $
// The header is for PEAR, if someday this code is put inside the rep...
/**
* Php Beautify: A tool to beautify php source code
*
* Copyright 2002, Jens Bierkandt, hide@address.com
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
* @package php_beautify
* @author Jens Bierkandt <hide@address.com>
*/
////////////////////////////////
// Main
////////////////////////////////
// for online demo
//set_time_limit(120);
//error_reporting(E_ALL);
/**
* Require for PEAR class
*/
//require_once "PEAR.php";
DEFINE("BEAUT_BRACES_PEAR", "0");
DEFINE("BEAUT_BRACES_C", "1");
DEFINE("BEAUT_INDENT_TYPE", "s"); // t for tabs
DEFINE("BEAUT_VERSION", "0.5.0, 08.05.2003");
/**
* Class to beautify php code
*/
class phpBeautify extends PEAR {
	//public variables
	/**
	* Spaces to indent
	* @var int
	*/
	var $indent_width = 4;
	/**
	* Wrap or not the code at line defined by {@link $max}
	* @var bool
	*/
	var $max_line = FALSE;
	/**
	* Max chars per line, if {@link $max_line} is true
	* @var int
	*/
	var $max = 40;
	/**
	* If true, delete empty lines
	* @var bool
	*/
	var $del_line = FALSE;
	/**
	* Highlight for the html version of the beautify code
	* @var bool
	*/
	var $highlight = FALSE;
	/**
	* Type of braces parse. Can be BEAUT_BRACES_PEAR or BEAUT_BRACES_C
	* @var int
	*/
	var $braces = BEAUT_BRACES_PEAR;
	/**
	* Name of the file to read. Can be "php://stdin".
	* @var string
	*/
	var $file = "";
	/**
	* Find and list the functions at the beggining of the script
	* @var bool
	*/
	var $find_functions = false;
	/**
	* Verify the integrity of the beautify version
	* @var bool
	*/
	var $verify = true;
	/**
	* default indentation mode
	*/
	var $indent_mode = BEAUT_INDENT_TYPE;
	/**
	* Indent the long comments.
	* Add a space to all long comment lines
	* so, the text start in the column of the *
	* Idea of Michael H.E. Roth <hide@address.com>
	* @var bool
	*/
	var $indent_long_comments = false;
	//friend variables (?)
	var $version = BEAUT_VERSION;
	//private variables
	/**
	* Set to true when the parser found a double quoted string
	* @var bool
	* @access private
	*/
	var $_marks = false;
	/**
	* Set to true when the parser found a single quoted string
	* @var bool
	* @access private
	*/
	var $_marks1 = false;
	/**
	* @var int
	* @access private
	*/
	var $_new_line_counter = 0;
	/**
	* @var int
	* @access private
	*/
	var $_indent = 0;
	/**
	* Keeps the string for output
	* @var string
	* @access private
	*/
	var $_allstr = "";
	/**
	* @var bool
	* @access private
	*/
	var $_long_comment = false;
	/**
	* @var bool
	* @access private
	*/
	var $_long_comment_first = false;
	/**
	* @var bool
	* @access private
	*/
	var $_long_comment_last = false;
	/**
	* var bool
	* @access private
	*/
	var $_do_indent = false;
	/**
	* @var bool
	* @access private
	*/
	var $_no_beautify = false;
	/**
	* var string
	* @access private
	*/
	var $_ehtml = "";
	/**
	* var string
	* @access private
	*/
	var $_outstr = "";
	/**
	* var bool
	* @access private
	*/
	var $_comment = false;
	/**
	* var bool
	* @access private
	*/
	var $_brackets = 0;
	/**
	* var bool
	* @access private
	*/
	var $_indent_next = false;
	/**
	* Keeps the original file for verification
	* @var string
	* @access private
	*/
	var $_original = ""; // Keeps the original file for verification
	/**
	* Constructor
	* Create a phpBeautify object, based on an array of settings.
	* This array have the keys for the names of the public variables
	* of the class.
	* @param array an array of settings
	* @author Claudio Bustos
	*/
	function phpBeautify($settings) {
		// seteo
		$this->PEAR();
		$this->setErrorHandling(PEAR_ERROR_DIE, E_USER_ERROR);
		//ingreso las variables en setting
		extract($settings, EXTR_OVERWRITE);
		if (isset($indent_width)) {
			$this->indent_width = $indent_width;
		}
		if (isset($indent_mode)) {
			$this->indent_mode = $indent_mode;
		}
		if (isset($max_line)) {
			$this->max_line = $max_line;
		}
		if (isset($max)) {
			$this->max = $max;
		}
		if (isset($del_line)) {
			$this->del_line = $del_line;
		}
		if (isset($highlight)) {
			$this->highlight = $highlight;
		}
		if (isset($braces)) {
			$this->braces = $braces;
		}
		if (isset($file)) {
			$this->file = $file;
		}
		if (isset($find_functions)) {
			$this->find_functions = $find_functions;
		}
		if (isset($verify)) {
			$this->find_functions = $verify;
		}
		if (isset($indent_long_comments)) {
			$this->indent_long_comments = $indent_long_comments;
		}
	}
	/**
	* Returns the Version of the program
	* @return string
	*/
	function getVersion() {
		return BEAUT_VERSION;
	}
	/**
	* Returns a string with the beautify php code.
	* To get a Html version of the code, use {@link toHtml()}
	* @return mixed you can obtain the string with the code or a PEAR_ERROR is something bad happens.
	*/
	function beautify() {
		$this->_main();
		$rs = $this->_output();
		if ($this->verify) {
			$this->_verify($rs);
		}
		if ($this->find_functions) {
			$this->_findfunctions($rs);
		}
		return $rs;
	}
	/**
	* Send to the screen the phpCode in HTML format (how I say that in english?)
	* Dependly of {@link $highlight}, you get a pure text version or with colors.
	* To get a string with the code, use {@link beautify()}
	*/
	function toHTML() {
		if ($this->highlight) {

			highlight_string($this->beautify());
			//echo "<code><pre>\n".htmlentities($this->beautify())."\n</pre></code>";

		} // endif
		else
		{
			//header("Content-Type: text/plain");
			echo "<code><pre>\n".htmlentities($this->beautify())."\n</pre></code>";
		}
	}
	/**
	* Open a file or the standard input for _main() function
	* @access private
	* @param string filename
	* @return resource a file pointer to filename
	*/
	function &_open_file($file) {
		if (!file_exists($file) AND $file  != "php://stdin") {
			return $this->raiseError("File ".$file." does not exist\n", 1);
		}
		$fp = fopen($file, "r");
		if (!is_resource($fp)) {
			return $this->raiseError("Could not open ".$file."file \n", 1);
		} else {
			return $fp;
		}
	}
	/**
	* Parse the code.
	* Returns TRUE is everything is OK or a PEAR_ERROR object instead
	* @return mixed can be a bool or a PEAR_ERROR
	* @access private
	* @author Jens Bierkandt
	*/
	function _main() {


		$lineTokens = explode("\n",$this->file);

		for ($lt=0; $lt<count($lineTokens);$lt++)
		{
			// Get a line from the file
			$str = $lineTokens[$lt];

			// check if we are allowed to process line
			if (trim($str) == "// BEAUTIFY") {
				// Do beautify :-)
				$this->_no_beautify = false;
				continue;
			}
			if (trim($str) == "// NO_BEAUTIFY") {
				// Do not beautify :-(
				$this->_no_beautify = true;
				continue;
			}

			$this->_original  .= $str;

			// End of ehtml?
			if (trim($str) == $this->_ehtml && $this->_ehtml != "") {
				$this->_allstr .= $str;
				$this->_ehtml = "";
				continue;
			}

			// Still in ehtml mode?
			if ($this->_ehtml) {
				$this->_allstr .= $str;
				continue;
			}

			//skip no php and // NO_BEAUTIFY lines
			if ($this->_no_beautify AND trim($str)  != "<?" AND trim($str)  != "<?php") {
				$this->_allstr  .= $str;
				continue;
			}
			$this->_outstr = "";
			$this->_comment = false;
			$this->_brackets = 0;
			// Kill nasty tabs
			$str = trim(str_replace("\t", " ", $str));
			// Don't delete empty lines if required by user
			if (!$this->del_line)
			if (preg_match("/^(\s)*$/", $str)  != 0) {
				$this->_out(" ");
				continue;
			}
			if ($this->_long_comment) {
				$this->_comment = true;
			}
			// Extract the characters in an array
			$a = null;
			for ($i = 0; $i < strlen($str); $i++) {
				$a[$i] = substr($str, $i, 1);
			}
			// Do pre-processing on every char
			for ($i = 0; $i < strlen($str); $i++) {
				// Check, if we deal with php-code
				if (!$this->_new_line_counter and ($i+1) < sizeof($a)) {
					if ($a[$i+1] == "?" AND $a[$i] == "<") {
						if ($this->_outstr) $this->_out(trim($this->_outstr));
						$this->_out("<?php");
						$this->_indent++;
						$this->_new_line_counter++;
						if (($i+4) < sizeof($a)) {
							if ($a[$i+2] == "p" AND $a[$i+3] == "h" AND $a[$i+4] == "p")
							$i = $i+3;
						}
						$i++;
						$this->_no_beautify = false;
						continue;
					}
				}

				// Kill all chars below 32
				if (ord($a[$i]) < 32) $a[$i] = " ";
				if (!$this->_marks AND !$this->_marks1) {
					if ($i > 0) {
						// check if line is long comment initiated with /*
						if ($a[$i]=="*" AND $a[$i-1]=="/" AND !$this->_comment) {
							$this->_long_comment=true;
							$this->_long_comment_first = true;
							$this->_comment=true;
						}
						// check if line is finishing long comment with */
						if ($a[$i]== "/" AND $a[$i-1] == "*") {
							$this->_long_comment = false;
							$this->_long_comment_last = true;
						}
						// check if line is comment with //
						if ($a[$i] == "/" AND $a[$i-1] == "/" or $this->_comment) {
							$this->_comment = true;
							$this->_outstr  .= $a[$i];
							continue;
						}
					} // end if ($i > 0)
					// check if line is comment with old #
					if ($a[$i] == "#") {
						$this->_comment = true;
						$this->_outstr  .= $a[$i];
						continue;
					}
					// add space before chars = < >
					if ($i > 0 AND !$this->_comment) {
						if (($a[$i] == "=" OR $a[$i] == "<" OR $a[$i] == ">" OR $a[$i] == "*")
						AND preg_match("/([ |\!|\=|\.|\<|\>|\-|\+|\*|\/]+)/", $a[$i-1]) == 0) {
							$this->_outstr  = rtrim($this->_outstr)." ";
						}
					}
					// add space behind =
					if ($i > 0 AND !$this->_comment) {
						if (($a[$i-1] == "="OR $a[$i-1] == "*")
						AND preg_match("/([ |=|>]+)/", $a[$i]) == 0) {
							$this->_outstr  = rtrim($this->_outstr)." ";
						}
					}
					// add space before two-digit-chars && || !
					if (($i+2) < sizeof($a) AND !$this->_comment) {
						if ($a[$i+1] == "&"AND $a[$i] == "&" AND $a[$i+2]  != " ") {
							$this->_outstr  = rtrim($this->_outstr)." ";
						}
						if ($a[$i+1] == "|" AND $a[$i] == "|" AND $a[$i+2]  != " ") {
							$this->_outstr  = rtrim($this->_outstr)." ";
						}
					}
				} //end if ($no_mark)
				// ignore all in between ""
				// echo$a[$i]."|";
				if ($a[$i] == "\"" AND !($this->_marks) AND !($this->_comment) AND !($this->_marks1)) {
					//turn on
					$this->_marks = true;
					if ($i > 0 AND $a[$i-1] == chr(92)) {
						$this->_marks = false;
						// echo"!off1!";
					}
					// echo"<on1>";
				} else {
					if ($a[$i] == "\"" AND $this->_marks AND !($this->_comment) AND !($this->_marks1)) {
						//turn off
						$this->_marks = false;
						if ($i > 0 AND $a[$i-1] == chr(92) and $a[$i-2]!=chr(92)) {
							$this->_marks = true;
							// echo"!on1!";
						}
						// echo"<off1>";
					}
				}
				// ignore all in between ' '
				if ($a[$i] == chr(39) AND !($this->_marks) AND !($this->_marks1) AND !($this->_comment)) {
					//turn on
					$this->_marks1 = true;
					if ($i > 0 AND $a[$i-1] == chr(92)) {
						$this->_marks1 = false;
						//      $this->_outstr.="off2";
					}
					//else $this->_outstr.="on2";
				} else {
					if ($a[$i] == chr(39) AND !($this->_marks) AND $this->_marks1 AND !($this->_comment)) {
						//turn off
						$this->_marks1 = false;
						if ($i > 0 AND $a[$i-1] == chr(92)) {
							$this->_marks1 = true;
							//        $this->_outstr.="on2";
						}
						//else $this->_outstr.="off2";
					}
				}
				// do further processing if code is not ignored
				if (!($this->_marks) AND !($this->_marks1) AND !($this->_comment)) {

					// check if we have a "<<<"
					if ($i+3 < sizeof($a)) {
						if ($a[$i] == "<" AND $a[$i+1] == "<" AND $a[$i+2] == "<") {

							// rest of line is the trigger for the end
							for ($z=$i+3;$z<sizeof($a);$z++) {
								$this->_ehtml .= $a[$z];
							}
							$this->_out($this->_outstr."<<<".$this->_ehtml);
							$this->_ehtml = trim($this->_ehtml);
							continue 2;
						}
					}

					// add space behind chars , < >
					if ($i+1 < sizeof($a)) {
						if (($a[$i] == "," OR $a[$i] == "<" OR $a[$i] == ">")
						AND preg_match("/([ |\!|\=|\.|\<|\>]+)/", $a[$i+1]) == 0) {
							$this->_outstr  .= $a[$i]." ";
							continue;
						}
					}
					// add spaces before chars . ! + - / * (if they belong to math function)
					if ($i+1 < sizeof($a)) {
						if (($a[$i] == "." OR $a[$i] == "!" OR $a[$i] == "+" OR $a[$i] == "-" OR $a[$i] == "/" OR $a[$i] == "*")
						AND preg_match("/([\=]+)/", $a[$i+1]) == 1) {
							$this->_outstr  = rtrim($this->_outstr)." ";
						}
					}
					// add space behind chars && ||
					if ($i > 0 and ($i+1) < sizeof($a)) {
						if ($a[$i-1] == "&" and $a[$i] == "&" and $a[$i+1]  != " ") {
							$this->_outstr  .= $a[$i]." ";
							continue;
						}
						if ($a[$i-1] == "|" and $a[$i] == "|" and $a[$i+1]  != " ") {
							$this->_outstr  .= $a[$i]." ";
							continue;
						}
					}
					if (($i+1) < sizeof($a)) {
						// check if php code ends
						if ($a[$i+1] == ">" AND $a[$i] == "?") {
							$this->_new_line_counter = 0;
							if ($this->_outstr) $this->_out(trim($this->_outstr));
							$this->_indent--;
							$this->_out("?>");
							//<?
							$i++;
							$this->_no_beautify = true;
							continue;
						}
						// Delete some odd spaces before ')'
						if ($a[$i] == " " AND $a[$i+1] == ")") {
							$this->_outstr  .= $a[$i];
							while ($a[$i+1] == " ") $i++;
							$this->_brackets--;
							continue;
						}
						// Delete some odd spaces behind '('
						if (($a[$i] == "(") AND $a[$i+1] == " ") {
							$this->_outstr  .= $a[$i];
							while ($a[$i+1] == " ") $i++;
							$this->_brackets++;
							continue;
						}
					}
					// check, if ; is last letter in line, check if ; is from for function
					if ($a[$i] == "(") $this->_brackets++;
					if ($a[$i] == ")") $this->_brackets--;
					/*
					if (substr($this->_outstr, 0, 3) == "for") {
					$this->_brackets = true;
					}
					*/
					// needed for for(;;;)
					// this prevent breaking direct calling function inside a
					// class
					// example  className::function()
					if (($i+2) < sizeof($a)) {
						if ($a[$i] == ":" and $a[$i+1] == ":") {
							$this->_outstr  .= $a[$i].$a[$i+1].$a[$i+2];
							$i  += 2;
							continue;
						}
					}
					if ((($a[$i] == ";") or ($a[$i] == ":")) AND !($this->_brackets)) {
						// echo $a[$i];
						if ($i+2 < sizeof($a)) {
							if ($a[$i+1] == "/" OR $a[$i+2] == "/") {
								// if comment in same line
								$this->_outstr  .= $a[$i];
								continue;
							}
							if ($a[$i] == ";") {
								// add newline
								$this->_out(trim($this->_outstr).$a[$i]);
								continue;
							}
						}
						$this->_out($this->_outstr.$a[$i]);
						continue;
					}
					// if for (;;;)
					if ($this->_brackets AND ($a[$i] == ";") AND ($a[$i]  != " ")) {
						$this->_outstr  .= "; ";
						continue;
					}
					// check if }
					if ($a[$i] == "}") {
						if ($i > 0) $this->_out(trim($this->_outstr)); // there was code before bracket->newline
						if ($i < sizeof($a)-1) {
							if ($a[$i+1] == ";") {
								$this->_indent--;
								$this->_outstr  .= "}";
								continue;
							}
						}
						$this->_indent--;
						if ($i < sizeof($a)-3) // check if something like } //
						{
							if ($a[$i+3] == "/" AND $a[$i+2] == "/") {
								$this->_comment = true;
								$this->_outstr  .= $a[$i];
								continue;
							}
						}
						$this->_out("}");
						continue;
					}
					// check if {
					if ($a[$i] == "{") {
						if ($i > 0) $this->_out(trim($this->_outstr)); // there was code before bracket->newline
						$this->_out("{");
						$this->_indent++;
						continue;
					}
					// check for double spaces
					$checkstr = substr($this->_outstr, strlen($this->_outstr)-1);
					if (($a[$i] == " ") AND ($checkstr == " ")) {
						$this->_outstr = substr($this->_outstr, 0, strlen($this->_outstr)-1);
					}

					// change ( ! to (!
					$this->_outstr = preg_replace("/(\(\s!)+/", "(!", $this->_outstr);
				}
				$this->_outstr  .= $a[$i];
			}
			$this->_out(trim($this->_outstr));
		} // end for lt
		return TRUE;
	}
	////////////////////////////////
	// Internal functions
	////////////////////////////////
	/**
	* Format and add output to $this->_allstr
	* @access private
	* @param string a outstr string
	* @author Jens Bierkandt
	*/
	function _out($outstr) {
		if ($this->del_line) $outstr = trim($outstr);
		if ($outstr == "") return;
		// additional beautifying
		$outstr = preg_replace("/( )*->( )*/", "->", $outstr);
		//->without surrounding spaces
		// space behind some key words
		$outstr = preg_replace("/^if\s*\(/", "if (", $outstr);
		$outstr = preg_replace("/^while\s*\(/", "while (", $outstr);
		// no free brackets
		// TODO: check, that ( ) doesn't change to ()
		//$outstr = preg_replace("/\(( )+/", "(", $outstr);
		//$outstr = preg_replace("/( )+\)/", ")", $outstr);
		// linebreak after $max_line
		if ($this->max_line) {
			if (strlen($outstr)+strlen($this->_getindent()) > $this->max_line) {
				$b = 0;
				while (strlen($outstr)+strlen($this->_getindent()) > $this->max_line) {
					if ($b > 0) $this->_indent++;
					$subout = substr($outstr, 0, $this->max_line-strlen($this->_getindent()));
					$end = strrpos($subout, " ");
					if ($end == false) // check if breakable by a space
					{
						$end = $this->max_line-strlen($this->_getindent()); // if not, break it after $max_line for now
					}
					$subout = substr($subout, 0, $end);
					$this->_allstr  .= $this->_getindent().trim($subout)."\n";
					$outstr = substr($outstr, $end);
					if ($outstr == "") {
						if ($b > 0) $this->indent--;
						continue 2;
					}
					if ($b > 20) {
						$this->_indent--;
						continue; // just in case we got stuck ;-)
					}
					if ($b > 0) $this->_indent--;
					$b++;
				}
				if ($b > 0) $this->_indent++;
				$this->_allstr  .= $this->_getindent().trim($outstr)."\n";
				if ($b > 0) $this->_indent--;
				$this->_outstr = "";
				return;
			}
		}
		//check if newline is requested
		//add before char
		if ($this->_indent_next) $this->_indent++;
		if ($this->_do_indent) $this->_allstr  .= $this->_getindent();
		$this->_allstr  .= $outstr;
		if ($this->_indent_next) {
			$this->_indent--;
			$this->_indent_next = 0;
		}
		//check if newline is requested
		//after char
		$this->_do_indent = 0;
		if ((preg_match("/(;|,|:|\s|{|}|\(|\)|else|do)$/", $outstr)) OR $this->_ehtml OR $this->_comment OR !$this->_new_line_counter or $this->max_line OR $this->_marks OR $this->_marks1) {
			$this->_allstr  .= "\n";
			$this->_do_indent = 1;
		} else {
			$this->_allstr  .= " ";
		}
		// Indent one line if expression is without brackets or inside quotation makrs
		if (!($this->_comment) AND ((preg_match("/^(if \(.*\)|else)$/", $this->_outstr)) OR preg_match("/(, *)$/", $this->_outstr) OR $this->_marks OR $this->_marks1)) {
			$this->_indent_next = true;
		}
		$this->_outstr = "";
		return;
	}
	/**
	* Return a string with parsed code.
	* @access private
	* @return string
	* @author Jens Bierkandt
	*/
	function _output() // print all
	{
		// if selected "braces PEAR-style", delete newline before {
		if ($this->braces == BEAUT_BRACES_PEAR) {
			// Put { in upper line
			$this->_allstr = preg_replace("/\)\n([ \t])*{/", ") {", $this->_allstr);
			// compress to } else {
			$this->_allstr = preg_replace("/}\n([ \t])*else\n([ \t])*{/", "} else {", $this->_allstr);
			$this->_allstr = preg_replace("/}\n.*?elseif/", "} elseif", $this->_allstr);
			// Do while loop
			$this->_allstr = preg_replace("/do\n([ \t])*{/", "do {", $this->_allstr);
		}
		return $this->_allstr;
	}
	/**
	* Put spaces on a line
	* @access private
	* @return string a string with spaces, accordly to $this->_indent
	*/
	function _getindent() {
		$str = "";
		if ($this->_indent < 0) $this->_indent = 0;
		if ($this->indent_mode == "t") {
			for ($i = 0; $i < $this->_indent; $i++) {
				$str  .= "\t";
			}
		} else {
			$str = str_repeat(" ", $this->_indent * $this->indent_width);
		}
		if ($this->indent_long_comments and ($this->_long_comment OR $this->_long_comment_last)) {
			if (!($this->_long_comment_first)) {
				$str  .= " ";
			} else {
				$this->_long_comment_first = false;
			}
			$this->_long_comment_last = false;
		}
		return $str;
	}
	/**
	* A nasty function, that verify that no code are altered.
	*
	* The idea is delete the space chars (spaces, tabs and new lines)
	* from the original and the copy and compare it
	* If something is different, the program altered the original
	* and is better not use it.
	*
	* TODO: a better way for make the test. Not discrimine parts of the code
	* that needs spaces (like SQL querys inside quotes);
	*
	* @access private
	* @return mixed bool(TRUE) or PEAR_ERROR (Wrong!)
	* @author Claudio Bustos
	*/
	function _verify() {
		$test1 = preg_replace("/\s*/", "", $this->_original);
		$test1 = str_replace("<?php", "", $test1);
		$test1 = str_replace("<?", "", $test1);
		$test2 = preg_replace("/\s*/", "", $this->_allstr);
		$test2 = str_replace("<?php", "", $test2);
		$test2 = str_replace("<?", "", $test2);
		if (md5($test1)  != md5($test2)) {
			return $this->raiseError("Original and beauty version aren't equal. Please find the differences and send them to the author ;-)");
		} else {
			return true;
		}
	}
	/**
	* A function that list the functions (redundance rules!) inside the file
	*
	* When the var find_functions is set to TRUE
	* this function return the functions in the file
	* and put it on the begining
	* @param string the beautified code
	* @author Jay Schauer - Claudio Bustos (Adaptation)
	*/
	function _findfunctions(&$rs) {
		$this->_indent++;
		$functionlist = "<?php\n";
		$functionlist .= $this->_getindent()."/* Functions in this file */\n";
		$functionlist .= $this->_getindent()."/**************************/\n\n";
		$thestr = $rs;
		$foundone = 0;
		/* use array to capture and sort functions */
		while (preg_match ("/(function )(\S*\(\S*\))/", $thestr, $regs)) {
			$foundone++;
			$functioncapture[] = $this->_getindent()."// ".trim($regs[2])."\n";
			$replacestr = $regs[1].$regs[2];
			$thestr = str_replace($replacestr, "", $thestr);
		}
		if ($foundone) {
			natcasesort($functioncapture);
			$functionlist  .= implode('', $functioncapture);
			$functionlist  .= '?'.">\n";
			$rs = $functionlist.$rs;
		}
		$this->_indent--;
		// this following adds space between functions in the main code
		//               $rs=str_replace('function',chr(13).'function',$rs);
		//this following unindents case statements in the main code*/
		//                $rs=str_replace('   case ','case ',$rs);
		//               return $rs;
	}
}
?>
Return current item: PhpCodeGenie