diff options
Diffstat (limited to 'reader/opml/serializer.go')
-rw-r--r-- | reader/opml/serializer.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/reader/opml/serializer.go b/reader/opml/serializer.go new file mode 100644 index 0000000..20c7046 --- /dev/null +++ b/reader/opml/serializer.go @@ -0,0 +1,58 @@ +// Copyright 2017 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package opml + +import ( + "bufio" + "bytes" + "encoding/xml" + "log" +) + +func Serialize(subscriptions SubcriptionList) string { + var b bytes.Buffer + writer := bufio.NewWriter(&b) + writer.WriteString(xml.Header) + + opml := new(Opml) + opml.Version = "2.0" + for categoryName, subs := range groupSubscriptionsByFeed(subscriptions) { + outline := Outline{Text: categoryName} + + for _, subscription := range subs { + outline.Outlines = append(outline.Outlines, Outline{ + Title: subscription.Title, + Text: subscription.Title, + FeedURL: subscription.FeedURL, + SiteURL: subscription.SiteURL, + }) + } + + opml.Outlines = append(opml.Outlines, outline) + } + + encoder := xml.NewEncoder(writer) + encoder.Indent(" ", " ") + if err := encoder.Encode(opml); err != nil { + log.Println(err) + return "" + } + + return b.String() +} + +func groupSubscriptionsByFeed(subscriptions SubcriptionList) map[string]SubcriptionList { + groups := make(map[string]SubcriptionList) + + for _, subscription := range subscriptions { + // if subs, ok := groups[subscription.CategoryName]; !ok { + // groups[subscription.CategoryName] = SubcriptionList{} + // } + + groups[subscription.CategoryName] = append(groups[subscription.CategoryName], subscription) + } + + return groups +} |