#!/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 © 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; } ?>