diff options
| author | lost+skunk <[email protected]> | 2024-06-30 14:40:27 +0300 |
|---|---|---|
| committer | lost+skunk <[email protected]> | 2024-06-30 14:40:27 +0300 |
| commit | ed031b353078d0b58a67981de4d463c8563a20d7 (patch) | |
| tree | 2c71d700de7f5661a97690cf2b6a313bf5263355 /app/util.go | |
| parent | a8633b828f3e4e2d232e2194d9f2b85cdcd9e8db (diff) | |
| download | skunky-art-ed031b353078d0b58a67981de4d463c8563a20d7.tar.gz skunky-art-ed031b353078d0b58a67981de4d463c8563a20d7.tar.bz2 skunky-art-ed031b353078d0b58a67981de4d463c8563a20d7.zip | |
попытка реализовать галерею. так сыро потому что мне скоро уезжать
Diffstat (limited to 'app/util.go')
| -rw-r--r-- | app/util.go | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/app/util.go b/app/util.go index 7c4d104..e4a1de2 100644 --- a/app/util.go +++ b/app/util.go @@ -2,11 +2,38 @@ package app import ( "encoding/json" + "net/http" + "strconv" "strings" + "text/template" "git.macaw.me/skunky/devianter" ) +// парсинг темплейтов +func (s skunkyart) ExecuteTemplate(file string, data any) { + var buf strings.Builder + tmp, e := template.ParseFiles(file) + err(e) + err(tmp.Execute(&buf, &data)) + wr(s.Writer, buf.String()) +} + +func (s skunkyart) ReturnHTTPError(status int) { + s.Writer.WriteHeader(status) + + // пострйока с помощью strings.Builder, потому что такой метод быстрее обычного сложения + var msg strings.Builder + msg.WriteString(`<html><link rel="stylesheet" href="/gui/css/skunky.css" />`) + msg.WriteString("<h1>") + msg.WriteString(strconv.Itoa(status)) + msg.WriteString(" - ") + msg.WriteString(http.StatusText(status)) + msg.WriteString("</h1></html>") + + wr(s.Writer, msg.String()) +} + type text struct { TXT string from int @@ -87,3 +114,174 @@ func ParseDescription(dscr devianter.Text) string { return parseddescription.String() } + +// навигация по страницам +type dlist struct { + Pages int + More bool +} + +// FIXME: на некоротрых артах первая страница может вызывать полное отсутствие панели навигации. +func (s skunkyart) NavBase(c dlist) string { + // TODO: сделать понятнее + // навигация по страницам + var list strings.Builder + list.WriteString("<br>") + p := s.Page + + // функция для генерации ссылок + prevrev := func(msg string, page int, onpage bool) { + if !onpage { + list.WriteString(`<a href="?p=`) + list.WriteString(strconv.Itoa(page)) + if s.Type != 0 { + list.WriteString("&type=") + list.WriteRune(s.Type) + } + if s.Query != "" { + list.WriteString("&q=") + list.WriteString(s.Query) + } + list.WriteString(`">`) + list.WriteString(msg) + list.WriteString("</a> ") + } else { + list.WriteString(strconv.Itoa(page)) + list.WriteString(" ") + } + } + + // вперёд-назад + if p > 1 { + prevrev("<= Prev |", p-1, false) + } else { + p = 1 + } + + if c.Pages > 0 { + // назад + for x := p - 6; x < p && x > 0; x++ { + prevrev(strconv.Itoa(x), x, false) + } + + // вперёд + for x := p; x <= p+6; x++ { + if x == p { + prevrev("", x, true) + x++ + } + + if x > p { + prevrev(strconv.Itoa(x), x, false) + } + } + } + + // вперёд-назад + if c.More { + prevrev("| Next =>", p+1, false) + } + + return list.String() +} + +func (s skunkyart) DeviationList(devs []devianter.Deviation, content ...dlist) string { + var list strings.Builder + list.WriteString(`<div class="content">`) + for _, data := range devs { + url := devianter.UrlFromMedia(data.Media) + + list.WriteString(`<a title="open/download" href="`) + list.WriteString(url) + list.WriteString(`"><div class="block"><img src="`) + list.WriteString(url) + list.WriteString(`" width="15%"></a><br><a href="`) + list.WriteString("/post/") + list.WriteString(data.Author.Username) + list.WriteString("/") + list.WriteString(data.Url[27:][strings.Index(data.Url[27:], "/art/")+5:]) + list.WriteString(`">`) + list.WriteString(data.Author.Username) + list.WriteString(" - ") + list.WriteString(data.Title) + + // шильдики нсфв, аи и ежедневного поста + if data.NSFW { + list.WriteString(` [<span class="nsfw">NSFW</span>]`) + } + if data.AI { + list.WriteString(" [🤖]") + } + if data.DD { + list.WriteString(` [<span class="dd">DD</span>]`) + } + + list.WriteString("</a></div>") + } + list.WriteString("</div>") + list.WriteString(s.NavBase(content[0])) + + return list.String() +} + +// FIXME: первый комментарий не отображается. +func (s skunkyart) ParseComments(c devianter.Comments) string { + var cmmts strings.Builder + replied := make(map[int]string) + + cmmts.WriteString("<details><summary>Comments: <b>") + cmmts.WriteString(strconv.Itoa(c.Total)) + cmmts.WriteString("</b></summary>") + for _, x := range c.Thread { + replied[x.ID] = x.User.Username + cmmts.WriteString(`<div class="msg`) + if x.Parent > 0 { + cmmts.WriteString(` reply`) + } + cmmts.WriteString(`"><p id="`) + cmmts.WriteString(strconv.Itoa(x.ID)) + cmmts.WriteString(`"><img src="/media/`) + cmmts.WriteString(x.User.Username) + cmmts.WriteString(`?type=a" width="30px" height="30px"><a href="/group_user?type=about&q=`) + cmmts.WriteString(x.User.Username) + cmmts.WriteString(`"><b`) + cmmts.WriteString(` class="`) + if x.User.Banned { + cmmts.WriteString(`banned`) + } + if x.Author { + cmmts.WriteString(`author`) + } + cmmts.WriteString(`">`) + cmmts.WriteString(x.User.Username) + cmmts.WriteString("</b></a> ") + + if x.Parent > 0 { + cmmts.WriteString(` In reply to <a href="#`) + cmmts.WriteString(strconv.Itoa(x.Parent)) + cmmts.WriteString(`">`) + if replied[x.Parent] == "" { + cmmts.WriteString("???") + } else { + cmmts.WriteString(replied[x.Parent]) + } + cmmts.WriteString("</a>") + } + cmmts.WriteString(" [") + cmmts.WriteString(x.Posted.UTC().String()) + cmmts.WriteString("]<p>") + + cmmts.WriteString(x.Comment) + cmmts.WriteString("<p>👍: ") + cmmts.WriteString(strconv.Itoa(x.Likes)) + cmmts.WriteString(" ⏩: ") + cmmts.WriteString(strconv.Itoa(x.Replies)) + cmmts.WriteString("</p></div>\n") + } + cmmts.WriteString(s.NavBase(dlist{ + Pages: 0, + More: c.HasMore, + })) + cmmts.WriteString("</details>") + return cmmts.String() +} |
