#!/usr/bin/env python3 """ scripts/verifica-vazamentos.py Verificação permanente de ausência de vazamento de português em rotas inglesas (en). Analisa tanto o texto visível da página quanto todos os blocos ", raw, re.DOTALL) for i, s in enumerate(scripts): try: data = json.loads(s) issues = check_jsonld(data, f"script[{i}]", pt_regex, False) for p, v in issues: print(f" ✖ JSON-LD vazamento em {u} -> {p}: \"{v}\"") falhas += 1 except Exception as e: print(f" ✖ Erro no parse de JSON-LD em {u}: {e}") falhas += 1 # 2. Verifica texto visível clean = re.sub(r"<(script|style)[\s\S]*?", "", raw) clean = html.unescape(re.sub(r"<[^>]+>", "\n", clean)) hits = [l.strip() for l in clean.split("\n") if l.strip() and pt_regex.search(l)] for h in hits: print(f" ✖ Texto visível vazamento em {u}: \"{h[:120]}\"") falhas += 1 # Varredura das rotas em espanhol fixas_es = [ "/es", "/es/series", "/es/comparacion", "/es/diagnostico", "/es/selector", "/es/frameworks", "/es/componentes", "/es/glosario", "/es/catalogo", "/es/acerca" ] urls_es = fixas_es + [f"/es/series/{s}" for s in series] + [f"/es/frameworks/{f}" for f in frameworks] print(f"\nESPDocs · Varredura de i18n nas 36 rotas em espanhol ({base})") for u in urls_es: try: req = urllib.request.Request(base + u, headers={"User-Agent": "ESPDocs-SmokeTest/1.0"}) raw = urllib.request.urlopen(req, timeout=10).read().decode("utf-8") except Exception as e: print(f" ✖ ERRO ao acessar {u}: {e}") falhas += 1 continue # 1. Verifica blocos ld+json scripts = re.findall(r"]*type=[\"']application/ld\+json[\"'][^>]*>(.*?)", raw, re.DOTALL) for i, s in enumerate(scripts): try: data = json.loads(s) issues = check_jsonld(data, f"script[{i}]", pt_in_es_regex, True) for p, v in issues: print(f" ✖ JSON-LD vazamento em {u} -> {p}: \"{v}\"") falhas += 1 except Exception as e: print(f" ✖ Erro no parse de JSON-LD em {u}: {e}") falhas += 1 # 2. Verifica texto visível clean = re.sub(r"<(script|style)[\s\S]*?", "", raw) clean = html.unescape(re.sub(r"<[^>]+>", "\n", clean)) hits = [l.strip() for l in clean.split("\n") if l.strip() and pt_in_es_regex.search(l)] for h in hits: print(f" ✖ Texto visível vazamento em {u}: \"{h[:120]}\"") falhas += 1 # Varredura das rotas em francês pt_in_fr_regex = re.compile( r"\b(não|você|para o|para a|com o|com a|são|também|então|pinagem|livro|" r"ção|ções|muito|já|estão|é um|é uma|pelo|pela|especificações|especificação|início|artigo|seletor)\b", re.I ) fixas_fr = [ "/fr", "/fr/series", "/fr/comparaison", "/fr/diagnostic", "/fr/selecteur", "/fr/frameworks", "/fr/composants", "/fr/glossaire", "/fr/catalogue", "/fr/a-propos" ] urls_fr = fixas_fr + [f"/fr/series/{s}" for s in series] + [f"/fr/frameworks/{f}" for f in frameworks] print(f"\nESPDocs · Varredura de i18n nas {len(urls_fr)} rotas em francês ({base})") for u in urls_fr: try: req = urllib.request.Request(base + u, headers={"User-Agent": "ESPDocs-SmokeTest/1.0"}) raw = urllib.request.urlopen(req, timeout=10).read().decode("utf-8") except Exception as e: print(f" ✖ ERRO ao acessar {u}: {e}") falhas += 1 continue # 1. Verifica blocos ld+json scripts = re.findall(r"]*type=[\"']application/ld\+json[\"'][^>]*>(.*?)", raw, re.DOTALL) for i, s in enumerate(scripts): try: data = json.loads(s) issues = check_jsonld(data, f"script[{i}]", pt_in_fr_regex, True) for p, v in issues: print(f" ✖ JSON-LD vazamento em {u} -> {p}: \"{v}\"") falhas += 1 except Exception as e: print(f" ✖ Erro no parse de JSON-LD em {u}: {e}") falhas += 1 # 2. Verifica texto visível clean = re.sub(r"<(script|style)[\s\S]*?", "", raw) clean = html.unescape(re.sub(r"<[^>]+>", "\n", clean)) hits = [l.strip() for l in clean.split("\n") if l.strip() and pt_in_fr_regex.search(l)] for h in hits: print(f" ✖ Texto visível vazamento em {u}: \"{h[:120]}\"") falhas += 1 # Varredura das rotas em alemão pt_in_de_regex = re.compile( r"\b(não|você|para o|para a|com o|com a|são|também|então|pinagem|série|séries|livro|" r"ção|ções|muito|já|estão|é um|é uma|pelo|pela|especificações|especificação|início|artigo|sobre|seletor)\b", re.I ) fixas_de = [ "/de", "/de/serien", "/de/vergleich", "/de/diagnose", "/de/auswahl", "/de/frameworks", "/de/komponenten", "/de/glossar", "/de/katalog", "/de/ueber-uns" ] urls_de = fixas_de + [f"/de/serien/{s}" for s in series] + [f"/de/frameworks/{f}" for f in frameworks] print(f"\nESPDocs · Varredura de i18n nas {len(urls_de)} rotas em alemão ({base})") for u in urls_de: try: req = urllib.request.Request(base + u, headers={"User-Agent": "ESPDocs-SmokeTest/1.0"}) raw = urllib.request.urlopen(req, timeout=10).read().decode("utf-8") except Exception as e: print(f" ✖ ERRO ao acessar {u}: {e}") falhas += 1 continue # 1. Verifica blocos ld+json scripts = re.findall(r"]*type=[\"']application/ld\+json[\"'][^>]*>(.*?)", raw, re.DOTALL) for i, s in enumerate(scripts): try: data = json.loads(s) issues = check_jsonld(data, f"script[{i}]", pt_in_de_regex, True) for p, v in issues: print(f" ✖ JSON-LD vazamento em {u} -> {p}: \"{v}\"") falhas += 1 except Exception as e: print(f" ✖ Erro no parse de JSON-LD em {u}: {e}") falhas += 1 # 2. Verifica texto visível clean = re.sub(r"<(script|style)[\s\S]*?", "", raw) clean = html.unescape(re.sub(r"<[^>]+>", "\n", clean)) hits = [l.strip() for l in clean.split("\n") if l.strip() and pt_in_de_regex.search(l)] for h in hits: print(f" ✖ Texto visível vazamento em {u}: \"{h[:120]}\"") falhas += 1 if falhas == 0: print(f" ✔ Todas as {len(urls)} rotas en, {len(urls_es)} rotas es, {len(urls_fr)} rotas fr e {len(urls_de)} rotas de verificadas com ZERO vazamentos (texto e JSON-LD).") sys.exit(0) else: print(f" ✖ Total de falhas detectadas: {falhas}") sys.exit(1)