Compare commits

...

3 commits

Author SHA1 Message Date
Ruben
f94b50f298 Patch: Update footnote sorting method reference
Use static method reference for footnote sorting
2025-11-30 22:27:03 +01:00
Ruben
1db80ebf38 Add language prefix to hero section feature URLs 2025-11-30 22:26:47 +01:00
Ruben
8291a86373 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
2025-11-30 22:26:37 +01:00
5 changed files with 48 additions and 28 deletions

View file

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

View file

@ -1,12 +1,13 @@
<?php
// Dynamisk hero-seksjon som viser PHP-muligheter
$prefix = $langPrefix ?? '';
$features = [
['icon' => '📁', 'title' => 'Filbasert', 'description' => 'Mapper blir URL-er automatisk', 'url' => '/examples/file-based-routing/'],
['icon' => '⚡', 'title' => 'Uten byggesteg', 'description' => 'Rediger og oppdater—det er alt', 'url' => '/examples/no-build-step/'],
['icon' => '🎨', 'title' => 'Bland formater', 'description' => 'Kombiner .md, .html og .php', 'url' => '/examples/mix-formats/'],
['icon' => '🌍', 'title' => 'Flerspråklig', 'description' => 'Innebygd i18n-støtte', 'url' => '/multilingual/'],
['icon' => '📝', 'title' => 'Markdown', 'description' => 'Skriv innhold i markdown', 'url' => '/examples/2024-12-15-markdown-demo/'],
['icon' => '🎭', 'title' => 'Maler', 'description' => 'Egendefinerte layout og stiler', 'url' => '/examples/templates-demo/'],
['icon' => '📁', 'title' => 'Filbasert', 'description' => 'Mapper blir URL-er automatisk', 'url' => $prefix . '/examples/file-based-routing/'],
['icon' => '⚡', 'title' => 'Uten byggesteg', 'description' => 'Rediger og oppdater—det er alt', 'url' => $prefix . '/examples/no-build-step/'],
['icon' => '🎨', 'title' => 'Bland formater', 'description' => 'Kombiner .md, .html og .php', 'url' => $prefix . '/examples/mix-formats/'],
['icon' => '🌍', 'title' => 'Flerspråklig', 'description' => 'Innebygd i18n-støtte', 'url' => $prefix . '/multilingual/'],
['icon' => '📝', 'title' => 'Markdown', 'description' => 'Skriv innhold i markdown', 'url' => $prefix . '/examples/2024-12-15-markdown-demo/'],
['icon' => '🎭', 'title' => 'Maler', 'description' => 'Egendefinerte layout og stiler', 'url' => $prefix . '/examples/templates-demo/'],
];
$stats = [

View file

@ -1,12 +1,13 @@
<?php
// Dynamic hero section showcasing PHP capabilities
$prefix = $langPrefix ?? '';
$features = [
['icon' => '📁', 'title' => 'File-Based', 'description' => 'Folders become URLs automatically', 'url' => '/examples/file-based-routing/'],
['icon' => '⚡', 'title' => 'No Build Step', 'description' => 'Edit and refresh—that\'s it', 'url' => '/examples/no-build-step/'],
['icon' => '🎨', 'title' => 'Mix Formats', 'description' => 'Combine .md, .html, and .php', 'url' => '/examples/mix-formats/'],
['icon' => '🌍', 'title' => 'Multilingual', 'description' => 'Built-in i18n support', 'url' => '/multilingual/'],
['icon' => '📝', 'title' => 'Markdown', 'description' => 'Write content in markdown', 'url' => '/examples/2024-12-15-markdown-demo/'],
['icon' => '🎭', 'title' => 'Templates', 'description' => 'Custom layouts and styles', 'url' => '/examples/templates-demo/'],
['icon' => '📁', 'title' => 'File-Based', 'description' => 'Folders become URLs automatically', 'url' => $prefix . '/examples/file-based-routing/'],
['icon' => '⚡', 'title' => 'No Build Step', 'description' => 'Edit and refresh—that\'s it', 'url' => $prefix . '/examples/no-build-step/'],
['icon' => '🎨', 'title' => 'Mix Formats', 'description' => 'Combine .md, .html, and .php', 'url' => $prefix . '/examples/mix-formats/'],
['icon' => '🌍', 'title' => 'Multilingual', 'description' => 'Built-in i18n support', 'url' => $prefix . '/multilingual/'],
['icon' => '📝', 'title' => 'Markdown', 'description' => 'Write content in markdown', 'url' => $prefix . '/examples/2024-12-15-markdown-demo/'],
['icon' => '🎭', 'title' => 'Templates', 'description' => 'Custom layouts and styles', 'url' => $prefix . '/examples/templates-demo/'],
];
$stats = [

View file

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

View file

@ -508,7 +508,7 @@ class ParsedownExtra extends Parsedown
),
);
uasort($this->DefinitionData['Footnote'], 'self::sortFootnotes');
uasort($this->DefinitionData['Footnote'], [$this, 'sortFootnotes']);
foreach ($this->DefinitionData['Footnote'] as $definitionId => $DefinitionData)
{