🧩 Exercícios: GitHub Flavored Markdown (GFM)
Extra Guia De Markdown • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 03.1 — Task Lists e Marcadores de Tarefas GFM
Contexto: Task Lists e Marcadores de Tarefas GFM aplicado ao domínio de GitHub Flavored Markdown (GFM).
Requisitos de Execução:
- Criar função para contar e calcular o percentual de conclusão de Task Lists (
- [ ]e- [x]).
Resultado Esperado
Total de Tarefas: 4 | Concluídas: 3 | Progresso: 75.0%
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_1_SeuNome - Envie na tarefa:
Atividade Cap 03 - GitHub Flavored Markdown (GFM)
🔑 Gabarito de Código & Solução Comentada
# task_list_counter.py
import re
def calcular_progresso_tasks(texto):
pendentes = len(re.findall(r"-\s+\[\s\]", texto))
concluidas = len(re.findall(r"-\s+\[[xX]\]", texto))
total = pendentes + concluidas
pct = (concluidas / total) * 100 if total > 0 else 0
print(f"Total: {total} | Concluídas: {concluidas} | Progresso: {pct:.1f}%")
return pct
tasks = """
- [x] Configurar CI/CD
- [x] Escrever testes unitários
- [x] Documentar API
- [ ] Deploy em produção
"""
calcular_progresso_tasks(tasks)
🔍 Nível 2: Prática
Problema 03.2 — Parser de Alerts GFM (> [!NOTE], > [!WARNING])
Contexto: Parser de Alerts GFM (> [!NOTE], > [!WARNING]) aplicado ao domínio de GitHub Flavored Markdown (GFM).
Requisitos de Execução:
- Identificar blocos de alert GitHub (> [!NOTE], > [!TIP], > [!IMPORTANT], > [!WARNING], > [!CAUTION]) e renderizar caixas estilizadas.
Resultado Esperado
Alert NOTE detectado: 'Este é um aviso importante.'
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_2_SeuNome - Envie na tarefa:
Atividade Cap 03 - GitHub Flavored Markdown (GFM)
🔑 Gabarito de Código & Solução Comentada
# alert_parser_gfm.py
import re
def extrair_alerts_gfm(texto):
padrao = r">\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*
((?:>[^
]*
?)*)"
matches = re.findall(padrao, texto, re.I)
alerts = []
for tipo, conteudo in matches:
linhas = [re.sub(r"^>\s?", "", l) for l in conteudo.strip().splitlines()]
alerts.append({"tipo": tipo.upper(), "mensagem": "\n".join(linhas)})
return alerts
doc = """
> [!WARNING]
> Cuidado ao executar migrations em produção.
"""
print(extrair_alerts_gfm(doc))
⚡ Nível 3: Integração
Problema 03.3 — Autolinks e Rastreamento de Issues / PRs / Commits
Contexto: Autolinks e Rastreamento de Issues / PRs / Commits aplicado ao domínio de GitHub Flavored Markdown (GFM).
Requisitos de Execução:
- Escrever conversor que substitua referências
#123por links de issues e hashes de commit por links para o repositório.
Resultado Esperado
Texto: 'Fixes #42 via commit a1b2c3d' -> Links HTML correspondentes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_3_SeuNome - Envie na tarefa:
Atividade Cap 03 - GitHub Flavored Markdown (GFM)
🔑 Gabarito de Código & Solução Comentada
# autolink_gfm.py
import re
def aplicar_autolinks_github(texto, repo_url):
# Substituir #123 por link da issue
texto = re.sub(r"#(\d+)", rf'<a href="{repo_url}/issues/">#</a>', texto)
# Substituir SHA-1 de 7 dígitos
texto = re.sub(r"([a-f0-9]{7})", rf'<a href="{repo_url}/commit/"></a>', texto)
return texto
msg = "Corrigido no PR #104 pelo commit 9f8e7d6."
print(aplicar_autolinks_github(msg, "https://github.com/empresa/repo"))
🏆 Nível 4: Desafio Corporativo
Problema 03.4 — Linter Automatizado de Documentação Técnica GFM
Contexto: Linter Automatizado de Documentação Técnica GFM aplicado ao domínio de GitHub Flavored Markdown (GFM).
Requisitos de Execução:
- Desenvolver linter que valide regras: cabeçalho H1 único, ausência de links mortos relativos e alerts válidos.
Resultado Esperado
Linter GFM: 0 erros, 0 alertas [DOCUMENTO 100% CONFORME]
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_4_SeuNome - Envie na tarefa:
Atividade Cap 03 - GitHub Flavored Markdown (GFM)
🔑 Gabarito de Código & Solução Comentada
# linter_gfm.py
import re
def lint_gfm_doc(conteudo):
erros = []
h1s = re.findall(r"^#\s+", conteudo, re.M)
if len(h1s) != 1:
erros.append(f"Deve haver exatamente 1 H1 (encontrados {len(h1s)})")
if re.search(r"```\s*
", conteudo):
erros.append("Bloco de código sem linguagem declarada")
return {"valido": len(erros) == 0, "erros": erros}
doc_correto = "# Título Único\n\n```bash\necho 1\n```"
print(lint_gfm_doc(doc_correto))