Allow links in statuses

This commit is contained in:
m15o 2022-02-19 08:53:38 +01:00
parent d9c82ad45e
commit 69f3159f9b
4 changed files with 25 additions and 3 deletions

View file

@ -3,6 +3,10 @@ package model
import (
"errors"
"fmt"
"html"
"html/template"
"regexp"
"strings"
"time"
)
@ -14,6 +18,24 @@ type Status struct {
CreatedAt time.Time
}
var urlRegexp = regexp.MustCompile(`https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)`)
func (s Status) ContentDisplay() string {
content := html.EscapeString(s.Content)
if urlRegexp.MatchString(s.Content) {
matches := urlRegexp.FindAllStringSubmatch(s.Content, -1)
for _, m := range matches {
url := m[0]
content = strings.Replace(content, url, fmt.Sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", url, url), 1)
}
}
return content
}
func (s Status) ContentHtml() template.HTML {
return template.HTML(s.ContentDisplay())
}
func (s Status) Validate() error {
if len(s.Content) == 0 {
return errors.New("content is empty")

View file

@ -48,7 +48,7 @@ var TplCommonMap = map[string]string{
{{ define "title" }}{{ end }}`,
"status": `{{ define "status" }}
<div class="status-username"><a href="/users/{{ .User }}">{{ .User }}</a> {{ .Face }} {{ .TimeAgo }}</div>
<p class="status-content">{{ .Content }}</p>
<p class="status-content">{{ .ContentHtml }}</p>
{{ end }}`,
"status_form": `{{ define "status_form" }}
<div class="faces">

View file

@ -1,4 +1,4 @@
{{ define "status" }}
<div class="status-username"><a href="/users/{{ .User }}">{{ .User }}</a> {{ .Face }} {{ .TimeAgo }}</div>
<p class="status-content">{{ .Content }}</p>
<p class="status-content">{{ .ContentHtml }}</p>
{{ end }}

View file

@ -224,7 +224,7 @@ func (h *Handler) showUserStatusJSONView(w http.ResponseWriter, r *http.Request)
var res statusjson
if len(statuses) > 0 {
res.Author = statuses[0].User
res.Content = statuses[0].Content
res.Content = statuses[0].ContentDisplay()
res.Face = statuses[0].Face
res.TimeAgo = statuses[0].TimeAgo()
}