GoBlog/feeds.go

60 lines
1.3 KiB
Go
Raw Normal View History

2020-09-02 15:48:37 +00:00
package main
import (
"github.com/gorilla/feeds"
"net/http"
"time"
)
type feedType string
const (
RSS feedType = "rss"
ATOM feedType = "atom"
JSON feedType = "json"
)
func generateFeed(f feedType, w http.ResponseWriter, posts []*Post, title string, description string) {
now := time.Now()
feed := &feeds.Feed{
Title: title,
Description: description,
Link: &feeds.Link{},
Created: now,
}
for _, postItem := range posts {
htmlContent, _ := renderMarkdown(postItem.Content)
feed.Add(&feeds.Item{
Title: postItem.title(),
Link: &feeds.Link{Href: postItem.Path},
Description: string(htmlContent),
Id: postItem.Path,
Content: string(htmlContent),
})
}
var feedStr string
var err error
switch f {
case RSS:
feedStr, err = feed.ToRss()
case ATOM:
feedStr, err = feed.ToAtom()
case JSON:
feedStr, err = feed.ToJSON()
}
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
switch f {
case RSS:
w.Header().Add("Content-Type", "application/rss+xml; charset=utf-8")
case ATOM:
w.Header().Add("Content-Type", "application/atom+xml; charset=utf-8")
case JSON:
w.Header().Add("Content-Type", "application/feed+json; charset=utf-8")
}
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte(feedStr))
}