From 47eb876129b04c14a001b6e2a5a8322d6a595d61 Mon Sep 17 00:00:00 2001 From: Marcel Kapfer Date: Mon, 18 Mar 2024 16:53:50 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(RSS)=20Re-write=20feed=20generatio?= =?UTF-8?q?n=20using=20XMLWriter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/templates/blog.rss.php | 84 +++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/site/templates/blog.rss.php b/site/templates/blog.rss.php index 8820c3f..58702f8 100644 --- a/site/templates/blog.rss.php +++ b/site/templates/blog.rss.php @@ -1,31 +1,61 @@ -'); - -$feed->channel->title = $site->title()->toString(); -$feed->channel->description = $site->description()->toString(); -$feed->channel->link = url(); -$feed->channel->language = 'en-us'; -$feed->channel->lastBuildDate = date(DATE_RSS); -$feed->channel->generator = 'Kirby'; - -$atomLink = $feed->channel->addChild('atom:link', null, 'atom'); -$atomLink->addAttribute('href', url('/feed')); -$atomLink->addAttribute('rel', 'self'); -$atomLink->addAttribute('type', 'application/rss+xml'); - -$articles = $page->children()->template('article')->sortBy('date', 'desc')->limit(10); - -foreach ($articles as $article) { - $xmlArticle = $feed->channel->addChild('item'); - $xmlArticle->title = $article->title()->toString(); - $xmlArticle->link = url($article->url()); - $xmlArticle->description = Escape::xml($article->text()->kirbytext()); - $xmlArticle->pubDate = $article->date()->toDate(DATE_RSS); - $xmlArticle->guid = url($article->url()); -} - $kirby->response()->type('application/rss+xml'); -echo $feed->asXML(); +$articles = $page->children()->template('article')->sortBy('date', 'desc')->limit(10); + +$writer = new XMLWriter(); +$writer->openMemory(); +$writer->setIndent(true); +$writer->setIndentString(' '); + +$writer->startDocument('1.0', 'UTF-8', 'yes'); + +$writer->startElement('rss'); +$writer->writeAttribute('version', '2.0'); +$writer->writeAttributeNs('xmlns', 'atom', null, 'http://www.w3.org/2005/Atom'); + +$writer->startElement('channel'); +$writer->writeElement('title', $site->title()->toString()); +$writer->writeElement('link', url()); +$writer->writeElement('description', $site->description()->toString()); +$writer->writeElement('language', 'en-GB'); +$writer->writeElement( + 'lastBuildDate', + $articles->first()->date()->toDate(DATE_RSS) +); +$writer->writeElement('generator', 'Kirby CMS'); +$writer->writeElement('docs', 'https://www.rssboard.org/rss-specification'); + +$writer->startElementNs('atom', 'link', null); +$writer->writeAttribute('href', url('/feed')); +$writer->writeAttribute('rel', 'self'); +$writer->writeAttribute('type', 'application/rss+xml'); +$writer->endElement(); // atom:link + +$writer->startElement('image'); +$writer->writeElement('url', url('/assets/img/favicon/favicon.png')); +$writer->writeElement('title', $site->title()->toString()); +$writer->writeElement('link', url()); +$writer->endElement(); // image + +foreach ($articles as $article) { + $writer->startElement('item'); + + $writer->writeElement('title', $article->title()->toString()); + $writer->writeElement('link', url($article->url())); + $writer->writeElement('guid', url($article->url())); + $writer->writeElement('pubDate', $article->date()->toDate(DATE_RSS)); + + $writer->startElement('description'); + $writer->writeCdata($article->text()->kirbytext()->toString()); + $writer->endElement(); // description + + $writer->endElement(); // item +} + +$writer->endElement(); // channel +$writer->endElement(); // rss + +$writer->endDocument(); +echo $writer->outputMemory();