Aller au contenu
🛠️ToolsShed

Générateur de TOC Markdown

Génère une table des matières avec liens depuis les titres markdown.

À propos de cet outil

Une table des matières (TOC) Markdown est une liste de navigation en haut d'un document qui aide les lecteurs à accéder rapidement à des sections spécifiques. Ce générateur extrait automatiquement les titres de votre source Markdown et crée des ancres liées compatibles avec GitHub, GitLab et la plupart des lecteurs Markdown. Il élimine le travail fastidieux d'écrire manuellement les entrées de la TOC et garantit que les liens restent précis à mesure que votre document évolue.

Collez votre texte Markdown et cliquez sur Générer pour créer instantanément une TOC formatée avec des liens d'ancre fonctionnels. L'outil prend en charge des options personnalisables : contrôlez la profondeur maximale des titres (H1 à H6) à inclure et choisissez votre style de puce préféré (tirets, astérisques ou plus). Les titres en double sont automatiquement détectés et numérotés avec des suffixes comme #heading-1, #heading-2 pour éviter les conflits d'ancre.

Questions Fréquentes

Implémentation du Code

import re

def heading_to_anchor(text: str) -> str:
    """Convert heading text to a GitHub-Flavored Markdown anchor."""
    anchor = text.lower()
    anchor = re.sub(r"[^\w\s-]", "", anchor)   # remove punctuation (keep letters, digits, -, _)
    anchor = re.sub(r"\s+", "-", anchor.strip())  # spaces → hyphens
    return anchor

def generate_toc(markdown: str, max_depth: int = 3, bullet: str = "-") -> str:
    lines = []
    seen: dict[str, int] = {}

    for line in markdown.splitlines():
        m = re.match(r"^(#{1,6})\s+(.*)", line)
        if not m:
            continue
        level = len(m.group(1))
        if level > max_depth:
            continue

        title  = m.group(2).strip()
        anchor = heading_to_anchor(title)

        # Deduplicate: second occurrence → anchor-1, third → anchor-2, ...
        count  = seen.get(anchor, 0)
        seen[anchor] = count + 1
        if count > 0:
            anchor = f"{anchor}-{count}"

        indent = "  " * (level - 1)
        lines.append(f"{indent}{bullet} [{title}](#{anchor})")

    return "\n".join(lines)


md = """# Getting Started
## Installation
### Prerequisites
### Install
## Configuration
## Usage
# Advanced
## Performance
## Security
"""

print(generate_toc(md, max_depth=3, bullet="-"))
# - [Getting Started](#getting-started)
#   - [Installation](#installation)
#     - [Prerequisites](#prerequisites)
#     - [Install](#install)
#   - [Configuration](#configuration)
#   - [Usage](#usage)
# - [Advanced](#advanced)
#   - [Performance](#performance)
#   - [Security](#security)

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.