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

  1. El dato — un lemario por niveles (data/lemario.csv: palabra,capa). Es lo único específico de Miniñol; ver procedencia.
  2. 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.json y se incrusta en el HTML.
  3. 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) y acentuacion.
  • 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/transcripcion para 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.py en Python que inyecta el índice).
  • Cloudflare Pages (cuenta ebaste.lti, donde vive wordkers.com), rama de producción main, 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.
En esta página