]> Sergey Matveev's repositories - linksexp.git/blob - xbel.go
Unify copyright comment format
[linksexp.git] / xbel.go
1 // linksexp -- Texinfo/XBEL/OPML/urls autogeneration from recfile bookmark
2 // Copyright (C) 2021-2024 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, version 3 of the License.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 package main
17
18 import (
19         "encoding/xml"
20         "os"
21 )
22
23 type Link struct {
24         Href string `xml:"href,attr"`
25 }
26
27 type Feed struct {
28         Owner string `xml:"owner,attr"`
29         Link  Link   `xml:"link"`
30 }
31
32 type Bookmark struct {
33         Href  string `xml:"href,attr"`
34         Title string `xml:"title"`
35         Feeds []Feed `xml:"info>metadata,omitempty"`
36 }
37
38 type Folder struct {
39         Title     string     `xml:"title"`
40         Bookmarks []Bookmark `xml:"bookmark"`
41 }
42
43 type XBEL struct {
44         XMLName xml.Name `xml:"xbel"`
45         Version string   `xml:"version,attr"`
46         Folders []Folder `xml:"folder"`
47 }
48
49 func xbel(cats []string, data map[string][]map[string][]string) {
50         folders := make([]Folder, 0, len(cats))
51         for _, cat := range cats {
52                 ents := data[cat]
53                 bs := make([]Bookmark, 0, len(ents))
54                 for _, ent := range ents {
55                         b := Bookmark{Href: ent["URL"][0], Title: ent["Title"][0]}
56                         for _, url := range ent["Feed"] {
57                                 b.Feeds = append(b.Feeds, Feed{Owner: "webfeed", Link: Link{url}})
58                         }
59                         bs = append(bs, b)
60                 }
61                 folders = append(folders, Folder{Title: cat, Bookmarks: bs})
62         }
63         x := XBEL{Version: "1.0", Folders: folders}
64         out, err := xml.MarshalIndent(&x, "", "  ")
65         if err != nil {
66                 panic(err)
67         }
68         os.Stdout.WriteString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
69         os.Stdout.WriteString("<!DOCTYPE xbel>\n")
70         os.Stdout.Write(out)
71 }