trending/trending.go

75 lines
1.5 KiB
Go

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)
}