diff --git a/lib/Nodes/Node.php b/lib/Nodes/Node.php index b0ea4103..b85894bd 100644 --- a/lib/Nodes/Node.php +++ b/lib/Nodes/Node.php @@ -15,6 +15,7 @@ use Doctrine\RST\Renderers\RenderedNode; use function implode; +use function ltrim; use function strlen; use function substr; use function trim; @@ -137,18 +138,25 @@ public function getValueString(): string protected function normalizeLines(array $lines): string { if ($lines !== []) { - $firstLine = $lines[0]; + $indentLevel = null; - $k = 0; + // find the indentation by locating the line with the fewest preceding whitespace + foreach ($lines as $line) { + // skip empty lines + if (trim($line) === '') { + continue; + } - for ($k = 0; $k < strlen($firstLine); $k++) { - if (trim($firstLine[$k]) !== '') { - break; + $startingWhitespace = strlen($line) - strlen(ltrim($line)); + if ($indentLevel !== null && $startingWhitespace > $indentLevel) { + continue; } + + $indentLevel = $startingWhitespace; } foreach ($lines as &$line) { - $line = substr($line, $k); + $line = substr($line, $indentLevel); } } diff --git a/tests/Functional/FunctionalTest.php b/tests/Functional/FunctionalTest.php index 4c56fcc3..2cb36e99 100644 --- a/tests/Functional/FunctionalTest.php +++ b/tests/Functional/FunctionalTest.php @@ -32,6 +32,7 @@ class FunctionalTest extends TestCase { private const RENDER_DOCUMENT_FILES = ['main-directive']; + private const SKIP_INDENTER_FILES = ['code-block-diff']; protected function setUp(): void { @@ -47,7 +48,8 @@ public function testFunctional( string $renderMethod, string $format, string $rst, - string $expected + string $expected, + bool $useIndenter = true ): void { $expectedLines = explode("\n", $expected); $firstLine = $expectedLines[0]; @@ -68,7 +70,7 @@ public function testFunctional( $rendered = $document->$renderMethod(); - if ($format === Format::HTML) { + if ($format === Format::HTML && $useIndenter) { $indenter = new Indenter(); $rendered = $indenter->indent($rendered); } @@ -133,7 +135,9 @@ public function getFunctionalTests(): array ? 'renderDocument' : 'render'; - $tests[$basename . '_' . $format] = [$basename, $parser, $renderMethod, $format, $rst, trim($expected)]; + $useIndenter = ! in_array($basename, self::SKIP_INDENTER_FILES, true); + + $tests[$basename . '_' . $format] = [$basename, $parser, $renderMethod, $format, $rst, trim($expected), $useIndenter]; } } diff --git a/tests/Functional/tests/code-block-diff/code-block-diff.html b/tests/Functional/tests/code-block-diff/code-block-diff.html new file mode 100644 index 00000000..d887b9b6 --- /dev/null +++ b/tests/Functional/tests/code-block-diff/code-block-diff.html @@ -0,0 +1,14 @@ +
+ Added line
+- Removed line
+ Normal line
+- Removed line
++ Added line
+
+
+ Normal line
++ Added line
+- Removed line
+ Normal line
+- Removed line
++ Added line
+
diff --git a/tests/Functional/tests/code-block-diff/code-block-diff.rst b/tests/Functional/tests/code-block-diff/code-block-diff.rst
new file mode 100644
index 00000000..fce0f5f6
--- /dev/null
+++ b/tests/Functional/tests/code-block-diff/code-block-diff.rst
@@ -0,0 +1,18 @@
+
+.. code-block:: diff
+
+ + Added line
+ - Removed line
+ Normal line
+ - Removed line
+ + Added line
+
+
+.. code-block:: diff
+
+ Normal line
+ + Added line
+ - Removed line
+ Normal line
+ - Removed line
+ + Added line