mirror of
https://codeberg.org/video-prize-ranch/rimgo.git
synced 2026-03-22 17:24:02 -04:00
Compare commits
2 Commits
encoding-j
...
sanitize-x
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb54932770 | ||
|
|
d03d2a3c25 |
@@ -36,7 +36,7 @@ func relTime(date time.Time) string {
|
|||||||
return humanize.Time(date)
|
return humanize.Time(date)
|
||||||
}
|
}
|
||||||
func rewriteUrl(link string) string {
|
func rewriteUrl(link string) string {
|
||||||
r, err := utils.RewriteUrl(link)
|
r, err := utils.RewriteUrlString(link)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,67 @@
|
|||||||
package render
|
package render
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"regexp"
|
"encoding/xml"
|
||||||
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"codeberg.org/rimgo/rimgo/utils"
|
||||||
"github.com/microcosm-cc/bluemonday"
|
"github.com/microcosm-cc/bluemonday"
|
||||||
"gitlab.com/golang-commonmark/linkify"
|
"gitlab.com/golang-commonmark/linkify"
|
||||||
)
|
)
|
||||||
|
|
||||||
var imgurRe = regexp.MustCompile(`https?://imgur\.com/(gallery|a)?/(.*)`)
|
|
||||||
var imgurRe2 = regexp.MustCompile(`https?://imgur\.com/(.*)`)
|
|
||||||
var imgRe = regexp.MustCompile(`https?://i\.imgur\.com/(.*)\.(png|gif|jpe?g|webp)`)
|
|
||||||
var vidRe = regexp.MustCompile(`https?://i\.imgur\.com/(.*)\.(mp4|webm)`)
|
|
||||||
var vidFormatRe = regexp.MustCompile(`\.(mp4|webm)`)
|
|
||||||
var iImgurRe = regexp.MustCompile(`https?://i\.imgur\.com`)
|
|
||||||
|
|
||||||
func sanitizeDescription(src string) string {
|
func sanitizeDescription(src string) string {
|
||||||
src = strings.ReplaceAll(src, "\n", "<br>")
|
src = strings.ReplaceAll(src, "\n", "<br>")
|
||||||
return bluemonday.UGCPolicy().Sanitize(src)
|
return bluemonday.UGCPolicy().Sanitize(src)
|
||||||
}
|
}
|
||||||
func sanitizeComment(src string) string {
|
func sanitizeComment(src string) string {
|
||||||
src = strings.ReplaceAll(src, "\n", "<br>")
|
src = strings.ReplaceAll(src, "\n", "<br>")
|
||||||
|
buf := new(strings.Builder)
|
||||||
for _, match := range imgRe.FindAllString(src, -1) {
|
enc := xml.NewEncoder(buf)
|
||||||
img := iImgurRe.ReplaceAllString(match, "")
|
from := 0
|
||||||
img = `<img src="` + img + `" class="comment__media" loading="lazy"/>`
|
|
||||||
src = strings.Replace(src, match, img, 1)
|
|
||||||
}
|
|
||||||
for _, match := range vidRe.FindAllString(src, -1) {
|
|
||||||
vid := iImgurRe.ReplaceAllString(match, "")
|
|
||||||
vid = `<video class="comment__media" controls loop preload="none" poster="` + vidFormatRe.ReplaceAllString(vid, ".webp") + `"><source type="` + strings.Split(vid, ".")[1] + `" src="` + vid + `" /></video>`
|
|
||||||
src = strings.Replace(src, match, vid, 1)
|
|
||||||
}
|
|
||||||
for _, l := range linkify.Links(src) {
|
for _, l := range linkify.Links(src) {
|
||||||
origLink := (src)[l.Start:l.End]
|
buf.WriteString(src[from:l.Start])
|
||||||
link := `<a href="` + origLink + `">` + origLink + `</a>`
|
origLink := src[l.Start:l.End]
|
||||||
src = strings.Replace(src, origLink, link, 1)
|
url, err := url.Parse(origLink)
|
||||||
|
if err != nil {
|
||||||
|
buf.WriteString(origLink)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newLink := utils.RewriteUrl(url)
|
||||||
|
if url.Host == "i.imgur.com" {
|
||||||
|
name, ext := utils.SplitNameExt(newLink)
|
||||||
|
switch ext {
|
||||||
|
case "png", "gif", "jpg", "jpeg", "webp":
|
||||||
|
start(enc, "img",
|
||||||
|
"src", newLink,
|
||||||
|
"class", "comment__media",
|
||||||
|
"loading", "lazy")
|
||||||
|
//self-closing tag
|
||||||
|
case "mp4", "webm":
|
||||||
|
start(enc, "video",
|
||||||
|
"class", "comment__media",
|
||||||
|
"controls", "controls",
|
||||||
|
"loop", "loop",
|
||||||
|
"preload", "none",
|
||||||
|
"poster", name+"webp")
|
||||||
|
start(enc, "source",
|
||||||
|
"type", ext,
|
||||||
|
"src", newLink)
|
||||||
|
end(enc, "source")
|
||||||
|
end(enc, "video")
|
||||||
|
default:
|
||||||
|
goto link
|
||||||
|
}
|
||||||
|
from = l.End
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
link:
|
||||||
|
start(enc, "a", "href", newLink)
|
||||||
|
xml.EscapeText(buf, []byte(origLink))
|
||||||
|
end(enc, "a")
|
||||||
|
from = l.End
|
||||||
}
|
}
|
||||||
src = imgurRe.ReplaceAllString(src, "/$1/$2")
|
buf.WriteString(src[from:])
|
||||||
src = imgurRe2.ReplaceAllString(src, "/$1")
|
|
||||||
|
|
||||||
p := bluemonday.UGCPolicy()
|
p := bluemonday.UGCPolicy()
|
||||||
p.AllowImages()
|
p.AllowImages()
|
||||||
@@ -49,5 +72,29 @@ func sanitizeComment(src string) string {
|
|||||||
p.RequireNoReferrerOnLinks(true)
|
p.RequireNoReferrerOnLinks(true)
|
||||||
p.RequireNoFollowOnLinks(true)
|
p.RequireNoFollowOnLinks(true)
|
||||||
p.RequireCrossOriginAnonymous(true)
|
p.RequireCrossOriginAnonymous(true)
|
||||||
return p.Sanitize(src)
|
return p.Sanitize(buf.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func start(enc *xml.Encoder, name string, attrs ...string) {
|
||||||
|
if len(attrs)%2 == 1 {
|
||||||
|
panic("odd number of arguments to attrs")
|
||||||
|
}
|
||||||
|
xmlAttrs := make([]xml.Attr, len(attrs)/2)
|
||||||
|
for i := 0; i < len(attrs); i += 2 {
|
||||||
|
xmlAttrs[i/2] = xml.Attr{
|
||||||
|
Name: xml.Name{Space: "", Local: attrs[i]},
|
||||||
|
Value: attrs[i+1],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enc.EncodeToken(xml.StartElement{
|
||||||
|
Name: xml.Name{Space: "", Local: name},
|
||||||
|
Attr: xmlAttrs,
|
||||||
|
})
|
||||||
|
enc.Flush()
|
||||||
|
}
|
||||||
|
func end(enc *xml.Encoder, name string) {
|
||||||
|
enc.EncodeToken(xml.EndElement{
|
||||||
|
Name: xml.Name{Space: "", Local: name},
|
||||||
|
})
|
||||||
|
enc.Flush()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,16 +4,20 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RewriteUrl(link string) (string, error) {
|
func RewriteUrl(link *url.URL) string {
|
||||||
|
switch link.Host {
|
||||||
|
case "", "imgur.com", "www.imgur.com", "i.imgur.com":
|
||||||
|
return link.Path
|
||||||
|
case "i.stack.imgur.com":
|
||||||
|
return "/stack" + link.Path
|
||||||
|
}
|
||||||
|
return link.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func RewriteUrlString(link string) (string, error) {
|
||||||
url, err := url.Parse(link)
|
url, err := url.Parse(link)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
switch url.Host {
|
return RewriteUrl(url), nil
|
||||||
case "", "imgur.com", "www.imgur.com", "i.imgur.com":
|
|
||||||
return url.Path, nil
|
|
||||||
case "i.stack.imgur.com":
|
|
||||||
return "/stack" + url.Path, nil
|
|
||||||
}
|
|
||||||
return link, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user