I stripped out all the database stuff because as my site grew I kept expanding on it and I needed a database.
Mine will also probably be longer than average because I wanted fancy stuff like my source pages being just “about.php” instead of “about/index.php”, but I wanted the output to be “about/index.html” so it got way more complicated than it needed to be. But again most of those lines in the for loop are just me being obsessive compulsive about my own directory structure 😂. I also didn’t count the utilities functions in my original line count because to me that’s equivalent of importing a module; I didn’t write that file, I just copy pasted it from online. You could probably find a simpler build script online.
Sure, I’m typing it out on my phone though so excuse any mistakes:
Tap for build.sh
# build.sh php build.phpTap for build.php
// build.php <?php // Just contains all the directory definitions and utilities in one place require once __DIR__ . './bootstrap.php'; require once __DIR__ . './utils.php'; // Static assets ensureDir(DIST_DIR); copy_all_files(ASSETS_DIR, DIST_DIR); $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator(PAGES_DIR) ); // Build each page foreach ($files as $file) { if ($file->isDir()) continue; $path = $file->getPathname(); // only build .php pages (skip partials) if (!str_ends_with($path, '.php')) continue; $relative = str_replace('pages/', '', str_replace(SRC_DIR . '/', '', $path)); $output = str_replace('.php', '/index.html', $relative); echo $relative . "\n"; if ($relative == 'index.php') { $outputPath = DIST_DIR . '/index.html'; } else if (str_ends_with($output, 'index/index.html')) { $output = str_replace('index/index.html', 'index.html', $output); $outputPath = DIST_DIR . '/' . $output; } else { $outputPath = DIST_DIR . '/' . $output; } ensureDir(dirname($outputPath)); ob_start(); include $path; $html = ob_get_clean(); echo $outputPath . "\n"; file_put_contents($outputPath, $html); } echo "Build complete\n";Tap for utils.php
// utils.php function ensureDir($path) { if (!is_dir($path)) { mkdir($path, 0777, true); } } function copy_all_files($source_dir, $target_dir) { $dir_obj = opendir($source_dir); @mkdir($target_dir); while ($file = readdir($dir_obj)) { if ($file != "." && $file != "..") { if (is_dir($source_dir . "/" . $file)) { copy_all_files($source_dir . "/" . $file, $target_dir . "/" . $file); } else { copy($source_dir . "/" . $file, $target_dir . "/" . $file); } } } closedir($dir_obj); }Tap for bootstrap.php
<?php define('ROOT_DIR', __DIR__); define('DIST_DIR', ROOT_DIR . '/dist'); define('SRC_DIR', ROOT_DIR . '/src'); define('PAGES_DIR', SRC_DIR . '/pages'); // etcI stripped out all the database stuff because as my site grew I kept expanding on it and I needed a database.
Mine will also probably be longer than average because I wanted fancy stuff like my source pages being just “about.php” instead of “about/index.php”, but I wanted the output to be “about/index.html” so it got way more complicated than it needed to be. But again most of those lines in the for loop are just me being obsessive compulsive about my own directory structure 😂. I also didn’t count the utilities functions in my original line count because to me that’s equivalent of importing a module; I didn’t write that file, I just copy pasted it from online. You could probably find a simpler build script online.
Tap for example.php
<?php $pageTitle = 'Example'; ?> <!DOCTYPE html> <html lang="en"> <head> <?php include PARTIALS_DIR . '/head.php'; ?> <link rel="stylesheet" href="/styles/example.css" /> </head> <body> <?php include PARTIALS_DIR . '/header.php'; ?> <?php include PARTIALS_DIR . '/noscript.php'; ?> <main> <h1>example</h1> </main> <?php include PARTIALS_DIR . '/footer.php'; ?> <?php include PARTIALS_DIR . '/global-scripts.php'; ?> </body> </html>Thank you very much. I’ll try to comprehend all this later, since I’m on the phone as well :)