parent
6df213be20
commit
8f4e70a785
@ -0,0 +1,211 @@ |
|||||||
|
<?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 = true; |
||||||
|
$show_filename_comments = true; |
||||||
|
$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/html_purifier.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 ") || |
||||||
|
str_contains($line, "use ") |
||||||
|
) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if ($file === "main.inc.php" && ( |
||||||
|
str_contains($line, "require_once") || |
||||||
|
str_contains($line, "add_namespace(") |
||||||
|
)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
$search = ['bs_tts', 'main_tts']; |
||||||
|
$replace = ['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); |
||||||
|
} |
||||||
Loading…
Reference in new issue