bloat/renderer/renderer.go

163 lines
5.3 KiB
Go
Raw Normal View History

2019-12-13 20:08:26 +02:00
package renderer
import (
"context"
"io"
"strconv"
"strings"
"text/template"
"time"
"mastodon"
)
type Renderer interface {
2019-12-26 11:11:24 +02:00
RenderErrorPage(ctx context.Context, writer io.Writer, data *ErrorData)
RenderHomePage(ctx context.Context, writer io.Writer, data *HomePageData) (err error)
RenderSigninPage(ctx context.Context, writer io.Writer, data *SigninData) (err error)
2019-12-25 16:13:59 +02:00
RenderTimelinePage(ctx context.Context, writer io.Writer, data *TimelineData) (err error)
RenderThreadPage(ctx context.Context, writer io.Writer, data *ThreadData) (err error)
RenderNotificationPage(ctx context.Context, writer io.Writer, data *NotificationData) (err error)
RenderUserPage(ctx context.Context, writer io.Writer, data *UserData) (err error)
RenderAboutPage(ctx context.Context, writer io.Writer, data *AboutData) (err error)
RenderEmojiPage(ctx context.Context, writer io.Writer, data *EmojiData) (err error)
2019-12-26 11:11:24 +02:00
RenderLikedByPage(ctx context.Context, writer io.Writer, data *LikedByData) (err error)
RenderRetweetedByPage(ctx context.Context, writer io.Writer, data *RetweetedByData) (err error)
2019-12-26 21:18:09 +02:00
RenderSearchPage(ctx context.Context, writer io.Writer, data *SearchData) (err error)
2019-12-13 20:08:26 +02:00
}
type renderer struct {
template *template.Template
}
func NewRenderer(templateGlobPattern string) (r *renderer, err error) {
t := template.New("default")
t, err = t.Funcs(template.FuncMap{
2019-12-21 07:48:06 +02:00
"EmojiFilter": EmojiFilter,
"StatusContentFilter": StatusContentFilter,
2019-12-13 20:08:26 +02:00
"DisplayInteractionCount": DisplayInteractionCount,
"TimeSince": TimeSince,
"FormatTimeRFC3339": FormatTimeRFC3339,
}).ParseGlob(templateGlobPattern)
if err != nil {
return
}
return &renderer{
template: t,
}, nil
}
2019-12-26 11:11:24 +02:00
func (r *renderer) RenderErrorPage(ctx context.Context, writer io.Writer, errorData *ErrorData) {
r.template.ExecuteTemplate(writer, "error.tmpl", errorData)
2019-12-13 20:08:26 +02:00
return
}
2019-12-26 11:11:24 +02:00
func (r *renderer) RenderHomePage(ctx context.Context, writer io.Writer, homePageData *HomePageData) (err error) {
return r.template.ExecuteTemplate(writer, "homepage.tmpl", homePageData)
2019-12-13 20:08:26 +02:00
}
2019-12-26 11:11:24 +02:00
func (r *renderer) RenderSigninPage(ctx context.Context, writer io.Writer, signinData *SigninData) (err error) {
return r.template.ExecuteTemplate(writer, "signin.tmpl", signinData)
2019-12-13 20:08:26 +02:00
}
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderTimelinePage(ctx context.Context, writer io.Writer, data *TimelineData) (err error) {
2019-12-13 20:08:26 +02:00
return r.template.ExecuteTemplate(writer, "timeline.tmpl", data)
}
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderThreadPage(ctx context.Context, writer io.Writer, data *ThreadData) (err error) {
2019-12-13 20:08:26 +02:00
return r.template.ExecuteTemplate(writer, "thread.tmpl", data)
}
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderNotificationPage(ctx context.Context, writer io.Writer, data *NotificationData) (err error) {
2019-12-15 19:37:58 +02:00
return r.template.ExecuteTemplate(writer, "notification.tmpl", data)
}
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderUserPage(ctx context.Context, writer io.Writer, data *UserData) (err error) {
return r.template.ExecuteTemplate(writer, "user.tmpl", data)
}
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderAboutPage(ctx context.Context, writer io.Writer, data *AboutData) (err error) {
2019-12-21 07:48:48 +02:00
return r.template.ExecuteTemplate(writer, "about.tmpl", data)
}
2019-12-21 07:48:06 +02:00
2019-12-25 16:13:59 +02:00
func (r *renderer) RenderEmojiPage(ctx context.Context, writer io.Writer, data *EmojiData) (err error) {
2019-12-22 20:10:42 +02:00
return r.template.ExecuteTemplate(writer, "emoji.tmpl", data)
}
2019-12-26 11:11:24 +02:00
func (r *renderer) RenderLikedByPage(ctx context.Context, writer io.Writer, data *LikedByData) (err error) {
return r.template.ExecuteTemplate(writer, "likedby.tmpl", data)
}
func (r *renderer) RenderRetweetedByPage(ctx context.Context, writer io.Writer, data *RetweetedByData) (err error) {
return r.template.ExecuteTemplate(writer, "retweetedby.tmpl", data)
}
2019-12-26 21:18:09 +02:00
func (r *renderer) RenderSearchPage(ctx context.Context, writer io.Writer, data *SearchData) (err error) {
return r.template.ExecuteTemplate(writer, "search.tmpl", data)
}
2019-12-21 07:48:06 +02:00
func EmojiFilter(content string, emojis []mastodon.Emoji) string {
var replacements []string
for _, e := range emojis {
2019-12-22 05:43:25 +02:00
replacements = append(replacements, ":"+e.ShortCode+":", "<img class=\"status-emoji\" src=\""+e.URL+"\" alt=\""+e.ShortCode+"\" title=\""+e.ShortCode+"\" />")
2019-12-21 07:48:06 +02:00
}
return strings.NewReplacer(replacements...).Replace(content)
}
2019-12-21 09:22:21 +02:00
func StatusContentFilter(spoiler string, content string, emojis []mastodon.Emoji, mentions []mastodon.Mention) string {
if len(spoiler) > 0 {
content = spoiler + "<br />" + content
}
2019-12-21 07:48:06 +02:00
var replacements []string
2019-12-13 20:08:26 +02:00
for _, e := range emojis {
2019-12-22 05:43:25 +02:00
replacements = append(replacements, ":"+e.ShortCode+":", "<img class=\"status-emoji\" src=\""+e.URL+"\" alt=\""+e.ShortCode+"\" title=\""+e.ShortCode+"\" />")
2019-12-21 07:48:06 +02:00
}
for _, m := range mentions {
replacements = append(replacements, "\""+m.URL+"\"", "\"/user/"+m.ID+"\"")
2019-12-13 20:08:26 +02:00
}
2019-12-21 07:48:06 +02:00
return strings.NewReplacer(replacements...).Replace(content)
2019-12-13 20:08:26 +02:00
}
func DisplayInteractionCount(c int64) string {
if c > 0 {
return strconv.Itoa(int(c))
}
return ""
}
func TimeSince(t time.Time) string {
dur := time.Since(t)
s := dur.Seconds()
if s < 60 {
return strconv.Itoa(int(s)) + "s"
}
m := dur.Minutes()
if m < 60 {
return strconv.Itoa(int(m)) + "m"
}
h := dur.Hours()
if h < 24 {
return strconv.Itoa(int(h)) + "h"
}
d := h / 24
if d < 30 {
return strconv.Itoa(int(d)) + "d"
}
mo := d / 30
if mo < 12 {
return strconv.Itoa(int(mo)) + "mo"
}
2019-12-20 20:31:55 +02:00
y := mo / 12
2019-12-13 20:08:26 +02:00
return strconv.Itoa(int(y)) + "y"
}
func FormatTimeRFC3339(t time.Time) string {
return t.Format(time.RFC3339)
}