</> Cómo funciona

Refranero

Esta página documenta el módulo que da servicio a estos endpoints:

Función pura del español.

Cómo funciona (por dentro)

Mapa de funciones

flowchart TD
  MOD[("repositorio")]
  _bean["_bean()"]
  buscar["buscar()"]
  por_lema["por_lema()"]
  aleatorio["aleatorio()"]
  _get["_get()"]
  refran["refran()"]
  sinonimos["sinonimos()"]
  variantes["variantes()"]
  traducciones["traducciones()"]
  enlaces_diccionario["enlaces_diccionario()"]
  mezcla["mezcla()"]
  aleatorio --> _bean
  buscar --> _bean
  enlaces_diccionario --> _get
  por_lema --> _bean
  refran --> _bean
  refran --> _get
  sinonimos --> _bean
  sinonimos --> _get
  traducciones --> _get
  variantes --> _get
  _bean -. datos .-> MOD
  _get -. datos .-> MOD
  mezcla -. datos .-> MOD
  classDef red fill:#fde7f0,stroke:#c0397b,color:#7a1e4d;
  class MOD red;

El código

# -*- coding: utf-8 -*-
"""refranario.py — diccionario de refranes españoles.

Búsqueda por texto del refrán o POR LEMA (lematizando la palabra). Cada refrán trae
significado, explicación, ejemplo, sus dos partes (para el juego «completa el refrán»),
nivel y dificultad; y sus relaciones: sinónimos, variantes y traducciones.

Un solo módulo da servicio a muchos endpoints del refranero: buscar, por lema, al azar,
ficha, sinónimos, variantes, traducciones, el cruce con el diccionario y el mezclador.
"""

_AUDIO_BASE = "https://refranes.wordkers.es/audio/"
_IMG_BASE = "https://refranes.wordkers.es/media/img/"     # ilustraciones (jpg)

# […consultas al repositorio de refranes (esquema interno: refranes y sus relaciones)…]


def _bean(x):
    # da forma a la respuesta pública de un refrán a partir de una fila
    return {"id": x[0], "refran": x[1], "significado": x[2], "explicacion": x[3],
            "comentario": x[4], "ejemplo": x[5], "parte1": x[6], "parte2": x[7],
            "nivel": x[8], "dificultad": x[9], "frecuencia": x[10],
            "imagen": (_IMG_BASE + str(x[11]) + ".jpg") if x[11] else None}


def buscar(cur, palabra, limite=20):
    """Refranes cuyo texto contiene la palabra."""
    limite = max(1, min(int(limite), 100))               # se acota el límite: entre 1 y 100
    cur.execute(_SQL_BUSCAR, ("%" + palabra + "%", limite))
    return {"palabra": palabra, "refranes": [_bean(x) for x in cur.fetchall()]}


def por_lema(cur, palabra, limite=20):
    """Refranes que contienen la palabra por su LEMA (lematiza primero)."""
    limite = max(1, min(int(limite), 100))
    cur.execute(_SQL_POR_LEMA, (palabra, limite))
    return {"palabra": palabra, "refranes": [_bean(x) for x in cur.fetchall()]}


def aleatorio(cur, cantidad=1):
    """`cantidad` refranes al azar (1-10)."""
    cantidad = max(1, min(int(cantidad), 10))
    cur.execute(_SQL_ALEATORIO, (cantidad,))
    return {"refranes": [_bean(x) for x in cur.fetchall()]}


def _get(cur, texto=None, id=None):
    # busca un refrán por id (preferente) o por su texto exacto
    cur.execute(_SQL_GET_ID if id is not None else _SQL_GET_TEXTO, (id if id is not None else texto,))
    return cur.fetchone()


def refran(cur, texto=None, id=None):
    """Ficha completa de un refrán (por texto exacto o por id)."""
    row = _get(cur, texto, id)
    if not row:
        return {"encontrado": False}
    d = _bean(row)
    d["encontrado"] = True
    return d


def sinonimos(cur, texto=None, id=None):
    """Refranes equivalentes (mismo sentido)."""
    row = _get(cur, texto, id)
    if not row:
        return {"encontrado": False, "sinonimos": []}
    rid = row[0]
    cur.execute(_SQL_SINONIMOS, (rid, rid, rid))
    return {"encontrado": True, "refran": row[1], "sinonimos": [_bean(x) for x in cur.fetchall()]}


def variantes(cur, texto=None, id=None):
    """Variantes (formas alternativas) del refrán."""
    row = _get(cur, texto, id)
    if not row:
        return {"encontrado": False, "variantes": []}
    cur.execute(_SQL_VARIANTES, (row[0],))
    return {"encontrado": True, "refran": row[1], "variantes": [x[0] for x in cur.fetchall()]}


def traducciones(cur, texto=None, id=None, idioma=None):
    """Equivalentes del refrán en otros idiomas (opcionalmente filtrado por `idioma`)."""
    row = _get(cur, texto, id)
    if not row:
        return {"encontrado": False, "traducciones": []}
    q, params = _SQL_TRAD, [row[0]]
    if idioma:                                           # filtro opcional por idioma
        q += _SQL_TRAD_IDIOMA
        params.append(idioma)
    cur.execute(q, params)
    return {"encontrado": True, "refran": row[1],
            "traducciones": [{"idioma": x[1], "refran": x[0]} for x in cur.fetchall()]}


def enlaces_diccionario(cur, texto=None, id=None):
    """CRUCE refranero → diccionario: palabras del refrán con entrada en el diccionario
    (para hacerlas «pinchables» hacia su definición). Usa el lema."""
    row = _get(cur, texto, id)
    if not row:
        return {"encontrado": False, "palabras": []}
    cur.execute(_SQL_ENLACES, (row[0],))
    return {"encontrado": True, "refran": row[1],
            "palabras": [{"palabra": x[0], "lema": x[1], "en_diccionario": x[2]} for x in cur.fetchall()]}


def mezcla(cur):
    """Mezclador de refranes: parte1 de un refrán + parte2 de OTRO → un refrán nuevo y
    absurdo. Devuelve las dos mitades y los refranes originales (para enlazarlos)."""
    cur.execute(_SQL_MEZCLA)
    rows = cur.fetchall()
    if len(rows) < 2:
        return {"mezcla": None}
    a, b = rows[0], rows[1]                               # a = primer refrán, b = segundo
    return {"parte1": a[1], "parte2": b[2], "mezcla": (a[1] + " " + b[2]).strip(),
            "refran1": a[0], "refran2": b[0]}

Pruébalo

Llámala con el código a la vista.

Ejemplos con el SDK

curl "https://api.wordkers.com/v1/refranario/buscar" \
  -H "X-API-Key: TU_CLAVE"

Cómo empezar con el SDK →

¿Quieres que cambie algo, o copiar la lógica para lo tuyo? Sin problema — escríbeme. Lo que ves es el algoritmo; los datos y las claves se quedan en casa.

Wordkers · Catálogo · Empezar · Tu cuenta