/** * Hydrate #lead section from live Pulse /api/articles?limit=1 * Syncs read-aloud voice when article edition changes. */ (function () { var section = document.getElementById('lead'); if (!section) return; var headline = section.querySelector('.lead-headline'); var deck = section.querySelector('.lead-deck'); var byline = section.querySelector('.lead-byline'); var flag = section.querySelector('.lead-flag'); var body = section.querySelector('.article-text'); var readBtn = section.querySelector('button[onclick*="vbSpeak"]'); function esc(s) { return String(s || '') .replace(/&/g, '&') .replace(//g, '>'); } function formatDate(iso) { if (!iso) return ''; try { return new Date(iso).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); } catch (_) { return ''; } } function syncLeadVoice(art) { if (!art || !window.GMIIEVoiceSync) return; var scripts = window.GMIIEVoiceSync.getScripts(); if (scripts.lead && scripts.lead.article_id === art.id) return; window.GMIIEVoiceSync.refresh(); } function isXml(str) { var s = String(str || '').trim().toLowerCase(); return s.indexOf('([\s\S]*?)<\/item>/i); var searchIn = itemMatch ? itemMatch[1] : xmlStr; var titleMatch = searchIn.match(/(?:<!\[CDATA\[)?([\s\S]*?)(?:\]\]>)?<\/title>/i); if (titleMatch) title = titleMatch[1].trim(); var linkMatch = searchIn.match(/<link>(?:<!\[CDATA\[)?([\s\S]*?)(?:\]\]>)?<\/link>/i); if (linkMatch) link = linkMatch[1].trim(); var descMatch = searchIn.match(/<description>(?:<!\[CDATA\[)?([\s\S]*?)(?:\]\]>)?<\/description>/i); if (descMatch) summary = descMatch[1].trim(); } if (summary) { summary = summary.replace(/<[^>]*>/g, '').trim(); summary = summary .replace(/</g, '<') .replace(/>/g, '>') .replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, "'"); if (summary.endsWith('f')) { summary = summary.slice(0, -1) + 'from the Federal Reserve Board.'; } } return { title: title, summary: summary, link: link }; } function hydrateArticle(art) { if (!art) return; var title = art.title; var summary = art.summary || ''; var sourceLink = art.source || 'https://www.federalreserve.gov/feeds/feeds.htm'; if (isXml(summary)) { var parsed = parseXmlRss(summary); title = parsed.title; summary = parsed.summary + '\n\nTakeaway: Monetary policy announcements and press releases directly impact R1 (Structural) and R2 (Language) rings.'; sourceLink = parsed.link; } if (headline) headline.textContent = title || headline.textContent; if (deck && summary) deck.textContent = summary.slice(0, 420); if (flag) { var desk = (art.desk || 'markets').replace(/-/g, ' '); flag.textContent = 'Lead Analysis — ' + desk.replace(/\b\w/g, function (c) { return c.toUpperCase(); }); } if (byline) { var author = (art.footer && art.footer.author_name) || art.author_id || 'GMIIE Intelligence Desk'; var date = formatDate(art.published_at); var signal = art.signal != null ? ' — Signal ' + art.signal + '/100' : ''; var badge = art.footer && art.footer.badge ? ' — ' + art.footer.badge : ''; byline.textContent = author + (date ? ' — ' + date : '') + signal + badge; } if (body && summary && summary.length > 120) { var paras = summary.split(/\n\n+/).filter(Boolean); if (paras.length) { body.innerHTML = paras .slice(0, 4) .map(function (p) { return '<p>' + esc(p) + '</p>'; }) .join(''); } } if (readBtn && art.title) { readBtn.setAttribute('aria-label', 'Read aloud: ' + art.title); readBtn.setAttribute('data-voice-article-id', art.id || ''); } var mintHost = section.querySelector('.lead-mint-host'); if (!mintHost) { mintHost = document.createElement('div'); mintHost.className = 'lead-mint-host'; if (readBtn && readBtn.parentNode) { readBtn.parentNode.insertBefore(mintHost, readBtn.nextSibling); } else { section.appendChild(mintHost); } } mintHost.innerHTML = ''; if (window.GMIIELpsMint && art.id) { window.GMIIELpsMint.renderButton(mintHost, { briefId: art.id, title: art.title, lps1Id: art.lps1_registration_id, }); } section.setAttribute('data-lead-hydrated', '1'); section.setAttribute('data-lead-article-id', art.id || ''); if (art.sha256) section.setAttribute('data-lead-sha256', art.sha256); syncLeadVoice(art); } function fetchAndHydrateLead(options) { var url = '/api/articles?limit=10'; var fetchOpts = { cache: 'no-store' }; if (options && options.signal) { fetchOpts.signal = options.signal; } return fetch(url, fetchOpts) .then(function (r) { return r.ok ? r.json() : null; }) .then(function (data) { var articles = (data && data.articles) || []; var leadArt = null; for (var i = 0; i < articles.length; i++) { var a = articles[i]; if ( a && (a.lane === 'lead' || a.id === 'catchup-cme-perps-suit-2026') && a.summary && a.summary.length > 500 && !a.id.startsWith('scrape-') ) { leadArt = a; break; } } if (leadArt) { hydrateArticle(leadArt); } else { section.setAttribute('data-lead-hydrated', 'static-fallback'); } }) .catch(function () { section.setAttribute('data-lead-hydrated', 'static-fallback'); }); } fetchAndHydrateLead({ signal: AbortSignal.timeout(12000) }); window.addEventListener('gmiie-voice-updated', function () { var artId = section.getAttribute('data-lead-article-id'); var scripts = window.GMIIEVoiceSync && window.GMIIEVoiceSync.getScripts(); if (scripts && scripts.lead && scripts.lead.article_id && artId && scripts.lead.article_id !== artId) { fetchAndHydrateLead(); } }); })();