feat(theme): add categories transform and improve ui (#342)

This commit is contained in:
pengzhanbo 2024-11-18 00:42:13 +08:00 committed by GitHub
parent 6f2d3958f4
commit 04ada17d5f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 33 additions and 13 deletions

View File

@ -145,6 +145,13 @@ interface BlogOptions {
*/ */
categoriesExpand?: number | 'deep' categoriesExpand?: number | 'deep'
/**
* 文章分类列表转换函数,比如排除不需要的一级分类
* @param categories 分类列表
* @returns 返回一个新的分类列表
*/
categoriesTransform?: (categories: PageCategoryData[]) => PageCategoryData[]
/** /**
* 博客文章封面图 * 博客文章封面图
* *

View File

@ -15,6 +15,7 @@ const { hasBlogExtract, tags, archives, categories } = useBlogExtract()
<template> <template>
<div v-if="hasBlogExtract" class="vp-blog-nav" :class="{ local: props.isLocal }"> <div v-if="hasBlogExtract" class="vp-blog-nav" :class="{ local: props.isLocal }">
<VPLink <VPLink
v-if="tags.link"
class="nav-link" class="nav-link"
:class="{ active: route.path === tags.link }" :class="{ active: route.path === tags.link }"
:href="tags.link" :href="tags.link"
@ -25,6 +26,7 @@ const { hasBlogExtract, tags, archives, categories } = useBlogExtract()
<span class="icon vpi-chevron-right" /> <span class="icon vpi-chevron-right" />
</VPLink> </VPLink>
<VPLink <VPLink
v-if="categories.link"
class="nav-link" class="nav-link"
:class="{ active: route.path === categories.link }" :class="{ active: route.path === categories.link }"
:href="categories.link" :href="categories.link"
@ -35,6 +37,7 @@ const { hasBlogExtract, tags, archives, categories } = useBlogExtract()
<span class="icon vpi-chevron-right" /> <span class="icon vpi-chevron-right" />
</VPLink> </VPLink>
<VPLink <VPLink
v-if="archives.link"
class="nav-link" class="nav-link"
:class="{ active: route.path === archives.link }" :class="{ active: route.path === archives.link }"
:href="archives.link" :href="archives.link"

View File

@ -290,6 +290,7 @@ const coverStyles = computed(() => {
.blog-post-item-content .post-meta { .blog-post-item-content .post-meta {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 16px;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
font-size: 14px; font-size: 14px;
@ -302,11 +303,6 @@ const coverStyles = computed(() => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
margin-right: 1rem;
}
.blog-post-item-content .post-meta > div:last-of-type {
margin-right: 0;
} }
.blog-post-item-content .post-meta .tag-list { .blog-post-item-content .post-meta .tag-list {
@ -333,7 +329,7 @@ const coverStyles = computed(() => {
.blog-post-item-content .post-meta .icon { .blog-post-item-content .post-meta .icon {
width: 14px; width: 14px;
height: 14px; height: 14px;
margin: 0.3rem; margin-right: 0.3rem;
color: var(--vp-c-text-3); color: var(--vp-c-text-3);
transition: color var(--vp-t-color); transition: color var(--vp-t-color);
} }

View File

@ -90,6 +90,7 @@ const hasMeta = computed(() => readingTime.value.time || tags.value.length || cr
.vp-doc-meta { .vp-doc-meta {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 16px;
align-items: center; align-items: center;
justify-content: flex-start; justify-content: flex-start;
padding: 1rem 0 0.5rem; padding: 1rem 0 0.5rem;
@ -103,7 +104,6 @@ const hasMeta = computed(() => readingTime.value.time || tags.value.length || cr
.vp-doc-meta p { .vp-doc-meta p {
display: flex; display: flex;
align-items: center; align-items: center;
margin-right: 1rem;
} }
.vp-doc-meta .icon { .vp-doc-meta .icon {
@ -143,7 +143,6 @@ const hasMeta = computed(() => readingTime.value.time || tags.value.length || cr
.vp-doc-meta .create-time { .vp-doc-meta .create-time {
min-width: 110px; min-width: 110px;
margin-right: 0;
text-align: right; text-align: right;
} }

View File

@ -33,6 +33,11 @@ export function resolveThemeData(app: App, options: PlumeThemeLocaleOptions): Pl
themeData.bulletin = opt themeData.bulletin = opt
} }
if (isPlainObject(themeData.blog)) {
const { categoriesTransform: _, ...blog } = themeData.blog
themeData.blog = blog
}
entries(options.locales || {}).forEach(([locale, opt]) => { entries(options.locales || {}).forEach(([locale, opt]) => {
themeData.locales![locale] = {} themeData.locales![locale] = {}
entries(opt).forEach(([key, value]) => { entries(opt).forEach(([key, value]) => {

View File

@ -1,6 +1,6 @@
import type { Page } from 'vuepress/core' import type { Page } from 'vuepress/core'
import type { PageCategoryData, PlumeThemeLocaleOptions, PlumeThemePageData } from '../../shared/index.js' import type { PageCategoryData, PlumeThemeLocaleOptions, PlumeThemePageData } from '../../shared/index.js'
import { ensureLeadingSlash } from '@vuepress/helper' import { ensureLeadingSlash, isPlainObject } from '@vuepress/helper'
import { resolveNotesLinkList } from '../config/index.js' import { resolveNotesLinkList } from '../config/index.js'
import { hash } from '../utils/index.js' import { hash } from '../utils/index.js'
@ -15,11 +15,13 @@ export function autoCategory(
options: PlumeThemeLocaleOptions, options: PlumeThemeLocaleOptions,
) { ) {
const pagePath = page.filePathRelative const pagePath = page.filePathRelative
const blog = isPlainObject(options.blog) ? options.blog : {}
const enabled = blog.categories !== false
if (page.data.type || !pagePath) if (page.data.type || !pagePath || !enabled)
return return
const notesLinks = resolveNotesLinkList(options)
const notesLinks = resolveNotesLinkList(options)
if (notesLinks.some(link => page.path.startsWith(link))) if (notesLinks.some(link => page.path.startsWith(link)))
return return
@ -44,5 +46,5 @@ export function autoCategory(
name: match[2], name: match[2],
} }
}) })
page.data.categoryList = categoryList page.data.categoryList = blog.categoriesTransform?.(categoryList) || categoryList
} }

View File

@ -95,7 +95,8 @@ export interface PlumeThemeBlog {
archivesLink?: string archivesLink?: string
/** /**
* *
* -
* @default true * @default true
*/ */
categories?: boolean categories?: boolean
@ -114,6 +115,13 @@ export interface PlumeThemeBlog {
*/ */
categoriesExpand?: number | 'deep' categoriesExpand?: number | 'deep'
/**
*
* @param categories
* @returns
*/
categoriesTransform?: (categories: PageCategoryData[]) => PageCategoryData[]
/** /**
* *
* *