2 linksexp -- Texinfo/XBEL/OPML autogeneration from recfile bookmark
3 Copyright (C) 2021 Sergey Matveev <stargrave@stargrave.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
29 "go.cypherpunks.ru/recfile"
32 type ByTitle []map[string][]string
34 func (a ByTitle) Len() int { return len(a) }
35 func (a ByTitle) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
36 func (a ByTitle) Less(i, j int) bool {
37 return strings.Compare(a[i]["Title"][0], a[j]["Title"][0]) < 0
41 doXBEL := flag.Bool("xbel", false, "Make XBEL")
42 doOPML := flag.Bool("opml", false, "Make OPML")
45 r := recfile.NewReader(os.Stdin)
47 data := make([]map[string][]string, 0)
49 m, err := r.NextMapWithSlice()
59 sort.Strings(m["Category"])
60 data = append(data, m)
62 sort.Sort(ByTitle(data))
67 data := make(map[string][]map[string][]string)
69 m, err := r.NextMapWithSlice()
79 sort.Strings(m["Category"])
80 if cs := m["Category"]; len(cs) == 0 {
81 data["Uncategorized"] = append(data["Uncategorized"], m)
83 for _, cat := range cs {
84 data[cat] = append(data[cat], m)
88 cats := make([]string, 0, len(data))
90 cats = append(cats, c)
91 sort.Sort(ByTitle(data[c]))
100 fmt.Println("Updated:", time.Now().Format(time.RFC3339))
101 fmt.Println("@table @strong")
102 for _, cat := range cats {
103 fmt.Println("@item", cat)
104 fmt.Println("@multitable @columnfractions .05 .8 .1 .05")
106 for n, ent := range ents {
107 catsOther := make([]string, 0)
108 for _, c := range ent["Category"] {
110 catsOther = append(catsOther, c)
114 if len(ent["Note"]) > 0 {
115 note = "(" + ent["Note"][0] + ")"
118 " @item %d @tab @url{%s, %s} %s @tab %s @tab\n",
119 n, ent["URL"][0], ent["Title"][0], note,
120 strings.Join(catsOther, ", "),
122 switch feeds := ent["Feed"]; len(feeds) {
124 fmt.Printf(" @emph{STATIC}\n")
126 fmt.Printf(" @url{%s, feed}\n", feeds[0])
128 for i, feed := range feeds {
129 fmt.Printf(" @url{%s, feed%d}\n", feed, i)
133 fmt.Println("@end multitable")
135 fmt.Println("@end table")