diff --git a/docs/.nav.yml b/docs/.nav.yml
new file mode 100644
index 0000000..12e5a7c
--- /dev/null
+++ b/docs/.nav.yml
@@ -0,0 +1,20 @@
+nav:
+ - Inicio: index.md
+ - Meetups:
+ - General: meetups/index.md
+ - "2025": meetups/2025/index.md
+ - "2024": meetups/2024/index.md
+ - "2023": meetups/2023/index.md
+ - Participa:
+ - Cómo Contribuir: comunidad/como-contribuir.md
+ - Voluntarios: comunidad/voluntarios.md
+ - Ponentes: comunidad/ponentes.md
+ - Sedes: comunidad/sedes.md
+ - Comunidad:
+ - Comunidades: comunidad/comunidades.md
+ - Código de Conducta: codigo-de-conducta.md
+ - Aviso de Privacidad: aviso-de-privacidad.md
+ - Blog:
+ - Inicio: blog/index.md
+ - PyCon Latam 2025: blog/PyconLatam2025.md
+ - Acerca de: about.md
diff --git a/docs/about.md b/docs/about.md
index 71e3f03..c50b71d 100644
--- a/docs/about.md
+++ b/docs/about.md
@@ -39,11 +39,11 @@ Creemos que el verdadero crecimiento profesional viene de la colaboración y el
### Ser Ponente
-Comparte tu experiencia y conocimiento con la comunidad. Consulta nuestra [guía para ponentes](comunidad/ponentes/) para más información.
+Comparte tu experiencia y conocimiento con la comunidad. Consulta nuestra [guía para ponentes](comunidad/ponentes.md) para más información.
### Ser Voluntario
-Ayuda a organizar eventos, gestionar redes sociales o contribuir con el desarrollo del sitio web. Conoce más en [nuestra página de voluntarios](/comunidad/voluntarios/).
+Ayuda a organizar eventos, gestionar redes sociales o contribuir con el desarrollo del sitio web. Conoce más en [nuestra página de voluntarios](comunidad/voluntarios.md).
### Asistir a Meetups
diff --git a/docs/blog/.nav.yml b/docs/blog/.nav.yml
new file mode 100644
index 0000000..6f73d44
--- /dev/null
+++ b/docs/blog/.nav.yml
@@ -0,0 +1,3 @@
+nav:
+ - Inicio: index.md
+ - PyCon Latam 2025: PyconLatam2025.md
diff --git a/docs/codigo-de-conducta.md b/docs/codigo-de-conducta.md
index 12e366f..3131ff4 100644
--- a/docs/codigo-de-conducta.md
+++ b/docs/codigo-de-conducta.md
@@ -100,7 +100,7 @@ Todas las quejas serán revisadas e investigadas y resultarán en una respuesta
Este código se inspira y adapta de:
* [PSF Code of Conduct](https://policies.python.org/python.org/code-of-conduct/)
-* [Pythonistas GDL](https://pythonistas-gdl.org/pages/codigo-de-conducta.html)
+* [Pythonistas GDL](https://pythonistas-gdl.org/pages/codigo-de-conducta.md)
* [LIDSOL Code of Conduct](https://github.com/LIDSOL/CodeOfConduct)
* [Contributor Covenant](https://www.contributor-covenant.org), versión 2.0
diff --git a/docs/comunidad/como-contribuir.md b/docs/comunidad/como-contribuir.md
index 3b668e1..dd4ebc5 100644
--- a/docs/comunidad/como-contribuir.md
+++ b/docs/comunidad/como-contribuir.md
@@ -28,13 +28,13 @@ Contribuir a Python CDMX te permite:
Comparte tu conocimiento con la comunidad a través de charlas técnicas, casos de uso o introducciones a nuevas tecnologías.
-**Más información:** [Ser Ponente](ponentes/)
+**Más información:** [Ser Ponente](ponentes.md)
### Ser Voluntario
Ayuda a organizar eventos, gestionar redes sociales, o contribuir con el desarrollo del sitio web.
-**Más información:** [Ser Voluntario](voluntarios/)
+**Más información:** [Ser Voluntario](voluntarios.md)
### Desarrollo Web
@@ -52,7 +52,7 @@ Escribe artículos, documentación, o crea contenido para nuestras redes sociale
Ayuda a establecer y mantener relaciones con otras comunidades y empresas.
-**Más información:** [Alianzas](alianzas/)
+**Más información:** [Alianzas](alianzas.md)
---
@@ -60,14 +60,14 @@ Ayuda a establecer y mantener relaciones con otras comunidades y empresas.
### 1. Identifica tu Área
-- Revisa las [formas de contribuir](#formas-de-contribuir/)
+- Revisa las [formas de contribuir](#formas-de-contribuir)
- Considera tus habilidades e intereses
- Evalúa tu disponibilidad de tiempo
### 2. Contacta con Nosotros
- Envía un mensaje a través de nuestros canales oficiales
-- Participa en [nuestros meetups](../meetups/) para conocernos
+- Participa en [nuestros meetups](../meetups/index.md) para conocernos
- Asiste a sesiones informativas
### 3. Comienza Pequeño
diff --git a/docs/comunidad/ponentes.md b/docs/comunidad/ponentes.md
index bed09f1..c7a050f 100644
--- a/docs/comunidad/ponentes.md
+++ b/docs/comunidad/ponentes.md
@@ -122,8 +122,8 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Desarrollo de APIs, Frameworks Web, Buenas Prácticas
Charlas recientes:
@@ -155,7 +155,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
OpenSource, Automatización, Hardening de Infraestructura
Charlas recientes:
@@ -187,7 +187,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Inteligencia Artificial, Tecnologías de Código Abierto
Charlas recientes:
@@ -219,8 +219,8 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Kubernetes, MLOps, GitOps, Cloud Native
Charlas recientes:
@@ -252,8 +252,8 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Validación de Datos, Mejores Prácticas, Nuevas Tecnologías
Charlas recientes:
@@ -285,7 +285,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Desarrollo Web, Portafolios, Python
Charlas recientes:
@@ -317,10 +317,10 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
DevOps, Docker, Kubernetes, CI/CD, AWS
Charlas recientes:
@@ -352,7 +352,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
NLP, Lenguas Indígenas, MLOps, Cultura Libre
Charlas recientes:
@@ -384,7 +384,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Agentes de IA, Machine Learning, LangGraph, LLMs
Charlas recientes:
@@ -416,7 +416,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Open Source, Ruby, Contribución Comunitaria
Charlas recientes:
@@ -448,7 +448,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Machine Learning, Análisis de Datos, Algoritmos Estadísticos
Charlas recientes:
@@ -480,10 +480,10 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Desarrollo Python, Análisis de Datos, Metaprogramación
Charlas recientes:
@@ -515,8 +515,8 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Ingeniería de Datos, Procesamiento ETL, Big Data
Charlas recientes:
@@ -548,7 +548,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
FinTech, Performance, DevOps, Software Libre
Charlas recientes:
@@ -580,7 +580,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Inteligencia Artificial, Machine Learning, Embeddings, Google Developer Expert
Charlas recientes:
@@ -612,7 +612,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Core Python, Optimización, Concurrencia, GIL
Charlas recientes:
@@ -644,7 +644,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Ingeniería de Software, Algoritmos, Resolución de Problemas
Charlas recientes:
@@ -676,7 +676,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Extensiones LibreOffice, Automatización de Oficina
Charlas recientes:
@@ -708,7 +708,7 @@ Conoce a algunos de los ponentes que han compartido su conocimiento con nuestra
Seguridad Informática, PCI DSS, Cumplimiento Normativo
Charlas recientes:
@@ -725,7 +725,7 @@ Si te interesa compartir tu conocimiento con la comunidad Python CDMX, ¡no dude
Enviar Propuesta de Charla
-
+
Más Información
diff --git a/docs/comunidad/sedes_faq.md b/docs/comunidad/sedes_faq.md
index 06e1621..2fc5796 100644
--- a/docs/comunidad/sedes_faq.md
+++ b/docs/comunidad/sedes_faq.md
@@ -106,7 +106,7 @@ Lo coordinamos con gusto durante la planeación.
**¡Sí!** Solo pedimos que sigan el mismo proceso que cualquier miembro de la comunidad:
-[Ser Ponente](/comunidad/ponentes/#por-que-ser-ponente)
+[Ser Ponente](ponentes.md#por-que-ser-ponente)
**Registrar su propuesta** en [python-cdmx-charlas/issues](https://github.com/PythonMexico/python-cdmx-charlas/issues)
para mantener el espíritu abierto y curado del contenido.
diff --git a/docs/comunidad/voluntarios.md b/docs/comunidad/voluntarios.md
index e7d4035..d786d0f 100644
--- a/docs/comunidad/voluntarios.md
+++ b/docs/comunidad/voluntarios.md
@@ -84,7 +84,7 @@ Ser voluntario en Python CDMX te permite:
Ver Voluntarios
- Más Información
+ Más Información
diff --git a/docs/index.md b/docs/index.md
index a530b74..23b5fca 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -5,8 +5,8 @@
#PythonCDMX es un grupo de personas interesadas en aprender y compartir su conocimiento sobre el lenguaje de programación Python. El objetivo es estar en contacto con más gente interesada en innovación y tecnología.
@@ -18,14 +18,14 @@
¡Únete a Nuestros Meetups!
Charlas técnicas, networking y aprendizaje colaborativo
-
Ver Meetups
+
Ver Meetups
---
@@ -36,17 +36,17 @@
Ser Ponente
Comparte tu conocimiento con la comunidad. Charlas técnicas, casos de uso, mejores prácticas y más.
-
Conoce Más
+
Conoce Más
Ser Voluntario
Ayuda a organizar eventos, gestionar redes sociales, o contribuir con el desarrollo del sitio web.
-
Únete
+
Únete
Asistir
Participa en nuestros meetups, aprende de expertos y conecta con otros desarrolladores Python.
-
Ver Eventos
+
Ver Eventos
diff --git a/docs/meetups/2023/index.md b/docs/meetups/2023/index.md
index 105d1b4..1aa5b85 100644
--- a/docs/meetups/2023/index.md
+++ b/docs/meetups/2023/index.md
@@ -12,11 +12,11 @@
| **Fecha** | **Charla** | **Ponente** | **Lugar** | **Detalles** |
|:---|:---|:---|:---|:---|
-| **14 Noviembre 2023** | GitOps: Automatizando el despliegue de aplicaciones | Carlos Reyes | Wizeline México | [Ver detalles](202311-noviembre/) |
-| **14 Noviembre 2023** | Historia de Python: De Guido van Rossum a la actualidad | Gustavo Vera | Wizeline México | [Ver detalles](202311-noviembre/) |
-| **10 Octubre 2023** | Jupyter a Web: De notebooks a aplicaciones web | Gustavo Vera | Wizeline México | [Ver detalles](202310-octubre/) |
-| **12 Septiembre 2023** | Metaprogramación en Python | David Sol | Wizeline México | [Ver detalles](202309-septiembre/) |
-| **12 Septiembre 2023** | AWS AI: Servicios de IA en la nube | Gustavo Vera | Wizeline México | [Ver detalles](202309-septiembre/) |
+| **14 Noviembre 2023** | GitOps: Automatizando el despliegue de aplicaciones | Carlos Reyes | Wizeline México | [Ver detalles](202311-noviembre.md) |
+| **14 Noviembre 2023** | Historia de Python: De Guido van Rossum a la actualidad | Gustavo Vera | Wizeline México | [Ver detalles](202311-noviembre.md) |
+| **10 Octubre 2023** | Jupyter a Web: De notebooks a aplicaciones web | Gustavo Vera | Wizeline México | [Ver detalles](202310-octubre.md) |
+| **12 Septiembre 2023** | Metaprogramación en Python | David Sol | Wizeline México | [Ver detalles](202309-septiembre.md) |
+| **12 Septiembre 2023** | AWS AI: Servicios de IA en la nube | Gustavo Vera | Wizeline México | [Ver detalles](202309-septiembre.md) |
---
@@ -56,4 +56,4 @@
---
-¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](/comunidad/como-contribuir/).
+¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](../../comunidad/como-contribuir.md).
diff --git a/docs/meetups/2024/index.md b/docs/meetups/2024/index.md
index 388afd1..666e809 100644
--- a/docs/meetups/2024/index.md
+++ b/docs/meetups/2024/index.md
@@ -12,21 +12,21 @@
| **Fecha** | **Charla** | **Ponente** | **Lugar** | **Detalles** |
|:---|:---|:---|:---|:---|
-| **12 Noviembre 2024** | Mejora tu código: Evita anti-patrones en Python | Alejandro Lopez | Wizeline México | [Ver detalles](202411-noviembre/) |
-| **12 Noviembre 2024** | Exactamente qué y (sobre todo) por qué ChatGPT | Hugo Ramírez | Wizeline México | [Ver detalles](202411-noviembre/) |
-| **08 Octubre 2024** | Contribuir a Open Source | Alex Callejas | Wizeline México | [Ver detalles](202410-octubre/) |
-| **10 Septiembre 2024** | Protocolos en Python | Diego Barriga | Wizeline México | [Ver detalles](202409-septiembre/) |
-| **10 Septiembre 2024** | Guía Open Source | David Sol | Wizeline México | [Ver detalles](202409-septiembre/) |
-| **13 Agosto 2024** | ETLs con Python | Gustavo Vera | Wizeline México | [Ver detalles](202408-agosto/) |
-| **13 Agosto 2024** | GIL: Global Interpreter Lock | Fer Perales | Wizeline México | [Ver detalles](202408-agosto/) |
-| **09 Julio 2024** | Regresión Lineal | Konstantin Spirin | Wizeline México | [Ver detalles](202407-julio/) |
-| **09 Julio 2024** | Fonética con Python | Hugo Ramirez | Wizeline México | [Ver detalles](202407-julio/) |
-| **11 Junio 2024** | Regresión Lineal | Geovanni Zepeda Martínez | Wizeline México | [Ver detalles](202406-junio/) |
-| **14 Mayo 2024** | Pydantic | Charly Román | Wizeline México | [Ver detalles](202405-mayo/) |
-| **09 Abril 2024** | Contenedores | David Sol | Wizeline México | [Ver detalles](202404-abril/) |
-| **12 Marzo 2024** | Flask APIs | Alejandro López | Wizeline México | [Ver detalles](202403-marzo/) |
-| **13 Febrero 2024** | Entornos Virtuales | Gustavo Vera | Wizeline México | [Ver detalles](202402-febrero/) |
-| **09 Enero 2024** | PyPI | David Sol | Wizeline México | [Ver detalles](202401-enero/) |
+| **12 Noviembre 2024** | Mejora tu código: Evita anti-patrones en Python | Alejandro Lopez | Wizeline México | [Ver detalles](202411-noviembre.md) |
+| **12 Noviembre 2024** | Exactamente qué y (sobre todo) por qué ChatGPT | Hugo Ramírez | Wizeline México | [Ver detalles](202411-noviembre.md) |
+| **08 Octubre 2024** | Contribuir a Open Source | Alex Callejas | Wizeline México | [Ver detalles](202410-octubre.md) |
+| **10 Septiembre 2024** | Protocolos en Python | Diego Barriga | Wizeline México | [Ver detalles](202409-septiembre.md) |
+| **10 Septiembre 2024** | Guía Open Source | David Sol | Wizeline México | [Ver detalles](202409-septiembre.md) |
+| **13 Agosto 2024** | ETLs con Python | Gustavo Vera | Wizeline México | [Ver detalles](202408-agosto.md) |
+| **13 Agosto 2024** | GIL: Global Interpreter Lock | Fer Perales | Wizeline México | [Ver detalles](202408-agosto.md) |
+| **09 Julio 2024** | Regresión Lineal | Konstantin Spirin | Wizeline México | [Ver detalles](202407-julio.md) |
+| **09 Julio 2024** | Fonética con Python | Hugo Ramirez | Wizeline México | [Ver detalles](202407-julio.md) |
+| **11 Junio 2024** | Regresión Lineal | Geovanni Zepeda Martínez | Wizeline México | [Ver detalles](202406-junio.md) |
+| **14 Mayo 2024** | Pydantic | Charly Román | Wizeline México | [Ver detalles](202405-mayo.md) |
+| **09 Abril 2024** | Contenedores | David Sol | Wizeline México | [Ver detalles](202404-abril.md) |
+| **12 Marzo 2024** | Flask APIs | Alejandro López | Wizeline México | [Ver detalles](202403-marzo.md) |
+| **13 Febrero 2024** | Entornos Virtuales | Gustavo Vera | Wizeline México | [Ver detalles](202402-febrero.md) |
+| **09 Enero 2024** | PyPI | David Sol | Wizeline México | [Ver detalles](202401-enero.md) |
---
@@ -66,4 +66,4 @@
---
-¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](/comunidad/como-contribuir/).
+¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](../../comunidad/como-contribuir.md).
diff --git a/docs/meetups/2025/index.md b/docs/meetups/2025/index.md
index 43d2e6a..b923d64 100644
--- a/docs/meetups/2025/index.md
+++ b/docs/meetups/2025/index.md
@@ -12,19 +12,19 @@
| **Fecha** | **Charla** | **Ponente** | **Lugar** | **Detalles** |
|:---|:---|:---|:---|:---|
-| **12 Agosto 2025** | Cómo preparar una ambiente de desarrollo con Python desde zero | Juan Guillermo Gómez | Jardin Chapultepec | [Ver detalles](202508-agosto/) |
-| **08 Julio 2025** | Cómo preparar una ambiente de desarrollo con Python desde zero | David Sol | Clara | [Ver detalles](202507-julio/) |
-| **10 Junio 2025** | Usando Python y software libre para crear nuevas herramientas: Traductor de voz español-inglés | Carlos Cesar Caballero | Wizeline México | [Ver detalles](202506-junio/) |
-| **13 Mayo 2025** | Construyendo un paquete en Python y publicándolo en PyPI | Javier Novoa | Wizeline México | [Ver detalles](202505-mayo/) |
-| **25 Abril 2025** | portafolio.py: Como hacer un portafolio web sin saber diseño web | Daniel Paredes | UNAM Facultad de Ciencias | [Ver detalles](202504-unam/) |
-| **25 Abril 2025** | Programar en tiempos del Vibe-Coding | Charly Roman | UNAM Facultad de Ciencias | [Ver detalles](202504-unam/) |
-| **08 Abril 2025** | El para que cosa de Quien. Kubernetes y AI | Carlos Reyes | Wizeline México | [Ver detalles](202504-abril/) |
-| **11 Marzo 2025** | Mi Primer Agente de Inteligencia Artificial con Python | Erik Rivera | Wizeline México | [Ver detalles](202503-marzo/) |
-| **11 Maro 2025** | Interfases gráficas con Pyside6 | David Sol | Wizeline México | [Ver detalles](202503-marzo/) |
-| **11 Febrero 2025** | Lecciones del Advent of Code 2024 | Manuel Rábade | Wizeline México | [Ver detalles](202502-febrero/) |
-| **11 Febrero 2025** | Embeddings: El lenguaje como las máquinas entienden el lenguaje humano | Juan Guillermo Gómez | Wizeline México | [Ver detalles](202502-febrero/) |
-| **14 Enero 2025** | Crea extensiones para LibreOffice con Python | elMau (Mauricio B.) | Wizeline México | [Ver detalles](202501-enero/) |
-| **14 Enero 2025** | Seguridad y cumplimiento de Python: Garantizar el cumplimiento de PCI DSS | Mauro Parra | Wizeline México | [Ver detalles](202501-enero/) |
+| **12 Agosto 2025** | Cómo preparar una ambiente de desarrollo con Python desde zero | Juan Guillermo Gómez | Jardin Chapultepec | [Ver detalles](202508-agosto.md) |
+| **08 Julio 2025** | Cómo preparar una ambiente de desarrollo con Python desde zero | David Sol | Clara | [Ver detalles](202507-julio.md) |
+| **10 Junio 2025** | Usando Python y software libre para crear nuevas herramientas: Traductor de voz español-inglés | Carlos Cesar Caballero | Wizeline México | [Ver detalles](202506-junio.md) |
+| **13 Mayo 2025** | Construyendo un paquete en Python y publicándolo en PyPI | Javier Novoa | Wizeline México | [Ver detalles](202505-mayo.md) |
+| **25 Abril 2025** | portafolio.py: Como hacer un portafolio web sin saber diseño web | Daniel Paredes | UNAM Facultad de Ciencias | [Ver detalles](202504-unam.md) |
+| **25 Abril 2025** | Programar en tiempos del Vibe-Coding | Charly Roman | UNAM Facultad de Ciencias | [Ver detalles](202504-unam.md) |
+| **08 Abril 2025** | El para que cosa de Quien. Kubernetes y AI | Carlos Reyes | Wizeline México | [Ver detalles](202504-abril.md) |
+| **11 Marzo 2025** | Mi Primer Agente de Inteligencia Artificial con Python | Erik Rivera | Wizeline México | [Ver detalles](202503-marzo.md) |
+| **11 Maro 2025** | Interfases gráficas con Pyside6 | David Sol | Wizeline México | [Ver detalles](202503-marzo.md) |
+| **11 Febrero 2025** | Lecciones del Advent of Code 2024 | Manuel Rábade | Wizeline México | [Ver detalles](202502-febrero.md) |
+| **11 Febrero 2025** | Embeddings: El lenguaje como las máquinas entienden el lenguaje humano | Juan Guillermo Gómez | Wizeline México | [Ver detalles](202502-febrero.md) |
+| **14 Enero 2025** | Crea extensiones para LibreOffice con Python | elMau (Mauricio B.) | Wizeline México | [Ver detalles](202501-enero.md) |
+| **14 Enero 2025** | Seguridad y cumplimiento de Python: Garantizar el cumplimiento de PCI DSS | Mauro Parra | Wizeline México | [Ver detalles](202501-enero.md) |
---
@@ -65,4 +65,4 @@
---
-¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](/comunidad/como-contribuir/).
+¿Te gustaría aparecer aquí? Conoce a nuestros [ponentes y voluntarios reconocidos](../../comunidad/como-contribuir.md).
diff --git a/mkdocs.yml b/mkdocs.yml
index 7feacf5..a5273bb 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -64,28 +64,6 @@ theme:
icon:
repo: fontawesome/brands/github
-# Navigation
-nav:
- - Inicio: index.md
- - Meetups:
- - General: meetups/index.md
- - 2025: meetups/2025/index.md
- - 2024: meetups/2024/index.md
- - 2023: meetups/2023/index.md
- - Participa:
- - Cómo Contribuir: comunidad/como-contribuir.md
- - Voluntarios: comunidad/voluntarios.md
- - Ponentes: comunidad/ponentes.md
- - Sedes: comunidad/sedes.md
- - Comunidad:
- - Comunidades: comunidad/comunidades.md
- - Código de Conducta: codigo-de-conducta.md
- - Aviso de Privacidad: aviso-de-privacidad.md
- - Blog:
- - Inicio: blog/index.md
- - PyCon Latam 2025: blog/PyconLatam2025.md
- - Acerca de: about.md
-
# Plugins
plugins:
- search:
@@ -101,10 +79,7 @@ plugins:
minify_js: true
htmlmin_opts:
remove_comments: true
- - awesome-pages:
- filename: .pages
- collapse_single_pages: false
- strict: false
+ - awesome-nav
# Social links
extra:
diff --git a/requirements.txt b/requirements.txt
index 7bfb1d6..754bafb 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,6 +2,7 @@ mkdocs>=1.5.0
mkdocs-material>=9.5.0
mkdocs-git-revision-date-localized-plugin>=1.2.0
mkdocs-minify-plugin>=0.7.0
-mkdocs-awesome-pages-plugin>=2.10.1
+mkdocs-awesome-nav>=3.0.0
pymdown-extensions>=10.0.0
Jinja2>=3.0
+requests>=2.25.0
diff --git a/scripts/check_links.py b/scripts/check_links.py
index e74ae22..07787c7 100644
--- a/scripts/check_links.py
+++ b/scripts/check_links.py
@@ -12,88 +12,79 @@
import requests
-def find_internal_links(content):
- """Find all internal links in markdown and HTML content."""
- links = []
+def is_external_link(url):
+ """Check if a URL is external (http, https, mailto, tel)."""
+ return url.startswith(("http://", "https://", "mailto:", "tel:"))
- # Markdown link pattern: [text](url)
- md_pattern = r"\[([^\]]+)\]\(([^)]+)\)"
- # HTML link pattern: text or text
- html_pattern = r']*>([^<]+)'
+def convert_md_to_html(url):
+ """Convert .md URLs to .html URLs."""
+ return url.replace(".md", ".html") if ".md" in url else url
- # Find markdown links
- for match in re.finditer(md_pattern, content):
- text = match.group(1)
- url = match.group(2)
- # Skip external links
- if url.startswith(("http://", "https://", "mailto:", "tel:")):
- continue
+def find_internal_links(content):
+ """Find all internal links in markdown and HTML content."""
+ links = []
- links.append((text, url, "markdown", match.start()))
+ # Common patterns for both markdown and HTML links
+ patterns = [
+ (r"\[([^\]]+)\]\(([^)]+)\)", "markdown"), # [text](url)
+ (r']*>([^<]+)', "html"),
+ ]
- # Find HTML links
- for match in re.finditer(html_pattern, content):
- url = match.group(1)
- text = match.group(2).strip()
+ for pattern, link_type in patterns:
+ for match in re.finditer(pattern, content):
+ if link_type == "markdown":
+ text, url = match.group(1), match.group(2)
+ else: # html
+ url, text = match.group(1), match.group(2).strip()
- # Skip external links
- if url.startswith(("http://", "https://", "mailto:", "tel:")):
- continue
+ # Skip external links
+ if is_external_link(url):
+ continue
- links.append((text, url, "html", match.start()))
+ links.append((text, url, link_type, match.start()))
return links
-def resolve_link_url(base_url, md_file, link_url):
- """Resolve the real URL as a browser would from the markdown file location."""
- # If link is absolute (starts with /), join with base_url
+def resolve_relative_url(base_url, current_file, link_url):
+ """Resolve a relative URL from the current file's directory."""
if link_url.startswith("/"):
return urljoin(base_url, link_url)
- # If link is relative, join with the file's directory path
+
+ # Get current file's directory
+ current_dir = str(Path(current_file).parent)
+ if current_dir != ".":
+ resolved_path = str(Path(current_dir) / link_url)
else:
- # Get the directory of the markdown file relative to docs/
- md_dir = Path(md_file).parent
- # Build the relative path as it would be in the site
- rel_path = (md_dir / link_url).as_posix()
- # Remove any leading './' for clean URLs
- if rel_path.startswith("./"):
- rel_path = rel_path[2:]
- return urljoin(base_url + "/", rel_path)
+ resolved_path = link_url
+
+ # Ensure path starts with /
+ if not resolved_path.startswith("/"):
+ resolved_path = "/" + resolved_path
+
+ return urljoin(base_url, resolved_path)
+
+
+def build_full_url(base_url, link_url, current_file):
+ """Build the full URL for checking or display."""
+ if link_url.startswith("#"):
+ # Anchor link - resolve from current page
+ file_path = current_file.replace(".md", ".html")
+ if not file_path.startswith("/"):
+ file_path = "/" + file_path
+ return urljoin(base_url, file_path + link_url)
+ else:
+ # Regular link - convert .md to .html and resolve
+ converted_url = convert_md_to_html(link_url)
+ return resolve_relative_url(base_url, current_file, converted_url)
def check_link(base_url, link_url, current_file):
"""Check if a link returns 200 or 404."""
try:
- # Handle anchor links - they should resolve from current page
- if link_url.startswith("#"):
- # Build URL from current file path
- file_path = current_file.replace(".md", "/")
- if not file_path.startswith("/"):
- file_path = "/" + file_path
- full_url = urljoin(base_url, file_path + link_url)
- else:
- # For relative links, resolve from current file's directory
- if not link_url.startswith("/"):
- # Get current file's directory
- current_dir = str(Path(current_file).parent)
- if current_dir != ".":
- # Resolve relative to current directory
- resolved_path = str(Path(current_dir) / link_url)
- else:
- resolved_path = link_url
-
- # Convert to URL format
- if not resolved_path.startswith("/"):
- resolved_path = "/" + resolved_path
- full_url = urljoin(base_url, resolved_path)
- else:
- # Absolute path from site root
- full_url = urljoin(base_url, link_url)
-
- # Make request
+ full_url = build_full_url(base_url, link_url, current_file)
response = requests.get(full_url, timeout=5)
if response.status_code == 200:
@@ -107,7 +98,62 @@ def check_link(base_url, link_url, current_file):
return False, f"Error: {e}"
+def create_link_result(
+ md_file, docs_dir, text, url, link_type, line_start, content, status
+):
+ """Create a standardized link result dictionary."""
+ current_file = str(md_file.relative_to(docs_dir))
+ full_url = build_full_url("http://127.0.0.1:8000", url, current_file)
+
+ return {
+ "file": current_file,
+ "text": text,
+ "url": url,
+ "full_url": full_url,
+ "status": status,
+ "line": content[:line_start].count("\n") + 1,
+ "link_type": link_type,
+ }
+
+
+def print_broken_links(broken_links):
+ """Print broken links to console."""
+ if not broken_links:
+ return
+
+ print("\n🔴 BROKEN LINKS (showing first 10):")
+ print("-" * 50)
+ for link in broken_links[:10]:
+ print("📄 {}:{}".format(link["file"], link["line"]))
+ print(f" Text: {link['text']}")
+ print(f" URL: {link['url']}")
+ print(f" Full URL: {link['full_url']}")
+ print(f" Status: {link['status']}")
+ print()
+
+
+def save_results(broken_links, working_links, docs_dir, base_url):
+ """Save results to JSON file."""
+ results = {
+ "summary": {
+ "total_files_scanned": len(list(docs_dir.rglob("*.md"))),
+ "working_links": len(working_links),
+ "broken_links": len(broken_links),
+ "base_url": base_url,
+ },
+ "broken_links": broken_links,
+ "working_links": working_links,
+ }
+
+ output_file = "broken_links.json"
+ with open(output_file, "w", encoding="utf-8") as f:
+ json.dump(results, f, indent=2, ensure_ascii=False)
+
+ print(f"\n📄 Results saved to: {output_file}")
+
+
def main():
+ """Main function to check all internal links."""
base_url = "http://127.0.0.1:8000"
docs_dir = Path("docs")
@@ -130,69 +176,26 @@ def main():
base_url, url, str(md_file.relative_to(docs_dir))
)
- # Calculate full URL for display
- if not url.startswith("#"):
- full_url = urljoin(base_url, url)
- else:
- full_url = urljoin(
- base_url,
- str(md_file.relative_to(docs_dir)).replace(".md", "/") + url,
- )
-
- result = {
- "file": str(md_file.relative_to(docs_dir)),
- "text": text,
- "url": url,
- "full_url": full_url,
- "status": status,
- "line": content[:line_start].count("\n") + 1,
- "link_type": link_type,
- }
+ result = create_link_result(
+ md_file, docs_dir, text, url, link_type, line_start, content, status
+ )
if is_working:
working_links.append(result)
else:
broken_links.append(result)
- except Exception as e:
+ except (IOError, OSError) as e:
print(f"❌ Error reading {md_file}: {e}")
# Print summary
print(f"✅ Working links: {len(working_links)}")
print(f"❌ Broken links: {len(broken_links)}")
- # Save results to JSON
- results = {
- "summary": {
- "total_files_scanned": len(list(docs_dir.rglob("*.md"))),
- "working_links": len(working_links),
- "broken_links": len(broken_links),
- "base_url": base_url,
- },
- "broken_links": broken_links,
- "working_links": working_links,
- }
-
- # Save to JSON file
- output_file = "broken_links.json"
- with open(output_file, "w", encoding="utf-8") as f:
- json.dump(results, f, indent=2, ensure_ascii=False)
-
- print(f"\n📄 Results saved to: {output_file}")
+ # Save results and print broken links
+ save_results(broken_links, working_links, docs_dir, base_url)
+ print_broken_links(broken_links)
- # Show some broken links in console
- if broken_links:
- print(f"\n🔴 BROKEN LINKS (showing first 10):")
- print("-" * 50)
- for link in broken_links[:10]:
- print(f"📄 {link['file']}:{link['line']}")
- print(f" Text: {link['text']}")
- print(f" URL: {link['url']}")
- print(f" Full URL: {link['full_url']}")
- print(f" Status: {link['status']}")
- print()
-
- # Return number of broken links
return len(broken_links)