• Zarobi@aussie.zone
    link
    fedilink
    English
    arrow-up
    3
    arrow-down
    1
    ·
    1 day ago

    I prefer the flexibility of PHP personally, but there’s pros and cons to everything. For example, I don’t really see how setting up 11ty is any easier than a 10 line build.php. Might as well keep it simple

    • squirrel@cake.kobel.fyi
      link
      fedilink
      English
      arrow-up
      2
      ·
      13 hours ago

      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?

      • Zarobi@aussie.zone
        link
        fedilink
        English
        arrow-up
        1
        ·
        11 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>
        
    • eleitl@lemmy.zip
      link
      fedilink
      arrow-up
      1
      ·
      1 day ago

      PHP is additional vulnerability, while static html is bullet proof, as long as http server is safe and up to date.

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

        How is PHP a vulnerability if it never leaves your machine and you only use it to build the HTML?

        • eleitl@lemmy.zip
          link
          fedilink
          arrow-up
          2
          ·
          1 day ago

          Oh, if you’re only using it to generate static html it’s of course safe. I would prefer minimal markdown for blogs, though.