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 (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"html"
|
||||||
|
"html/template"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -14,6 +18,24 @@ type Status struct {
|
||||||
CreatedAt time.Time
|
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 {
|
func (s Status) Validate() error {
|
||||||
if len(s.Content) == 0 {
|
if len(s.Content) == 0 {
|
||||||
return errors.New("content is empty")
|
return errors.New("content is empty")
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ var TplCommonMap = map[string]string{
|
||||||
{{ define "title" }}{{ end }}`,
|
{{ define "title" }}{{ end }}`,
|
||||||
"status": `{{ define "status" }}
|
"status": `{{ define "status" }}
|
||||||
<div class="status-username"><a href="/users/{{ .User }}">{{ .User }}</a> {{ .Face }} {{ .TimeAgo }}</div>
|
<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 }}`,
|
{{ end }}`,
|
||||||
"status_form": `{{ define "status_form" }}
|
"status_form": `{{ define "status_form" }}
|
||||||
<div class="faces">
|
<div class="faces">
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
{{ define "status" }}
|
{{ define "status" }}
|
||||||
<div class="status-username"><a href="/users/{{ .User }}">{{ .User }}</a> {{ .Face }} {{ .TimeAgo }}</div>
|
<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 }}
|
{{ end }}
|
||||||
|
|
@ -224,7 +224,7 @@ func (h *Handler) showUserStatusJSONView(w http.ResponseWriter, r *http.Request)
|
||||||
var res statusjson
|
var res statusjson
|
||||||
if len(statuses) > 0 {
|
if len(statuses) > 0 {
|
||||||
res.Author = statuses[0].User
|
res.Author = statuses[0].User
|
||||||
res.Content = statuses[0].Content
|
res.Content = statuses[0].ContentDisplay()
|
||||||
res.Face = statuses[0].Face
|
res.Face = statuses[0].Face
|
||||||
res.TimeAgo = statuses[0].TimeAgo()
|
res.TimeAgo = statuses[0].TimeAgo()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue