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.
I tried SSGs like 11ty, but they are overkill for simple things.
I’d be interested in the 10 line build.php. Care to share?
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 :)