</> Cómo funciona
Esta página documenta el módulo que da servicio a estos endpoints:
Función pura del español.
commons/refranario.py — un módulo con el formateador base _bean() y las funciones de cada endpoint (buscar, por lema, al azar, ficha, sinónimos, variantes, traducciones, enlaces con el diccionario, mezclador)._bean()); por eso van en una sola página.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;# -*- 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]}
Llámala con el código a la vista.
curl "https://api.wordkers.com/v1/refranario/buscar" \
-H "X-API-Key: TU_CLAVE"