package main import ( "fmt" "net/http" "strings" "github.com/PuerkitoBio/goquery" ) func trendingLang(lang string, timeframes []string) (language, error) { l := language{ repositories: make([]repository, 0), } repoMap := make(map[repository]struct{}) for _, timeframe := range timeframes { la, err := trendingRepos(lang, timeframe) if err != nil { return la, err } l.color = la.color for _, r := range la.repositories { repoMap[r] = struct{}{} } } for repo := range repoMap { l.repositories = append(l.repositories, repo) } return l, nil } func trendingRepos(lang, timeframe string) (language, error) { u := fmt.Sprintf("https://github.com/trending/%s?since=%s", lang, timeframe) res, err := http.Get(u) if err != nil { return language{}, err } defer res.Body.Close() doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { return language{}, err } var l language doc.Find(".Box-row").Each(func(_ int, s *goquery.Selection) { if l.color == "" { rlcStyle, _ := s.Find(".repo-language-color").Attr("style") l.color = strings.Fields(rlcStyle)[1] } e := s.Find("h1 a") repo := strings.Join(strings.Fields(e.Text()), "") d := strings.TrimSpace(s.Find("p").Text()) l.repositories = append(l.repositories, repository{name: repo, description: d}) }) return l, nil } type language struct { color string repositories []repository } type repository struct { name string description string } func (r repository) link() string { return fmt.Sprintf("https://github.com/%s", r.name) }