diff options
Diffstat (limited to 'post/util.go')
-rw-r--r-- | post/util.go | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/post/util.go b/post/util.go index c653276..b9d9b80 100644 --- a/post/util.go +++ b/post/util.go @@ -2,6 +2,7 @@ package post import ( "fmt" + "html/template" "io/ioutil" "mime/multipart" "os" @@ -382,3 +383,181 @@ func ResizeAttachmentToPreview() error { return nil }) } + +func ParseAttachment(obj activitypub.ObjectBase, catalog bool) template.HTML { + // TODO: convert all of these to Sprintf statements, or use strings.Builder or something, anything but this really + // string concatenation is highly inefficient _especially_ when being used like this + + if len(obj.Attachment) < 1 { + return "" + } + + var media string + if regexp.MustCompile(`image\/`).MatchString(obj.Attachment[0].MediaType) { + media = "<img " + media += "id=\"img\" " + media += "main=\"1\" " + media += "enlarge=\"0\" " + media += "attachment=\"" + obj.Attachment[0].Href + "\"" + if catalog { + media += "style=\"max-width: 180px; max-height: 180px;\" " + } else { + media += "style=\"float: left; margin-right: 10px; margin-bottom: 10px; max-width: 250px; max-height: 250px;\"" + } + if obj.Preview.Id != "" { + media += "src=\"" + util.MediaProxy(obj.Preview.Href) + "\"" + media += "preview=\"" + util.MediaProxy(obj.Preview.Href) + "\"" + } else { + media += "src=\"" + util.MediaProxy(obj.Attachment[0].Href) + "\"" + media += "preview=\"" + util.MediaProxy(obj.Attachment[0].Href) + "\"" + } + + media += ">" + + return template.HTML(media) + } + + if regexp.MustCompile(`audio\/`).MatchString(obj.Attachment[0].MediaType) { + media = "<audio " + media += "controls=\"controls\" " + media += "preload=\"metadta\" " + if catalog { + media += "style=\"margin-right: 10px; margin-bottom: 10px; max-width: 180px; max-height: 180px;\" " + } else { + media += "style=\"float: left; margin-right: 10px; margin-bottom: 10px; max-width: 250px; max-height: 250px;\" " + } + media += ">" + media += "<source " + media += "src=\"" + util.MediaProxy(obj.Attachment[0].Href) + "\" " + media += "type=\"" + obj.Attachment[0].MediaType + "\" " + media += ">" + media += "Audio is not supported." + media += "</audio>" + + return template.HTML(media) + } + + if regexp.MustCompile(`video\/`).MatchString(obj.Attachment[0].MediaType) { + media = "<video " + media += "controls=\"controls\" " + media += "preload=\"metadta\" " + media += "muted=\"muted\" " + if catalog { + media += "style=\"margin-right: 10px; margin-bottom: 10px; max-width: 180px; max-height: 180px;\" " + } else { + media += "style=\"float: left; margin-right: 10px; margin-bottom: 10px; max-width: 250px; max-height: 250px;\" " + } + media += ">" + media += "<source " + media += "src=\"" + util.MediaProxy(obj.Attachment[0].Href) + "\" " + media += "type=\"" + obj.Attachment[0].MediaType + "\" " + media += ">" + media += "Video is not supported." + media += "</video>" + + return template.HTML(media) + } + + return template.HTML(media) +} + +func ParseContent(board activitypub.Actor, op string, content string, thread activitypub.ObjectBase) (template.HTML, error) { + // TODO: should escape more than just < and >, should also escape &, ", and ' + nContent := strings.ReplaceAll(content, `<`, "<") + + nContent, err := ParseLinkComments(board, op, nContent, thread) + if err != nil { + return "", err + } + + nContent = ParseCommentQuotes(nContent) + + nContent = strings.ReplaceAll(nContent, `/\<`, ">") + + return template.HTML(nContent), nil +} + +func ParseLinkComments(board activitypub.Actor, op string, content string, thread activitypub.ObjectBase) (string, error) { + re := regexp.MustCompile(`(>>(https?://[A-Za-z0-9_.:\-~]+\/[A-Za-z0-9_.\-~]+\/)(f[A-Za-z0-9_.\-~]+-)?([A-Za-z0-9_.\-~]+)?#?([A-Za-z0-9_.\-~]+)?)`) + match := re.FindAllStringSubmatch(content, -1) + + //add url to each matched reply + for i, _ := range match { + link := strings.Replace(match[i][0], ">>", "", 1) + isOP := "" + + domain := match[i][2] + + if link == op { + isOP = " (OP)" + } + + parsedLink := ConvertHashLink(domain, link) + + //formate the hover title text + var quoteTitle string + + // if the quoted content is local get it + // else get it from the database + if thread.Id == link { + quoteTitle = ParseLinkTitle(board.Outbox, op, thread.Content) + } else { + for _, e := range thread.Replies.OrderedItems { + if e.Id == parsedLink { + quoteTitle = ParseLinkTitle(board.Outbox, op, e.Content) + break + } + } + + if quoteTitle == "" { + obj, err := activitypub.GetObjectFromDBFromID(parsedLink) + if err != nil { + return "", err + } + + if len(obj.OrderedItems) > 0 { + quoteTitle = ParseLinkTitle(board.Outbox, op, obj.OrderedItems[0].Content) + } else { + quoteTitle = ParseLinkTitle(board.Outbox, op, parsedLink) + } + } + } + + if replyID, isReply, err := db.IsReplyToOP(op, parsedLink); err == nil || !isReply { + id := util.ShortURL(board.Outbox, replyID) + + content = strings.Replace(content, match[i][0], "<a class=\"reply\" title=\""+quoteTitle+"\" href=\"/"+board.Name+"/"+util.ShortURL(board.Outbox, op)+"#"+id+"\">>>"+id+""+isOP+"</a>", -1) + } else { + //this is a cross post + + parsedOP, err := db.GetReplyOP(parsedLink) + if err == nil { + link = parsedOP + "#" + util.ShortURL(parsedOP, parsedLink) + } + + actor, err := webfinger.FingerActor(parsedLink) + if err == nil && actor.Id != "" { + content = strings.Replace(content, match[i][0], "<a class=\"reply\" title=\""+quoteTitle+"\" href=\""+link+"\">>>"+util.ShortURL(board.Outbox, parsedLink)+isOP+" →</a>", -1) + } + } + } + + return content, nil +} + +func ParseCommentQuotes(content string) string { + // replace quotes + re := regexp.MustCompile(`((\r\n|\r|\n|^)>(.+)?[^\r\n])`) + match := re.FindAllStringSubmatch(content, -1) + + for i, _ := range match { + quote := strings.Replace(match[i][0], ">", ">", 1) + line := re.ReplaceAllString(match[i][0], "<span class=\"quote\">"+quote+"</span>") + content = strings.Replace(content, match[i][0], line, 1) + } + + //replace isolated greater than symboles + re = regexp.MustCompile(`(\r\n|\n|\r)>`) + + return re.ReplaceAllString(content, "\r\n<span class=\"quote\">></span>") +} |