Skip to content

Instantly share code, notes, and snippets.

@mattmccray
Last active August 12, 2020 19:33
Show Gist options
  • Save mattmccray/8149def5a8c8b8f7ce3cec1109d69fce to your computer and use it in GitHub Desktop.
Save mattmccray/8149def5a8c8b8f7ce3cec1109d69fce to your computer and use it in GitHub Desktop.
Tilt feed component
import { renderMarkdown, useCollection, useFiles, usePage, useSite, xml } from "../packages/tilt/index.js";
export default function Feed(props, children) {
const site = useSite()
const posts = useCollection('posts')
const buildDate = (new Date()).toUTCString()
return xml`<?xml version="1.0" encoding="UTF-8"?>
<rss
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>
<![CDATA[${site.title}]]>
</title>
<description>
<![CDATA[${renderMarkdown(site.description)}]]>
</description>
<link>${site.url}</link>
<generator>tilt</generator>
<lastBuildDate>${buildDate}</lastBuildDate>
<atom:link href="${site.url}/feed.xml" rel="self" type="application/rss+xml"/>
<author>
<![CDATA[${site.author}]]>
</author>
${posts.slice(0, 5).map(post => xml`
${Item({ ...post, author: site.author, category: getCategory(post) })}
`)}
</channel>
</rss>
`
}
function Item({ title, description, permalink, category, date, author }, children) {
date = date instanceof Date ? date.toUTCString() : date
return xml`
<item>
<title>
<![CDATA[${title}]]>
</title>
<description>
<![CDATA[${renderMarkdown(description)}]]>
</description>
<link>${permalink}</link>
<guid isPermaLink="true">${permalink}</guid>
<category>
<![CDATA[${category}]]>
</category>
<dc:creator>
<![CDATA[${author}]]>
</dc:creator>
<pubDate>${date}</pubDate>
</item>
`
}
const getCategory = (post) =>
(post.categories[0] || []).map(c => c.name).join('/')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment