Atom/RSS Feed XML Generator

Feed Item Details

Item Log (0)

Generated XML (RSS 2.0)

// Define metadata and add items to generate feed...

Feed Metadata

Format: | Base URL: | Date:

I. Feed Structure & Content

# Title Link Description Published Date

II. Generated XML Output (Sample)


      
    

No items logged.

'; return; } items.forEach(item => { const div = document.createElement('div'); div.className = 'item-chip'; div.innerHTML = ` ${item.title} `; logContainer.appendChild(div); }); } // --- XML Generation --- function escapeXml(unsafe) { if (!unsafe) return ''; return unsafe.replace(/[&<>"']/g, function (match) { switch (match) { case '&': return '&'; case '<': return '<'; case '>': return '>'; case '"': return '"'; case "'": return '''; } }); } function toRfc822(date) { const d = new Date(date); return d.toUTCString(); } function toIso8601(date) { return new Date(date).toISOString(); } function generateRSS(meta) { let xml = `\n`; xml += `\n`; xml += `\n`; xml += ` ${escapeXml(meta.title)}\n`; xml += ` ${escapeXml(meta.url)}\n`; xml += ` ${escapeXml(meta.title)} - Latest updates\n`; xml += ` ${escapeXml(meta.lang)}\n`; xml += ` ${toRfc822(new Date())}\n`; items.forEach(item => { xml += ` \n`; xml += ` ${escapeXml(item.title)}\n`; xml += ` ${escapeXml(item.link)}\n`; xml += ` ${escapeXml(item.link)}\n`; xml += ` ${escapeXml(item.description)}\n`; xml += ` ${toRfc822(item.pubDate)}\n`; xml += ` \n`; }); xml += `\n`; xml += ``; return xml; } function generateAtom(meta) { let xml = `\n`; xml += `\n`; xml += ` ${escapeXml(meta.title)}\n`; xml += ` \n`; xml += ` ${toIso8601(new Date())}\n`; xml += ` ${escapeXml(meta.url)}/feed\n`; items.forEach(item => { xml += ` \n`; xml += ` ${escapeXml(item.title)}\n`; xml += ` \n`; xml += ` ${escapeXml(item.link)}\n`; xml += ` ${toIso8601(item.pubDate)}\n`; xml += ` ${escapeXml(item.description)}\n`; xml += ` \n`; }); xml += ``; return xml; } function generateRequest() { const format = document.getElementById('cfg-format').value; const meta = { title: document.getElementById('cfg-title').value, url: document.getElementById('cfg-url').value, lang: document.getElementById('cfg-lang').value }; let xml = ''; if (format === 'rss') { xml = generateRSS(meta); } else if (format === 'atom') { xml = generateAtom(meta); } document.getElementById('xml-output').innerText = xml; document.getElementById('format-display').innerText = format === 'rss' ? 'RSS 2.0' : 'Atom 1.0'; } // --- Download Actions --- function downloadXML() { if (items.length === 0) { alert("Please add feed items before downloading."); return; } const format = document.getElementById('cfg-format').value; const xmlContent = document.getElementById('xml-output').innerText; const ext = format === 'rss' ? 'rss' : 'xml'; const filename = (document.getElementById('cfg-title').value || 'feed').replace(/[^a-zA-Z0-9]/g, '_') + '.' + ext; const blob = new Blob([xmlContent], { type: `application/${ext}+xml;charset=utf-8` }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); } function generatePDF() { if (items.length === 0) { alert("Please add feed items before generating the report."); return; } const template = document.getElementById('pdf-template'); const pdfTbody = document.getElementById('pdf-tbody'); // 1. Fill Metadata document.getElementById('pdf-title').innerText = document.getElementById('cfg-title').value; document.getElementById('pdf-format').innerText = document.getElementById('cfg-format').value.toUpperCase(); document.getElementById('pdf-url').innerText = document.getElementById('cfg-url').value; document.getElementById('pdf-date').innerText = new Date().toLocaleDateString(); // 2. Fill Table Content pdfTbody.innerHTML = ''; items.forEach((entry, index) => { pdfTbody.innerHTML += ` ${index + 1} ${entry.title} ${entry.link} ${entry.description} ${entry.pubDate.toLocaleDateString()} `; }); // 3. Fill XML Sample document.getElementById('pdf-xml-output').innerText = document.getElementById('xml-output').innerText; // 4. Generate PDF template.style.display = 'block'; const opt = { margin: 0.5, filename: 'Feed_Specification_Report.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: 'in', format: 'letter', orientation: 'landscape' } }; html2pdf().set(opt).from(template).save().then(() => { template.style.display = 'none'; }); } return { switchTab, addItem, deleteItem, generateRequest, downloadXML, generatePDF }; })();
Scroll to Top