aboutsummaryrefslogtreecommitdiffhomepage
path: root/reader/opml/serializer.go
diff options
context:
space:
mode:
Diffstat (limited to 'reader/opml/serializer.go')
-rw-r--r--reader/opml/serializer.go58
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
+}