From ed031b353078d0b58a67981de4d463c8563a20d7 Mon Sep 17 00:00:00 2001 From: lost+skunk Date: Sun, 30 Jun 2024 14:40:27 +0300 Subject: попытка реализовать галерею. так сыро потому что мне скоро уезжать MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/util.go | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) (limited to 'app/util.go') 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(``) + msg.WriteString("

") + msg.WriteString(strconv.Itoa(status)) + msg.WriteString(" - ") + msg.WriteString(http.StatusText(status)) + msg.WriteString("

") + + 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("
") + p := s.Page + + // функция для генерации ссылок + prevrev := func(msg string, page int, onpage bool) { + if !onpage { + list.WriteString(``) + list.WriteString(msg) + list.WriteString(" ") + } 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(`
`) + for _, data := range devs { + url := devianter.UrlFromMedia(data.Media) + + list.WriteString(`") + } + list.WriteString("
") + 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("
Comments: ") + cmmts.WriteString(strconv.Itoa(c.Total)) + cmmts.WriteString("") + for _, x := range c.Thread { + replied[x.ID] = x.User.Username + cmmts.WriteString(`

`) + cmmts.WriteString(x.User.Username) + cmmts.WriteString(" ") + + if x.Parent > 0 { + cmmts.WriteString(` In reply to `) + if replied[x.Parent] == "" { + cmmts.WriteString("???") + } else { + cmmts.WriteString(replied[x.Parent]) + } + cmmts.WriteString("") + } + cmmts.WriteString(" [") + cmmts.WriteString(x.Posted.UTC().String()) + cmmts.WriteString("]

") + + cmmts.WriteString(x.Comment) + cmmts.WriteString("

👍: ") + cmmts.WriteString(strconv.Itoa(x.Likes)) + cmmts.WriteString(" ⏩: ") + cmmts.WriteString(strconv.Itoa(x.Replies)) + cmmts.WriteString("

\n") + } + cmmts.WriteString(s.NavBase(dlist{ + Pages: 0, + More: c.HasMore, + })) + cmmts.WriteString("
") + return cmmts.String() +} -- cgit v1.2.3