Rewrote flag parsing to use flag-like interface
This commit is contained in:
parent
9a1cd340f3
commit
143fbe7bbc
3 changed files with 42 additions and 45 deletions
2
go.mod
2
go.mod
|
@ -3,7 +3,7 @@ module git.sr.ht/~sircmpwn/openring
|
||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7
|
git.sr.ht/~sircmpwn/getopt v0.0.0-20190621174457-292febf82fd0
|
||||||
github.com/SlyMarbo/rss v1.0.1
|
github.com/SlyMarbo/rss v1.0.1
|
||||||
github.com/mattn/go-runewidth v0.0.4
|
github.com/mattn/go-runewidth v0.0.4
|
||||||
github.com/microcosm-cc/bluemonday v1.0.2
|
github.com/microcosm-cc/bluemonday v1.0.2
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -1,5 +1,7 @@
|
||||||
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7 h1:xTFH5S/3ltiRvAtETLLDFWm5nVIouT5GeCPHm8UaVEU=
|
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7 h1:xTFH5S/3ltiRvAtETLLDFWm5nVIouT5GeCPHm8UaVEU=
|
||||||
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
|
git.sr.ht/~sircmpwn/getopt v0.0.0-20190214165041-9a4f886f9fc7/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
|
||||||
|
git.sr.ht/~sircmpwn/getopt v0.0.0-20190621174457-292febf82fd0 h1:gUeOEsT0mhoCKxKYJk8HeYtUZME686xs70eG2l80W5U=
|
||||||
|
git.sr.ht/~sircmpwn/getopt v0.0.0-20190621174457-292febf82fd0/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
|
||||||
github.com/SlyMarbo/rss v1.0.1 h1:fiaIU5UhcXauVOniHOIocWG7uj8Ej6pHNarMGPJilzA=
|
github.com/SlyMarbo/rss v1.0.1 h1:fiaIU5UhcXauVOniHOIocWG7uj8Ej6pHNarMGPJilzA=
|
||||||
github.com/SlyMarbo/rss v1.0.1/go.mod h1:JNF+T33oj4m5WLCQXpBTCgO+SxRbYVgdiiimHNgzcbA=
|
github.com/SlyMarbo/rss v1.0.1/go.mod h1:JNF+T33oj4m5WLCQXpBTCgO+SxRbYVgdiiimHNgzcbA=
|
||||||
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
|
||||||
|
|
83
openring.go
83
openring.go
|
@ -8,15 +8,35 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.sr.ht/~sircmpwn/getopt"
|
||||||
|
|
||||||
"github.com/SlyMarbo/rss"
|
"github.com/SlyMarbo/rss"
|
||||||
"github.com/mattn/go-runewidth"
|
"github.com/mattn/go-runewidth"
|
||||||
"github.com/microcosm-cc/bluemonday"
|
"github.com/microcosm-cc/bluemonday"
|
||||||
"git.sr.ht/~sircmpwn/getopt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type urlSlice []*url.URL
|
||||||
|
|
||||||
|
func (us *urlSlice) String() string {
|
||||||
|
var str []string
|
||||||
|
for _, u := range *us {
|
||||||
|
str = append(str, u.String())
|
||||||
|
}
|
||||||
|
return strings.Join(str, ", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (us *urlSlice) Set(val string) error {
|
||||||
|
u, err := url.Parse(val)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*us = append(*us, u)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type Article struct {
|
type Article struct {
|
||||||
Date time.Time
|
Date time.Time
|
||||||
Link string
|
Link string
|
||||||
|
@ -28,47 +48,22 @@ type Article struct {
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
narticles int = 3
|
narticles = getopt.Int("n", 3, "article count")
|
||||||
perSource int = 1
|
perSource = getopt.Int("p", 1, "articles to take from each source")
|
||||||
summaryLen int = 256
|
summaryLen = getopt.Int("l", 256, "length of summaries")
|
||||||
sources []*url.URL
|
sources []*url.URL
|
||||||
)
|
)
|
||||||
|
getopt.Var((*urlSlice)(&sources), "s", "list of sources")
|
||||||
|
|
||||||
opts, optind, err := getopt.Getopts(os.Args[1:], "l:n:p:s:")
|
getopt.Usage = func() {
|
||||||
|
log.Fatalf("Usage: %s [-s https://source.rss...] < in.html > out.html",
|
||||||
|
os.Args[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
err := getopt.Parse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
for _, opt := range opts {
|
|
||||||
switch opt.Option {
|
|
||||||
case 'l':
|
|
||||||
summaryLen, err = strconv.Atoi(opt.Value)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
case 'n':
|
|
||||||
narticles, err = strconv.Atoi(opt.Value)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
case 'p':
|
|
||||||
perSource, err = strconv.Atoi(opt.Value)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
case 's':
|
|
||||||
u, err := url.Parse(opt.Value)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
sources = append(sources, u)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(os.Args[optind+1:]) != 0 {
|
|
||||||
log.Fatalf(
|
|
||||||
"Usage: %s [-s https://source.rss...] < in.html > out.html",
|
|
||||||
os.Args[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
input, err := ioutil.ReadAll(os.Stdin)
|
input, err := ioutil.ReadAll(os.Stdin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -111,8 +106,8 @@ func main() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
items := feed.Items
|
items := feed.Items
|
||||||
if len(items) > perSource {
|
if len(items) > *perSource {
|
||||||
items = items[:perSource]
|
items = items[:*perSource]
|
||||||
}
|
}
|
||||||
for _, item := range items {
|
for _, item := range items {
|
||||||
raw_summary := item.Summary
|
raw_summary := item.Summary
|
||||||
|
@ -120,7 +115,7 @@ func main() {
|
||||||
raw_summary = html.UnescapeString(item.Content)
|
raw_summary = html.UnescapeString(item.Content)
|
||||||
}
|
}
|
||||||
summary := runewidth.Truncate(
|
summary := runewidth.Truncate(
|
||||||
policy.Sanitize(raw_summary), summaryLen, "…")
|
policy.Sanitize(raw_summary), *summaryLen, "…")
|
||||||
articles = append(articles, &Article{
|
articles = append(articles, &Article{
|
||||||
Date: item.Date,
|
Date: item.Date,
|
||||||
SourceLink: feed.Link,
|
SourceLink: feed.Link,
|
||||||
|
@ -134,11 +129,11 @@ func main() {
|
||||||
sort.Slice(articles, func(i, j int) bool {
|
sort.Slice(articles, func(i, j int) bool {
|
||||||
return articles[i].Date.After(articles[j].Date)
|
return articles[i].Date.After(articles[j].Date)
|
||||||
})
|
})
|
||||||
if len(articles) < narticles {
|
if len(articles) < *narticles {
|
||||||
narticles = len(articles)
|
*narticles = len(articles)
|
||||||
}
|
}
|
||||||
articles = articles[:narticles]
|
articles = articles[:*narticles]
|
||||||
err = tmpl.Execute(os.Stdout, struct{
|
err = tmpl.Execute(os.Stdout, struct {
|
||||||
Articles []*Article
|
Articles []*Article
|
||||||
}{
|
}{
|
||||||
Articles: articles,
|
Articles: articles,
|
||||||
|
|
Loading…
Reference in a new issue