init vitepress

This commit is contained in:
Clas Wen 2025-01-25 21:17:06 +08:00
parent f757775c10
commit fdc94548ff
38 changed files with 2021 additions and 1 deletions

4
.gitignore vendored
View file

@ -1 +1,3 @@
.DS_Store
.DS_Store
node_modules
.vitepress/cache

24
.vitepress/config.mts Normal file
View file

@ -0,0 +1,24 @@
import { defineConfig } from 'vitepress'
import { getMeetingMinutesSidebar } from '../meetings/sidebar'
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "Documents",
description: "Documents for nbtca",
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
nav: [
{ text: 'Home', link: '/' },
{ text: 'Meeting Minutes', link: '/meetings' }
],
sidebar: [
...getMeetingMinutesSidebar()
],
socialLinks: [
{ icon: 'github', link: 'https://github.com/vuejs/vitepress' }
]
}
})

25
index.md Normal file
View file

@ -0,0 +1,25 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
hero:
name: "Documents"
text: "Documents for nbtca"
tagline: My great project tagline
actions:
- theme: brand
text: Meeting minutes
link: /meetings/index
# - theme: alt
# text: API Examples
# link: /api-examples
features:
- title: Feature A
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- title: Feature B
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
- title: Feature C
details: Lorem ipsum dolor sit amet, consectetur adipiscing elit
---

1
meetings/index.md Normal file
View file

@ -0,0 +1 @@
12

63
meetings/sidebar.ts Normal file
View file

@ -0,0 +1,63 @@
import { scanDir } from "../utils/sidebar"
import dayjs from "dayjs"
type MeetingMinutesParsed = {
date: Date
fileNameWithoutDate: string
fileName: string
link: string
}
const stripFileExtension = (filename: string) => {
return filename.split(".").slice(0, -1).join(".")
}
const parseFileName = (fileName: string, link: string): MeetingMinutesParsed => {
const dateString = fileName.slice(0, 10)
const date = new Date(dateString)
return {
date,
fileNameWithoutDate: stripFileExtension(fileName.slice(10)),
fileName: fileName,
link: link
}
}
export const getMeetingMinutesSidebar = () => {
const items = scanDir("meetings")
const groupedItems = items.reduce((acc, item) => {
const parsed = parseFileName(item.filename, item.link)
const year = parsed.date.getFullYear()
if (!acc[year]) {
acc[year] = []
}
acc[year].push(parsed)
return acc
}, {} as Record<number, MeetingMinutesParsed[]>)
const groupedSidebarItems = Object.keys(groupedItems).map(v => {
const items: MeetingMinutesParsed[] = groupedItems[v]
return {
text: v.toString(),
items: items
.sort((a, b) => {
return a.date > b.date ? 1 : -1
})
.map(v => {
return {
text: `${dayjs(v.date).format("YYYY-MM-DD")} ${v.fileNameWithoutDate}`,
link: v.link
}
})
}
})
return groupedSidebarItems.sort((a, b) => {
return b.text > a.text ? 1 : -1
})
}

23
package.json Normal file
View file

@ -0,0 +1,23 @@
{
"name": "documents",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "vitest",
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"vitepress": "^1.6.3",
"vitest": "^3.0.4"
},
"dependencies": {
"@types/node": "^22.10.10",
"dayjs": "^1.11.13"
}
}

1866
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load diff

16
utils/sidebar.ts Normal file
View file

@ -0,0 +1,16 @@
import { readdirSync } from "fs"
import { resolve } from "path"
export const scanDir = (dirname: string) => {
const dirpath = resolve(__dirname, `../${dirname}`)
const res = readdirSync(dirpath)
const markdownFileNames = res.filter((name) => name.endsWith('.md'))
return markdownFileNames.map(v => {
return {
filename: v,
link: resolve(dirpath, v)
}
})
}