Saltar al contenido
🛠️ToolsShed

Generador de TOC Markdown

Genera una tabla de contenidos enlazada desde los encabezados de markdown.

Acerca de esta herramienta

Una Tabla de Contenidos (TOC) de Markdown es una lista de navegación en la parte superior de un documento que ayuda a los lectores a saltar rápidamente a secciones específicas. Este generador extrae automáticamente los encabezados de tu fuente Markdown y crea anclas vinculadas compatibles con GitHub, GitLab y la mayoría de los renderizadores de Markdown. Elimina el tedioso trabajo manual de escribir entradas de TOC y garantiza que los enlaces permanezcan precisos a medida que tu documento evoluciona.

Pega tu texto Markdown y haz clic en Generar para crear instantáneamente un TOC formateado con enlaces de ancla funcionales. La herramienta admite opciones personalizables: controla la profundidad máxima de encabezados (H1 a H6) a incluir y elige tu estilo de viñeta preferido (guiones, asteriscos o signos de más). Los encabezados duplicados se detectan automáticamente y se numeran con sufijos como #heading-1, #heading-2 para evitar conflictos de ancla.

Preguntas Frecuentes

Implementación de Código

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.