#!/usr/bin/php
<?php
/**
 * Prado build file.
 *
 * This is a command line script that can be run simply by "php build.php".
 *
 * This script expands prado.php into a file that contains the content
 * of prado.php and all its included (directly or indirectly) files.
 * Comments and trace statements are stripped off to further improve
 * performance.
 *
 * The generated file is named pradolite.php and is placed under the
 * 'framework' directory.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.pradosoft.com/
 * @copyright Copyright &copy; 2005 PradoSoft
 * @license http://www.pradosoft.com/license/
 * @version $Id$
 * @package Tools
 */

/**
 * The framework directory
 */
define('FRAMEWORK_DIR',realpath(dirname(__FILE__).'/../../framework'));
/**
 * The merged file name
 */
define('OUTPUT_FILE','pradolite.php');


if(FRAMEWORK_DIR===false || !is_file(FRAMEWORK_DIR.'/prado.php'))
	die('Unable to determine the installation directory of Prado Framework.');

$lastupdate=date('Y/m/d H:i:s');
$comments="
/**
 * File Name: pradolite.php
 * Last Update: $lastupdate
 * Generated By: buildscripts/phpbuilder/build.php
 *
 * This file is used in lieu of prado.php to boost PRADO application performance.
 * It is generated by expanding prado.php with included files.
 * Comments and trace statements are stripped off.
 *
 * Do not modify this file manually.
 */
";

$content=unfold_file(FRAMEWORK_DIR.'/prado.php');
$content="<?php\n".preg_replace('/^(\?>|<\?php)/mu','',$content)."\n?>";
$content=strip_comments($content);
$content=preg_replace('/^\s*Prado::trace.*\s*;\s*$/mu','',$content);
$content=strip_empty_lines($content);
$content=substr_replace($content,$comments,5,0);
file_put_contents(FRAMEWORK_DIR.'/'.OUTPUT_FILE,$content);
echo "Done.\n";

exit();

function strip_comments($source)
{
	$tokens = token_get_all($source);
	/* T_ML_COMMENT does not exist in PHP 5.
	* The following three lines define it in order to
	* preserve backwards compatibility.
	*
	* The next two lines define the PHP 5-only T_DOC_COMMENT,
	* which we will mask as T_ML_COMMENT for PHP 4.
	*/
	if (!defined('T_ML_COMMENT')) {
		@define('T_ML_COMMENT', T_COMMENT);
	} else {
		@define('T_DOC_COMMENT', T_ML_COMMENT);
	}
	$output = '';
	foreach ($tokens as $token) {
		if (is_string($token)) {
			// simple 1-character token
			$output .= $token;
		} else {
			// token array
			list($id, $text) = $token;
			switch ($id) {
				case T_COMMENT:
				case T_ML_COMMENT: // we've defined this
				case T_DOC_COMMENT: // and this
					// no action on comments
					break;
				default:
				// anything else -> output "as is"
				$output .= $text;
				break;
			}
		}
	}
	return $output;
}

function strip_empty_lines($string)
{
	$string = preg_replace("/[\r\n]+[\s\t]*[\r\n]+/", "\n", $string);
	$string = preg_replace("/^[\s\t]*[\r\n]+/", "", $string);
	return $string;
}

function unfold_file($fileName)
{
	static $unfoldedFiles=array();
	$pattern='^(Prado::using|require_once|include_once)\s*\(([^\*]*?)\);';
	echo "adding $fileName...\n";
	$content=file_get_contents($fileName);
	while(preg_match("/$pattern/m",$content,$matches,PREG_OFFSET_CAPTURE))
	{
		$offset=$matches[0][1];
		$length=strlen($matches[0][0]);
		$type=$matches[1][0];
		$file=trim($matches[2][0],"'\"");
		if($type==='Prado::using')
		{
			$file=substr_replace(strtr($file,'.','/'),FRAMEWORK_DIR,0,6).'.php';
		}
		else
		{
			$file=strtr($file,'"',"'");
			if(($pos=strpos($file,"'"))!==false)
				$file=FRAMEWORK_DIR.'/'.substr($file,$pos+1);
			else
				die('Unable to process file '.$fileName.' about '.$matches[0][0]);
		}
		if(($file=realpath($file))===false || !is_file($file))
			die('Unable to process file '.$fileName.' about '.$matches[0][0]);
		if(isset($unfoldedFiles[$file]))
		{
			$content=substr_replace($content,'',$offset,$length);
		}
		else
		{
			$unfoldedFiles[$file]=true;
			$content=substr_replace($content,unfold_file($file),$offset,$length);
		}
	}
	return $content;
}

?>