summaryrefslogtreecommitdiff
path: root/buildscripts/phpbuilder/build.php
blob: 74253f190b68bee498affb1223f54ccf2835e9c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/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 https://github.com/pradosoft/prado
 * @copyright Copyright &copy; 2005-2016 The PRADO Group
 * @license https://github.com/pradosoft/prado/blob/master/COPYRIGHT
 * @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;
}