68 lines
2.9 KiB
JavaScript
68 lines
2.9 KiB
JavaScript
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) {
|
|
var source = String(html || '');
|
|
return source.replace(/\{\{\s*([a-zA-Z0-9_]+)(?:\.([a-zA-Z0-9_.]+))?\s*\}\}/g, function (_match, tokenName, tokenPath) {
|
|
if (!item || typeof item !== 'object') {
|
|
return '';
|
|
}
|
|
var key = tokenName === 'item' && tokenPath ? tokenPath : tokenName;
|
|
return escapeHtml(resolveRssPath(item, key || ''));
|
|
});
|
|
}
|
|
|
|
function renderRssRegion(region, regionContent) {
|
|
var content = 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 fontFamily = sanitizeFontFamily(regionContent.font_family || region.fontFamily);
|
|
var fontSize = sanitizeFontSize(regionContent.font_size || region.fontSize);
|
|
var fontColor = sanitizeTextColor(regionContent.font_color || region.fontColor);
|
|
var item = getRssFeedItem(feedId, itemNumber);
|
|
var body = item ? substituteRssVariables(content, item) : '';
|
|
if (!body && item) {
|
|
var summaryParts = [];
|
|
if (item.title) {
|
|
summaryParts.push('<h3>' + escapeHtml(item.title) + '</h3>');
|
|
}
|
|
if (item.description) {
|
|
summaryParts.push('<div>' + sanitizeRichText(item.description) + '</div>');
|
|
}
|
|
body = summaryParts.join('');
|
|
}
|
|
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) + ';';
|
|
var renderedBody = body ? renderEditorJsContent(body) : '<div class="template-region-placeholder">RSS item</div>';
|
|
return '<div class="template-region rss" style="' + region.baseStyle + '"><div class="template-region-text-scale" style="' + contentStyle + '">' + renderedBody + '</div></div>';
|
|
}
|