summaryrefslogtreecommitdiff
path: root/internal/href/href.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/href/href.go')
-rw-r--r--internal/href/href.go34
1 files changed, 32 insertions, 2 deletions
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."):