Commit 0f528ee9fa

0f528ee9fa8b84c5e7532e22480b8b4b3ff7d5ba

parent: e07e1a25b2

Unsigned

lost+skunk <skunky@ebloid.ru> · 2024-07-09 09:54 UTC

Поиск по группам

Layout: unified · split

app/util.go +25 −15
@@ -66,12 +66,35 @@ func (s skunkyart) ConvertDeviantArtUrlToSkunkyArt(url string) (output string) {
6666 return
6767}
6868
69func BuildUserPlate(name string) string {
70 var htm strings.Builder
71 htm.WriteString(`<div class="user-plate"><img src="`)
72 htm.WriteString(UrlBuilder("media", "emojitar", name, "?type=a"))
73 htm.WriteString(`"><a href="`)
74 htm.WriteString(UrlBuilder("group_user", "?type=about&q=", name))
75 htm.WriteString(`">`)
76 htm.WriteString(name)
77 htm.WriteString(`</a></div>`)
78 return htm.String()
79}
80
6981type text struct {
7082 TXT string
7183 from int
7284 to int
7385}
7486
87func tagval(t *html.Tokenizer) string {
88 for tt := t.Next(); ; {
89 switch tt {
90 default:
91 return ""
92 case html.TextToken:
93 return string(t.Text())
94 }
95 }
96}
97
7598func ParseDescription(dscr devianter.Text) string {
7699 var parseddescription strings.Builder
77100 TagBuilder := func(tag string, content string) string {
@@ -182,20 +205,7 @@ func ParseDescription(dscr devianter.Text) string {
182205 }
183206 }
184207 } else if dl != 0 {
185 tagval := func(t *html.Tokenizer) string {
186 for {
187 tt := t.Next()
188 switch tt {
189 case html.ErrorToken:
190 return ""
191 case html.TextToken:
192 return string(t.Text())
193 }
194 }
195 }
196
197 tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup))
198 for {
208 for tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)); ; {
199209 t := tt.Next()
200210 switch t {
201211 case html.ErrorToken:
@@ -314,7 +324,7 @@ func (s skunkyart) NavBase(c dlist) string {
314324 }
315325
316326 // вперёд-назад
317 if c.More {
327 if p != 417 || c.More {
318328 prevrev("| Next =>", p+1, false)
319329 }
320330
app/wrapper.go +53 −11
@@ -10,6 +10,7 @@ import (
1010 "time"
1111
1212 "git.macaw.me/skunky/devianter"
13 "golang.org/x/net/html"
1314)
1415
1516var wr = io.WriteString
@@ -131,13 +132,7 @@ func (s skunkyart) GRUser() {
131132 case "group_admins":
132133 var htm strings.Builder
133134 for _, z := range x.ModuleData.GroupAdmins.Results {
134 htm.WriteString(`<div class="admin"><img src="`)
135 htm.WriteString(UrlBuilder("media", "emojitar", z.User.Username, "?type=a"))
136 htm.WriteString(`"><a href="`)
137 htm.WriteString(UrlBuilder("group_user", "?type=about&q=", z.User.Username))
138 htm.WriteString(`">`)
139 htm.WriteString(z.User.Username)
140 htm.WriteString(`</a></div>`)
135 htm.WriteString(BuildUserPlate(z.User.Username))
141136 }
142137 group.Admins += htm.String()
143138 }
@@ -270,15 +265,62 @@ func (s skunkyart) Search() {
270265 ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type)
271266 case 'g':
272267 ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type, s.Args.Get("usr"))
268 case 'r': // скраппер, поскольку девиантартовцы зажопили гостевое API для поиска групп
269 var (
270 usernames = make(map[int]string)
271 url strings.Builder
272 num int
273 )
274
275 s.Page++
276
277 url.WriteString("https://www.deviantart.com/groups/?q=")
278 url.WriteString(s.Query)
279 if s.Page > 1 {
280 url.WriteString("&offset=")
281 url.WriteString(strconv.Itoa(10 * s.Page))
282 }
283
284 r, err := http.Get(url.String())
285 if err != nil {
286 s.ReturnHTTPError(502)
287 }
288 defer r.Body.Close()
289
290 for z := html.NewTokenizer(r.Body); ; {
291 if n, token := z.Next(), z.Token(); n == html.StartTagToken && token.Data == "a" {
292 for _, x := range token.Attr {
293 if x.Key == "class" && x.Val == "u regular username" {
294 usernames[num] = tagval(z)
295 num++
296 }
297 }
298 } else if n == 0 {
299 break
300 } else {
301 continue
302 }
303 }
304
305 if l := len(usernames); l != 0 {
306 ss.List += `<div class="content plates">`
307 for x := 0; x < len(usernames); x++ {
308 ss.List += BuildUserPlate(usernames[x])
309 }
310 ss.List += `</div>`
311 ss.List += s.NavBase(dlist{})
312 }
273313 default:
274314 s.ReturnHTTPError(400)
275315 }
276316 err(e)
277317
278 ss.List = s.DeviationList(ss.Content.Results, dlist{
279 Pages: ss.Content.Pages,
280 More: ss.Content.HasMore,
281 })
318 if s.Type != 'r' {
319 ss.List = s.DeviationList(ss.Content.Results, dlist{
320 Pages: ss.Content.Pages,
321 More: ss.Content.HasMore,
322 })
323 }
282324
283325 s.ExecuteTemplate("html/search.htm", &s)
284326}
css/skunky.css +9 −5
@@ -82,7 +82,7 @@ form input, button, select {
8282 border: 3px solid #4d27d6;
8383 transition: 400ms;
8484}
85.block img, .admins .admin img{
85.block img, .plates .user-plate img{
8686 width: 100%;
8787}
8888.block p {
@@ -103,16 +103,20 @@ form input, button, select {
103103 background-color: #060820;
104104 border: 3px solid #060820;
105105}
106.admins {
106.plates {
107107 display: flex
108108}
109.admins .admin {
110 margin-left: 1%;
109.admins .user-plate {
110 width: 5%;
111111 background-color: #011522;
112}
113.plates .user-plate {
114 margin-left: 1%;
115 background-color: #091f19;
112116 padding: 3px;
113117 word-break: break-all;
114118 text-align: center;
115 width: 5%;
119 max-width: 15%;
116120}
117121
118122@media screen and (orientation: portrait) {
html/about.htm +1
@@ -12,6 +12,7 @@
1212 <select name="type">
1313 <option value="all">All</option>
1414 <option value="tag">Tag</option>
15 <option value="r">Groups</option>
1516 </select>
1617 <button type="submit">Search!</button>
1718 </form>
html/deviantion.htm +1
@@ -12,6 +12,7 @@
1212 <select name="type">
1313 <option value="all">All</option>
1414 <option value="tag">Tag</option>
15 <option value="r">Groups</option>
1516 </select>
1617 <button type="submit">Search!</button>
1718 </form>
html/gruser.htm +2 −1
@@ -22,6 +22,7 @@
2222 <option value="gallery">Gallery</option>
2323 <option value="all">All</option>
2424 <option value="tag">Tag</option>
25 <option value="r">Groups</option>
2526 </select>
2627 <button type="submit">Search!</button>
2728 </form> <h1>| {{.Templates.GroupUser.GR.Owner.Username}}</h1>
@@ -57,7 +58,7 @@
5758
5859 {{if ne .Templates.GroupUser.Admins ""}}
5960 <h3 id="admins"><a href="#admins">#</a> Group admins</h3>
60 <div class="admins">
61 <div class="plates admins">
6162 {{.Templates.GroupUser.Admins}}
6263 </div>
6364 {{end}}
html/index.htm +1
@@ -11,6 +11,7 @@
1111 <select name="type">
1212 <option value="all">All</option>
1313 <option value="tag">Tag</option>
14 <option value="r">Groups</option>
1415 </select>
1516 <button type="submit">Search!</button>
1617 </form>
html/list.htm +1
@@ -12,6 +12,7 @@
1212 <select name="type">
1313 <option value="all">All</option>
1414 <option value="tag">Tag</option>
15 <option value="r">Groups</option>
1516 </select>
1617 <button type="submit">Search!</button>
1718 </form>
html/search.htm +1
@@ -12,6 +12,7 @@
1212 <select name="type">
1313 <option value="all">All</option>
1414 <option value="tag">Tag</option>
15 <option value="r">Groups</option>
1516 </select>
1617 <button type="submit">Search!</button>
1718 </form>