mirror of https://github.com/vuejs/vitepress
parent
c1ba483e58
commit
7c59896562
@ -0,0 +1,25 @@
|
||||
module.exports = {
|
||||
lang: 'en-US',
|
||||
title: 'VitePresser',
|
||||
description: 'Vite & Vue powered static site generator.',
|
||||
|
||||
themeConfig: {
|
||||
repo: 'vuejs/vitepress',
|
||||
docsDir: 'docs',
|
||||
|
||||
editLinks: true,
|
||||
editLinkText: 'Edit this page on GitHub',
|
||||
lastUpdated: 'Last Updated',
|
||||
|
||||
|
||||
nav: [
|
||||
{ text: 'Guide', link: '/', activeMatch: '^/$|^/guide/' },
|
||||
{
|
||||
text: 'Config Reference',
|
||||
link: '/config/basics',
|
||||
activeMatch: '^/config/'
|
||||
}
|
||||
],
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
---
|
||||
title: Docs with VitePress
|
||||
editLink: true
|
||||
---
|
||||
|
||||
|
||||
# Hello VitePress
|
||||
|
||||
test.....
|
||||
|
||||
## Sub 1
|
||||
|
||||
foo
|
||||
|
||||
## Sub 2
|
||||
|
||||
bar
|
||||
|
||||
|
@ -0,0 +1,13 @@
|
||||
---
|
||||
title: Docs with VitePress
|
||||
editLink: true
|
||||
---
|
||||
|
||||
|
||||
# Hello Test absddd
|
||||
|
||||
Some foobar here
|
||||
|
||||
## sub
|
||||
|
||||
Here is the subtext...
|
@ -0,0 +1,13 @@
|
||||
---
|
||||
title: Docs with VitePress
|
||||
editLink: true
|
||||
---
|
||||
|
||||
|
||||
# Hello Test 22
|
||||
|
||||
Some foobar here.
|
||||
|
||||
## sub
|
||||
|
||||
Here is the subtext
|
@ -0,0 +1,110 @@
|
||||
import fg from 'fast-glob'
|
||||
import * as fsAsync from 'fs/promises'
|
||||
import path from 'path'
|
||||
import { resolveSiteData } from 'vitepress/dist/node/config'
|
||||
import { HmrContext } from 'vite'
|
||||
|
||||
let root = ''
|
||||
|
||||
export default function vitepressPages(docDir?: string) {
|
||||
const virtualFileId = '/@siteData'
|
||||
return {
|
||||
name: 'vitepress-pages', // required, will show up in warnings and errors
|
||||
resolveId(id) {
|
||||
if (id === virtualFileId) {
|
||||
return virtualFileId
|
||||
}
|
||||
},
|
||||
async load(id) {
|
||||
if (id === virtualFileId) {
|
||||
root = docDir ?? 'docs'
|
||||
const conf = await resolveSiteData(root)
|
||||
|
||||
conf.themeConfig.sidebar = await resolvePages()
|
||||
|
||||
const stringConfig = JSON.stringify(conf).replace(/"/g, '\\"')
|
||||
|
||||
return "export default \"" + stringConfig + "\""
|
||||
}
|
||||
},
|
||||
async handleHotUpdate(context: HmrContext) {
|
||||
// not sure if this can plugin can support hot reloading
|
||||
}
|
||||
}
|
||||
|
||||
async function resolvePages() {
|
||||
const mdFiles = findMdFiles()
|
||||
const dirToFiles = createMultiMap(mdFiles)
|
||||
|
||||
const sidebarItems = []
|
||||
for (let [dir, files] of dirToFiles) {
|
||||
const fileHeadlineArray = await Promise.all(files.map(f => findFirstH1InFile(f)))
|
||||
|
||||
const sidebarItem = {
|
||||
text: beautifySidebarItemText(dir),
|
||||
children: fileHeadlineArray.map(fh => createChild(fh.headline, fh.file))
|
||||
}
|
||||
|
||||
sidebarItems.push(sidebarItem)
|
||||
}
|
||||
|
||||
return sidebarItems
|
||||
}
|
||||
|
||||
function findMdFiles() {
|
||||
return fg.sync(`${root}/**/*.md`, {
|
||||
onlyFiles: true,
|
||||
})
|
||||
}
|
||||
|
||||
async function findFirstH1InFile(filepath: string) {
|
||||
return {
|
||||
file: filepath,
|
||||
headline: await findFirstH1(filepath)
|
||||
}
|
||||
}
|
||||
|
||||
async function findFirstH1(filepath: string) {
|
||||
const file = await fsAsync.readFile(filepath, 'utf8')
|
||||
const data = file.toString()
|
||||
.split('\n')
|
||||
.filter(l => l.startsWith('# '))
|
||||
|
||||
return data[0]
|
||||
}
|
||||
|
||||
function createChild(text: string, link: string): { text: string; link: string } {
|
||||
return {
|
||||
text: text.replace('# ', ''),
|
||||
link: link
|
||||
.replace(root, '')
|
||||
.replace('index', '')
|
||||
.replace('.md', '')
|
||||
}
|
||||
}
|
||||
|
||||
function beautifySidebarItemText(path: string) {
|
||||
const lastDir = path.split('/').pop()
|
||||
|
||||
const capitalizedWords = lastDir
|
||||
.split('-')
|
||||
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
||||
.join(' ');
|
||||
|
||||
return capitalizedWords
|
||||
}
|
||||
|
||||
function createMultiMap(files: string[]): Map<string, string[]> {
|
||||
let map = new Map();
|
||||
files.forEach((file) => {
|
||||
const dir = path.dirname(file)
|
||||
|
||||
if (map.has(dir)) {
|
||||
(map.get(dir) ?? []).push(file);
|
||||
} else {
|
||||
map.set(dir, [file]);
|
||||
}
|
||||
});
|
||||
return map;
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
|
||||
import { defineConfig } from 'vite'
|
||||
import vitepressPages from './plugin/vitepress-pages'
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
vitepressPages(),
|
||||
],
|
||||
})
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "vitepress-pages",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"docs:dev": "vitepress dev docs",
|
||||
"docs:build": "vitepress build docs",
|
||||
"docs:serve": "vitepress serve docs"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@types/node": "^16.7.13",
|
||||
"fast-glob": "^3.2.7",
|
||||
"vitepress": "^0.16.1"
|
||||
}
|
||||
}
|
Loading…
Reference in new issue