From ba0bfe70a8f07164e1341f4b094841acdad5c3a2 Mon Sep 17 00:00:00 2001
From: Wim <wim@42.be>
Date: Sat, 23 May 2020 21:46:15 +0200
Subject: [PATCH] Add StripMarkdown option (irc). (#1145)

Enable `StripMarkdown` to strip markdown for irc.
---
 bridge/config/config.go                       |  1 +
 bridge/irc/irc.go                             |  5 ++
 go.mod                                        |  2 +
 go.sum                                        |  2 +
 matterbridge.toml.sample                      |  4 ++
 .../writeas/go-strip-markdown/.gitignore      |  3 +
 .../writeas/go-strip-markdown/LICENSE         | 21 ++++++
 .../writeas/go-strip-markdown/README.md       | 51 ++++++++++++++
 .../writeas/go-strip-markdown/strip.go        | 66 +++++++++++++++++++
 vendor/modules.txt                            |  2 +
 10 files changed, 157 insertions(+)
 create mode 100644 vendor/github.com/writeas/go-strip-markdown/.gitignore
 create mode 100644 vendor/github.com/writeas/go-strip-markdown/LICENSE
 create mode 100644 vendor/github.com/writeas/go-strip-markdown/README.md
 create mode 100644 vendor/github.com/writeas/go-strip-markdown/strip.go

diff --git a/bridge/config/config.go b/bridge/config/config.go
index 031f5a81..59d7d4be 100644
--- a/bridge/config/config.go
+++ b/bridge/config/config.go
@@ -136,6 +136,7 @@ type Protocol struct {
 	SkipTLSVerify          bool       // IRC, mattermost
 	SkipVersionCheck       bool       // mattermost
 	StripNick              bool       // all protocols
+	StripMarkdown          bool       // irc
 	SyncTopic              bool       // slack
 	TengoModifyMessage     string     // general
 	Team                   string     // mattermost, keybase
diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go
index bae9aef0..5fc315a7 100644
--- a/bridge/irc/irc.go
+++ b/bridge/irc/irc.go
@@ -14,6 +14,7 @@ import (
 	"github.com/42wim/matterbridge/bridge/config"
 	"github.com/42wim/matterbridge/bridge/helper"
 	"github.com/lrstanley/girc"
+	stripmd "github.com/writeas/go-strip-markdown"
 
 	// We need to import the 'data' package as an implicit dependency.
 	// See: https://godoc.org/github.com/paulrosania/go-charset/charset
@@ -156,6 +157,10 @@ func (b *Birc) Send(msg config.Message) (string, error) {
 	}
 
 	var msgLines []string
+	if b.GetBool("StripMarkdown") {
+		msg.Text = stripmd.Strip(msg.Text)
+	}
+
 	if b.GetBool("MessageSplit") {
 		msgLines = helper.GetSubLines(msg.Text, b.MessageLength)
 	} else {
diff --git a/go.mod b/go.mod
index c2433d09..e7378bce 100644
--- a/go.mod
+++ b/go.mod
@@ -49,6 +49,7 @@ require (
 	github.com/spf13/viper v1.6.1
 	github.com/stretchr/testify v1.4.0
 	github.com/technoweenie/multipartstreamer v1.0.1 // indirect
+	github.com/writeas/go-strip-markdown v2.0.1+incompatible
 	github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
 	github.com/yaegashi/msgraph.go v0.1.2
 	github.com/zfjagann/golang-ring v0.0.0-20190106091943-a88bb6aef447
@@ -56,6 +57,7 @@ require (
 	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
 	gopkg.in/fsnotify.v1 v1.4.7 // indirect
 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
+	github.com/writeas/go-strip-markdown v2.0.1+incompatible
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
 )
 
diff --git a/go.sum b/go.sum
index b983d8c1..52b7c7fd 100644
--- a/go.sum
+++ b/go.sum
@@ -250,6 +250,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC
 github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4=
 github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
+github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw=
+github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9pXdk8V6MVnZmTzRG0alMNLMwa0J01fE=
 github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
 github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample
index e0942c65..975078c7 100644
--- a/matterbridge.toml.sample
+++ b/matterbridge.toml.sample
@@ -103,6 +103,10 @@ ColorNicks=false
 #OPTIONAL (default empty)
 RunCommands=["PRIVMSG user hello","PRIVMSG chanserv something"]
 
+#StripMarkdown strips markdown from messages
+#OPTIONAL (default false)
+StripMarkdown=false
+
 #Nicks you want to ignore.
 #Regular expressions supported
 #Messages from those users will not be sent to other bridges.
diff --git a/vendor/github.com/writeas/go-strip-markdown/.gitignore b/vendor/github.com/writeas/go-strip-markdown/.gitignore
new file mode 100644
index 00000000..270dc7ce
--- /dev/null
+++ b/vendor/github.com/writeas/go-strip-markdown/.gitignore
@@ -0,0 +1,3 @@
+*~
+*.swp
+cmd/strip/strip
diff --git a/vendor/github.com/writeas/go-strip-markdown/LICENSE b/vendor/github.com/writeas/go-strip-markdown/LICENSE
new file mode 100644
index 00000000..134a5b8e
--- /dev/null
+++ b/vendor/github.com/writeas/go-strip-markdown/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Write.as
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/writeas/go-strip-markdown/README.md b/vendor/github.com/writeas/go-strip-markdown/README.md
new file mode 100644
index 00000000..41664c52
--- /dev/null
+++ b/vendor/github.com/writeas/go-strip-markdown/README.md
@@ -0,0 +1,51 @@
+# go-strip-markdown
+
+[![GoDoc](https://godoc.org/github.com/writeas/go-strip-markdown?status.svg)](https://godoc.org/github.com/writeas/go-strip-markdown)
+
+A Markdown stripper written in Go (golang).
+
+## Usage
+You could create a simple command-line utility:
+
+```go
+package main
+
+import (
+	"fmt"
+	"github.com/writeas/go-strip-markdown"
+	"os"
+)
+
+func main() {
+	if len(os.Args) < 2 {
+		os.Exit(1)
+	}
+	fmt.Println(stripmd.Strip(os.Args[1]))
+}
+```
+
+You could pass it Markdown and get pure, beauteous text in return:
+
+```bash
+./strip "# A Tale of Text Formatting
+
+_One fateful day_ a developer was presented with [Markdown](https://daringfireball.net/projects/markdown/).
+And they wanted **none of it**."
+
+# A Tale of Text Formatting
+#
+# One fateful day a developer was presented with Markdown.
+# And they wanted none of it.
+```
+
+## Inspiration
+This was largely based off of [remove-markdown](https://github.com/stiang/remove-markdown), a Markdown stripper written in Javascript.
+
+## Used by
+
+This library is used in these projects:
+
+* [WriteFreely](https://github.com/writeas/writefreely)
+
+## License
+MIT.
diff --git a/vendor/github.com/writeas/go-strip-markdown/strip.go b/vendor/github.com/writeas/go-strip-markdown/strip.go
new file mode 100644
index 00000000..c20812f6
--- /dev/null
+++ b/vendor/github.com/writeas/go-strip-markdown/strip.go
@@ -0,0 +1,66 @@
+// Package stripmd strips Markdown from text
+package stripmd
+
+import (
+	"regexp"
+)
+
+var (
+	listLeadersReg = regexp.MustCompile(`(?m)^([\s\t]*)([\*\-\+]|\d\.)\s+`)
+
+	headerReg = regexp.MustCompile(`\n={2,}`)
+	strikeReg = regexp.MustCompile(`~~`)
+	codeReg   = regexp.MustCompile("`{3}" + `.*\n`)
+
+	htmlReg         = regexp.MustCompile("<(.*?)>")
+	emphReg         = regexp.MustCompile(`\*\*([^*]+)\*\*`)
+	emphReg2        = regexp.MustCompile(`\*([^*]+)\*`)
+	emphReg3        = regexp.MustCompile(`__([^_]+)__`)
+	emphReg4        = regexp.MustCompile(`_([^_]+)_`)
+	setextHeaderReg = regexp.MustCompile(`^[=\-]{2,}\s*$`)
+	footnotesReg    = regexp.MustCompile(`\[\^.+?\](\: .*?$)?`)
+	footnotes2Reg   = regexp.MustCompile(`\s{0,2}\[.*?\]: .*?$`)
+	imagesReg       = regexp.MustCompile(`\!\[(.*?)\]\s?[\[\(].*?[\]\)]`)
+	linksReg        = regexp.MustCompile(`\[(.*?)\][\[\(].*?[\]\)]`)
+	blockquoteReg   = regexp.MustCompile(`>\s*`)
+	refLinkReg      = regexp.MustCompile(`^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$`)
+	atxHeaderReg    = regexp.MustCompile(`(?m)^\#{1,6}\s*([^#]+)\s*(\#{1,6})?$`)
+	atxHeaderReg2   = regexp.MustCompile(`([\*_]{1,3})(\S.*?\S)?P1`)
+	atxHeaderReg3   = regexp.MustCompile("(?m)(`{3,})" + `(.*?)?P1`)
+	atxHeaderReg4   = regexp.MustCompile(`^-{3,}\s*$`)
+	atxHeaderReg5   = regexp.MustCompile("`(.+?)`")
+	atxHeaderReg6   = regexp.MustCompile(`\n{2,}`)
+)
+
+// Strip returns the given string sans any Markdown.
+// Where necessary, elements are replaced with their best textual forms, so
+// for example, hyperlinks are stripped of their URL and become only the link
+// text, and images lose their URL and become only the alt text.
+func Strip(s string) string {
+	res := s
+	res = listLeadersReg.ReplaceAllString(res, "$1")
+
+	res = headerReg.ReplaceAllString(res, "\n")
+	res = strikeReg.ReplaceAllString(res, "")
+	res = codeReg.ReplaceAllString(res, "")
+
+	res = emphReg.ReplaceAllString(res, "$1")
+	res = emphReg2.ReplaceAllString(res, "$1")
+	res = emphReg3.ReplaceAllString(res, "$1")
+	res = emphReg4.ReplaceAllString(res, "$1")
+	res = htmlReg.ReplaceAllString(res, "$1")
+	res = setextHeaderReg.ReplaceAllString(res, "")
+	res = footnotesReg.ReplaceAllString(res, "")
+	res = footnotes2Reg.ReplaceAllString(res, "")
+	res = imagesReg.ReplaceAllString(res, "$1")
+	res = linksReg.ReplaceAllString(res, "$1")
+	res = blockquoteReg.ReplaceAllString(res, "  ")
+	res = refLinkReg.ReplaceAllString(res, "")
+	res = atxHeaderReg.ReplaceAllString(res, "$1")
+	res = atxHeaderReg2.ReplaceAllString(res, "$2")
+	res = atxHeaderReg3.ReplaceAllString(res, "$2")
+	res = atxHeaderReg4.ReplaceAllString(res, "")
+	res = atxHeaderReg5.ReplaceAllString(res, "$1")
+	res = atxHeaderReg6.ReplaceAllString(res, "\n\n")
+	return res
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index e8d5ffab..fe595159 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -200,6 +200,8 @@ github.com/technoweenie/multipartstreamer
 github.com/valyala/bytebufferpool
 # github.com/valyala/fasttemplate v1.1.0
 github.com/valyala/fasttemplate
+# github.com/writeas/go-strip-markdown v2.0.1+incompatible
+github.com/writeas/go-strip-markdown
 # github.com/yaegashi/msgraph.go v0.1.2
 github.com/yaegashi/msgraph.go/beta
 github.com/yaegashi/msgraph.go/jsonx