Add support for page-specific JavaScript files with cache busting via MD5 hash. The script is loaded at the end of the body with defer attribute. The JavaScript file must be named script.js and located in the same directory as the page content.
61 lines
2.5 KiB
PHP
61 lines
2.5 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="<?= htmlspecialchars($currentLang ?? 'en') ?>">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title><?= htmlspecialchars($pageTitle ?? 'FolderWeb') ?></title>
|
|
<?php if (!empty($metaDescription)): ?>
|
|
<meta name="description" content="<?= htmlspecialchars($metaDescription) ?>">
|
|
<?php endif; ?>
|
|
<?php if (!empty($socialImageUrl)): ?>
|
|
<meta property="og:image" content="<?= htmlspecialchars($socialImageUrl) ?>">
|
|
<?php endif; ?>
|
|
<link rel="stylesheet" href="/app/default/styles/styles.css">
|
|
<?php if (!empty($pageCssUrl)): ?>
|
|
<link rel="stylesheet" href="<?= htmlspecialchars($pageCssUrl) ?>?v=<?= htmlspecialchars($pageCssHash ?? '') ?>">
|
|
<?php endif; ?>
|
|
<?php if (!empty($feedUrl)): ?>
|
|
<link rel="alternate" type="application/atom+xml" title="<?= htmlspecialchars($pageTitle ?? 'Feed') ?>" href="<?= htmlspecialchars($feedUrl) ?>">
|
|
<?php endif; ?>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<nav>
|
|
<a href="<?= htmlspecialchars($langPrefix ?? '') ?>/"><?= htmlspecialchars($homeLabel ?? ($translations['home'] ?? 'Home')) ?></a>
|
|
<?php if (!empty($navigation)): ?>
|
|
<?php foreach ($navigation as $item): ?>
|
|
<a href="<?= htmlspecialchars($item['url']) ?>"><?= htmlspecialchars($item['title']) ?></a>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</nav>
|
|
<?php if (!empty($languageUrls) && count($languageUrls) > 1): ?>
|
|
<nav class="language-switcher" aria-label="Language">
|
|
<?php foreach ($languageUrls as $lang => $url): ?>
|
|
<a href="<?= htmlspecialchars($url) ?>" <?= ($lang === $currentLang) ? 'aria-current="true"' : '' ?>><?= htmlspecialchars(strtoupper($lang)) ?></a>
|
|
<?php endforeach; ?>
|
|
</nav>
|
|
<?php endif; ?>
|
|
</header>
|
|
|
|
<main>
|
|
<?= $content ?>
|
|
</main>
|
|
|
|
<footer>
|
|
<nav>
|
|
<a href="https://mastodon.social/@example" rel="me">Mastodon</a>
|
|
<a href="https://bsky.app/profile/example.bsky.social">Bluesky</a>
|
|
</nav>
|
|
<p>
|
|
<?php if (!empty($translations['footer_handcoded'])): ?>
|
|
<?= htmlspecialchars($translations['footer_handcoded']) ?> <?= number_format((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000, 2) ?><?= htmlspecialchars($translations['footer_page_time'] ?? 'ms') ?>
|
|
<?php else: ?>
|
|
Generated in <?= number_format((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000, 2) ?>ms
|
|
<?php endif; ?>
|
|
</p>
|
|
</footer>
|
|
<?php if (!empty($pageJsUrl)): ?>
|
|
<script defer src="<?= htmlspecialchars($pageJsUrl) ?>?v=<?= htmlspecialchars($pageJsHash ?? '') ?>"></script>
|
|
<?php endif; ?>
|
|
</body>
|
|
</html>
|