You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
6.5 KiB
221 lines
6.5 KiB
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* @author Robert Strutts <Robert@TryingToScale.com>
|
|
* @copyright Copyright (c) 2022, Robert Strutts.
|
|
* @license https://mit-license.org/
|
|
*/
|
|
$print_new_line = false;
|
|
$show_filename_comments = false;
|
|
$make_one_file = true;
|
|
|
|
if ($make_one_file) {
|
|
single_file();
|
|
} else {
|
|
multi_files();
|
|
}
|
|
|
|
function single_file(): void {
|
|
$bootstap_files = glob("bootstrap/*.php");
|
|
|
|
$loader_files = [];
|
|
$loader_files[] = "bootstrap/auto_loader.php";
|
|
$loader_files[] = "bootstrap/errors.php";
|
|
$loader_files[] = "bootstrap/site_helper.php";
|
|
compile($loader_files, "tts.php", false, "namespace tts;");
|
|
pop_bs($bootstap_files, $loader_files);
|
|
unset($loader_files);
|
|
|
|
$core_files = [];
|
|
$core_files[] = "main.inc.php";
|
|
foreach($bootstap_files as $bs) {
|
|
$core_files[] = $bs;
|
|
}
|
|
rsearch($core_files, "classes", "/^.*\.(php)$/");
|
|
compile($core_files, "tts.php", true); // true = Append mode
|
|
}
|
|
|
|
function multi_files(): void {
|
|
$bootstap_files = glob("bootstrap/*.php");
|
|
|
|
$main_files = [];
|
|
$main_files[] = "bootstrap/site_helper.php";
|
|
compile($main_files, "tts.php", false ,"namespace tts;");
|
|
pop_bs($bootstap_files, $main_files);
|
|
unset($main_files);
|
|
|
|
$loader_files = [];
|
|
$loader_files[] = "bootstrap/auto_loader.php";
|
|
$loader_files[] = "bootstrap/errors.php";
|
|
$loader_files[] = "bootstrap/html_purifier.php";
|
|
compile($loader_files, "tts_loader.php", false, null, "require_once \"tts_core.php\";");
|
|
pop_bs($bootstap_files, $loader_files);
|
|
unset($loader_files);
|
|
|
|
$core_files = [];
|
|
$core_files[] = "main.inc.php";
|
|
foreach($bootstap_files as $bs) {
|
|
$core_files[] = $bs;
|
|
}
|
|
rsearch($core_files, "classes", "/^.*\.(php)$/");
|
|
compile($core_files, "tts_core.php", false, "namespace tts;");
|
|
}
|
|
/*
|
|
* Remove already included BS files, pop them...out of the array
|
|
*/
|
|
function pop_bs(array & $files, array $files_to_pop): void {
|
|
foreach($files as $index => $file) {
|
|
if (in_array($file, $files_to_pop)) {
|
|
unset($files[$index]);
|
|
}
|
|
}
|
|
}
|
|
|
|
function rsearch(array & $file_list, string $folder, string $pattern): void {
|
|
$dir = new RecursiveDirectoryIterator($folder);
|
|
$ite = new RecursiveIteratorIterator($dir);
|
|
$files = new RegexIterator($ite, $pattern, RegexIterator::GET_MATCH);
|
|
|
|
$arrays = [];
|
|
|
|
foreach($files as $file) {
|
|
// If we are making Multiple files, skip now and later make new file for arrays
|
|
if (
|
|
$GLOBALS['make_one_file'] === false &&
|
|
str_contains($file[0], "/arrays/")
|
|
) {
|
|
$arrays[] = $file[0];
|
|
continue; // I do not want Dummy Array Data as it is kinda big in the core file
|
|
}
|
|
$file_list[] = $file[0];
|
|
}
|
|
if ($GLOBALS['make_one_file'] === false) {
|
|
compile($arrays, "tts_arrays.php", "namespace tts;");
|
|
}
|
|
}
|
|
|
|
function remove_comments(string & $str): void {
|
|
foreach (token_get_all($str) as $token ) {
|
|
if ($token[0] != T_COMMENT &&
|
|
$token[0] != \T_DOC_COMMENT
|
|
) {
|
|
continue; // Do nothing on NON-Comments!
|
|
}
|
|
$str = str_replace($token[1], '', $str); // Replace comment
|
|
}
|
|
}
|
|
|
|
function is_folder(string $dir): bool {
|
|
if (!file_exists($dir)) {
|
|
echo "Compiler Path $dir Does not Exists!";
|
|
exit(1);
|
|
}
|
|
if (!is_writable($dir)) {
|
|
echo "Unable to write to Compiler Path $dir !";
|
|
exit(2);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function compile(
|
|
array $files,
|
|
string $output_filename,
|
|
bool $append = false,
|
|
?string $prefix = "",
|
|
?string $postfix = ""
|
|
): void {
|
|
$root_path = __DIR__ . '/';
|
|
is_folder($root_path);
|
|
|
|
$dist = $root_path . 'dist';
|
|
if (!is_dir($dist)) {
|
|
mkdir($dist);
|
|
}
|
|
is_folder($dist);
|
|
$dist .= '/';
|
|
|
|
$tts_file = $dist . $output_filename;
|
|
$mode = ($append) ? "a" : "w";
|
|
$fl_handle = fopen($tts_file, $mode);
|
|
if ($fl_handle === false) {
|
|
echo "Compiler error, unable to write to file $tts_file";
|
|
exit(3);
|
|
}
|
|
if (! $append) {
|
|
fwrite($fl_handle, "<?php \r\n declare(strict_types=1);\r\n");
|
|
fwrite($fl_handle, "\t /** \r\n \t * @link https://git.mysnippetsofcode.com/tts/tts_framework \r\n \t * @author Robert Strutts <Robert@TryingToScale.com> \r\n \t * @copyright Copyright (c) 2022, Robert Strutts. \r\n \t * @license MIT \r\n \t */ \r\n");
|
|
}
|
|
if ($prefix !== null && ! empty($prefix)) {
|
|
fwrite($fl_handle, $prefix);
|
|
}
|
|
foreach ($files as $file) {
|
|
$file_with_path = $root_path . $file;
|
|
|
|
$content = file_get_contents($file_with_path);
|
|
if ($content === false) {
|
|
continue;
|
|
}
|
|
|
|
remove_comments($content);
|
|
|
|
$a = explode(PHP_EOL, $content);
|
|
unset($content);
|
|
|
|
$is_php_start_block = true;
|
|
foreach ($a as $line) {
|
|
if ($is_php_start_block) {
|
|
$is_php_start_block = false;
|
|
if ($GLOBALS['show_filename_comments']) {
|
|
$line = PHP_EOL . "/* Contents of : {$file} */";
|
|
fwrite($fl_handle, $line);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if ($GLOBALS['print_new_line']) {
|
|
$line .= PHP_EOL;
|
|
} else {
|
|
$line = trim($line);
|
|
}
|
|
|
|
if (
|
|
(str_contains($line, "declare(") &&
|
|
! str_contains($line, "fwrite(") &&
|
|
! str_contains($line, "str_contains(")
|
|
) ||
|
|
str_contains($line, "namespace ")
|
|
) {
|
|
continue;
|
|
}
|
|
if ($file === "main.inc.php" && (
|
|
str_contains($line, "require_once") ||
|
|
str_contains($line, "add_namespace(")
|
|
)) {
|
|
continue;
|
|
}
|
|
$search = ['bs_tts', 'main_tts',
|
|
'\\tts\\enum\\',
|
|
'\\tts\\contacts\\',
|
|
'\\tts\\traits\\database\\',
|
|
'\\tts\\traits\\security\\',
|
|
'\\tts\\services\\sessions\\'];
|
|
$replace = ['tts', 'tts',
|
|
'\\tts\\',
|
|
'\\tts\\',
|
|
'\\tts\\',
|
|
'\\tts\\',
|
|
'\\tts\\'];
|
|
$out = str_replace($search, $replace, $line);
|
|
fwrite($fl_handle, $out);
|
|
}
|
|
}
|
|
if ($postfix !== null && ! empty($postfix)) {
|
|
fwrite($fl_handle, $postfix);
|
|
}
|
|
fclose($fl_handle);
|
|
chmod($tts_file, 0664);
|
|
}
|
|
|
|
echo "Compiled tts_framework into folder: dist"; |