Skip to main content

MkDocs plugin to strip numeric prefixes from page URLs while keeping them in source files

Project description

vexy-mkdocs-strip-number-prefix

PyPI version CI codecov License: MIT Python versions

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

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.md
  • 020--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:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new functionality
  4. Ensure all tests pass
  5. Submit a pull request

License

MIT License - see LICENSE file for details.

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vexy_mkdocs_strip_number_prefix-1.0.4.tar.gz (9.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file vexy_mkdocs_strip_number_prefix-1.0.4.tar.gz.

File metadata

File hashes

Hashes for vexy_mkdocs_strip_number_prefix-1.0.4.tar.gz
Algorithm Hash digest
SHA256 d6897385a66febad574a93418397a37befc7b75a0ee0ab704af540615651b9f1
MD5 8d350c15bcfab7861cfd06152f9826da
BLAKE2b-256 182a1d11f183bf0df65b4461e5fd7ad8d7610ca73292e06d5c18159db62b987e

See more details on using hashes here.

File details

Details for the file vexy_mkdocs_strip_number_prefix-1.0.4-py3-none-any.whl.

File metadata

File hashes

Hashes for vexy_mkdocs_strip_number_prefix-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6138851e275191a87915524b53ae00774219fd72a70b4b5097a447fe11a50ebf
MD5 89ce6d8a2b78c951c184471d3fccb7eb
BLAKE2b-256 4c05ff7ad0cd5b6bc7d8b56c46c17f88e5f5d93917b7f53d6301866dd72acae3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page