notFound()) : ?>

404

get('Page not found'); ?>

get('The page you are looking for does not exist or has moved.'); ?>

get('Back to home'); ?>
coverImage()): ?>
<?php echo blowfish_text($page->title()); ?>
isStatic() && !$url->notFound()) : ?>

title()); ?>

isStatic() && !$url->notFound()): ?> isStatic() && !$url->notFound()) : $bdSeriesTag = ''; $bdSeriesName = ''; foreach ($page->tags(true) as $bdTk => $bdTn) { if (preg_match('/^series[-_]/i', $bdTk)) { $bdSeriesTag = $bdTk; $bdSeriesName = $bdTn; break; } } $bdSeriesPosts = array(); if ($bdSeriesTag) { try { global $pages; if (isset($pages) && method_exists($pages, 'getList')) { foreach ($pages->getList(1, 1000, true) as $bdSk) { $bdSp = new Page($bdSk); if (in_array($bdSeriesTag, array_keys($bdSp->tags(true)), true)) { $bdSeriesPosts[] = $bdSp; } } // Oldest first (Part 1 → N); when posts share a date, fall back to // natural title order so "WIMH #1" precedes "WIMH #2". usort($bdSeriesPosts, function ($a, $b) { $d = strcmp((string) $a->getValue('date'), (string) $b->getValue('date')); return $d !== 0 ? $d : strnatcasecmp($a->title(), $b->title()); }); } } catch (\Throwable $e) { $bdSeriesPosts = array(); } } $bdSeriesLabel = trim(preg_replace('/^series\s*[:\-_]?\s*/i', '', blowfish_plain($bdSeriesName))); ?> 1) : ?>
) are untouched. $bdContent = preg_replace( '/]*\bloading=)/i', 'content() ); // Add width/height to local-upload images so the layout doesn't // shift as they load (CLS). CSS `img { height: auto }` keeps the // aspect ratio responsive. echo blowfish_img_dimensions($bdContent); ?>
tags(true); $categoryKey = $page->categoryKey(); ?>
category()); ?> $tagName) : ?>
isStatic() && !$url->notFound()) : ?> permalink(true); $bdShareTitle = blowfish_plain($page->title()); ?>
get('Share'); ?> X (Twitter) Reddit LinkedIn
isStatic() && !$url->notFound()) { $bdOlder = null; $bdNewer = null; try { global $pages; if (isset($pages) && method_exists($pages, 'getList')) { $bdNavKeys = array(); foreach ($pages->getList(1, 10000, true) as $bdNk) { $bdNp = new Page($bdNk); if (!$bdNp->isStatic()) { $bdNavKeys[] = $bdNp; } } foreach ($bdNavKeys as $bdNi => $bdNp) { if ($bdNp->key() === $page->key()) { if ($bdNi > 0) { $bdNewer = $bdNavKeys[$bdNi - 1]; } if ($bdNi < count($bdNavKeys) - 1) { $bdOlder = $bdNavKeys[$bdNi + 1]; } break; } } } } catch (\Throwable $e) { $bdOlder = null; $bdNewer = null; } ?> isStatic() && !$url->notFound()) { $bdRelated = array(); try { global $pages; if (isset($pages) && method_exists($pages, 'getList')) { $bdKeys = $pages->getList(1, 10000, true); // published if (is_array($bdKeys)) { $bdCur = $page->key(); $bdCat = $page->categoryKey(); $bdTags = array_keys($page->tags(true)); // Skip the posts already shown in the older/newer nav just above. $bdNavShown = array(); if (!empty($bdOlder)) { $bdNavShown[] = $bdOlder->key(); } if (!empty($bdNewer)) { $bdNavShown[] = $bdNewer->key(); } foreach ($bdKeys as $bdK) { if ($bdK === $bdCur || in_array($bdK, $bdNavShown, true)) { continue; } if (count($bdRelated) >= 3) { break; } $bdCand = new Page($bdK); $bdMatch = ($bdCat && $bdCand->categoryKey() === $bdCat); if (!$bdMatch && $bdTags) { $bdMatch = (bool) array_intersect($bdTags, array_keys($bdCand->tags(true))); } if ($bdMatch) { $bdRelated[] = $bdCand; } } } } } catch (\Throwable $e) { $bdRelated = array(); } ?>