rewrite opml
This commit is contained in:
parent
1c810f68f8
commit
7d7feda319
7 changed files with 244 additions and 155 deletions
78
src/opml/opml.go
Normal file
78
src/opml/opml.go
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
package opml
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"html"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Folder struct {
|
||||
Title string
|
||||
Folders []*Folder
|
||||
Feeds []*Feed
|
||||
}
|
||||
|
||||
type Feed struct {
|
||||
Title string
|
||||
FeedUrl string
|
||||
SiteUrl string
|
||||
}
|
||||
|
||||
func NewFolder(title string) *Folder {
|
||||
return &Folder{
|
||||
Title: title,
|
||||
Folders: make([]*Folder, 0),
|
||||
Feeds: make([]*Feed, 0),
|
||||
}
|
||||
}
|
||||
|
||||
func (f *Folder) AllFeeds() []*Feed {
|
||||
feeds := make([]*Feed, 0)
|
||||
feeds = append(feeds, f.Feeds...)
|
||||
for _, subfolder := range f.Folders {
|
||||
feeds = append(feeds, subfolder.AllFeeds()...)
|
||||
}
|
||||
return feeds
|
||||
}
|
||||
|
||||
var e = html.EscapeString
|
||||
var indent = " "
|
||||
var nl = "\n"
|
||||
|
||||
func (f *Folder) outline(level int) string {
|
||||
builder := strings.Builder{}
|
||||
prefix := strings.Repeat(indent, level)
|
||||
|
||||
if level > 0 {
|
||||
builder.WriteString(prefix + fmt.Sprintf(`<outline text="%s">` + nl, e(f.Title)))
|
||||
}
|
||||
for _, folder := range f.Folders {
|
||||
builder.WriteString(folder.outline(level + 1))
|
||||
}
|
||||
for _, feed := range f.Feeds {
|
||||
builder.WriteString(feed.outline(level + 1))
|
||||
}
|
||||
if level > 0 {
|
||||
builder.WriteString(prefix + `</outline>` + nl)
|
||||
}
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
func (f *Feed) outline(level int) string {
|
||||
return strings.Repeat(indent, level) + fmt.Sprintf(
|
||||
`<outline type="rss" text="%s" xmlUrl="%s" htmlUrl="%s"/>` + nl,
|
||||
e(f.Title), e(f.FeedUrl), e(f.SiteUrl),
|
||||
)
|
||||
}
|
||||
|
||||
func (f *Folder) OPML() string {
|
||||
builder := strings.Builder{}
|
||||
builder.WriteString(`<?xml version="1.0" encoding="UTF-8"?>` + nl)
|
||||
builder.WriteString(`<opml version="1.1">` + nl)
|
||||
builder.WriteString(`<head><title>subscriptions</title></head>` + nl)
|
||||
builder.WriteString(`<body>` + nl)
|
||||
builder.WriteString(f.outline(0))
|
||||
builder.WriteString(`</body>` + nl)
|
||||
builder.WriteString(`</opml>` + nl)
|
||||
return builder.String()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue