2 linksexp -- Texinfo/XBEL/OPML/urls 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")
43 doURLS := flag.Bool("urls", false, "Make newsboat urls")
46 r := recfile.NewReader(os.Stdin)
50 m, err := r.NextMapWithSlice()
60 sort.Strings(m["Category"])
61 cats := strings.Join(m["Category"], " ")
62 for _, f := range m["Feed"] {
70 data := make([]map[string][]string, 0)
72 m, err := r.NextMapWithSlice()
82 sort.Strings(m["Category"])
83 data = append(data, m)
85 sort.Sort(ByTitle(data))
90 data := make(map[string][]map[string][]string)
92 m, err := r.NextMapWithSlice()
102 sort.Strings(m["Category"])
103 if cs := m["Category"]; len(cs) == 0 {
104 data["Uncategorized"] = append(data["Uncategorized"], m)
106 for _, cat := range cs {
107 data[cat] = append(data[cat], m)
111 cats := make([]string, 0, len(data))
112 for c := range data {
113 cats = append(cats, c)
114 sort.Sort(ByTitle(data[c]))
123 fmt.Println("Updated:", time.Now().Format(time.RFC3339))
126 fmt.Println("Categories:")
127 for _, cat := range cats {
128 fmt.Printf("* %s: LinksCat%s\n", cat, cat)
130 fmt.Println("@end menu")
132 for _, cat := range cats {
133 fmt.Println("@node", "LinksCat"+cat)
134 fmt.Println("@section Links category:", cat)
135 fmt.Println("@multitable @columnfractions .05 .8 .1 .05")
136 fmt.Println("@headitem @tab @tab Other categories @tab Feed URLs")
138 for n, ent := range ents {
139 catsOther := make([]string, 0)
140 for _, c := range ent["Category"] {
142 catsOther = append(catsOther, c)
146 if len(ent["Note"]) > 0 {
147 note = "(" + ent["Note"][0] + ")"
150 " @item %d @tab @url{%s,, %s} %s @tab %s @tab\n",
151 n, ent["URL"][0], ent["Title"][0], note,
152 strings.Join(catsOther, ", "),
154 switch feeds := ent["Feed"]; len(feeds) {
156 fmt.Printf(" @emph{STATIC}\n")
160 strings.ReplaceAll(feeds[0], "@", "@@"),
163 for i, feed := range feeds {
164 fmt.Printf(" @url{%s, feed%d}\n", feed, i)
168 fmt.Println("@end multitable")