owl-blogs/rss.go

67 lines
1.2 KiB
Go

package owl
import (
"bytes"
"encoding/xml"
)
type RSS struct {
XMLName xml.Name `xml:"rss"`
Version string `xml:"version,attr"`
Channel RSSChannel `xml:"channel"`
}
type RSSChannel struct {
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
Items []RSSItem `xml:"item"`
}
type RSSItem struct {
Guid string `xml:"guid"`
Title string `xml:"title"`
Link string `xml:"link"`
PubDate string `xml:"pubDate"`
}
func RenderRSSFeed(user User) (string, error) {
config, _ := user.Config()
rss := RSS{
Version: "2.0",
Channel: RSSChannel{
Title: config.Title,
Link: user.FullUrl(),
Description: config.SubTitle,
Items: make([]RSSItem, 0),
},
}
posts, _ := user.Posts()
for _, postId := range posts {
post, _ := user.GetPost(postId)
_, meta := post.MarkdownData()
date, ok := meta["date"]
if !ok {
date = ""
}
rss.Channel.Items = append(rss.Channel.Items, RSSItem{
Guid: postId,
Title: post.Title(),
Link: post.FullUrl(),
PubDate: date.(string),
})
}
buf := new(bytes.Buffer)
err := xml.NewEncoder(buf).Encode(rss)
if err != nil {
return "", err
}
return xml.Header + buf.String(), nil
}