diff --git a/dashboard.php b/dashboard.php index d48692c..b5b6349 100644 --- a/dashboard.php +++ b/dashboard.php @@ -18,6 +18,9 @@ function parseMarkdownWithMeta($filePath) { 'date' => '', 'platform' => '', 'url' => '', + 'tags' => [], + 'duration' => '', + 'type' => 'article', 'summary' => '' ]; @@ -42,8 +45,17 @@ function parseMarkdownWithMeta($filePath) { if (preg_match('/^url:\s*(.+?)\s*$/m', $yaml, $m)) { $meta['url'] = trim($m[1]); } + if (preg_match('/^duration:\s*(.+?)\s*$/m', $yaml, $m)) { + $meta['duration'] = trim($m[1]); + $meta['type'] = 'video'; + } + if (preg_match('/^tags:\s*\[(.+)\]\s*$/m', $yaml, $m)) { + $tagsStr = $m[1]; + preg_match_all('/"([^"]+)"/', $tagsStr, $tagMatches); + $meta['tags'] = $tagMatches[1] ?? []; + } - // 提取正文概述(前两行非空内容) + // 提取正文概述 $lines = preg_split('/\r?\n/', trim($body)); $summaryLines = []; foreach ($lines as $line) { @@ -53,17 +65,6 @@ function parseMarkdownWithMeta($filePath) { if (count($summaryLines) >= 2) break; } $meta['summary'] = implode(' ', $summaryLines); - } else { - // 没有 front matter,从正文提取 - $lines = preg_split('/\r?\n/', trim($content)); - $summaryLines = []; - foreach ($lines as $line) { - $line = trim($line); - if (empty($line) || strpos($line, '#') === 0) continue; - $summaryLines[] = $line; - if (count($summaryLines) >= 2) break; - } - $meta['summary'] = implode(' ', $summaryLines); } return $meta; @@ -91,7 +92,6 @@ function scanDirectory($dir, $baseDir, $search) { $content = file_get_contents($fullPath); - // 搜索过滤 if ($search) { $searchLower = mb_strtolower($search); $contentLower = mb_strtolower($content); @@ -100,19 +100,21 @@ function scanDirectory($dir, $baseDir, $search) { } } - // 解析元数据 $meta = parseMarkdownWithMeta($fullPath); $docs[] = [ 'name' => $item, 'path' => $relativePath, 'folder' => dirname($relativePath) === '.' ? '' : dirname($relativePath), - 'size' => filesize($fullPath), 'mtime' => filemtime($fullPath), 'title' => $meta['title'], 'author' => $meta['author'], 'date' => $meta['date'], 'platform' => $meta['platform'], + 'url' => $meta['url'], + 'tags' => $meta['tags'], + 'duration' => $meta['duration'], + 'type' => $meta['type'], 'summary' => $meta['summary'] ]; } @@ -122,32 +124,35 @@ function scanDirectory($dir, $baseDir, $search) { $documents = scanDirectory($docDir, $docDir, $search); -// 按日期排序(新文件在前) +// 排序 usort($documents, function($a, $b) { - // 优先按日期排序 if ($a['date'] && $b['date']) { return strcmp($b['date'], $a['date']); } - // 其次按修改时间 return $b['mtime'] - $a['mtime']; }); -// 平台图标映射 -function getPlatformIcon($platform) { - $icons = [ - 'bilibili' => '📺', - 'youtube' => '▶️', - 'zhihu' => '💡', - 'wechat' => '💬', +// 平台配置 +function getPlatformInfo($platform) { + $platforms = [ + 'bilibili' => ['name' => 'Bilibili', 'icon' => '📺', 'color' => '#fb7299'], + 'youtube' => ['name' => 'YouTube', 'icon' => '▶️', 'color' => '#ff0000'], + 'zhihu' => ['name' => '知乎', 'icon' => '💡', 'color' => '#0084ff'], + 'wechat' => ['name' => '微信', 'icon' => '💬', 'color' => '#07c160'], ]; - return $icons[$platform] ?? '📄'; + return $platforms[$platform] ?? ['name' => $platform ?: '未知', 'icon' => '📄', 'color' => '#666']; +} + +// 类型图标 +function getTypeIcon($type) { + return $type === 'video' ? '🎬' : '📝'; } ?>
- +$2', $text);
$text = preg_replace('/`(.+?)`/', '$1', $text);
- // 链接
$text = preg_replace('/\[(.+?)\]\((.+?)\)/', '$1', $text);
- // 列表
$text = preg_replace('/^- (.*$)/m', '', $text); $text = '
' . $text . '
'; return $text; } -// 高亮搜索词 function highlightSearch($text, $search) { if (empty($search)) return $text; - return preg_replace('/(' . preg_quote($search, '/') . ')/i', - '$1', $text); + return preg_replace('/(' . preg_quote($search, '/') . ')/i', '$1', $text); } $htmlContent = markdownToHtml(htmlspecialchars($content)); @@ -102,13 +105,26 @@ if ($search) { } $folder = dirname($file) !== '.' ? dirname($file) : ''; + +// 平台配置 +function getPlatformInfo($platform) { + $platforms = [ + 'bilibili' => ['name' => 'Bilibili', 'icon' => '📺', 'color' => '#fb7299'], + 'youtube' => ['name' => 'YouTube', 'icon' => '▶️', 'color' => '#ff0000'], + 'zhihu' => ['name' => '知乎', 'icon' => '💡', 'color' => '#0084ff'], + 'wechat' => ['name' => '微信', 'icon' => '💬', 'color' => '#07c160'], + ]; + return $platforms[$platform] ?? ['name' => $platform ?: '未知', 'icon' => '📄', 'color' => '#666']; +} + +$platformInfo = getPlatformInfo($meta['platform']); ?> -