• squirrel@cake.kobel.fyi
    link
    fedilink
    English
    arrow-up
    2
    ·
    21 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
      ·
      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 :)