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.

- Explorar charlas - Participa + Explorar charlas + Participa
@@ -18,14 +18,14 @@

Conoce a quienes hacen posible
Python CDMX!

- Voluntarios - Ponentes + Voluntarios + Ponentes

¡Ú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)