Add language prefix support to cached markdown rendering

Add language prefix parameter to cache functions Update
renderContentFile to handle language prefixes Add language prefix to
internal links in markdown Make template variables available to PHP
content files
This commit is contained in:
Ruben 2025-11-30 22:26:37 +01:00
parent f212e320cb
commit 8291a86373
2 changed files with 33 additions and 15 deletions

View file

@ -1,9 +1,9 @@
<?php <?php
function getCachedMarkdown(string $filePath): ?string { function getCachedMarkdown(string $filePath, string $langPrefix = ''): ?string {
$cacheDir = '/tmp/folderweb_cache'; $cacheDir = '/tmp/folderweb_cache';
$mtime = filemtime($filePath); $mtime = filemtime($filePath);
$cacheKey = md5($filePath . $mtime); $cacheKey = md5($filePath . $mtime . $langPrefix);
$cachePath = "$cacheDir/$cacheKey"; $cachePath = "$cacheDir/$cacheKey";
if (file_exists($cachePath)) { if (file_exists($cachePath)) {
@ -13,14 +13,14 @@ function getCachedMarkdown(string $filePath): ?string {
return null; return null;
} }
function setCachedMarkdown(string $filePath, string $html): void { function setCachedMarkdown(string $filePath, string $html, string $langPrefix = ''): void {
$cacheDir = '/tmp/folderweb_cache'; $cacheDir = '/tmp/folderweb_cache';
if (!is_dir($cacheDir)) { if (!is_dir($cacheDir)) {
mkdir($cacheDir, 0755, true); mkdir($cacheDir, 0755, true);
} }
$mtime = filemtime($filePath); $mtime = filemtime($filePath);
$cacheKey = md5($filePath . $mtime); $cacheKey = md5($filePath . $mtime . $langPrefix);
$cachePath = "$cacheDir/$cacheKey"; $cachePath = "$cacheDir/$cacheKey";
file_put_contents($cachePath, $html); file_put_contents($cachePath, $html);

View file

@ -1,16 +1,19 @@
<?php <?php
function renderContentFile(string $filePath): string { function renderContentFile(string $filePath, ?Context $ctx = null): string {
$ext = pathinfo($filePath, PATHINFO_EXTENSION); $ext = pathinfo($filePath, PATHINFO_EXTENSION);
ob_start(); ob_start();
if ($ext === 'md') { if ($ext === 'md') {
require_once __DIR__ . '/cache.php'; require_once __DIR__ . '/cache.php';
$cached = getCachedMarkdown($filePath); $langPrefix = $ctx ? $ctx->get('langPrefix', '') : '';
$cached = getCachedMarkdown($filePath, $langPrefix);
if ($cached !== null) { if ($cached !== null) {
echo $cached; echo $cached;
} else { } else {
// Update to newer versions before PHP 9.0 release
// Current versions have been patched for PHP 8.4+ compatibility
if (!class_exists('Parsedown')) { if (!class_exists('Parsedown')) {
require_once __DIR__ . '/vendor/Parsedown.php'; require_once __DIR__ . '/vendor/Parsedown.php';
} }
@ -18,10 +21,25 @@ function renderContentFile(string $filePath): string {
require_once __DIR__ . '/vendor/ParsedownExtra.php'; require_once __DIR__ . '/vendor/ParsedownExtra.php';
} }
$html = '<article>' . (new ParsedownExtra())->text(file_get_contents($filePath)) . '</article>'; $html = '<article>' . (new ParsedownExtra())->text(file_get_contents($filePath)) . '</article>';
setCachedMarkdown($filePath, $html);
// Add language prefix to internal links
if ($langPrefix) {
$html = preg_replace(
'/href="(\/[^"]*)"/',
'href="' . $langPrefix . '$1"',
$html
);
}
setCachedMarkdown($filePath, $html, $langPrefix);
echo $html; echo $html;
} }
} elseif (in_array($ext, ['html', 'php'])) { } elseif (in_array($ext, ['html', 'php'])) {
// Make template variables available to PHP content files
if ($ctx !== null && $ext === 'php') {
$templateVars = Hooks::apply(Hook::TEMPLATE_VARS, [], $ctx);
extract($templateVars);
}
include $filePath; include $filePath;
} }
return ob_get_clean(); return ob_get_clean();
@ -29,12 +47,12 @@ function renderContentFile(string $filePath): string {
function renderTemplate(Context $ctx, string $content, int $statusCode = 200): void { function renderTemplate(Context $ctx, string $content, int $statusCode = 200): void {
global $GLOBALS; global $GLOBALS;
// Get basic template vars // Get basic template vars
$navigation = $ctx->navigation; $navigation = $ctx->navigation;
$homeLabel = $ctx->homeLabel; $homeLabel = $ctx->homeLabel;
$pageTitle = null; $pageTitle = null;
// Let plugins add template variables // Let plugins add template variables
$templateVars = Hooks::apply(Hook::TEMPLATE_VARS, [ $templateVars = Hooks::apply(Hook::TEMPLATE_VARS, [
'content' => $content, 'content' => $content,
@ -42,7 +60,7 @@ function renderTemplate(Context $ctx, string $content, int $statusCode = 200): v
'homeLabel' => $homeLabel, 'homeLabel' => $homeLabel,
'pageTitle' => $pageTitle 'pageTitle' => $pageTitle
], $ctx); ], $ctx);
extract($templateVars); extract($templateVars);
http_response_code($statusCode); http_response_code($statusCode);
@ -59,7 +77,7 @@ function renderFile(Context $ctx, string $filePath): void {
$ext = pathinfo($realPath, PATHINFO_EXTENSION); $ext = pathinfo($realPath, PATHINFO_EXTENSION);
if (in_array($ext, CONTENT_EXTENSIONS)) { if (in_array($ext, CONTENT_EXTENSIONS)) {
$content = renderContentFile($realPath); $content = renderContentFile($realPath, $ctx);
$pageDir = dirname($realPath); $pageDir = dirname($realPath);
$pageMetadata = loadMetadata($pageDir); $pageMetadata = loadMetadata($pageDir);
@ -97,7 +115,7 @@ function renderFile(Context $ctx, string $filePath): void {
'pageCssHash' => $pageCssHash, 'pageCssHash' => $pageCssHash,
'socialImageUrl' => $socialImageUrl 'socialImageUrl' => $socialImageUrl
], $ctx); ], $ctx);
extract($templateVars); extract($templateVars);
// Wrap content with page template // Wrap content with page template
@ -116,11 +134,11 @@ function renderFile(Context $ctx, string $filePath): void {
function renderMultipleFiles(Context $ctx, array $files, string $pageDir): void { function renderMultipleFiles(Context $ctx, array $files, string $pageDir): void {
$content = ''; $content = '';
foreach ($files as $file) { foreach ($files as $file) {
$content .= renderContentFile($file); $content .= renderContentFile($file, $ctx);
} }
$pageMetadata = loadMetadata($pageDir); $pageMetadata = loadMetadata($pageDir);
// Load page-level plugins // Load page-level plugins
getPluginManager()->loadPagePlugins($pageMetadata); getPluginManager()->loadPagePlugins($pageMetadata);
@ -154,7 +172,7 @@ function renderMultipleFiles(Context $ctx, array $files, string $pageDir): void
'pageCssHash' => $pageCssHash, 'pageCssHash' => $pageCssHash,
'socialImageUrl' => $socialImageUrl 'socialImageUrl' => $socialImageUrl
], $ctx); ], $ctx);
extract($templateVars); extract($templateVars);
// Wrap content with page template // Wrap content with page template