diff --git a/commonmark/src/main/java/org/commonmark/internal/util/LinkScanner.java b/commonmark/src/main/java/org/commonmark/internal/util/LinkScanner.java index b8072ad26..f629f4da7 100644 --- a/commonmark/src/main/java/org/commonmark/internal/util/LinkScanner.java +++ b/commonmark/src/main/java/org/commonmark/internal/util/LinkScanner.java @@ -123,7 +123,7 @@ private static boolean scanLinkDestinationWithBalancedParens(Scanner scanner) { char c = scanner.peek(); switch (c) { case ' ': - return !empty; + return !empty && parens == 0; case '\\': scanner.next(); if (isEscapable(scanner.peek())) { @@ -149,14 +149,14 @@ private static boolean scanLinkDestinationWithBalancedParens(Scanner scanner) { default: // or control character if (Character.isISOControl(c)) { - return !empty; + return !empty && parens == 0; } scanner.next(); break; } empty = false; } - return true; + return parens == 0; } private static boolean isEscapable(char c) { diff --git a/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java b/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java index 43b7686c9..f1021d2ee 100644 --- a/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java +++ b/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java @@ -207,6 +207,16 @@ public void linkLabelWithBracket() { """); } + @Test + public void linkReferenceDefinitionWithUnbalancedParens() { + // Parentheses in a link destination must be balanced, otherwise it's not a definition + assertRendering("[foo]: (", "

[foo]: (

\n"); + assertRendering("[foo]: (\nbar", "

[foo]: (\nbar

\n"); + assertRendering("[foo]: a(b\n\n[foo]", "

[foo]: a(b

\n

[foo]

\n"); + assertRendering( + "[foo]: a(b) \"t\"\n\n[foo]", "

foo

\n"); + } + @Test public void linkLabelLength() { String label1 = "a".repeat(999);