marca: el simbolo como arte de terminal, y la via al fetch de shuma
scripts/logo-ascii.py emite la tocapu 7x7 en color (ANSI 24-bit) y en monocromo. Se DERIVA del SVG en vez de dibujarse a mano: una copia aparte se desincroniza el dia que la marca cambie y nadie se entera. Para shuma: su fetch no lleva arte ASCII a proposito —su propio doc explica que los *fetch clasicos empaquetan el ASCII de trescientas distros y que eso envejece— pero expone SHUMA_FETCH_LOGO, que toma una IMAGEN. Y el hallazgo que hay que dejar escrito: NO sirve exportarla desde el perfil de la shell. shuma absorbe el entorno de la login shell, pero su es_denegada rechaza todo lo que empiece con SHUMA_, por diseño. La via correcta es su propio env.json, que aplica los grupos activos al proceso al arrancar. El icono se instala fuera del repo (~/.local/share/pixmaps/takana.png): una ruta dentro del arbol se rompe cuando el repo se mueve, que es literalmente lo que paso hoy con ~/hammer.
This commit is contained in:
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Emite el símbolo de takana como arte de terminal, al estilo de los `*fetch`.
|
||||
|
||||
Se DERIVA del SVG de `docs/marca/`, no se dibuja a mano: una copia dibujada
|
||||
aparte se desincroniza del símbolo el día que la marca cambie, y nadie se
|
||||
entera. La grilla es la tocapu 7x7 y cada celda ocupa dos columnas para que
|
||||
salga cuadrada en una terminal (los caracteres son ~2:1 de alto).
|
||||
|
||||
Uso:
|
||||
scripts/logo-ascii.py # color (ANSI 24-bit)
|
||||
scripts/logo-ascii.py --plano # monocromo, para pipes y TERM tontos
|
||||
scripts/logo-ascii.py --regenerar # reescribe docs/marca/simbolo.{ansi,txt}
|
||||
"""
|
||||
import re, sys, pathlib
|
||||
|
||||
RAIZ = pathlib.Path(__file__).resolve().parent.parent
|
||||
SVG = RAIZ / "docs/marca/simbolo-fondo-oscuro.svg"
|
||||
# Monocromo: densidad decreciente, del extremo del gradiente a la chispa.
|
||||
DENSIDAD = {"#A63A25": "#", "#DF6B2A": "*", "#E3A63D": "+", "#FFF6DE": "@"}
|
||||
|
||||
|
||||
def grilla():
|
||||
s = SVG.read_text()
|
||||
# El SVG trae un manifiesto C2PA enorme en <metadata>; los rects van después.
|
||||
cuerpo = s[s.rfind("</metadata>") + 11:] if "</metadata>" in s else s
|
||||
celdas = {}
|
||||
for m in re.finditer(
|
||||
r'<rect x="(\d+)" y="(\d+)" width="(\d+)" height="(\d+)" fill="(#[0-9A-Fa-f]{6})"', cuerpo
|
||||
):
|
||||
x, y, fill = int(m.group(1)), int(m.group(2)), m.group(5)
|
||||
celdas[(y // 108, x // 108)] = fill
|
||||
if not celdas:
|
||||
sys.exit(f"no encontré celdas en {SVG} — ¿cambió el formato del símbolo?")
|
||||
return celdas, max(r for r, _ in celdas) + 1, max(c for _, c in celdas) + 1
|
||||
|
||||
|
||||
def render(color=True):
|
||||
celdas, filas, cols = grilla()
|
||||
out = []
|
||||
for r in range(filas):
|
||||
linea = []
|
||||
for c in range(cols):
|
||||
f = celdas.get((r, c))
|
||||
if f is None:
|
||||
linea.append(" ")
|
||||
elif color:
|
||||
rr, gg, bb = int(f[1:3], 16), int(f[3:5], 16), int(f[5:7], 16)
|
||||
linea.append(f"\x1b[38;2;{rr};{gg};{bb}m██\x1b[0m")
|
||||
else:
|
||||
linea.append(DENSIDAD[f] * 2)
|
||||
out.append("".join(linea).rstrip())
|
||||
return "\n".join(out)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if "--regenerar" in sys.argv:
|
||||
(RAIZ / "docs/marca/simbolo.ansi").write_text(render(True) + "\n")
|
||||
(RAIZ / "docs/marca/simbolo.txt").write_text(render(False) + "\n")
|
||||
print("docs/marca/simbolo.ansi y simbolo.txt regenerados desde el SVG")
|
||||
else:
|
||||
print(render(color="--plano" not in sys.argv))
|
||||
Reference in New Issue
Block a user