package atom import ( "encoding/xml" "fmt" "path/filepath" "time" "git.icyphox.sh/vite/config" "git.icyphox.sh/vite/types" ) 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 []types.Post) ([]byte, error) { entries := []AtomEntry{} 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", config.Config.URL[8:], // strip https:// dateStr, filepath.Join(srcDir, p.Meta["slug"]), ), // filepath.Join strips the second / in http:// Link: &AtomLink{Href: config.Config.URL + filepath.Join(srcDir, p.Meta["slug"])}, Summary: &AtomSummary{ Content: fmt.Sprintf("