Automatizando tarefas com Python
Este documento detalha o funcionamento, a arquitetura e a integração do script de automação scripts/generate_index.py, responsável por catalogar as publicações do site e gerar dinamicamente o índice principal em Markdown (content/_index.md).
1. Visão Geral
O site é gerado pelo Hugo com o tema Hextra. Em vez de manter manualmente a lista de publicações e artigos atualizados na página inicial, o projeto conta com um script em Python puro (sem dependências externas) que:
- Varre todo o diretório
content/em busca de arquivos Markdown. - Analisa o cabeçalho (Frontmatter) de cada arquivo.
- Filtra rascunhos, posts com datas futuras e páginas especiais.
- Agrupa os conteúdos cronologicamente por Ano e Mês (em português do Brasil).
- Gera automaticamente o arquivo
content/_index.mdcontendo os Cards de navegação e a listagem com links, datas e tags.
2. Como Executar
Pré-requisitos
- Python 3.8+ instalado.
- Nenhuma biblioteca de terceiros é necessária (utiliza apenas a biblioteca padrão:
os,re,datetime,collections).
Execução Local
Na raiz do repositório, execute:
python3 scripts/generate_index.pySaída Esperada no Terminal
Scanning content directory...
Found 4 published post(s)
Main index generated: /home/radiant/DevHub/joaopedro-chaves.github.io/content/_index.mdApós a execução, o arquivo content/_index.md estará atualizado e o servidor local do Hugo (dev.sh ou hugo server) refletirá as mudanças instantaneamente.
3. Fluxo de Execução e Arquitetura
O script segue um pipeline linear e modular dividido nas seguintes etapas:
graph TD
A[Início: scripts/generate_index.py] --> B[collect_posts: Varre pasta content/]
B --> C{Filtros de Publicação}
C -->|Rascunho draft=true| D[Ignora Post]
C -->|coming_soon=true| D
C -->|Data futura| D
C -->|Pasta/Arquivo de Sistema| D
C -->|Post Válido| E[Extrai Metadados: título, data, tags, URL]
E --> F[Ordena cronologicamente decrescente]
F --> G[generate_index: Agrupa por Ano/Mês em PT-BR]
G --> H[Insere Cards do Hextra + Links dos Posts]
H --> I[Grava content/_index.md]
3.1. Varredura e Coleta (collect_posts)
A função percorre recursivamente o diretório content/ via os.walk, aplicando regras de exclusão:
- Pastas ignoradas:
.git,public,themes,static,assets. - Arquivos ignorados:
_index.md(para evitar recursão) eabout.md.
3.2. Leitura do Frontmatter (parse_frontmatter)
O script lê os delimitadores --- do YAML usando expressões regulares (re), evitando a dependência de pacotes externos como pyyaml:
- Mapeia chaves simples como
title,date,draftecoming_soon. - Suporte a Tags: Trata tanto listas inline no formato
tags: ["tag1", "tag2"]quanto listas em bloco com marcadores- tag.
3.3. Tratamento de Datas (parse_date)
A função é resiliente a múltiplos formatos de data:
YYYY-MM-DDTHH:MM:SSZ(ISO com UTC)YYYY-MM-DDTHH:MM:SS-03:00(ISO com fuso horário / timezone offset)YYYY-MM-DD(data simples) Todas as datas são normalizadas para objetosdatetimecom fuso horário ciente (timezone-aware) para comparação segura com o horário atual.
3.4. Regras de Filtragem
O post só é incluído na página inicial se atender aos seguintes critérios:
draftnão étrue.coming_soonnão étrue.- A data da publicação não é futura em relação ao momento da execução.
3.5. Formatação do Markdown (generate_index)
- Gera o frontmatter da homepage com o timestamp da compilação:
--- date: "2026-09-03T22:39:58Z" draft: false cascade: type: --- - Insere os blocos de cartões interativos do Hextra:
- Agrupa as postagens por mês em português brasileiro (ex.:
Agosto 2026). - Constrói as entradas com o título vinculado à URL do Hugo, data formatada (
DD/MM/AAAA) e badges formatadas em código para as tags:- [Título do Post](/caminho/do/post/) _(26/08/2026)_ — `tag1`, `tag2`
4. Integração Contínua (CI/CD com GitHub Actions)
O script está integrado ao fluxo de publicação do GitHub Pages através do arquivo .github/workflows/pages.yaml.
A cada git push na branch main:
- O job
update-indexinicializa o ambiente com Python. - O comando
python scripts/generate_index.pyé executado. - Se houver alterações no
content/_index.md, a ação realiza automaticamente um commit com a mensagem:chore: auto-update index pages [skip ci] - Em seguida, o job de build do Hugo empacota o site com a lista 100% atualizada e faz o deploy no GitHub Pages.
5. Guia para Autores de Conteúdo
Ao criar um novo post ou documento em content/blog/, content/docs/ ou content/projects/, certifique-se de preencher o cabeçalho corretamente para que ele seja indexado automaticamente:
---
title: "Título do Seu Artigo"
description: "Breve resumo sobre o conteúdo."
date: "2026-08-27T14:22:32Z"
tags: ["python", "automacao", "hugo"]
draft: false
---Tip
Caso queira preparar um artigo antecipadamente sem que ele apareça na página inicial, defina draft: true ou configure a data para um momento futuro. Ele só entrará no índice quando o rascunho for desativado e a data atingida.