diff --git a/matterircd.toml.example b/matterircd.toml.example index 370b9db5..a95230c4 100644 --- a/matterircd.toml.example +++ b/matterircd.toml.example @@ -153,6 +153,9 @@ ShowMentions = false # This disables that making them appear as normal PRIVMSGs. #DisableDefaultMentions = true +# Disable formatting / emphasis of text from Mattermost markdown to IRC (bold & italics) +#DisableIRCEmphasis = true + # Enable syntax highlighting for code blocks. # Formatter and Style are passed through to the chroma v2 package. # https://github.com/alecthomas/chroma/blob/master/formatters/tty_indexed.go#L262 diff --git a/mm-go-irckit/userbridge.go b/mm-go-irckit/userbridge.go index a5c4b048..5814cec9 100644 --- a/mm-go-irckit/userbridge.go +++ b/mm-go-irckit/userbridge.go @@ -7,6 +7,7 @@ import ( "math/rand" "net" "net/http" + "regexp" "strings" "sync" "time" @@ -160,6 +161,10 @@ func (u *User) handleDirectMessageEvent(event *bridge.DirectMessageEvent) { continue } + if !u.v.GetBool(u.br.Protocol()+".disableircemphasis") && !codeBlockBackTick && !codeBlockTilde { + text = markdown2irc(text) + } + if showContext { text = prefix + text + suffix } @@ -306,6 +311,10 @@ func (u *User) handleChannelMessageEvent(event *bridge.ChannelMessageEvent) { continue } + if !u.v.GetBool(u.br.Protocol()+".disableircemphasis") && !codeBlockBackTick && !codeBlockTilde { + text = markdown2irc(text) + } + if showContext { text = prefix + text + suffix } @@ -1174,3 +1183,43 @@ func (u *User) formatCodeBlockText(text string, prefix string, codeBlockBackTick return text, codeBlockBackTick, codeBlockTilde, lexer } + +// Use static initialisation to optimize. +// Bold & Italic - https://www.markdownguide.org/basic-syntax#bold-and-italic +var boldItalicRegExp = []*regexp.Regexp{ + regexp.MustCompile(`(?:\*\*\*)+?(.+?)(?:\*\*\*)+?`), + regexp.MustCompile(`\b(?:\_\_\_)+?(.+?)(?:\_\_\_)+?\b`), + regexp.MustCompile(`\b(?:\_\_\*)+?(.+?)(?:\*\_\_)+?\b`), + regexp.MustCompile(`\b(?:\*\*\_)+?(.+?)(?:\_\*\*)+?\b`), +} + +// Bold - https://www.markdownguide.org/basic-syntax#bold +var boldRegExp = []*regexp.Regexp{ + regexp.MustCompile(`(?:\*\*)+?(.+?)(?:\*\*)+?`), + regexp.MustCompile(`\b(?:\_\_)+?(.+?)(?:\_\_)+?\b`), +} + +// Italic - https://www.markdownguide.org/basic-syntax#italic +var italicRegExp = []*regexp.Regexp{ + regexp.MustCompile(`(?:\*)+?([^\*]+?)(?:\*)+?`), + regexp.MustCompile(`\b(?:\_)+?([^_]+?)(?:\_)+?\b`), +} + +func markdown2irc(msg string) string { + // Bold & Italic 0x02+0x1d + for _, re := range boldItalicRegExp { + msg = re.ReplaceAllString(msg, "\x02\x1d$1\x1d\x02") + } + + // Bold 0x02 + for _, re := range boldRegExp { + msg = re.ReplaceAllString(msg, "\x02$1\x02") + } + + // Italic 0x1d + for _, re := range italicRegExp { + msg = re.ReplaceAllString(msg, "\x1d$1\x1d") + } + + return msg +}