diff --git a/server/handlers.go b/server/handlers.go index c690ac1..a9cf4b3 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -14,6 +14,8 @@ import ( "path/filepath" "strconv" "math" + "html" + "fmt" ) func IndexHandler(rw http.ResponseWriter, req *http.Request) { @@ -412,6 +414,57 @@ func OPMLExportHandler(rw http.ResponseWriter, req *http.Request) { if req.Method == "GET" { rw.Header().Set("Content-Type", "application/xml; charset=utf-8") rw.Header().Set("Content-Disposition", `attachment; filename="subscriptions.opml"`) - rw.Write([]byte("content")) + + builder := strings.Builder{} + + line := func(s string, args ...string) { + if len(args) > 0 { + escapedargs := make([]interface{}, len(args)) + for idx, arg := range args { + escapedargs[idx] = html.EscapeString(arg) + } + s = fmt.Sprintf(s, escapedargs...) + } + builder.WriteString(s) + builder.WriteString("\n") + } + + feedline := func(feed storage.Feed, indent int) { + line( + strings.Repeat(" ", indent) + + ``, + feed.Title, feed.Description, + feed.FeedLink, feed.Link, + ) + } + line(``) + line(``) + line(``) + line(` subscriptions.opml`) + line(``) + line(``) + feedsByFolderID := make(map[int64][]storage.Feed) + for _, feed := range db(req).ListFeeds() { + var folderId = int64(0) + if feed.FolderId != nil { + folderId = *feed.FolderId + } + if feedsByFolderID[folderId] == nil { + feedsByFolderID[folderId] = make([]storage.Feed, 0) + } + feedsByFolderID[folderId] = append(feedsByFolderID[folderId], feed) + } + for _, folder := range db(req).ListFolders() { + line(` `) + } + for _, feed := range feedsByFolderID[0] { + feedline(feed, 2) + } + builder.WriteString(``) + rw.Write([]byte(builder.String())) } }