diff --git a/server/plugin.go b/server/plugin.go index 3808bf26..3441b856 100644 --- a/server/plugin.go +++ b/server/plugin.go @@ -60,14 +60,27 @@ func (p *Plugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*mode return false } - if textNode, ok := node.(*markdown.Text); ok { - startPos, endPos := textNode.Range.Position+offset, textNode.Range.End+offset - origText := postText[startPos:endPos] + origText := "" + startPos := 0 + endPos := 0 + + if autolinkNode, ok := node.(*markdown.Autolink); ok { + startPos, endPos = autolinkNode.RawDestination.Position+offset, autolinkNode.RawDestination.End+offset + origText = postText[startPos:endPos] + if autolinkNode.Destination() != origText { + mlog.Error(fmt.Sprintf("Markdown autolink did not match range text, '%s' != '%s'", autolinkNode.Destination(), origText)) + return true + } + } else if textNode, ok := node.(*markdown.Text); ok { + startPos, endPos = textNode.Range.Position+offset, textNode.Range.End+offset + origText = postText[startPos:endPos] if textNode.Text != origText { mlog.Error(fmt.Sprintf("Markdown text did not match range text, '%s' != '%s'", textNode.Text, origText)) return true } + } + if origText != "" { newText := origText for _, l := range links { newText = l.Replace(newText) @@ -78,6 +91,7 @@ func (p *Plugin) MessageWillBePosted(c *plugin.Context, post *model.Post) (*mode offset += len(newText) - len(origText) } } + return true }) post.Message = postText diff --git a/server/plugin_test.go b/server/plugin_test.go index b7a5e2e6..3ec82fe5 100644 --- a/server/plugin_test.go +++ b/server/plugin_test.go @@ -43,6 +43,9 @@ func TestSpecialCases(t *testing.T) { }, &Link{ Pattern: "(Example)", Template: "[Example](https://example.com)", + }, &Link{ + Pattern: "(https://mattermost.atlassian.net/browse/)(MM)(-)(?P\\d+)", + Template: "[MM-$jira_id](https://mattermost.atlassian.net/browse/MM-$jira_id)", }, &Link{ Pattern: "(foo!bar)", Template: "fb", @@ -160,16 +163,27 @@ func TestSpecialCases(t *testing.T) { }, { "foo!bar & foo!bar\nfoo!bar & foo!bar\nfoo!bar & foo!bar", "fb & fb\nfb & fb\nfb & fb", + }, { + "https://mattermost.atlassian.net/browse/MM-12345", + "[MM-12345](https://mattermost.atlassian.net/browse/MM-12345)", + }, { + "Welcome https://mattermost.atlassian.net/browse/MM-12345", + "Welcome [MM-12345](https://mattermost.atlassian.net/browse/MM-12345)", + }, { + "text https://mattermost.atlassian.net/browse/MM-12345 other text", + "text [MM-12345](https://mattermost.atlassian.net/browse/MM-12345) other text", }, } for _, tt := range tests { - post := &model.Post{ - Message: tt.inputMessage, - } + t.Run(tt.inputMessage, func(t *testing.T) { + post := &model.Post{ + Message: tt.inputMessage, + } - rpost, _ := p.MessageWillBePosted(&plugin.Context{}, post) + rpost, _ := p.MessageWillBePosted(&plugin.Context{}, post) - assert.Equal(t, tt.expectedMessage, rpost.Message) + assert.Equal(t, tt.expectedMessage, rpost.Message) + }) } }