docs: publicar el documento de alcance como pagina web privada en /doc/alcance-2f9k7d/

- scripts/generar-web-documento.py arma la pagina (barra con logotipo, boton de
  descarga del PDF, hoja centrada, tablas con scroll en pantallas chicas, modo
  oscuro automatico y estilos de impresion) y reutiliza el generador de PDF.
- La pagina se sirve con un prefijo privado en NGINX: no se enlaza desde ninguna
  app, lleva X-Robots-Tag y meta noindex, y la cache se desactiva para que los
  cambios se vean al momento.
- Se sincroniza deploy/nginx-host.conf con lo que estaba instalado en el host
  (faltaba el cache de assets immutable) y se agrega la ruta privada.
- El logotipo se reduce a tamano de pantalla: venia de un JPEG de 959 px y era el
  90% del peso del PDF (495 KB -> 240 KB), sin cambiar el diseno.
This commit is contained in:
2026-09-21 19:16:48 +00:00
parent 31abeec362
commit e8d1c57ad5
7 changed files with 1631 additions and 4 deletions

View File

@@ -38,14 +38,22 @@ COLOR_FONDO_LOGO = (247, 247, 247)
TOLERANCIA_FONDO = 8
DIMENSION_LOGO = (480, 360)
def logo_con_transparencia() -> pathlib.Path:
"""El logo del repo trae fondo gris; se aplana a alfa 0 desde los bordes.
Se rellena solo desde el exterior para no borrar los grises interiores del
arte (contrafuertes de letras). Sin transparencia, la portada blanca dibuja
un rectángulo gris alrededor del logotipo.
La salida se reduce a `DIMENSION_LOGO`: el original de 959 px pesa 440 KB
(viene de un JPEG, con ruido que el PNG no comprime) y se dibuja a 24 mm, así
que sobra resolución. El nombre del archivo incluye el tamaño para no reusar
una versión vieja con otras medidas.
"""
destino = pathlib.Path(tempfile.gettempdir()) / 'frasa-logo-transparente.png'
destino = pathlib.Path(tempfile.gettempdir()) / f'frasa-logo-transparente-{DIMENSION_LOGO[0]}x{DIMENSION_LOGO[1]}.png'
if destino.exists():
return destino
@@ -83,7 +91,8 @@ def logo_con_transparencia() -> pathlib.Path:
if y < alto - 1:
cola.append((x, y + 1))
imagen.save(destino)
imagen.thumbnail(DIMENSION_LOGO)
imagen.save(destino, optimize=True)
return destino