From 23b4e36272c7a44a034a535f39be1469a976a2d2 Mon Sep 17 00:00:00 2001 From: ybai08 <271969568+ybai08@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:45:11 -0500 Subject: [PATCH] Allow consecutive question marks in inline processing instructions --- .../org/commonmark/internal/inline/HtmlInlineParser.java | 8 ++------ .../java/org/commonmark/test/HtmlInlineParserTest.java | 8 +++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/commonmark/src/main/java/org/commonmark/internal/inline/HtmlInlineParser.java b/commonmark/src/main/java/org/commonmark/internal/inline/HtmlInlineParser.java index babcb90f..9d89b82b 100644 --- a/commonmark/src/main/java/org/commonmark/internal/inline/HtmlInlineParser.java +++ b/commonmark/src/main/java/org/commonmark/internal/inline/HtmlInlineParser.java @@ -164,17 +164,13 @@ private boolean tryProcessingInstruction(Scanner scanner) { return false; } scanner.next(); - int found; - while ((found = scanner.find('?')) > 0) { + while (scanner.find('?') >= 0) { scanner.next(); if (scanner.next('>')) { return true; } } - // The loop also ends when a `?` is found directly at the current position (`found == 0`), - // which is not the end of the input, so only remember the miss when the scan really did - // reach the end. - noProcessingInstructionEnd = found < 0; + noProcessingInstructionEnd = true; return false; } diff --git a/commonmark/src/test/java/org/commonmark/test/HtmlInlineParserTest.java b/commonmark/src/test/java/org/commonmark/test/HtmlInlineParserTest.java index 454c1de8..80520c92 100644 --- a/commonmark/src/test/java/org/commonmark/test/HtmlInlineParserTest.java +++ b/commonmark/src/test/java/org/commonmark/test/HtmlInlineParserTest.java @@ -21,11 +21,17 @@ public void cdata() { assertRendering("inline ", "
inline
\n"); } + @Test + public void processingInstruction() { + assertRendering("inline ?>", "inline ?>
\n"); + assertRendering("inline ", "inline
\n"); + assertRendering("inline ? ", "inline ?
\n"); + } + @Test public void afterFailedAttempt() { // A `<` that doesn't start inline HTML must not stop a later one from being parsed assertRendering("inline ", "inline <!-
\n"); - assertRendering("inline ? ", "inline <??
\n"); assertRendering( "inline ", "inline <![x]]>
\n"); assertRendering("inline ", "inline <!foo>
\n");