diff --git a/modules/markup/markdown/markdown_math_test.go b/modules/markup/markdown/markdown_math_test.go
index a75f18d36a..9e368cb689 100644
--- a/modules/markup/markdown/markdown_math_test.go
+++ b/modules/markup/markdown/markdown_math_test.go
@@ -30,6 +30,10 @@ func TestMathRender(t *testing.T) {
"$ a $",
`
a
` + nl,
},
+ {
+ "$a$$b$",
+ `ab
` + nl,
+ },
{
"$a$ $b$",
`a b
` + nl,
@@ -59,7 +63,7 @@ func TestMathRender(t *testing.T) {
`a$b $a a$b b$
` + nl,
},
{
- "a$x$",
+ "a$x$", // Pattern: "word$other$" The real world example is: "Price is between US$1 and US$2.", so don't parse this.
`a$x$
` + nl,
},
{
@@ -70,6 +74,10 @@ func TestMathRender(t *testing.T) {
"$a$ ($b$) [$c$] {$d$}",
`a (b) [$c$] {$d$}
` + nl,
},
+ {
+ "[$a$](link)",
+ `a
` + nl,
+ },
{
"$$a$$",
`a
` + nl,
diff --git a/modules/markup/markdown/math/inline_parser.go b/modules/markup/markdown/math/inline_parser.go
index a711d1e1cd..564861df90 100644
--- a/modules/markup/markdown/math/inline_parser.go
+++ b/modules/markup/markdown/math/inline_parser.go
@@ -54,6 +54,10 @@ func isAlphanumeric(b byte) bool {
return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9')
}
+func isInMarkdownLinkText(block text.Reader, lineAfter []byte) bool {
+ return block.PrecendingCharacter() == '[' && bytes.HasPrefix(lineAfter, []byte("]("))
+}
+
// Parse parses the current line and returns a result of parsing.
func (parser *inlineParser) Parse(parent ast.Node, block text.Reader, pc parser.Context) ast.Node {
line, _ := block.PeekLine()
@@ -115,7 +119,9 @@ func (parser *inlineParser) Parse(parent ast.Node, block text.Reader, pc parser.
}
// check valid ending character
isValidEndingChar := isPunctuation(succeedingCharacter) || isParenthesesClose(succeedingCharacter) ||
- succeedingCharacter == ' ' || succeedingCharacter == '\n' || succeedingCharacter == 0
+ succeedingCharacter == ' ' || succeedingCharacter == '\n' || succeedingCharacter == 0 ||
+ succeedingCharacter == '$' ||
+ isInMarkdownLinkText(block, line[i+len(stopMark):])
if checkSurrounding && !isValidEndingChar {
break
}