Add modular architecture to router
Extract configuration, helpers, content processing, and rendering logic into separate files Refactor router to use modular components
This commit is contained in:
parent
eda800d048
commit
149ba03359
5 changed files with 464 additions and 456 deletions
126
app/rendering.php
Normal file
126
app/rendering.php
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
|
||||
function renderTemplate(string $content, int $statusCode = 200): void {
|
||||
global $baseTemplate, $contentDir, $currentLang, $defaultLang;
|
||||
|
||||
// Build navigation for templates
|
||||
$navigation = buildNavigation($contentDir, $currentLang, $defaultLang);
|
||||
|
||||
// Load frontpage metadata for home button label
|
||||
$frontpageMetadata = loadMetadata($contentDir, $currentLang, $defaultLang);
|
||||
$homeLabel = $frontpageMetadata['slug'] ?? 'Home';
|
||||
|
||||
// Load translations
|
||||
$translations = loadTranslations($currentLang);
|
||||
|
||||
http_response_code($statusCode);
|
||||
include $baseTemplate;
|
||||
exit;
|
||||
}
|
||||
|
||||
function renderFile(string $filePath): void {
|
||||
global $baseTemplate, $pageTemplate, $contentDir, $currentLang, $defaultLang;
|
||||
|
||||
$realPath = realpath($filePath);
|
||||
if (!$realPath || !str_starts_with($realPath, $contentDir) || !is_readable($realPath)) {
|
||||
renderTemplate("<article><h1>403 Forbidden</h1><p>Access denied.</p></article>", 403);
|
||||
}
|
||||
|
||||
$ext = pathinfo($realPath, PATHINFO_EXTENSION);
|
||||
|
||||
if (in_array($ext, ['php', 'html', 'md'])) {
|
||||
ob_start();
|
||||
if ($ext === 'md') {
|
||||
if (!class_exists('Parsedown')) {
|
||||
require_once __DIR__ . '/vendor/Parsedown.php';
|
||||
}
|
||||
echo '<article>' . (new Parsedown())->text(file_get_contents($realPath)) . '</article>';
|
||||
} else {
|
||||
include $realPath;
|
||||
}
|
||||
$content = ob_get_clean();
|
||||
|
||||
// Build navigation for templates
|
||||
$navigation = buildNavigation($contentDir, $currentLang, $defaultLang);
|
||||
|
||||
// Load metadata for current page/directory
|
||||
$pageDir = dirname($realPath);
|
||||
$pageMetadata = loadMetadata($pageDir, $currentLang, $defaultLang);
|
||||
$pageTitle = $pageMetadata['title'] ?? null;
|
||||
|
||||
// Load frontpage metadata for home button label
|
||||
$frontpageMetadata = loadMetadata($contentDir, $currentLang, $defaultLang);
|
||||
$homeLabel = $frontpageMetadata['slug'] ?? 'Home';
|
||||
|
||||
// Load translations
|
||||
$translations = loadTranslations($currentLang);
|
||||
|
||||
// Wrap content with page template
|
||||
ob_start();
|
||||
include $pageTemplate;
|
||||
$content = ob_get_clean();
|
||||
|
||||
// Wrap with base template
|
||||
include $baseTemplate;
|
||||
exit;
|
||||
}
|
||||
|
||||
// Serve other file types directly
|
||||
header('Content-Type: ' . (mime_content_type($realPath) ?: 'application/octet-stream'));
|
||||
readfile($realPath);
|
||||
exit;
|
||||
}
|
||||
|
||||
function renderMultipleFiles(array $filePaths, string $pageDir): void {
|
||||
global $baseTemplate, $pageTemplate, $contentDir, $currentLang, $defaultLang;
|
||||
|
||||
// Validate all files are safe
|
||||
foreach ($filePaths as $filePath) {
|
||||
$realPath = realpath($filePath);
|
||||
if (!$realPath || !str_starts_with($realPath, $contentDir) || !is_readable($realPath)) {
|
||||
renderTemplate("<article><h1>403 Forbidden</h1><p>Access denied.</p></article>", 403);
|
||||
}
|
||||
}
|
||||
|
||||
// Render all content files in order
|
||||
$content = '';
|
||||
foreach ($filePaths as $filePath) {
|
||||
$ext = pathinfo($filePath, PATHINFO_EXTENSION);
|
||||
|
||||
ob_start();
|
||||
if ($ext === 'md') {
|
||||
if (!class_exists('Parsedown')) {
|
||||
require_once __DIR__ . '/vendor/Parsedown.php';
|
||||
}
|
||||
echo '<article>' . (new Parsedown())->text(file_get_contents($filePath)) . '</article>';
|
||||
} elseif ($ext === 'html') {
|
||||
include $filePath;
|
||||
} elseif ($ext === 'php') {
|
||||
include $filePath;
|
||||
}
|
||||
$content .= ob_get_clean();
|
||||
}
|
||||
|
||||
// Build navigation for templates
|
||||
$navigation = buildNavigation($contentDir, $currentLang, $defaultLang);
|
||||
|
||||
// Load metadata for current page/directory
|
||||
$pageMetadata = loadMetadata($pageDir, $currentLang, $defaultLang);
|
||||
$pageTitle = $pageMetadata['title'] ?? null;
|
||||
|
||||
// Load frontpage metadata for home button label
|
||||
$frontpageMetadata = loadMetadata($contentDir, $currentLang, $defaultLang);
|
||||
$homeLabel = $frontpageMetadata['slug'] ?? 'Home';
|
||||
|
||||
// Load translations
|
||||
$translations = loadTranslations($currentLang);
|
||||
|
||||
// Wrap content with page template
|
||||
ob_start();
|
||||
include $pageTemplate;
|
||||
$content = ob_get_clean();
|
||||
|
||||
// Wrap with base template
|
||||
include $baseTemplate;
|
||||
exit;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue