README corto y sin comentarios en el código

This commit is contained in:
hacklab 2026-09-29 10:26:46 +02:00
parent cb551e2a3c
commit 7ed0276704
9 changed files with 7 additions and 165 deletions

Binary file not shown.

View file

@ -1,16 +1,4 @@
#!/usr/bin/env node
// Lee del sbot de OASIS lo que va a la web y lo saca en JSON para tools/genera.py.
//
// Quién publica: miembros de la tribu TRIBU a los que CUENTA sigue, más CUENTA.
// La tribu sola no basta: en SSB cualquiera puede publicar que se une a una tribu
// (la invitación solo la comprueba la interfaz de OASIS). El follow de CUENTA sí
// está firmado por CUENTA.
//
// comunicados posts con #comunicado26s de quien publica
// comisiones subtribus públicas de TRIBU creadas por quien publica
// debates foros públicos abiertos por quien publica
//
// Uso: OASIS_DIR=~/oasis CUENTA=@...ed25519 TRIBU=%...sha256 node tools/extrae.js
const path = require('path');
const dir = process.env.OASIS_DIR || path.join(process.env.HOME, 'oasis');
@ -26,7 +14,6 @@ if (!CUENTA || !CUENTA.startsWith('@') || !TRIBU || !TRIBU.startsWith('%')) {
const ssbConfig = require(path.join(dir, 'src', 'server', 'ssb_config'));
const ssbClient = require(path.join(dir, 'src', 'server', 'node_modules', 'ssb-client'));
// igual que STRUCTURAL_FIELDS en src/models/tribes_model.js
const ESTRUCTURA = ['title', 'description', 'image', 'location', 'tags', 'isAnonymous',
'inviteMode', 'status', 'parentTribeId', 'mapUrl'];
@ -44,9 +31,6 @@ const todos = (src) => new Promise((res, rej) => {
const lista = (x) => (Array.isArray(x) ? x : []);
const igual = (a, b) => JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
// Cadena de una tribu (create + updates por `replaces`) con las mismas reglas que
// buildTribeIndex: el autor raíz cambia lo que quiera; otro miembro solo puede
// entrar o salir él mismo. Devuelve el último estado válido.
function puntaTribu(raiz, msgs) {
const porPadre = new Map();
for (const m of msgs) {
@ -98,7 +82,6 @@ ssbClient(ssbConfig.keys, { remote, caps: ssbConfig.caps }).then(async (ssb) =>
const [contactos, tribus, posts, feeds, foros, lapidas] = await Promise.all(
['contact', 'tribe', 'post', 'feed', 'forum', 'tombstone'].map(tipo));
// a quién sigue CUENTA (el último contact gana)
const sigue = new Map();
for (const m of contactos) {
const c = m.value.content;
@ -115,7 +98,6 @@ ssbClient(ssbConfig.keys, { remote, caps: ssbConfig.caps }).then(async (ssb) =>
const miembros = lista(puntaTribu(raiz, deTribu(raiz)).value.content.members);
const editores = new Set([CUENTA, ...miembros.filter((id) => sigue.get(id) === true)]);
// borrado: tombstone del propio autor
const borrado = new Set(lapidas
.filter((m) => typeof m.value.content.target === 'string')
.map((m) => `${m.value.author} ${m.value.content.target}`));

View file

@ -1,17 +1,4 @@
#!/usr/bin/env python3
"""Escribe en la web lo que sale de tools/extrae.js.
Lee el JSON por stdin y, dentro de SITE:
- rellena en index.html los bloques entre <!-- X:inicio --> y <!-- X:fin -->
para X = comunicados, comisiones, debates
- crea comunicados/AAAA-MM-DD-xxxxxxxx.html por comunicado y borra los que
ya no están (borrados en OASIS o de alguien que ya no publica)
Todo el texto que viene de SSB se escapa. Escritura atómica: nginx nunca sirve
un fichero a medias.
node tools/extrae.js | python3 tools/genera.py /var/www/acampada26s.net
"""
import hashlib
import html
import json
@ -40,7 +27,6 @@ def blob(ref):
def plano(texto):
"""Texto sin markdown de imágenes/enlaces ni la etiqueta, en una línea."""
texto = IMG.sub("", texto)
texto = ENLACE.sub(r"\1", texto)
texto = ETIQUETA.sub("", texto)
@ -48,7 +34,6 @@ def plano(texto):
def partir(texto):
"""Primera línea con contenido = título; el resto = cuerpo."""
lineas = ETIQUETA.sub("", texto).replace("\r", "").split("\n")
for i, l in enumerate(lineas):
t = plano(l).lstrip("# ").strip()
@ -58,7 +43,6 @@ def partir(texto):
def cuerpo(texto):
"""Markdown mínimo: párrafos, saltos, imágenes del pub y enlaces http(s)."""
out = []
for parrafo in re.split(r"\n\s*\n", texto.replace("\r", "").strip()):
if not parrafo.strip():

View file

@ -1,7 +1,4 @@
#!/bin/sh
# Quita metadatos (EXIF, GPS, modelo de móvil) de las imágenes antes de subirlas.
# Uso: tools/limpia-img.sh foto1.jpg foto2.png ...
# Necesita exiftool (libimage-exiftool-perl) o mat2.
set -eu
[ $# -gt 0 ] || { echo "uso: $0 imagen..." >&2; exit 1; }
@ -17,7 +14,6 @@ else
exit 1
fi
# comprobación: no debe quedar GPS
if command -v exiftool >/dev/null 2>&1; then
if exiftool -q -q -if '$GPSLatitude' -p '$FileName' -- "$@" 2>/dev/null | grep .; then
echo "ojo: quedan coordenadas GPS en las de arriba" >&2