'use strict'; // ── Configuración ────────────────────────────────────────────── // BOE Sección II-B: Oposiciones, concursos y vacantes const BOE_RSS = 'https://www.boe.es/rss/boe_dias.php?s=2B'; // Proxy CORS gratuito que convierte RSS a JSON const RSS2JSON = 'https://api.rss2json.com/v1/api.json?rss_url='; // Palabras clave para resaltar entradas de interés informático/TAI const KW_TAI = /\b(TAI|T\.A\.I|técnico[a]? (de )?administración (general |de la )?inform|inform[aá]tic|sistemas?\s+de\s+información|AGE\b)/i; // ── Carga del feed BOE ───────────────────────────────────────── async function cargarBOE() { const panel = document.getElementById('boe-items'); const badge = document.getElementById('boe-fecha'); try { const resp = await fetch(RSS2JSON + encodeURIComponent(BOE_RSS)); if (!resp.ok) throw new Error('HTTP ' + resp.status); const data = await resp.json(); if (data.status !== 'ok') throw new Error('Feed error: ' + data.message); const items = data.items || []; if (items.length === 0) { panel.innerHTML = '
No hay publicaciones recientes en esta sección.
'; badge.textContent = 'Sin datos'; return; } // Separar: primero los que coincidan con TAI/informática, luego el resto const importantes = items.filter(it => KW_TAI.test(it.title + ' ' + (it.description || ''))); const resto = items.filter(it => !KW_TAI.test(it.title + ' ' + (it.description || ''))); const ordenados = [...importantes, ...resto].slice(0, 25); // Fecha de la última actualización del feed const fechaFeed = data.feed?.lastBuildDate ? new Date(data.feed.lastBuildDate).toLocaleDateString('es-ES', { day:'2-digit', month:'short', year:'numeric' }) : 'hoy'; badge.textContent = 'Act. ' + fechaFeed; panel.innerHTML = ordenados.map(item => { const esTAI = KW_TAI.test(item.title + ' ' + (item.description || '')); const fecha = item.pubDate ? new Date(item.pubDate).toLocaleDateString('es-ES', { day:'2-digit', month:'short', year:'numeric' }) : ''; const titulo = escHtml(truncar(item.title || 'Sin título', 120)); return `