package main import ( "strings" dg "github.com/bwmarrin/discordgo" stripmd "github.com/writeas/go-strip-markdown" ) type Link struct { Alt, URL string } // StripAltText removes Markdown alt text from links and images and replaces them with just the URL. // Currently uses the deepest alt text when links/images are nested. // If links = true, links are completely removed, and a list of URLs and their alt text is also returned. func StripAltText(md string, links bool) (string, []*dg.MessageEmbed) { altTextStart := -1 // Start of alt text (between '[' & ']') URLStart := -1 // Start of url (between '(' & ')') URLEnd := -1 previousURLEnd := -2 out := "" embeds := []*dg.MessageEmbed{} for i := range md { if altTextStart != -1 && URLStart != -1 && md[i] == ')' { URLEnd = i - 1 out += md[previousURLEnd+2 : altTextStart-1] if links { embed := &dg.MessageEmbed{ Type: dg.EmbedTypeLink, Title: md[altTextStart : URLStart-2], } if md[altTextStart-1] == '!' { embed.Title = md[altTextStart+1 : URLStart-2] embed.Type = dg.EmbedTypeImage embed.Image = &dg.MessageEmbedImage{ URL: md[URLStart : URLEnd+1], } } else { embed.URL = md[URLStart : URLEnd+1] } embeds = append(embeds, embed) } else { out += md[URLStart : URLEnd+1] } previousURLEnd = URLEnd // Removing links often leaves a load of extra newlines which look weird, this removes them. if links { next := 2 for md[URLEnd+next] == '\n' { next++ } if next >= 3 { previousURLEnd += next - 2 } } altTextStart, URLStart, URLEnd = -1, -1, -1 continue } if md[i] == '[' && altTextStart == -1 { altTextStart = i + 1 if i > 0 && md[i-1] == '!' { altTextStart-- } } if i > 0 && md[i-1] == ']' && md[i] == '(' && URLStart == -1 { URLStart = i + 1 } } if previousURLEnd+1 != len(md)-1 { out += md[previousURLEnd+2:] } if out == "" { return md, embeds } return out, embeds } func stripMarkdown(md string) string { stripped, _ := StripAltText(md, false) return strings.TrimPrefix(strings.TrimSuffix(stripmd.Strip(stripped), "

"), "

") }