From 3b3292cdaf6013bdb0f204b39d747721e35937a0 Mon Sep 17 00:00:00 2001 From: Tanbir Hossain Ramim <96797470+TanbirRamim@users.noreply.github.com> Date: Fri, 25 Sep 2026 05:13:13 +0200 Subject: [PATCH] Fix code spans after an unclosed backtick string After scanning to the end for an unclosed backtick string, the parser overwrote the cached last position of each backtick run length while parsing later code spans. A later opener of the same length then looked like it had no closer and was left as text. Fixes #458 --- .../commonmark/internal/inline/BackticksInlineParser.java | 8 ++++++-- .../test/java/org/commonmark/test/SpecialInputTest.java | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/commonmark/src/main/java/org/commonmark/internal/inline/BackticksInlineParser.java b/commonmark/src/main/java/org/commonmark/internal/inline/BackticksInlineParser.java index d14889ca..73e5398b 100644 --- a/commonmark/src/main/java/org/commonmark/internal/inline/BackticksInlineParser.java +++ b/commonmark/src/main/java/org/commonmark/internal/inline/BackticksInlineParser.java @@ -38,8 +38,12 @@ public ParsedInline tryParse(InlineParserState inlineParserState) { while (scanner.find('`') > 0) { var beforeClosing = scanner.position(); var length = scanner.matchMultiple('`'); - // Keep track of last position of backticks run of this length - backtickPositions.put(length, beforeClosing); + // Keep track of last position of backticks run of this length. Once the whole input + // has been scanned, the map already holds the last positions, so don't overwrite them + // with earlier ones. + if (!scannedToEnd) { + backtickPositions.put(length, beforeClosing); + } if (length == openingLength) { Code node = new Code(); diff --git a/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java b/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java index 8dcdbebe..007b5765 100644 --- a/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java +++ b/commonmark/src/test/java/org/commonmark/test/SpecialInputTest.java @@ -456,4 +456,11 @@ public void emphasisAfterHardLineBreak() { Foo
"""); } + + @Test + public void codeSpansAfterUnclosedBackticks() { + assertRendering("`` `a` `c`", "`` a c
`` a c e