diff --git a/discordmd/discordmd.go b/discordmd/discordmd.go new file mode 100644 index 0000000..09b326a --- /dev/null +++ b/discordmd/discordmd.go @@ -0,0 +1,24 @@ +package discordmd + +import ( + "regexp" +) + +var ( + boldRegex = regexp.MustCompile(`(?ms)\*\*(.*?)\*\*`) + italicRegex = regexp.MustCompile(`(?ms)\*(.*?)\*`) + underlineRegex = regexp.MustCompile(`(?ms)__(.*?)__`) + strikeThroughRegex = regexp.MustCompile(`(?ms)~~(.*?)~~`) +) + +// Parse parses Discord-flavored markdown to tview's [Color Tags]. +// +// [Color Tags]: https://pkg.go.dev/github.com/rivo/tview#hdr-Colors +func Parse(md string) string { + md = boldRegex.ReplaceAllString(md, "[::b]$1[::-]") + md = italicRegex.ReplaceAllString(md, "[::i]$1[::-]") + md = underlineRegex.ReplaceAllString(md, "[::u]$1[::-]") + md = strikeThroughRegex.ReplaceAllString(md, "[::s]$1[::-]") + + return md +} diff --git a/ui/builder.go b/ui/builder.go index 547019b..84bcc50 100644 --- a/ui/builder.go +++ b/ui/builder.go @@ -5,6 +5,7 @@ import ( "strings" "time" + "github.com/ayntgl/discordo/discordmd" "github.com/diamondburned/arikawa/v3/discord" ) @@ -93,7 +94,7 @@ func buildReferencedMessage(b *strings.Builder, rm *discord.Message, clientID di if rm.Content != "" { rm.Content = buildMentions(rm.Content, rm.Mentions, clientID) - b.WriteString(parseMarkdown(rm.Content)) + b.WriteString(discordmd.Parse(rm.Content)) } b.WriteString("[::-]") @@ -104,7 +105,7 @@ func buildReferencedMessage(b *strings.Builder, rm *discord.Message, clientID di func buildContent(b *strings.Builder, m discord.Message, clientID discord.UserID) { if m.Content != "" { m.Content = buildMentions(m.Content, m.Mentions, clientID) - b.WriteString(parseMarkdown(m.Content)) + b.WriteString(discordmd.Parse(m.Content)) } } @@ -147,7 +148,7 @@ func buildEmbeds(b *strings.Builder, es []discord.Embed) { embedBuilder.WriteByte('\n') } - embedBuilder.WriteString(parseMarkdown(e.Description)) + embedBuilder.WriteString(discordmd.Parse(e.Description)) } if len(e.Fields) != 0 { @@ -161,7 +162,7 @@ func buildEmbeds(b *strings.Builder, es []discord.Embed) { embedBuilder.WriteString(ef.Name) embedBuilder.WriteString("[::-]") embedBuilder.WriteByte('\n') - embedBuilder.WriteString(parseMarkdown(ef.Value)) + embedBuilder.WriteString(discordmd.Parse(ef.Value)) if i != len(e.Fields)-1 { embedBuilder.WriteString("\n\n") diff --git a/ui/messages_view.go b/ui/messages_view.go index ad202b3..0786e62 100644 --- a/ui/messages_view.go +++ b/ui/messages_view.go @@ -3,6 +3,7 @@ package ui import ( "log" + "github.com/ayntgl/discordo/discordmd" "github.com/diamondburned/arikawa/v3/discord" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" @@ -43,7 +44,7 @@ func newMessagesView(app *Application) *MessagesView { func (v *MessagesView) setTitle(c *discord.Channel) { title := channelToString(*c) if c.Topic != "" { - title += " - " + parseMarkdown(c.Topic) + title += " - " + discordmd.Parse(c.Topic) } v.SetTitle(title) diff --git a/ui/util.go b/ui/util.go index 043c5fc..a64f506 100644 --- a/ui/util.go +++ b/ui/util.go @@ -1,30 +1,12 @@ package ui import ( - "regexp" "strings" "github.com/diamondburned/arikawa/v3/discord" "github.com/diamondburned/arikawa/v3/state" ) -var ( - boldRegex = regexp.MustCompile(`(?ms)\*\*(.*?)\*\*`) - italicRegex = regexp.MustCompile(`(?ms)\*(.*?)\*`) - underlineRegex = regexp.MustCompile(`(?ms)__(.*?)__`) - strikeThroughRegex = regexp.MustCompile(`(?ms)~~(.*?)~~`) -) - -func parseMarkdown(md string) string { - var res string - res = boldRegex.ReplaceAllString(md, "[::b]$1[::-]") - res = italicRegex.ReplaceAllString(res, "[::i]$1[::-]") - res = underlineRegex.ReplaceAllString(res, "[::u]$1[::-]") - res = strikeThroughRegex.ReplaceAllString(res, "[::s]$1[::-]") - - return res -} - func channelToString(c discord.Channel) string { var repr string