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();
@ -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);
@ -116,7 +134,7 @@ 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);

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)
{