diff --git a/.gitignore b/.gitignore index 1d60a35bc..eacd117fd 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ package-lock.json /src/client/shared.ts /src/node/shared.ts pnpm-global -TODOs.md \ No newline at end of file +TODOs.md +article-data.json \ No newline at end of file diff --git a/collect-article-data.mjs b/collect-article-data.mjs new file mode 100644 index 000000000..35af11b76 --- /dev/null +++ b/collect-article-data.mjs @@ -0,0 +1,21 @@ +import glob from 'fast-glob' +import matter from 'gray-matter' +import fs from 'node:fs/promises' + +// 感谢: https://github.com/brc-dd/vitepress-blog-demo +const articleData = await Promise.all( + glob.sync('./repos/**/*.md', { + onlyFiles: true, + objectMode: true, + ignore: ['./repos/**/index.md', './repos/**/tags.md', './repos/**/me.md'], // without ! + }).map(async (article) => { + const file = matter.read(`${article.path}`) + const { data, path } = file + return { + ...data, + path: path.replace(/\.md$/, '.html').replace('./repos/', '') + } + }) +) + +await fs.writeFile('./article-data.json', JSON.stringify(articleData), 'utf-8') \ No newline at end of file diff --git a/package.json b/package.json index 9394140ac..92bb0142f 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "author": "Charles7c", "license": "MIT", "scripts": { - "dev": "vitepress dev repos", - "build": "vitepress build repos", + "dev": "node collect-article-data.mjs && vitepress dev repos", + "build": "node collect-article-data.mjs && vitepress build repos", "serve": "vitepress serve repos" }, "devDependencies": { @@ -19,6 +19,7 @@ "element-plus": "^2.2.9", "fast-glob": "^3.2.11", "gitalk": "^1.7.2", + "gray-matter": "^4.0.3", "vue": "^3.2.37" } } diff --git a/repos/.vitepress/config.ts b/repos/.vitepress/config.ts index d0891191e..2fda7fe9c 100644 --- a/repos/.vitepress/config.ts +++ b/repos/.vitepress/config.ts @@ -4,6 +4,7 @@ import { head } from './config/head' import { markdown } from './config/markdown' import { themeConfig } from './config/theme' +// 感谢: https://github.com/windicss/docs export default defineConfig({ lang: metaData.lang, title: metaData.title, diff --git a/repos/.vitepress/config/markdown.ts b/repos/.vitepress/config/markdown.ts index b0e5ae17f..b57dee993 100644 --- a/repos/.vitepress/config/markdown.ts +++ b/repos/.vitepress/config/markdown.ts @@ -5,7 +5,7 @@ export const markdown: MarkdownOptions = { lineNumbers: true, // 启用行号 // 在所有文档的

标签后添加组件 - // 感谢: vitepress/@brc-dd + // 感谢: https://github.com/vuejs/vitepress/issues/1050 config: (md) => { md.renderer.rules.heading_close = (tokens, idx, options, env, slf) => { let htmlResult = slf.renderToken(tokens, idx, options, env, slf) diff --git a/repos/.vitepress/config/nav.ts b/repos/.vitepress/config/nav.ts index d24fb6559..cb35fd945 100644 --- a/repos/.vitepress/config/nav.ts +++ b/repos/.vitepress/config/nav.ts @@ -17,6 +17,11 @@ export const nav: DefaultTheme.Config['nav'] = [ ], activeMatch: '/courses/' }, + { + text: '我的标签', + link: '/tags', + activeMatch: '/tags' + }, { text: '关于', items: [ diff --git a/repos/.vitepress/config/sidebar.ts b/repos/.vitepress/config/sidebar.ts index 509160d9a..35bda7dc5 100644 --- a/repos/.vitepress/config/sidebar.ts +++ b/repos/.vitepress/config/sidebar.ts @@ -1,5 +1,5 @@ import DefaultTheme from 'vitepress/theme' -import { sync } from "fast-glob" +import { sync } from 'fast-glob' export const sidebar: DefaultTheme.Config['sidebar'] = { '/categories/issues/': getItemsByDate("categories/issues"), diff --git a/repos/.vitepress/theme/components/ArticleMetadata.vue b/repos/.vitepress/theme/components/ArticleMetadata.vue index 9f1cf245a..5a6b31b66 100644 --- a/repos/.vitepress/theme/components/ArticleMetadata.vue +++ b/repos/.vitepress/theme/components/ArticleMetadata.vue @@ -29,6 +29,7 @@ import { useData } from 'vitepress' import dayjs from 'dayjs' import 'dayjs/locale/zh-cn' import relativeTime from 'dayjs/plugin/relativeTime' +import '../styles/article-meta-data.css' // 获取发布时间 const { page, theme, frontmatter } = useData() @@ -43,45 +44,4 @@ const toDate = dayjs().to(dayjs(frontmatter.value.date)) \ No newline at end of file diff --git a/repos/.vitepress/theme/components/Comment.vue b/repos/.vitepress/theme/components/Comment.vue index 3d037e8df..827ba2297 100644 --- a/repos/.vitepress/theme/components/Comment.vue +++ b/repos/.vitepress/theme/components/Comment.vue @@ -44,7 +44,7 @@ function renderGitalk(options) { gitalk.render('comment-container') /* - // 感谢: dingqianwen/my-blog + // 感谢: https://github.com/dingqianwen/my-blog // 如果点赞,先判断有没有登录 let $gc = $('#gitalk-container'); $gc.on('click', '.gt-comment-like', function () { diff --git a/repos/.vitepress/theme/components/Tag.vue b/repos/.vitepress/theme/components/Tag.vue new file mode 100644 index 000000000..c3cb1354e --- /dev/null +++ b/repos/.vitepress/theme/components/Tag.vue @@ -0,0 +1,272 @@ + + + + + \ No newline at end of file diff --git a/repos/.vitepress/theme/index.ts b/repos/.vitepress/theme/index.ts index c6e45ee37..2ecec2695 100644 --- a/repos/.vitepress/theme/index.ts +++ b/repos/.vitepress/theme/index.ts @@ -3,6 +3,7 @@ import MyLayout from "./components/MyLayout.vue" import ElementPlus from 'element-plus' import "element-plus/dist/index.css" import ArticleMetadata from './components/ArticleMetadata.vue' +import Tag from './components/Tag.vue' import './styles/vars.css' import './styles/custom.css' @@ -14,5 +15,6 @@ export default { app.use(ElementPlus) app.component('ArticleMetadata', ArticleMetadata) + app.component('Tag', Tag) } } \ No newline at end of file diff --git a/repos/.vitepress/theme/styles/article-meta-data.css b/repos/.vitepress/theme/styles/article-meta-data.css new file mode 100644 index 000000000..0094dd7c7 --- /dev/null +++ b/repos/.vitepress/theme/styles/article-meta-data.css @@ -0,0 +1,41 @@ +.meta-wrapper { + margin-top: 10px; +} +.meta-item { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: middle; + max-width: 240px; + color: var(--vp-c-text-2); + cursor: default; + font-size: 14px; +} +.meta-item:not(:last-child) { + margin-right: 1rem; +} +.meta-icon, meta-content { + display: inline-block; + margin-right: .375rem; + vertical-align: middle; +} +.meta-icon { + position: relative; + bottom: 1.5px; +} +.meta-icon.date { + bottom: 1.3px; +} +.meta-icon svg { + fill: var(--vp-c-text-2); + height: 16px; + width: 16px; +} +.meta-content a { + font-weight: 400; + color: var(--vp-c-text-2); +} +.meta-content a:hover { + color: var(--vp-c-brand); +} \ No newline at end of file diff --git a/repos/tags.md b/repos/tags.md new file mode 100644 index 000000000..e7f0aa4ce --- /dev/null +++ b/repos/tags.md @@ -0,0 +1,7 @@ +--- +editLink: false +lastUpdated: false +aside: false +--- + + \ No newline at end of file