#!/usr/bin/env python3 """Quita el tag de Google Analytics clasico (UA-32008163-1) del mirror servible. UA dejo de procesar datos en julio de 2023: el snippet solo sirve para pedir un ga.js muerto en cada carga. Se quita el bloque que contiene el UA. El (?:(?!).)*? impide # que el .*? se coma varios bloques seguidos y se lleve por delante el GA4. BLOQUE = re.compile( r"[ \t]*]*>(?:(?!).)*?" + re.escape(UA) + r"(?:(?!).)*?\s*", re.S) tocados = errores = 0 sin_ga4 = [] bytes_antes = bytes_despues = 0 for raiz, _, ficheros in os.walk(SITE): for f in ficheros: if not f.lower().endswith((".html", ".htm")) and "." in f: continue ruta = os.path.join(raiz, f) try: txt = open(ruta, encoding="utf-8", errors="surrogateescape").read() except (OSError, UnicodeDecodeError): continue if UA not in txt: continue tenia_ga4 = GA4 in txt nuevo, n = BLOQUE.subn("\n", txt) if UA in nuevo: # El bloque no casó: no dejar el fichero a medias, mejor avisar. errores += 1 continue if tenia_ga4 and GA4 not in nuevo: sin_ga4.append(ruta) continue bytes_antes += len(txt) bytes_despues += len(nuevo) tocados += 1 if not DRY: with open(ruta, "w", encoding="utf-8", errors="surrogateescape") as fh: fh.write(nuevo) print(f"ficheros modificados : {tocados}") print(f"no casó el patron : {errores}") print(f"habrian perdido GA4 : {len(sin_ga4)}") for r in sin_ga4[:5]: print(" ", r) if tocados: print(f"bytes : {bytes_antes:,} -> {bytes_despues:,} " f"({bytes_antes - bytes_despues:,} menos)") print("(DRY RUN, no se ha escrito nada)" if DRY else "escrito")