// RSS region helpers for resolving feeds, items, and nested values. var registry = window.pulsePlayerRegionTypes; var placeholderUtils = window.placeholderUtils || {}; function getDefaultStyle() { return { font_family: 'Arial', font_size: 32, font_color: '#000000' }; } function normalizeRenderableValue(value) { if (value && typeof value === 'object') { if (value.value !== undefined) { return value.value; } if (value.text !== undefined) { return value.text; } if (value.html !== undefined) { return value.html; } try { return JSON.stringify(value); } catch (_error) { return ''; } } return value; } function getRssFeedById(feedId) { var feeds = Array.isArray(initialData && initialData.rssFeeds) ? initialData.rssFeeds : []; var normalizedId = Number(feedId || 0); return feeds.find(function (feed) { return Number(feed.id) === normalizedId; }) || null; } function getRssFeedItem(feedId, itemNumber) { var feed = getRssFeedById(feedId); var items = feed && Array.isArray(feed.items) ? feed.items : []; var parsedItemNumber = Math.max(1, Number(itemNumber || 1)); var index = Number.isFinite(parsedItemNumber) && parsedItemNumber > 0 ? parsedItemNumber - 1 : 0; return items[index] || null; } function resolveRssPath(value, path) { var current = value; if (!path) { return current; } String(path).split('.').forEach(function (segment) { if (current === undefined || current === null) { current = ''; return; } current = current[segment]; }); return current === undefined || current === null ? '' : current; } function substituteRssVariables(html, item, feedId) { var source = String(html || ''); return source.replace(/\{\{\s*([^{}]+?)\s*\}\}/g, function (_match, expression) { if (!item || typeof item !== 'object') { return ''; } if (typeof placeholderUtils.resolvePlaceholderExpression !== 'function' || typeof placeholderUtils.formatPlaceholderValue !== 'function') { return ''; } var resolved = placeholderUtils.resolvePlaceholderExpression(item, expression); if (typeof placeholderUtils.isImagePlaceholderExpression === 'function' && placeholderUtils.isImagePlaceholderExpression(expression)) { var imageSource = placeholderUtils.formatPlaceholderValue(resolved); var feed = getRssFeedById(feedId); imageSource = feed && feed.imageCache && feed.imageCache[imageSource] ? feed.imageCache[imageSource] : imageSource; if (!/^(?:https?:\/\/|\/media\/|\/assets\/|\/[^/])/i.test(imageSource)) { return ''; } var imageConfig = typeof placeholderUtils.getImagePlaceholderConfig === 'function' ? placeholderUtils.getImagePlaceholderConfig(expression) : {}; var hasImageBounds = imageConfig.width && imageConfig.height; var imageStyle = hasImageBounds ? 'display:block;width:100%;height:100%;object-fit:contain;' : 'display:block;width:auto;height:auto;' + (imageConfig.width ? 'max-width:' + imageConfig.width + 'px;' : '') + (imageConfig.height ? 'max-height:' + imageConfig.height + 'px;' : ''); var image = ''; return hasImageBounds ? '' + image + '' : image; } return escapeHtml(placeholderUtils.formatPlaceholderValue(resolved)); }); } function renderRssRegion(region, regionContent) { var content = normalizeRenderableValue(regionContent && regionContent.value !== undefined ? regionContent.value : ''); var feedId = regionContent && regionContent.feed_id !== undefined ? regionContent.feed_id : null; var itemNumber = regionContent && regionContent.item_number !== undefined ? regionContent.item_number : 1; var defaultStyle = getDefaultStyle(); var fontFamily = sanitizeFontFamily(regionContent.font_family || region.fontFamily || defaultStyle.font_family); var fontSize = sanitizeFontSize(regionContent.font_size || region.fontSize || defaultStyle.font_size); var fontColor = sanitizeTextColor(regionContent.font_color || region.fontColor || defaultStyle.font_color); var item = getRssFeedItem(feedId, itemNumber); var hasFeed = String(feedId === undefined || feedId === null ? '' : feedId).trim() !== ''; var body = hasFeed ? (item ? substituteRssVariables(content, item, feedId) : '') : content; var contentStyle = 'width:' + region.pixelWidth + 'px;height:' + region.pixelHeight + 'px;transform:scale(' + region.canvasScale + ');transform-origin:top left;' + (fontFamily ? 'font-family:' + escapeHtml(fontFamily) + ';' : '') + 'font-size:' + fontSize + 'px;color:' + escapeHtml(fontColor) + ';'; if (!body) { return ''; } var renderedBody = renderEditorJsContent(body); return renderedBody ? '
' + renderedBody + '
' : ''; } registry.register('rss', { getDefaultStyle: getDefaultStyle, renderRegion: renderRssRegion });