UNPKG

vitepress-auto-nav

Version:

Auto-generate navigation and sidebar configuration for VitePress

248 lines (184 loc) 7.42 kB
# VitePress Auto Navigation Generator [English](./README.md) | [中文](./README.zh-CN.md) `vitepress-auto-nav` is a tool that automatically generates navigation bar and sidebar configurations for VitePress based on your document directory structure, eliminating the need for manual configuration. ## Installation ```bash npm install vitepress-auto-nav --save-dev # or yarn add vitepress-auto-nav --dev # or pnpm add vitepress-auto-nav -D ``` ## Basic Usage Import and use in your VitePress configuration file: ```js // .vitepress/config.js or .vitepress/config.ts const { default: generateVitepressConfig } = require('vitepress-auto-nav') // or using ES module syntax // import generateVitepressConfig from 'vitepress-auto-nav'; export default { // ...other configurations themeConfig: { // Use auto-generated navigation and sidebar ...generateVitepressConfig(), }, } ``` ## Documentation Directory Detection The tool automatically detects your documentation directory in the following order: 1. `src/docs` - Checked first 2. `docs` - Checked if src/docs doesn't exist 3. Current directory (`.`) - As a fallback You can override this with the `docsDir` option. ## Configuration Options You can customize the generation behavior through options: ```js import generateVitepressConfig from 'vitepress-auto-nav' export default { // ...other configurations themeConfig: { ...generateVitepressConfig({ // Documentation root directory, auto-detected by default (src/docs, docs, or .) docsDir: 'docs', // Whether to expand sidebar groups by default, defaults to true defaultExpand: true, // Directories to ignore ignoreDirs: ['public', 'assets', 'node_modules', 'api'], // Suffix for overview files overviewSuffix: 'Overview', // Custom function for formatting display names formatDisplayName: name => { // Example: convert kebab-case to Title Case return name.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) }, // Custom sorting function for sidebar items sidebarItemSorter: (a, b) => { // Example: keep Overview at top, then sort alphabetically if (a.text && a.text.includes('Overview')) return -1 if (b.text && b.text.includes('Overview')) return 1 return a.text && b.text ? a.text.localeCompare(b.text) : 0 }, // Enable debug logging debug: false, // Maximum depth for directory traversal (1, 2, or 3) maxDepth: 3, // Whether to include files in the root of document directory includeRootFiles: false, // File patterns to include (only files matching these extensions) filePatterns: ['.md'], }), }, } ``` ## Advanced Configuration Details ### Document Structure Depth Control The `maxDepth` option controls how deep the tool traverses your directory structure: - `maxDepth: 1` - Only process level 1 directories (e.g., `/guides/`) - `maxDepth: 2` - Process up to level 2 directories (e.g., `/guides/basics/`) - `maxDepth: 3` - Process up to level 3 directories (default, e.g., `/guides/basics/installation/`) ### Custom Display Name Formatting You can completely customize how directory and file names are displayed in the navigation and sidebar: ```js formatDisplayName: name => { // Remove common prefixes like "01-", "02-" etc. name = name.replace(/^\d+[-_]/, '') // Add your own formatting logic return name.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) } ``` ### Custom Sidebar Item Sorting Control the order of sidebar items with a custom sorting function: ```js sidebarItemSorter: (a, b) => { // First, sort by custom order const order = ['introduction', 'getting-started', 'configuration', 'advanced'] // Get base names without paths const aName = a.link ? a.link.split('/').pop() : '' const bName = b.link ? b.link.split('/').pop() : '' // Find positions in custom order array const aIndex = order.findIndex(item => aName && aName.includes(item)) const bIndex = order.findIndex(item => bName && bName.includes(item)) // If both items are in the custom order if (aIndex !== -1 && bIndex !== -1) { return aIndex - bIndex } // Put items in custom order before other items if (aIndex !== -1) return -1 if (bIndex !== -1) return 1 // Default alphabetical sort for remaining items return a.text && b.text ? a.text.localeCompare(b.text) : 0 } ``` ## Using Navigation Bar or Sidebar Separately You can also use the navigation bar or sidebar generation functions separately: ```js import { generateNav, generateSidebar } from 'vitepress-auto-nav' export default { // ...other configurations themeConfig: { // Use auto-generated navigation nav: generateNav({ maxDepth: 2, includeRootFiles: true, }), // Use auto-generated sidebar, mixed with manual configuration sidebar: { ...generateSidebar({ // Set sidebar not to expand by default defaultExpand: false, // Only include markdown files filePatterns: ['.md'], }), // Manually add or override sidebar for specific paths '/custom/path/': [ { text: 'Custom Section', items: [{ text: 'Document 1', link: '/custom/path/doc1' }], }, ], }, }, } ``` ## Auto-generation Rules ### Directory Structure Example ``` docs/ ├── Web-Development/ # Level 1 directory Main navigation menu item ├── Frontend/ # Level 2 directory Dropdown menu group title ├── Vue/ # Level 3 directory Navigation item and sidebar group ├── index.md # Generates an overview link ├── basics.md # Sidebar sub-item └── advanced.md # Sidebar sub-item ``` ### Generation Rules 1. **Navigation Bar Generation Rules**: - Level 1 directory Main navigation menu item - Level 2 directory Dropdown menu group title - Level 3 directory Navigation item (links to index.md) 2. **Sidebar Generation Rules**: - Level 3 directory Collapsible group title - .md files under Level 3 directory Sidebar sub-items - index.md is specially treated as "[Directory name] Overview" 3. **Path Format**: - Preserves original directory name case - No special processing for directory names - Uses original path name concatenation 4. **Smart Filtering**: - Ignores directories starting with `_` - Automatically skips Level 3 directories without index.md - Ignores special directories like public, assets, etc. (customizable) ## Troubleshooting ### Documentation Directory Not Found If you see an error like "Documentation directory not found", check: 1. Your project structure - make sure you have a `docs` or `src/docs` directory 2. Explicitly set the `docsDir` option to point to your documentation directory: ```js generateVitepressConfig({ docsDir: 'your/docs/path' }) ``` 3. Enable debug mode to see more information: ```js generateVitepressConfig({ debug: true }) ``` ## License MIT