import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const ROOT = path.resolve(__dirname, '..'); const DIST = path.join(ROOT, 'dist'); const SITE = 'https://pushkinohistory.ru'; const TITLE = 'История города Пушкино'; const DESC = 'Прошлое, настоящее, будущее города Пушкино.'; const posts = JSON.parse(fs.readFileSync(path.join(ROOT, 'src/content/posts.json'), 'utf8')); const escapeXml = (s) => String(s) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); const cdata = (s) => `/g, ']]]]>')}]]>`; const rfc2822 = (s) => { const d = new Date(s.replace(' ', 'T') + '+03:00'); return d.toUTCString(); }; const absoluteImages = (html) => html.replace(/(src|href)="\/uploads\//g, `$1="${SITE}/uploads/`); const items = posts.map((p) => { const html = absoluteImages(p.html); const description = p.excerpt ? p.excerpt : html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 500); const url = `${SITE}/${p.slug}/`; return ` ${escapeXml(p.title)} ${url} ${url} ${rfc2822(p.date)} ${cdata('История города Пушкино')} ${(p.categories || []).map((c) => `${escapeXml(c)}`).join('\n ')} ${cdata(description)} ${cdata(html)} `; }).join('\n'); const lastBuild = new Date().toUTCString(); const rss = ` ${escapeXml(TITLE)} ${SITE}/ ${escapeXml(DESC)} ru-RU ${lastBuild} 60 ${items} `; fs.mkdirSync(DIST, { recursive: true }); fs.writeFileSync(path.join(DIST, 'feed.xml'), rss); console.log(`rss: ${posts.length} items → dist/feed.xml`);