From fc0b9a03eba065f50a3e9ecee765beea7838f29b Mon Sep 17 00:00:00 2001 From: ayn2op Date: Sat, 7 Jan 2023 23:04:21 +0530 Subject: [PATCH] Markdown parser --- discordmd/discordmd.go | 20 ++++++++++++++++++++ discordmd/discordmd_test.go | 14 ++++++++++++++ guilds_tree.go | 14 +++++++------- messages_text.go | 3 ++- state.go | 4 ++-- 5 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 discordmd/discordmd.go create mode 100644 discordmd/discordmd_test.go diff --git a/discordmd/discordmd.go b/discordmd/discordmd.go new file mode 100644 index 0000000..37cf095 --- /dev/null +++ b/discordmd/discordmd.go @@ -0,0 +1,20 @@ +package discordmd + +import ( + "regexp" +) + +var ( + boldRegex = regexp.MustCompile(`(?ms)\*\*(.*?)\*\*`) + italicRegex = regexp.MustCompile(`(?ms)\*(.*?)\*`) + underlineRegex = regexp.MustCompile(`(?ms)__(.*?)__`) + strikeThroughRegex = regexp.MustCompile(`(?ms)~~(.*?)~~`) +) + +func Parse(input string) string { + input = boldRegex.ReplaceAllString(input, "[::b]$1[::-]") + input = italicRegex.ReplaceAllString(input, "[::i]$1[::-]") + input = underlineRegex.ReplaceAllString(input, "[::u]$1[::-]") + input = strikeThroughRegex.ReplaceAllString(input, "[::s]$1[::-]") + return input +} diff --git a/discordmd/discordmd_test.go b/discordmd/discordmd_test.go new file mode 100644 index 0000000..5f7a42b --- /dev/null +++ b/discordmd/discordmd_test.go @@ -0,0 +1,14 @@ +package discordmd + +import ( + "testing" +) + +func TestParse(t *testing.T) { + const input = `**Lorem** ipsum dolor sit amet, consectetur adipiscing __elit.__ Nullam ante magna, luctus in ~~molestie non, elementum sit~~ amet tortor. Nunc euismod urna ac massa dictum ultrices. Donec tempor __dignissim__ ullamcorper. Mauris ultricies, risus non malesuada consectetur, *purus leo interdum purus*, nec vestibulum lacus neque non nulla.` + const want = `[::b]Lorem[::-] ipsum dolor sit amet, consectetur adipiscing [::u]elit.[::-] Nullam ante magna, luctus in [::s]molestie non, elementum sit[::-] amet tortor. Nunc euismod urna ac massa dictum ultrices. Donec tempor [::u]dignissim[::-] ullamcorper. Mauris ultricies, risus non malesuada consectetur, [::i]purus leo interdum purus[::-], nec vestibulum lacus neque non nulla.` + + if got := Parse(input); got != want { + t.Errorf("got %s; want %s", got, want) + } +} diff --git a/guilds_tree.go b/guilds_tree.go index 06a8db3..6d74013 100644 --- a/guilds_tree.go +++ b/guilds_tree.go @@ -42,7 +42,7 @@ func newGuildsTree() *GuildsTree { return gt } -func (gt *GuildsTree) newGuildFromID(n *tview.TreeNode, gid discord.GuildID) error { +func (gt *GuildsTree) createGuildNodeFromID(n *tview.TreeNode, gid discord.GuildID) error { g, err := discordState.Cabinet.Guild(gid) if err != nil { return err @@ -54,7 +54,7 @@ func (gt *GuildsTree) newGuildFromID(n *tview.TreeNode, gid discord.GuildID) err return nil } -func (gt *GuildsTree) newChannel(n *tview.TreeNode, c discord.Channel) { +func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) { cn := tview.NewTreeNode(gt.channelToString(c)) cn.SetReference(c.ID) n.AddChild(cn) @@ -121,7 +121,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) { // Orphan (top-level) channels for _, c := range cs { if c.Type != discord.GuildCategory && !c.ParentID.IsValid() { - gt.newChannel(n, c) + gt.createChannelNode(n, c) } } @@ -131,12 +131,12 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) { if c.Type == discord.GuildCategory { for _, nestedChannel := range cs { if nestedChannel.ParentID == c.ID { - gt.newChannel(n, c) + gt.createChannelNode(n, c) continue CATEGORY } } - gt.newChannel(n, c) + gt.createChannelNode(n, c) } } @@ -154,7 +154,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) { }) if parent != nil { - gt.newChannel(parent, c) + gt.createChannelNode(parent, c) } } } @@ -196,7 +196,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) { }) for _, c := range cs { - gt.newChannel(n, c) + gt.createChannelNode(n, c) } } } diff --git a/messages_text.go b/messages_text.go index 16c6eff..55e740d 100644 --- a/messages_text.go +++ b/messages_text.go @@ -5,6 +5,7 @@ import ( "log" "time" + "github.com/ayn2op/discordo/discordmd" "github.com/diamondburned/arikawa/v3/discord" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" @@ -92,7 +93,7 @@ func (mt *MessagesText) newTimestamp(m *discord.Message) { } func (mt *MessagesText) newContent(m *discord.Message) { - fmt.Fprint(mt, tview.Escape(m.Content)) + fmt.Fprint(mt, discordmd.Parse(tview.Escape(m.Content))) } func (mt *MessagesText) newAttachments(m *discord.Message) { diff --git a/state.go b/state.go index ec35799..69f6321 100644 --- a/state.go +++ b/state.go @@ -42,7 +42,7 @@ func (s *State) onReady(r *gateway.ReadyEvent) { for _, gf := range r.UserSettings.GuildFolders { /// If the ID of the guild folder is zero, the guild folder only contains single guild. if gf.ID == 0 { - if err := guildsTree.newGuildFromID(guildsTree.root, gf.GuildIDs[0]); err != nil { + if err := guildsTree.createGuildNodeFromID(guildsTree.root, gf.GuildIDs[0]); err != nil { log.Println(err) continue } @@ -51,7 +51,7 @@ func (s *State) onReady(r *gateway.ReadyEvent) { guildsTree.root.AddChild(gfNode) for _, gid := range gf.GuildIDs { - if err := guildsTree.newGuildFromID(gfNode, gid); err != nil { + if err := guildsTree.createGuildNodeFromID(gfNode, gid); err != nil { log.Println(err) continue }