filemtime($b) <=> filemtime($a)); $items = []; foreach ($pageFiles as $pageFile) { $seed = basename($pageFile, '.html'); $previewWebPath = '/previews/' . $seed . '.jpg'; $previewFsPath = __DIR__ . '/previews/' . $seed . '.jpg'; $hasPreview = file_exists($previewFsPath); $title = $seed; $rawHtml = file_get_contents($pageFile); if ($rawHtml !== false && preg_match('/(.*?)<\/title>/is', $rawHtml, $matches) === 1) { $title = trim(strip_tags($matches[1])); } $items[] = [ 'seed' => $seed, 'title' => $title, 'updated' => date('Y-m-d H:i:s', filemtime($pageFile)), 'hasPreview' => $hasPreview, 'previewWebPath' => $previewWebPath, ]; } return $items; } function renderSeedCards(array $items): string { if ($items === []) { return '<p class="text-zinc-300">No generated seed pages found yet.</p>'; } $html = '<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-6">'; foreach ($items as $item) { $seed = htmlspecialchars((string) $item['seed'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $title = htmlspecialchars((string) $item['title'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $updated = htmlspecialchars((string) $item['updated'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $previewWebPath = htmlspecialchars((string) $item['previewWebPath'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $hasPreview = (bool) $item['hasPreview']; $html .= '<a href="/' . $seed . '" class="block rounded-xl overflow-hidden border border-zinc-800 bg-zinc-900/70 hover:border-emerald-500 transition">'; $html .= '<div class="aspect-[16/10] bg-zinc-800">'; if ($hasPreview) { $html .= '<img loading="lazy" src="' . $previewWebPath . '" alt="Preview for ' . $seed . '" class="w-full h-full object-cover">'; } else { $html .= '<div class="w-full h-full grid place-items-center text-zinc-400 text-sm">Preview not available yet</div>'; } $html .= '</div>'; $html .= '<div class="p-4">'; $html .= '<h2 class="text-lg font-semibold mb-1 line-clamp-2">' . $title . '</h2>'; $html .= '<p class="text-xs text-zinc-400 mb-1">' . $seed . '</p>'; $html .= '<p class="text-xs text-zinc-500">Updated: ' . $updated . '</p>'; $html .= '</div></a>'; } $html .= '</div>'; return $html; } $path = (string) parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH); $segments = array_values(array_filter(explode('/', ltrim($path, '/')))); $firstSegment = $segments[0] ?? ''; if (count($segments) === 1 && str_starts_with($firstSegment, 'seed-')) { $file = __DIR__ . '/../pages/' . $firstSegment . '.html'; if (file_exists($file)) { header('Content-Type: text/html; charset=UTF-8'); echo file_get_contents($file); exit; } http_response_code(404); echo 'Page not found'; exit; } if ($firstSegment === 'generate') { include_once __DIR__ . '/generator.php'; exit; } if ($firstSegment === 'list-cards') { header('Content-Type: text/html; charset=UTF-8'); echo renderSeedCards(collectSeedPages()); exit; } if ($firstSegment === '' || $firstSegment === 'list') { header('Content-Type: text/html; charset=UTF-8'); $cardsHtml = renderSeedCards(collectSeedPages()); echo '<!doctype html><html lang="en"><head><meta charset="UTF-8">'; echo '<meta name="viewport" content="width=device-width, initial-scale=1.0">'; echo '<title>Generated Seed Pages'; echo ''; echo ''; echo '
'; echo '
'; echo '

Generated Seeds

'; echo '
'; echo ''; echo ''; echo '
'; echo '
'; echo '

Idle.

'; echo '
' . $cardsHtml . '
'; echo '
'; echo ''; echo ''; exit; } http_response_code(404); echo 'Not found';