Cómo está hecho (La Sonda Léxica)
La Sonda Léxica es una sola página estática: todo corre en el navegador, sin servidor ni base de datos detrás. La inteligencia lingüística vive en nuestras APIs y se hornea en la página durante la construcción. Este documento cuenta el cómo, de dentro afuera. (La visión de usuario está en que-es-la-sonda-lexica; reutilizarla en otro diccionario, en configurar-para-otro-diccionario.)
La idea en una frase
En un momento (el build) proceso los lemas, creo unos índices y los vuelco a la página. Al abrirla, el navegador solo lee y filtra — instantáneo.
Las tres capas
- El dato — un lemario por niveles (
data/lemario.csv:palabra,capa). Es lo único específico de Miniñol; ver procedencia. - El índice precalculado — por cada lema, sus propiedades ya masticadas: sílabas, sílaba tónica, acentuación, AFI y claves de rima. Se guarda en
data/index.jsony se incrusta en el HTML. - El front — lee ese índice y filtra en memoria. No hace lingüística ninguna.
El build: build.py
Es el corazón del asunto y donde se aplica la regla «usar nuestras APIs, no reinventar». En frío y una sola vez, por cada lema llama a la API de Wordkers:
GET /v1/silabeo/acentuacion?palabra=…→silabas,n_silabas,silaba_tonica(contada desde el final: aguda=1, llana=2, esdrújula=3) yacentuacion.GET /v1/fonetica/transcripcion?palabra=…→ el AFI (ipa_silabas, con la marca de tónicaˈ). De ahí se derivan las claves de rima (consonante = desde la vocal tónica al final; asonante = solo sus vocales). Derivar la clave es rebanar la salida de la API, no reimplementar lingüística.
Detalles que importan:
- Caché reanudable (
data/index.json): solo se pide lo que falta. Se commitea, así el despliegue no necesita tocar la API. - Backoff en 429 y concurrencia baja: el apifront (el gateway público) tiene rate limit con la clave demo. → Para el diccionario grande, el build debe llamar la función directa (en el servidor / importando el módulo), saltándose el gateway. Pendiente en pendientes.
- Mejora de calidad: la rima por AFI es más correcta que un cálculo ortográfico — guerra y perra riman (ambas
/era/), cosa que el texto crudo no ve.
El front
- Cajón: filtra y autocompleta al vuelo (prefijo + una errata de tolerancia). Cada sugerencia muestra su nivel (la seña de Miniñol).
- Búsqueda avanzada (ruedecita ⚙, plegable, con insignia del nº de filtros): empieza/termina/contiene, longitud, sílabas, acentuación, rima consonante/asonante, nivel. Operadores en la caja: comodines
*?, difusa~. - Ordenaciones: alfabético, alfabético inverso (por terminación), longitud, sílabas, nivel.
- Único caso runtime: rima con una palabra fuera del diccionario → una sola llamada a
/v1/fonetica/transcripcionpara su AFI. Todo lo demás es offline. - Sin lingüística en JS: solo utilidades de cadena (quitar tildes, distancia de edición) y lectura del índice.
Cómo escala al diccionario grande
Cambian dos piezas, el resto igual:
- El autocompletado pasa a un FST comprimido en WebAssembly que el navegador baja una vez (ver el diseño en el repo
dev/diccionario, doc «autocompletado-fst»). - La búsqueda por definición (pesada) pasa a Postgres FTS detrás de una API; el front pregunta.
- La clave: la capa de búsqueda no sabe de dónde viene el dato. Cambiar de diccionario es reindexar (reejecutar
build.py), no reescribir.
Diseño visual
Identidad de instrumento lexicográfico: paleta «tierra y piedra» (libro de estilo WK-ESTILO-001), con los niveles como estratos de sedimento (0→4) y acento verde-pino; tipografías Fraunces (display), Public Sans (texto) e IBM Plex Mono (datos). Tema claro y oscuro.
Stack y despliegue
- Estático puro; sin build de JS (un
build.pyen Python que inyecta el índice). - Cloudflare Pages (cuenta
ebaste.lti, donde vivewordkers.com), rama de producciónmain, dominio sonda.wordkers.com. Comando:npx wrangler pages deploy public --project-name=sonda --branch=main.
Huecos honestos
- 189 adverbios en -mente no están en la fonética (
encontrado:false) → se quedan sin rima (sí tienen sílabas/acento). Se arreglaría derivando su AFI del adjetivo base. - El silabeador fino (Azrael) podría afinar casos cultos/raros más adelante.