atom/feed.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
package atom
import (
"encoding/xml"
"fmt"
"path/filepath"
"time"
"git.icyphox.sh/vite/config"
"git.icyphox.sh/vite/markdown"
)
type AtomLink struct {
XMLName xml.Name `xml:"link"`
Href string `xml:"href,attr"`
Rel string `xml:"rel,attr,omitempty"`
}
type AtomSummary struct {
XMLName xml.Name `xml:"summary"`
Content string `xml:",chardata"`
Type string `xml:"type,attr"`
}
type AtomAuthor struct {
XMLName xml.Name `xml:"author"`
Name string `xml:"name"`
Email string `xml:"email"`
}
type AtomEntry struct {
XMLName xml.Name `xml:"entry"`
Title string `xml:"title"`
Updated string `xml:"updated"`
ID string `xml:"id"`
Link *AtomLink
Summary *AtomSummary
}
type AtomFeed struct {
XMLName xml.Name `xml:"feed"`
Xmlns string `xml:"xmlns,attr"`
Title string `xml:"title"`
Subtitle string `xml:"subtitle"`
ID string `xml:"id"`
Updated string `xml:"updated"`
Link *AtomLink
Author *AtomAuthor `xml:"author"`
Entries []AtomEntry
}
// Creates a new Atom feed.
func NewAtomFeed(srcDir string, posts []markdown.Output) ([]byte, error) {
entries := []AtomEntry{}
cfg := config.ConfigYaml{}
cfg.ParseConfig()
for _, p := range posts {
dateStr := p.Meta["date"]
date, err := time.Parse("2006-01-02", dateStr)
if err != nil {
return nil, err
}
rfc3339 := date.Format(time.RFC3339)
entry := AtomEntry{
Title: p.Meta["title"],
Updated: rfc3339,
// tag:icyphox.sh,2019-10-23:blog/some-post/
ID: fmt.Sprintf(
"tag:%s,%s:%s",
cfg.URL[8:], // strip https://
dateStr,
filepath.Join(srcDir, p.Meta["slug"]),
),
Link: &AtomLink{Href: filepath.Join(cfg.URL, srcDir, p.Meta["slug"])},
Summary: &AtomSummary{Content: string(p.HTML), Type: "html"},
}
entries = append(entries, entry)
}
// 2021-07-14T00:00:00Z
now := time.Now().Format(time.RFC3339)
feed := &AtomFeed{
Xmlns: "http://www.w3.org/2005/Atom",
Title: cfg.Title,
ID: cfg.URL,
Subtitle: cfg.Desc,
Link: &AtomLink{Href: cfg.URL},
Author: &AtomAuthor{
Name: cfg.Author.Name,
Email: cfg.Author.Email,
},
Updated: now,
Entries: entries,
}
feedXML, err := xml.MarshalIndent(feed, " ", " ")
if err != nil {
return nil, err
}
// Add the <?xml...> header.
return []byte(xml.Header + string(feedXML)), nil
}
|