文件
JGZYES 4091c6791a release: PMM v0.6.0 + ppdm v0.0.2 — 站点版本/文档/CI 版本提升
- pmm 0.6.0: 结构化错误码(见前), 站点 PMM_VERSION + install.sh 版本 + 文档版本
- ppdm 0.0.2: 新增 list/del 命令(客户端) + web/ppdm/list.php/del.php 后端
- CI: ppdm 构建版本 0.0.1 -> 0.0.2
- docs: ppdm.md 加 list/del, download/install 文档 0.5.6 -> 0.6.0
- CHANGELOG 0.6.0 增 ppdm 0.0.2 全量发布说明
2026-09-06 18:01:41 +08:00

82 行
3.9 KiB
PHP

<?php
/* Shared layout + constants for the PMM site (4 pages + home).
* Pure grayscale dark theme. Each page: define('PMM_SITE',1); require _common.php;
* then pmm_header($active,$title); ... pmm_footer(); */
if (!defined('PMM_SITE')) { http_response_code(403); exit('forbidden'); }
define('PMM_VERSION', '0.6.0');
function pmm_nav_links(string $active): string {
$items = [
'home' => ['/index.php', '首页'],
'docs' => ['/docs/index.php', '文档'],
];
$html = '';
foreach ($items as $key => [$href, $label]) {
$cls = $key === $active ? ' class="active"' : '';
$html .= '<li><a' . $cls . ' href="' . $href . '">' . $label . '</a></li>';
}
return $html;
}
/* Minimal markdown renderer (self-contained). Used by the docs site. */
function md(string $t): string {
$t = htmlspecialchars($t, ENT_QUOTES, 'UTF-8');
$t = preg_replace('/```([a-zA-Z0-9]*)\n(.*?)```/s', "<pre class=\"mdcode\"><code>\\2</code></pre>", $t);
$t = preg_replace('/^### (.*)$/m', '<h3>$1</h3>', $t);
$t = preg_replace('/^## (.*)$/m', '<h2>$1</h2>', $t);
$t = preg_replace('/^# (.*)$/m', '<h1>$1</h1>', $t);
$t = preg_replace('/^[-*] (.*)$/m', '<li>$1</li>', $t);
$t = preg_replace('/^\s*---\s*$/m', '<hr>', $t);
$t = preg_replace('/\*\*(.+?)\*\*/', '<strong>$1</strong>', $t);
$t = preg_replace('/\[([^\]]+)\]\(([^)]+)\)/', '<a href="$2" target="_blank" rel="noopener">$1</a>', $t);
$t = preg_replace('/`([^`]+)`/', '<code>$1</code>', $t);
return $t;
}
function pmm_header(string $active, string $title): void {
$t = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
echo '<!DOCTYPE html>' . "\n" .
'<html lang="zh-CN">' . "\n" .
'<head>' . "\n" .
'<meta charset="UTF-8">' . "\n" .
'<meta name="viewport" content="width=device-width, initial-scale=1.0">' . "\n" .
'<title>' . $t . ' · ParlzPackageManager</title>' . "\n" .
'<meta name="description" content="ParlzPackageManager (PMM) — 用 C 语言编写、跨 Windows/Linux/macOS 的包管理器。">' . "\n" .
'<link rel="icon" href="/icon.png">' . "\n" .
'<link rel="apple-touch-icon" href="/icon.png">' . "\n" .
'<link rel="stylesheet" href="/assets/style.css">' . "\n" .
'</head>' . "\n" .
'<body>' . "\n" .
'<nav class="nav">' . "\n" .
' <a class="brand" href="/index.php"><img class="brand-img" src="/icon.png" alt="PMM"><span class="brand-name">ParlzPackageManager</span></a>' . "\n" .
' <ul class="nav-links">' . "\n" .
' ' . pmm_nav_links($active) . "\n" .
' <li><a class="btn btn-sm" href="https://github.com/JGZYES/ParlzPackageManger" target="_blank" rel="noopener">GitHub ↗</a></li>' . "\n" .
' </ul>' . "\n" .
'</nav>' . "\n";
}
function pmm_page_open(string $kicker, string $title): void {
$k = htmlspecialchars($kicker, ENT_QUOTES, 'UTF-8');
$t = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
echo '<header class="page-hero"><div class="wrap">' . "\n" .
' <div class="page-kicker">' . $k . '</div>' . "\n" .
' <h1>' . $t . '</h1>' . "\n" .
'</div></header>' . "\n";
}
function pmm_footer(): void {
echo '<footer class="footer"><div class="wrap">' . "\n" .
' <div class="footer-top"><span class="brand-name">ParlzPackageManager</span><span>GNU GPL-3.0 · C11 · 跨平台</span></div>' . "\n" .
' <div class="footer-links">' . "\n" .
' <a href="https://github.com/JGZYES/ParlzPackageManger" target="_blank" rel="noopener">GitHub</a>' . "\n" .
' <a href="https://github.com/JGZYES/ParlzPackageManger/releases" target="_blank" rel="noopener">Releases</a>' . "\n" .
' <a href="index.php">首页</a>' . "\n" .
' </div>' . "\n" .
' <p class="footer-note">© 2026 ParlzPackageManager Project · 深圳 sz.pmm.parlz.com · 香港 pmm.parlz.com</p>' . "\n" .
'</div></footer>' . "\n" .
'<script src="/assets/main.js"></script>' . "\n" .
'</body>' . "\n" . '</html>';
}