MkDocs plugin to strip numeric prefixes from page URLs while keeping them in source files
Project description
vexy-mkdocs-strip-number-prefix
A lightweight MkDocs plugin that strips numeric prefixes from page URLs while preserving them in source filenames for natural sorting.
Features
- ✅ Clean URLs: Remove numeric prefixes from generated URLs
- ✅ Natural Sorting: Keep prefixes in source files for predictable ordering
- ✅ Collision Detection: Prevent duplicate URLs with configurable strictness
- ✅ Link Rewriting: Automatically update internal markdown links
- ✅ Flexible Patterns: Customize prefix matching with regex patterns
- ✅ Debug Support: Verbose logging for troubleshooting
Installation
Install from PyPI:
uv pip install --system --upgrade vexy-mkdocs-strip-number-prefix
or from source:
pip install git+https://github.com/vexyart/vexy-mkdocs-strip-number-prefix
Quick Start
Add the plugin to your mkdocs.yml:
plugins:
- search
- strip-number-prefix
Name your files with numeric prefixes:
docs/
├── 010--introduction.md
├── 020--getting-started.md
├── 030--configuration.md
└── 999--faq.md
Build your site:
mkdocs build
Generated URLs will be clean:
/introduction//getting-started//configuration//faq/
Configuration
All configuration options with their defaults:
plugins:
- strip-number-prefix:
pattern: '^\\d+--' # Regex pattern for prefix (default: '^\\d+--')
verbose: false # Enable debug logging (default: false)
strict: true # Fail on slug collisions (default: true)
strip_links: false # Strip prefixes from markdown links (default: false)
Pattern Examples
| Pattern | Matches | Example |
|---|---|---|
^\\d+-- |
Any digits + -- |
123--file.md |
^\\d{3}-- |
Exactly 3 digits + -- |
001--file.md |
^\\d+- |
Any digits + - |
42-file.md |
^\\d+\\. |
Any digits + . |
1.file.md |
Collision Handling
When multiple files would generate the same URL after prefix removal:
plugins:
- strip-number-prefix:
strict: true # Fail build (recommended)
# strict: false # Log warning and continue
Link Rewriting
Automatically update internal markdown links:
plugins:
- strip-number-prefix:
strip_links: true
Before:
[Setup Guide](020--setup.md)
After:
[Setup Guide](setup.md)
Examples
Basic Usage
# mkdocs.yml
site_name: My Documentation
plugins:
- strip-number-prefix
With Material Theme
# mkdocs.yml
site_name: My Documentation
theme:
name: material
features:
- navigation.instant
- navigation.sections
plugins:
- search
- strip-number-prefix:
pattern: '^\\d{3}--'
verbose: true
With Awesome Nav
# mkdocs.yml
site_name: My Documentation
plugins:
- search
- awesome-nav
- strip-number-prefix:
pattern: '^\\d+--'
strip_links: true
Custom Pattern
# mkdocs.yml
plugins:
- strip-number-prefix:
pattern: '^\\d{2}\\.' # Matches: 01.file.md, 99.file.md
strict: false
File Organization Strategies
Sequential Numbering
docs/
├── 010--introduction.md
├── 020--installation.md
├── 030--configuration.md
├── 040--advanced.md
└── 999--troubleshooting.md
Hierarchical Numbering
docs/
├── 100--getting-started.md
├── 110--installation.md
├── 120--first-steps.md
├── 200--configuration.md
├── 210--basic-config.md
├── 220--advanced-config.md
└── 900--appendix.md
Category Prefixes
docs/
├── 01--intro/
│ ├── 010--overview.md
│ └── 020--quickstart.md
├── 02--guides/
│ ├── 010--setup.md
│ └── 020--deployment.md
└── 99--reference/
└── 010--api.md
Compatibility
- MkDocs: >= 1.5.0
- Python: >= 3.9
- Works with:
- Material for MkDocs
- vexy-mkdocs-awesome-nav
- vexy-mkdocs-nav-weight
- Most other MkDocs plugins
Troubleshooting
Duplicate URLs
ERROR: Multiple files would map to 'intro.md': 010--intro.md, 020--intro.md
Solution: Use unique base names:
010--intro-basics.md020--intro-advanced.md
Broken Links
When strip_links: false (default), use clean slugs in links:
✅ [Next page](configuration.md)
❌ [Next page](030--configuration.md)
When strip_links: true, both forms work:
✅ [Next page](configuration.md)
✅ [Next page](030--configuration.md) # Auto-converted
Debug Mode
Enable verbose logging:
plugins:
- strip-number-prefix:
verbose: true
This shows:
- File transformations
- URL mappings
- Collision warnings
- Link rewriting
Development
Setup
git clone https://github.com/vexyart/vexy-mkdocs-strip-number-prefix
cd vexy-mkdocs-strip-number-prefix
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -e .[dev]
pre-commit install
Testing
# Run all tests
pytest
# Run with coverage
pytest --cov=mkdocs_strip_number_prefix --cov-report=html
# Run specific test
pytest tests/test_plugin.py::TestStripNumberPrefixPlugin::test_default_pattern
Code Quality
# Format and lint
black src tests
ruff check --fix src tests
mypy src
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
License
MIT License - see LICENSE file for details.
Support
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions
- 📖 Documentation: Project Documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vexy_mkdocs_strip_number_prefix-1.0.10.tar.gz.
File metadata
- Download URL: vexy_mkdocs_strip_number_prefix-1.0.10.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8f626e49ece5fb5757429e293608d2458cae77d6aabc57f26cf849458b6060f
|
|
| MD5 |
3e127140a27b3205261d59c8ee7dd59c
|
|
| BLAKE2b-256 |
16ffa6318364f656805394c8999de3cbc362541fc217a8bd5e2d83e05b3eb33b
|
File details
Details for the file vexy_mkdocs_strip_number_prefix-1.0.10-py3-none-any.whl.
File metadata
- Download URL: vexy_mkdocs_strip_number_prefix-1.0.10-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
956feb1191a72b0bc85fb0f47ede64061d9cb187683440d5a5614399e3139f16
|
|
| MD5 |
0a9fce2d6a42c9bad0eb806ca4f6e0b4
|
|
| BLAKE2b-256 |
09af95eba14c964971bc469cdb4bf86a3b942bf73845052ac1e589212f32596e
|