diff options
| author | lost+skunk <[email protected]> | 2024-07-09 12:54:15 +0300 |
|---|---|---|
| committer | lost+skunk <[email protected]> | 2024-07-09 12:54:15 +0300 |
| commit | 0f528ee9fa8b84c5e7532e22480b8b4b3ff7d5ba (patch) | |
| tree | 2609896980f76fc47b6a04fc9ddc9e344ae99641 /app | |
| parent | e07e1a25b26d3fd2b8fd097491d055fe7b002d2b (diff) | |
| download | skunky-art-0f528ee9fa8b84c5e7532e22480b8b4b3ff7d5ba.tar.gz skunky-art-0f528ee9fa8b84c5e7532e22480b8b4b3ff7d5ba.tar.bz2 skunky-art-0f528ee9fa8b84c5e7532e22480b8b4b3ff7d5ba.zip | |
Поиск по группам
Diffstat (limited to 'app')
| -rw-r--r-- | app/util.go | 40 | ||||
| -rw-r--r-- | app/wrapper.go | 64 |
2 files changed, 78 insertions, 26 deletions
diff --git a/app/util.go b/app/util.go index eb1c7ce..645ceb4 100644 --- a/app/util.go +++ b/app/util.go @@ -66,12 +66,35 @@ func (s skunkyart) ConvertDeviantArtUrlToSkunkyArt(url string) (output string) { return } +func BuildUserPlate(name string) string { + var htm strings.Builder + htm.WriteString(`<div class="user-plate"><img src="`) + htm.WriteString(UrlBuilder("media", "emojitar", name, "?type=a")) + htm.WriteString(`"><a href="`) + htm.WriteString(UrlBuilder("group_user", "?type=about&q=", name)) + htm.WriteString(`">`) + htm.WriteString(name) + htm.WriteString(`</a></div>`) + return htm.String() +} + type text struct { TXT string from int to int } +func tagval(t *html.Tokenizer) string { + for tt := t.Next(); ; { + switch tt { + default: + return "" + case html.TextToken: + return string(t.Text()) + } + } +} + func ParseDescription(dscr devianter.Text) string { var parseddescription strings.Builder TagBuilder := func(tag string, content string) string { @@ -182,20 +205,7 @@ func ParseDescription(dscr devianter.Text) string { } } } else if dl != 0 { - tagval := func(t *html.Tokenizer) string { - for { - tt := t.Next() - switch tt { - case html.ErrorToken: - return "" - case html.TextToken: - return string(t.Text()) - } - } - } - - tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)) - for { + for tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)); ; { t := tt.Next() switch t { case html.ErrorToken: @@ -314,7 +324,7 @@ func (s skunkyart) NavBase(c dlist) string { } // вперёд-назад - if c.More { + if p != 417 || c.More { prevrev("| Next =>", p+1, false) } diff --git a/app/wrapper.go b/app/wrapper.go index 0340aed..0303c6a 100644 --- a/app/wrapper.go +++ b/app/wrapper.go @@ -10,6 +10,7 @@ import ( "time" "git.macaw.me/skunky/devianter" + "golang.org/x/net/html" ) var wr = io.WriteString @@ -131,13 +132,7 @@ func (s skunkyart) GRUser() { case "group_admins": var htm strings.Builder for _, z := range x.ModuleData.GroupAdmins.Results { - htm.WriteString(`<div class="admin"><img src="`) - htm.WriteString(UrlBuilder("media", "emojitar", z.User.Username, "?type=a")) - htm.WriteString(`"><a href="`) - htm.WriteString(UrlBuilder("group_user", "?type=about&q=", z.User.Username)) - htm.WriteString(`">`) - htm.WriteString(z.User.Username) - htm.WriteString(`</a></div>`) + htm.WriteString(BuildUserPlate(z.User.Username)) } group.Admins += htm.String() } @@ -270,15 +265,62 @@ func (s skunkyart) Search() { ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type) case 'g': ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type, s.Args.Get("usr")) + case 'r': // скраппер, поскольку девиантартовцы зажопили гостевое API для поиска групп + var ( + usernames = make(map[int]string) + url strings.Builder + num int + ) + + s.Page++ + + url.WriteString("https://www.deviantart.com/groups/?q=") + url.WriteString(s.Query) + if s.Page > 1 { + url.WriteString("&offset=") + url.WriteString(strconv.Itoa(10 * s.Page)) + } + + r, err := http.Get(url.String()) + if err != nil { + s.ReturnHTTPError(502) + } + defer r.Body.Close() + + for z := html.NewTokenizer(r.Body); ; { + if n, token := z.Next(), z.Token(); n == html.StartTagToken && token.Data == "a" { + for _, x := range token.Attr { + if x.Key == "class" && x.Val == "u regular username" { + usernames[num] = tagval(z) + num++ + } + } + } else if n == 0 { + break + } else { + continue + } + } + + if l := len(usernames); l != 0 { + ss.List += `<div class="content plates">` + for x := 0; x < len(usernames); x++ { + ss.List += BuildUserPlate(usernames[x]) + } + ss.List += `</div>` + ss.List += s.NavBase(dlist{}) + } default: s.ReturnHTTPError(400) } err(e) - ss.List = s.DeviationList(ss.Content.Results, dlist{ - Pages: ss.Content.Pages, - More: ss.Content.HasMore, - }) + if s.Type != 'r' { + ss.List = s.DeviationList(ss.Content.Results, dlist{ + Pages: ss.Content.Pages, + More: ss.Content.HasMore, + }) + } s.ExecuteTemplate("html/search.htm", &s) } |
