| @@ -47,7 +47,77 @@ func (s skunkyart) httperr(status int) { |
| 47 | 47 | wr(s.Writer, msg.String()) |
| 48 | 48 | } |
| 49 | 49 | |
| 50 | | func (s skunkyart) DeviationList(devs []devianter.Deviation) string { |
| 50 | // навигация по страницам |
| 51 | type dlist struct { |
| 52 | Pages int |
| 53 | More bool |
| 54 | } |
| 55 | |
| 56 | // FIXME: на некоротрых артах первая страница может вызывать полное отсутствие панели навигации. |
| 57 | func (s skunkyart) NavBase(c dlist) string { |
| 58 | // TODO: сделать понятнее |
| 59 | // навигация по страницам |
| 60 | var list strings.Builder |
| 61 | list.WriteString("<br>") |
| 62 | p := s.Page |
| 63 | |
| 64 | // функция для генерации ссылок |
| 65 | prevrev := func(msg string, page int, onpage bool) { |
| 66 | if !onpage { |
| 67 | list.WriteString(`<a href="?p=`) |
| 68 | list.WriteString(strconv.Itoa(page)) |
| 69 | if s.Type != 0 { |
| 70 | list.WriteString("&type=") |
| 71 | list.WriteRune(s.Type) |
| 72 | } |
| 73 | if s.Query != "" { |
| 74 | list.WriteString("&q=") |
| 75 | list.WriteString(s.Query) |
| 76 | } |
| 77 | list.WriteString(`">`) |
| 78 | list.WriteString(msg) |
| 79 | list.WriteString("</a> ") |
| 80 | } else { |
| 81 | list.WriteString(strconv.Itoa(page)) |
| 82 | list.WriteString(" ") |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | // вперёд-назад |
| 87 | if p > 1 { |
| 88 | prevrev("<= Prev |", p-1, false) |
| 89 | } else { |
| 90 | p = 1 |
| 91 | } |
| 92 | |
| 93 | if c.Pages > 0 { |
| 94 | // назад |
| 95 | for x := p - 6; x < p && x > 0; x++ { |
| 96 | prevrev(strconv.Itoa(x), x, false) |
| 97 | } |
| 98 | |
| 99 | // вперёд |
| 100 | for x := p; x <= p+6; x++ { |
| 101 | if x == p { |
| 102 | prevrev("", x, true) |
| 103 | x++ |
| 104 | } |
| 105 | |
| 106 | if x > p { |
| 107 | prevrev(strconv.Itoa(x), x, false) |
| 108 | } |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | // вперёд-назад |
| 113 | if c.More { |
| 114 | prevrev("| Next =>", p+1, false) |
| 115 | } |
| 116 | |
| 117 | return list.String() |
| 118 | } |
| 119 | |
| 120 | func (s skunkyart) DeviationList(devs []devianter.Deviation, content ...dlist) string { |
| 51 | 121 | var list strings.Builder |
| 52 | 122 | list.WriteString(`<div class="content">`) |
| 53 | 123 | for _, data := range devs { |
| @@ -81,6 +151,8 @@ func (s skunkyart) DeviationList(devs []devianter.Deviation) string { |
| 81 | 151 | list.WriteString("</a></div>") |
| 82 | 152 | } |
| 83 | 153 | list.WriteString("</div>") |
| 154 | list.WriteString(s.NavBase(content[0])) |
| 155 | |
| 84 | 156 | return list.String() |
| 85 | 157 | } |
| 86 | 158 | |
| @@ -102,7 +174,6 @@ func (s skunkyart) Deviation(author, postname string) { |
| 102 | 174 | // время публикации |
| 103 | 175 | post.StringTime = post.Post.Deviation.PublishedTime.UTC().String() |
| 104 | 176 | |
| 105 | | println(post.Post.Description) |
| 106 | 177 | // хештэги |
| 107 | 178 | for _, x := range post.Post.Deviation.Extended.Tags { |
| 108 | 179 | var tag strings.Builder |
| @@ -115,34 +186,52 @@ func (s skunkyart) Deviation(author, postname string) { |
| 115 | 186 | post.Tags += tag.String() |
| 116 | 187 | } |
| 117 | 188 | |
| 189 | // FIXME: первый комментарий не отображается. |
| 118 | 190 | // генерация комментов |
| 119 | 191 | var cmmts strings.Builder |
| 120 | | var replied map[int]string |
| 121 | | _ = replied |
| 192 | replied := make(map[int]string) |
| 122 | 193 | c := devianter.CommentsFunc(id, post.Post.Comments.Cursor, s.Page, 1) |
| 123 | 194 | |
| 124 | 195 | cmmts.WriteString("<details><summary>Comments: <b>") |
| 125 | 196 | cmmts.WriteString(strconv.Itoa(c.Total)) |
| 126 | 197 | cmmts.WriteString("</b></summary>") |
| 127 | 198 | for _, x := range c.Thread { |
| 128 | | cmmts.WriteString(`<div class="msg"><p id="`) |
| 199 | replied[x.ID] = x.User.Username |
| 200 | cmmts.WriteString(`<div class="msg`) |
| 201 | if x.Parent > 0 { |
| 202 | cmmts.WriteString(` reply`) |
| 203 | } |
| 204 | cmmts.WriteString(`"><p id="`) |
| 129 | 205 | cmmts.WriteString(strconv.Itoa(x.ID)) |
| 130 | 206 | cmmts.WriteString(`"><img src="/media/`) |
| 131 | 207 | cmmts.WriteString(x.User.Username) |
| 132 | 208 | cmmts.WriteString(`?type=a" width="30px" height="30px"><a href="/user/`) |
| 133 | 209 | cmmts.WriteString(x.User.Username) |
| 134 | 210 | cmmts.WriteString(`"><b`) |
| 211 | cmmts.WriteString(` class="`) |
| 135 | 212 | if x.User.Banned { |
| 136 | | cmmts.WriteString(` class="banned"`) |
| 213 | cmmts.WriteString(`banned`) |
| 137 | 214 | } |
| 138 | 215 | if x.Author { |
| 139 | | cmmts.WriteString(` class="author"`) |
| 216 | cmmts.WriteString(`author`) |
| 140 | 217 | } |
| 141 | | cmmts.WriteString(">") |
| 218 | cmmts.WriteString(`">`) |
| 142 | 219 | cmmts.WriteString(x.User.Username) |
| 143 | 220 | cmmts.WriteString("</b></a> ") |
| 221 | if x.Parent > 0 { |
| 222 | cmmts.WriteString(` In reply to <a href="#`) |
| 223 | cmmts.WriteString(strconv.Itoa(x.Parent)) |
| 224 | cmmts.WriteString(`">`) |
| 225 | if replied[x.Parent] == "" { |
| 226 | cmmts.WriteString("???") |
| 227 | } else { |
| 228 | cmmts.WriteString(replied[x.Parent]) |
| 229 | } |
| 230 | cmmts.WriteString("</a>") |
| 231 | } |
| 232 | cmmts.WriteString(" [") |
| 144 | 233 | cmmts.WriteString(x.Posted.UTC().String()) |
| 145 | | cmmts.WriteString("<p>") |
| 234 | cmmts.WriteString("]<p>") |
| 146 | 235 | cmmts.WriteString(x.Comment) |
| 147 | 236 | cmmts.WriteString("<p>👍: ") |
| 148 | 237 | cmmts.WriteString(strconv.Itoa(x.Likes)) |
| @@ -150,7 +239,12 @@ func (s skunkyart) Deviation(author, postname string) { |
| 150 | 239 | cmmts.WriteString(strconv.Itoa(x.Replies)) |
| 151 | 240 | cmmts.WriteString("</p></div>\n") |
| 152 | 241 | } |
| 242 | cmmts.WriteString(s.NavBase(dlist{ |
| 243 | Pages: 0, |
| 244 | More: c.HasMore, |
| 245 | })) |
| 153 | 246 | cmmts.WriteString("</details>") |
| 247 | |
| 154 | 248 | post.Comments = cmmts.String() |
| 155 | 249 | |
| 156 | 250 | s.exe("html/deviantion.htm", &post) |
| @@ -159,6 +253,14 @@ func (s skunkyart) Deviation(author, postname string) { |
| 159 | 253 | } |
| 160 | 254 | } |
| 161 | 255 | |
| 256 | func (s skunkyart) DD() { |
| 257 | dd := devianter.DailyDeviationsFunc(s.Page) |
| 258 | s.exe("html/list.htm", s.DeviationList(dd.Deviations, dlist{ |
| 259 | Pages: 0, |
| 260 | More: dd.HasMore, |
| 261 | })) |
| 262 | } |
| 263 | |
| 162 | 264 | func (s skunkyart) Search() { |
| 163 | 265 | // тут всё и так понятно |
| 164 | 266 | if s.Type == 'a' || s.Type == 't' || s.Type == 'g' { |
| @@ -170,7 +272,10 @@ func (s skunkyart) Search() { |
| 170 | 272 | var e error |
| 171 | 273 | srch.Search, e = devianter.SearchFunc(s.Query, s.Page, s.Type) |
| 172 | 274 | err(e) |
| 173 | | srch.List = s.DeviationList(srch.Search.Results) |
| 275 | srch.List = s.DeviationList(srch.Search.Results, dlist{ |
| 276 | Pages: srch.Search.Pages, |
| 277 | More: srch.Search.HasMore, |
| 278 | }) |
| 174 | 279 | |
| 175 | 280 | s.exe("html/search.htm", &srch) |
| 176 | 281 | } else { |