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:

  1. 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)

  1. Salve o arquivo como: Atividade_03_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_03_2_SeuNome
  2. 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

Contexto: Autolinks e Rastreamento de Issues / PRs / Commits aplicado ao domínio de GitHub Flavored Markdown (GFM).

Requisitos de Execução:

  1. Escrever conversor que substitua referências #123 por 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)

  1. Salve o arquivo como: Atividade_03_3_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_03_4_SeuNome
  2. 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))