From 090d2fae173d241ee93966e6c6aa95e7d0ec9e86 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 6 Jul 2019 18:34:01 +0200 Subject: simplify --- internal/href/href.go | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'internal/href/href.go') diff --git a/internal/href/href.go b/internal/href/href.go index d134f67..f224d27 100644 --- a/internal/href/href.go +++ b/internal/href/href.go @@ -3,12 +3,14 @@ package href import ( "context" "errors" + "fmt" "io" "net/http" "strings" "time" "unicode/utf8" + lru "github.com/hashicorp/golang-lru" "golang.org/x/net/html" "golang.org/x/net/html/charset" ) @@ -23,6 +25,34 @@ var ( const maxLength = 10 * 1024 * 1024 // 10MB +type Titles struct { + cache *lru.Cache + w io.Writer +} + +func NewTitles(w io.Writer) *Titles { + cache, _ := lru.New(100) + return &Titles{cache: cache, w: w} +} + +func (t *Titles) Resolve(text string) { + for _, v := range parseLinks(text) { + if v == "" { + continue + } + title, ok := t.cache.Get(v) + if ok { + fmt.Fprintf(t.w, "Title: %v (cached)", title) + continue + } + title, err := fetch(v) + if err == nil { + t.cache.Add(v, title) + fmt.Fprintf(t.w, "Title: %v", title) + } + } +} + func title(r io.Reader) (string, error) { var inTitle bool z := html.NewTokenizer(r) @@ -51,7 +81,7 @@ func title(r io.Reader) (string, error) { return "", errNoTitle } -func Title(uri string) (string, error) { +func fetch(uri string) (string, error) { req, err := http.NewRequest("GET", uri, nil) if err != nil { return "", err @@ -86,7 +116,7 @@ func Title(uri string) (string, error) { return title(r) } -func Links(s string) (ret []string) { +func parseLinks(s string) (ret []string) { for _, v := range strings.Fields(s) { switch { case strings.HasPrefix(v, "www."): -- cgit v1.2.3