Foro: ítems de wowhead sin parpadeo y con color de calidad correcto

Dos problemas restantes con los enlaces de wowhead:

1) Texto blanco en vez del color de calidad. theme.css solo define q3..q6, así que
   un ítem de calidad 0/1/2 (p.ej. verde=q2) se quedaba sin color y salía blanco.
   Se completan .q0/.q1/.q2/.q7 en forum.css (colores estándar de WoW) con
   !important para ganar al color del enlace. Además el saneador deja los enlaces
   de wowhead SIN nofollow (el script de wowhead ignora los nofollow al colorear).

2) Parpadeo de «item=xxx» al recargar. Salía porque el texto del enlace era un
   marcador que wowhead renombraba de forma asíncrona. Ahora el botón resuelve el
   NOMBRE y la CALIDAD en el servidor (nuevo /api/forum/wowhead, que consulta el
   endpoint de tooltip de wowhead en la rama WotLK y el idioma de la web) e inserta
   el enlace ya con su nombre real y su clase qN: sin parpadeo y ya coloreado. Si la
   API falla, se cae al modo anterior (data-wh-rename-link).

El editor añade los colores de calidad a su content_style para que el preview salga
igual. El icono lo sigue poniendo wowhead (iconizeLinks) tanto en el editor como al
postear.

Verificado en producción: el endpoint devuelve nombre (es), calidad e icono; el CSS
sirve q2; un post con nombre real + q2 se guarda sin nofollow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-16 13:26:09 +00:00
parent c4961879df
commit 799341a1a4
4 changed files with 78 additions and 14 deletions
+33
View File
@@ -0,0 +1,33 @@
// Resuelve nombre, calidad e icono de una entidad de wowhead (rama WotLK) para que
// el editor del foro pueda insertar el enlace ya con su nombre real y su color de
// calidad, sin el parpadeo de «item=xxx». Usa el endpoint de tooltip de wowhead
// (el mismo que consume tooltips.js) con dataEnv=8 = WotLK Classic.
const TYPES = new Set(['item', 'spell', 'quest', 'npc', 'achievement', 'object'])
// Código de locale de wowhead: 0 = inglés, 6 = español.
const WH_LOCALE: Record<string, number> = { es: 6, en: 0 }
export async function GET(request: Request) {
const url = new URL(request.url)
const type = String(url.searchParams.get('type') || 'item')
const id = String(url.searchParams.get('id') || '').replace(/\D/g, '')
const locale = String(url.searchParams.get('locale') || 'es')
if (!TYPES.has(type) || !id) return Response.json({ name: null }, { status: 400 })
const wl = WH_LOCALE[locale] ?? 0
try {
const r = await fetch(`https://nether.wowhead.com/tooltip/${type}/${id}?dataEnv=8&locale=${wl}`, {
// cache un día: los nombres/calidades no cambian
next: { revalidate: 86400 },
})
if (!r.ok) return Response.json({ name: null })
const d = (await r.json()) as { name?: string; quality?: number; icon?: string }
return Response.json({
name: d.name ?? null,
quality: typeof d.quality === 'number' ? d.quality : null,
icon: d.icon ?? null,
})
} catch {
return Response.json({ name: null })
}
}