From 56f39ef0b4fa5c90b43ff1fd41996c6a01ff1199 Mon Sep 17 00:00:00 2001 From: adevopg Date: Thu, 16 Jul 2026 12:52:40 +0000 Subject: [PATCH] Foro: permitir enlaces de wowhead en los posts (tooltip, color, icono) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Al escribir un post se puede pegar un enlace de wowhead y sale con su tooltip, color por calidad e icono, igual que en el resto de la web (lo pinta el script global tooltips.js del layout, que actúa sobre los enlaces a wowhead.com y sobre data-wowhead). El saneador de posts (lib/forum-sanitize.ts) lo impedía; ahora: - conserva data-wowhead (en y ) y class, que el tooltip necesita; - normaliza los enlaces de wowhead a la rama /wotlk/ manteniendo el subdominio (www=inglés, es=español…), que es lo que fija el idioma del tooltip. Así un enlace pegado en retail muestra igualmente el tooltip de WotLK; - abre esos enlaces en pestaña nueva, como los del resto del sitio. Los enlaces que no son de wowhead se quedan igual. Verificado en producción: un enlace retail pegado en un post se guarda como .../wotlk/item=… y la página del tema carga tooltips.js. Co-Authored-By: Claude Opus 4.8 (1M context) --- web-next/lib/forum-sanitize.ts | 36 +++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/web-next/lib/forum-sanitize.ts b/web-next/lib/forum-sanitize.ts index b2d822c..b057ea3 100644 --- a/web-next/lib/forum-sanitize.ts +++ b/web-next/lib/forum-sanitize.ts @@ -1,5 +1,25 @@ import sanitizeHtml from 'sanitize-html' +// Tipos de entidad de wowhead que aceptan tooltip (para normalizar el enlace). +const WOWHEAD_TYPES = 'item|spell|quest|npc|achievement|object|faction|currency|itemset|title' + +/** + * Normaliza un enlace de wowhead para que el tooltip salga en la rama WotLK. + * - Mantiene el subdominio (www=inglés, es=español…), que es lo que fija el idioma + * del tooltip cuando no hay data-wowhead. + * - Fuerza el segmento `/wotlk/` (si el usuario pega un enlace retail, el tooltip + * saldría de retail; así siempre es WotLK). + * Devuelve el href tal cual si no reconoce un `=`. + */ +function normalizeWowheadHref(href: string): string { + const m = /^https?:\/\/([a-z]+)\.wowhead\.com\/.*?\b(?:wotlk\/)?(?:(item|spell|quest|npc|achievement|object|faction|currency|itemset|title)=(\d+))/i.exec( + href, + ) + if (!m) return href + const [, sub, type, id] = m + return `https://${sub}.wowhead.com/wotlk/${type.toLowerCase()}=${id}` +} + // Misma allowlist que forum/sanitize.py (nh3) para el HTML de los mensajes. export function cleanPostHtml(html: string): string { if (!html) return '' @@ -13,16 +33,26 @@ export function cleanPostHtml(html: string): string { 'table', 'thead', 'tbody', 'tr', 'th', 'td', ], allowedAttributes: { - a: ['href', 'title', 'target'], + // data-wowhead + class dejan que los enlaces de wowhead muestren tooltip, + // color por calidad e icono (los pinta el script global tooltips.js del layout). + a: ['href', 'title', 'target', 'data-wowhead', 'class'], img: ['src', 'alt', 'title', 'width', 'height'], - span: ['style'], + span: ['style', 'data-wowhead'], div: ['style'], td: ['colspan', 'rowspan'], th: ['colspan', 'rowspan'], }, allowedSchemes: ['http', 'https', 'mailto'], transformTags: { - a: sanitizeHtml.simpleTransform('a', { rel: 'noopener noreferrer nofollow' }), + a: (tagName, attribs) => { + const out: Record = { ...attribs, rel: 'noopener noreferrer nofollow' } + if (out.href && /\.wowhead\.com\//i.test(out.href)) { + out.href = normalizeWowheadHref(out.href) + // abrir en pestaña nueva, como los enlaces de wowhead del resto del sitio + out.target = '_blank' + } + return { tagName, attribs: out } + }, }, }) }