Add Atom feed support
Add feed URL to base template Refactor list item building into separate function Improve date extraction logic Add feed XML generation handler Update template variables handling
This commit is contained in:
parent
b03511f99b
commit
1cbfb67a4c
4 changed files with 166 additions and 60 deletions
|
|
@ -32,11 +32,73 @@ function extractTitle(string $filePath): ?string {
|
|||
return null;
|
||||
}
|
||||
|
||||
function extractDateFromFolder(string $folderName): ?string {
|
||||
// Build sorted list items for a directory
|
||||
function buildListItems(string $dir, Context $ctx, ?array $parentMetadata): array {
|
||||
$subdirs = getSubdirectories($dir);
|
||||
|
||||
$items = array_filter(array_map(function($item) use ($dir, $ctx) {
|
||||
$itemPath = "$dir/$item";
|
||||
$metadata = loadMetadata($itemPath);
|
||||
$coverImage = findCoverImage($itemPath);
|
||||
$pdfFile = findPdfFile($itemPath);
|
||||
|
||||
$title = $metadata['title'] ?? extractTitle($itemPath) ?? $item;
|
||||
|
||||
$rawDate = null;
|
||||
$date = null;
|
||||
if (isset($metadata['date'])) {
|
||||
$rawDate = $metadata['date'];
|
||||
$date = Hooks::apply(Hook::PROCESS_CONTENT, $rawDate, 'date_format');
|
||||
} else {
|
||||
$rawDate = extractRawDateFromFolder($item);
|
||||
if ($rawDate) {
|
||||
$date = Hooks::apply(Hook::PROCESS_CONTENT, $rawDate, 'date_format');
|
||||
} else {
|
||||
$rawDate = date("Y-m-d", filemtime($itemPath));
|
||||
$date = Hooks::apply(Hook::PROCESS_CONTENT, $rawDate, 'date_format');
|
||||
}
|
||||
}
|
||||
|
||||
$urlSlug = ($metadata && isset($metadata['slug'])) ? $metadata['slug'] : $item;
|
||||
|
||||
$langPrefix = $ctx->get('langPrefix', '');
|
||||
$baseUrl = $langPrefix . '/' . trim($ctx->requestPath, '/') . '/' . urlencode($urlSlug);
|
||||
$assetUrl = $langPrefix . '/' . trim($ctx->requestPath, '/') . '/' . urlencode($item);
|
||||
|
||||
return [
|
||||
'title' => $title,
|
||||
'url' => $baseUrl . '/',
|
||||
'date' => $date,
|
||||
'rawDate' => $rawDate,
|
||||
'summary' => $metadata['summary'] ?? null,
|
||||
'cover' => $coverImage ? "$assetUrl/$coverImage" : null,
|
||||
'pdf' => $pdfFile ? "$assetUrl/$pdfFile" : null,
|
||||
'redirect' => $metadata['redirect'] ?? null,
|
||||
'dirPath' => $itemPath
|
||||
];
|
||||
}, $subdirs));
|
||||
|
||||
$sortOrder = strtolower($parentMetadata['order'] ?? 'descending');
|
||||
if ($sortOrder === 'ascending') {
|
||||
usort($items, fn($a, $b) => strcmp($a['date'] ?? '', $b['date'] ?? ''));
|
||||
} else {
|
||||
usort($items, fn($a, $b) => strcmp($b['date'] ?? '', $a['date'] ?? ''));
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
function extractRawDateFromFolder(string $folderName): ?string {
|
||||
if (preg_match('/^(\d{4})-(\d{2})-(\d{2})-/', $folderName, $matches)) {
|
||||
$dateString = $matches[1] . '-' . $matches[2] . '-' . $matches[3];
|
||||
// Let plugins format the date
|
||||
return Hooks::apply(Hook::PROCESS_CONTENT, $dateString, 'date_format');
|
||||
return $matches[1] . '-' . $matches[2] . '-' . $matches[3];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function extractDateFromFolder(string $folderName): ?string {
|
||||
$raw = extractRawDateFromFolder($folderName);
|
||||
if ($raw) {
|
||||
return Hooks::apply(Hook::PROCESS_CONTENT, $raw, 'date_format');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue