const fs = require('fs'); const jsyaml = require('js-yaml'); const path = require('path'); function generateRSS(programs) { const host = 'https://ysws.hackclub.com'; const now = new Date().toUTCString(); const activePrograms = Object.values(programs) .flat() .filter(program => program.status === 'active') .sort((a, b) => { if (!a.deadline) return 1; if (!b.deadline) return -1; return new Date(a.deadline) - new Date(b.deadline); }); let rss = ` Hack Club YSWS Programs ${host} Active "You Ship, We Ship" programs from Hack Club en-us ${now} `; activePrograms.forEach(program => { const pubDate = program.pubDate ? new Date(program.pubDate).toUTCString() : now; const deadline = program.deadline ? `

Deadline: ${new Date(program.deadline).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}

` : ''; const channelRef = program.slackChannel ? program.slackChannel.replace(/^#+/, '#') : ''; rss += ` ${escapeXML(program.name)} ${program.website || host} ${program.name}-${Date.now()} ${pubDate} ${escapeXML(program.description)}

${deadline} ${program.detailedDescription ? `

${escapeXML(program.detailedDescription)}

` : ''} ${channelRef ? `

Join the discussion in ${channelRef}

` : ''} ]]>
`; }); rss += `
`; return rss; } function escapeXML(text) { if (!text) return ''; return text .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } async function main() { try { const dataFile = path.join(__dirname, 'data.yml'); const fileContent = fs.readFileSync(dataFile, 'utf8'); const data = jsyaml.load(fileContent); const rssFeed = generateRSS(data); fs.writeFileSync(path.join(__dirname, 'feed.xml'), rssFeed); console.log('RSS feed generated successfully!'); } catch (error) { console.error('Error generating RSS feed:', error); process.exit(1); } } main();