Allow links in statuses
This commit is contained in:
parent
d9c82ad45e
commit
69f3159f9b
4 changed files with 25 additions and 3 deletions
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue