Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/treetrek.git
<?php
require_once __DIR__ . '/../File.php';
require_once __DIR__ . '/../UrlBuilder.php';
require_once __DIR__ . '/Page.php';

abstract class BasePage implements Page {
  protected $repositories;
  protected $title;

  public function __construct( array $repositories ) {
    $this->repositories = $repositories;
  }

  protected function renderLayout( $contentCallback, $currentRepo = null ) {
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title><?php
        echo Config::SITE_TITLE .
          ( $this->title ? ' - ' . htmlspecialchars( $this->title ) : '' );
      ?></title>
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
      <link rel="stylesheet" href="/styles/repo.css">
    </head>
    <body>
    <div class="container">
      <header>
        <h1><?php echo Config::SITE_TITLE; ?></h1>
        <nav class="nav">
          <a href="<?php echo (new UrlBuilder())->build(); ?>">Home</a>
          <?php if( $currentRepo ):
            $safeName = $currentRepo['safe_name'];
            ?>
            <a href="<?php echo (new UrlBuilder())->withRepo( $safeName )->withAction( 'tree' )->build(); ?>">Files</a>
            <a href="<?php echo (new UrlBuilder())->withRepo( $safeName )->withAction( 'commits' )->build(); ?>">Commits</a>
            <a href="<?php echo (new UrlBuilder())->withRepo( $safeName )->withAction( 'tags' )->build(); ?>">Tags</a>
          <?php endif; ?>

          <?php if( $currentRepo ): ?>
          <div class="repo-selector">
            <label>Repository:</label>
            <select onchange="<?php echo (new UrlBuilder())->withSwitcher( 'this.value' )->build(); ?>">
              <?php foreach( $this->repositories as $r ): ?>
              <option value="<?php echo htmlspecialchars( $r['safe_name'] ); ?>"
                <?php echo $r['safe_name'] === $currentRepo['safe_name'] ? 'selected' : ''; ?>>
                <?php echo htmlspecialchars( $r['name'] ); ?>
              </option>
              <?php endforeach; ?>
            </select>
          </div>
          <?php endif; ?>
        </nav>
      </header>

      <?php call_user_func( $contentCallback ); ?>

    </div>
    </body>
    </html>
    <?php
  }

  protected function renderBreadcrumbs( $repo, $trail = [] ) {
    $repoUrl = (new UrlBuilder())->withRepo( $repo['safe_name'] )->build();

    $parts = array_merge(
      [
        '<a href="' . $repoUrl . '" class="repo-breadcrumb">' .
          htmlspecialchars( $repo['name'] ) . '</a>'
      ],
      $trail
    );

    echo '<div class="breadcrumb">' . implode( ' / ', $parts ) . '</div>';
  }
}