From bbcbfcc8cf86438a013a3774154edc136a5bbae0 Mon Sep 17 00:00:00 2001 From: Andreas Schulz Date: Tue, 30 Jul 2024 14:46:03 +0200 Subject: [PATCH] gobble spaces after backslash-hardline-break --- .../core/test/util/parser/ParserTest.java | 71 +++++++++++++++++++ .../parser/internal/InlineParserImpl.java | 12 +++- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/flexmark-core-test/src/test/java/com/vladsch/flexmark/core/test/util/parser/ParserTest.java b/flexmark-core-test/src/test/java/com/vladsch/flexmark/core/test/util/parser/ParserTest.java index e37da066b..6d9a6c143 100644 --- a/flexmark-core-test/src/test/java/com/vladsch/flexmark/core/test/util/parser/ParserTest.java +++ b/flexmark-core-test/src/test/java/com/vladsch/flexmark/core/test/util/parser/ParserTest.java @@ -313,6 +313,77 @@ public void blockquotesWithCrLfLineBreaks() { assertFalse(it.hasNext()); } + @Test + public void assertSpacesHardLineBreak() { + + //---------------------- - -1---------- + //--------------01234567 8 901234567890 + String given = "line1 \r\n line2"; + Parser parser = Parser.builder().build(); + Document document = parser.parse(given); + + assertThat(document.getFirstChild(), instanceOf(Paragraph.class)); + ReversiblePeekingIterator it = document.getFirstChild().getChildIterator(); + + assertTrue(it.hasNext()); + Node node = it.next(); + assertThat(node, instanceOf(Text.class)); + assertEquals("line1", node.getChars().toString()); + assertEquals(0, node.getStartOffset()); + assertEquals(5, node.getEndOffset()); + + assertTrue(it.hasNext()); + node = it.next(); + assertThat(node, instanceOf(HardLineBreak.class)); + assertEquals(5, node.getStartOffset()); + assertEquals(9, node.getEndOffset()); + + assertTrue(it.hasNext()); + node = it.next(); + assertThat(node, instanceOf(Text.class)); + assertEquals("line2", node.getChars().toString()); + assertEquals(14, node.getStartOffset()); + assertEquals(19, node.getEndOffset()); + + assertFalse(it.hasNext()); + } + + @Test + public void assertBackslashHardLineBreak() { + + //-------------------- - - --1---------- + //--------------012345 6 7 8901234567890 + String given = "line1\\\r\n line2"; + Parser parser = Parser.builder().build(); + Document document = parser.parse(given); + + assertThat(document.getFirstChild(), instanceOf(Paragraph.class)); + ReversiblePeekingIterator it = document.getFirstChild().getChildIterator(); + + assertTrue(it.hasNext()); + Node node = it.next(); + assertThat(node, instanceOf(Text.class)); + assertEquals("line1", node.getChars().toString()); + assertEquals(0, node.getStartOffset()); + assertEquals(5, node.getEndOffset()); + + assertTrue(it.hasNext()); + node = it.next(); + assertThat(node, instanceOf(HardLineBreak.class)); + assertEquals(5, node.getStartOffset()); + assertEquals(8, node.getEndOffset()); + + assertTrue(it.hasNext()); + node = it.next(); + assertThat(node, instanceOf(Text.class)); + assertEquals("line2", node.getChars().toString()); + assertEquals(13, node.getStartOffset()); + assertEquals(18, node.getEndOffset()); + + assertFalse(it.hasNext()); + } + + String escape(String input, Parser parser) { BasedSequence baseSeq = BasedSequence.of(input); List handlers = Parser.SPECIAL_LEAD_IN_HANDLERS.get(parser.getOptions()); diff --git a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/InlineParserImpl.java b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/InlineParserImpl.java index 888a98c93..d152b73c4 100644 --- a/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/InlineParserImpl.java +++ b/flexmark/src/main/java/com/vladsch/flexmark/parser/internal/InlineParserImpl.java @@ -524,9 +524,8 @@ public boolean parseNewline() { } // gobble leading spaces in next line - while (peek() == ' ') { - index++; - } + gobbleLeadingSpaces(); + return true; } @@ -542,6 +541,7 @@ protected boolean parseBackslash() { int charsMatched = peek(1) == '\n' ? 2 : 1; appendNode(new HardLineBreak(input.subSequence(index - 1, index + charsMatched))); index += charsMatched; + gobbleLeadingSpaces(); } else if (index < input.length() && myParsing.ESCAPABLE.matcher(input.subSequence(index, index + 1)).matches()) { appendText(input, index - 1, index + 1); index++; @@ -550,6 +550,12 @@ protected boolean parseBackslash() { } return true; } + + private void gobbleLeadingSpaces() { + while (peek() == ' ') { + index++; + } + } /** * Attempt to parse backticks, adding either a backtick code span or a literal sequence of backticks.