• Zarobi@aussie.zone
    link
    fedilink
    English
    arrow-up
    1
    ·
    19 hours ago

    Sure, I’m typing it out on my phone though so excuse any mistakes:

    Tap for build.sh
    # build.sh
    php build.php
    
    Tap 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');
    // etc
    

    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.

    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>
    
    • squirrel@cake.kobel.fyi
      link
      fedilink
      English
      arrow-up
      2
      ·
      17 hours ago

      Thank you very much. I’ll try to comprehend all this later, since I’m on the phone as well :)