From 2735a0388e96fd4d09201ae5451e1a972ef2130a Mon Sep 17 00:00:00 2001 From: demo Date: Sun, 10 May 2026 11:57:56 -0400 Subject: feat: implement find for finding links --- internal/links/find.go | 35 +++++++++++++++++++++++++++++++++++ internal/links/find_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 internal/links/find.go create mode 100644 internal/links/find_test.go diff --git a/internal/links/find.go b/internal/links/find.go new file mode 100644 index 0000000..33b24d5 --- /dev/null +++ b/internal/links/find.go @@ -0,0 +1,35 @@ +package links + +import ( + "io" + + "golang.org/x/net/html" + "golang.org/x/net/html/atom" +) + +func find(htmlInput io.Reader) ([]string, error) { + doc, err := html.Parse(htmlInput) + if err != nil { + return nil, err + } + + hrefs := findHrefs(doc) + + return hrefs, nil +} + +// findHrefs returns all link addresses inside doc. +func findHrefs(doc *html.Node) []string { + var hrefs []string + for node := range doc.Descendants() { + if node.Type == html.ElementNode && node.DataAtom == atom.A { + for _, attr := range node.Attr { + if attr.Key == "href" { + hrefs = append(hrefs, attr.Val) + } + } + } + } + + return hrefs +} diff --git a/internal/links/find_test.go b/internal/links/find_test.go new file mode 100644 index 0000000..a4c952e --- /dev/null +++ b/internal/links/find_test.go @@ -0,0 +1,34 @@ +package links + +import ( + "strings" + "testing" +) + +const ( + ex1 = ` + + + Ex 1 + + + Example Page + Posts + + +` +) + +func TestFindCountHrefs(t *testing.T) { + r := strings.NewReader(ex1) + hrefs, err := find(r) + if err != nil { + t.Error(err) + } + + const expectedLen = 2 + + if actualLen := len(hrefs); actualLen != expectedLen { + t.Errorf("got %d, want %d", actualLen, expectedLen) + } +} -- cgit v1.2.3