2022-08-13 13:32:26 +00:00
|
|
|
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 {
|
2022-08-13 16:47:27 +00:00
|
|
|
Guid string `xml:"guid"`
|
|
|
|
Title string `xml:"title"`
|
|
|
|
Link string `xml:"link"`
|
|
|
|
PubDate string `xml:"pubDate"`
|
2022-08-13 13:32:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func RenderRSSFeed(user User) (string, error) {
|
|
|
|
|
|
|
|
config, _ := user.Config()
|
|
|
|
|
|
|
|
rss := RSS{
|
|
|
|
Version: "2.0",
|
|
|
|
Channel: RSSChannel{
|
|
|
|
Title: config.Title,
|
2022-08-13 16:47:27 +00:00
|
|
|
Link: user.FullUrl(),
|
2022-08-13 13:32:26 +00:00
|
|
|
Description: config.SubTitle,
|
|
|
|
Items: make([]RSSItem, 0),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2022-08-13 16:47:27 +00:00
|
|
|
posts, _ := user.Posts()
|
|
|
|
for _, postId := range posts {
|
|
|
|
post, _ := user.GetPost(postId)
|
|
|
|
_, meta := post.MarkdownData()
|
|
|
|
rss.Channel.Items = append(rss.Channel.Items, RSSItem{
|
|
|
|
Guid: postId,
|
|
|
|
Title: post.Title(),
|
|
|
|
Link: post.FullUrl(),
|
2022-08-13 17:07:10 +00:00
|
|
|
PubDate: meta.Date,
|
2022-08-13 16:47:27 +00:00
|
|
|
})
|
|
|
|
}
|
2022-08-13 13:32:26 +00:00
|
|
|
|
|
|
|
buf := new(bytes.Buffer)
|
|
|
|
err := xml.NewEncoder(buf).Encode(rss)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return xml.Header + buf.String(), nil
|
|
|
|
|
|
|
|
}
|