diff --git a/src/Languages/Base/Injections/AdditionInjection.php b/src/Languages/Base/Injections/AdditionInjection.php
index a3496ab..8ef5ba0 100644
--- a/src/Languages/Base/Injections/AdditionInjection.php
+++ b/src/Languages/Base/Injections/AdditionInjection.php
@@ -20,6 +20,8 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio
preg_match_all('/(\{\+)((.|\n)*?)(\+})/', $content, $matches, PREG_OFFSET_CAPTURE);
+ $parsedOffset = 0;
+
foreach ($matches[0] as $match) {
$matchedContent = $match[0];
$offset = $match[1];
@@ -42,20 +44,22 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio
$startingLineNumber = substr_count(
haystack: $content,
needle: PHP_EOL,
- length: $offset,
+ length: $offset + $parsedOffset,
) + 1;
$totalAmountOfLines = substr_count(
haystack: $parsedMatchedContent,
needle: PHP_EOL,
- ) + 1;
+ );
- for ($lineNumber = $startingLineNumber; $lineNumber < $startingLineNumber + $totalAmountOfLines; $lineNumber++) {
+ for ($lineNumber = $startingLineNumber; $lineNumber <= $startingLineNumber + $totalAmountOfLines; $lineNumber++) {
$gutter
->addIcon($lineNumber, '+')
->addClass($lineNumber, 'hl-gutter-addition');
}
}
+
+ $parsedOffset += strlen($open) + strlen($close);
}
return new ParsedInjection($content);
diff --git a/src/Languages/Base/Injections/DeletionInjection.php b/src/Languages/Base/Injections/DeletionInjection.php
index 6b5d20f..355a49f 100644
--- a/src/Languages/Base/Injections/DeletionInjection.php
+++ b/src/Languages/Base/Injections/DeletionInjection.php
@@ -20,6 +20,8 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio
preg_match_all('/(\{-)((.|\n)*?)(-})/', $content, $matches, PREG_OFFSET_CAPTURE);
+ $parsedOffset = 0;
+
foreach ($matches[0] as $match) {
$matchedContent = $match[0];
$offset = $match[1];
@@ -42,7 +44,7 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio
$startingLineNumber = substr_count(
haystack: $content,
needle: PHP_EOL,
- length: $offset,
+ length: $offset + $parsedOffset,
) + 1;
$totalAmountOfLines = substr_count(
@@ -56,6 +58,8 @@ public function parse(string $content, Highlighter $highlighter): ParsedInjectio
->addClass($lineNumber, 'hl-gutter-deletion');
}
}
+
+ $parsedOffset += strlen($open) + strlen($close);
}
return new ParsedInjection($content);
diff --git a/src/Languages/Base/Patterns/AdditionEndTokenPattern.php b/src/Languages/Base/Patterns/AdditionEndTokenPattern.php
index 35e4896..5807a49 100644
--- a/src/Languages/Base/Patterns/AdditionEndTokenPattern.php
+++ b/src/Languages/Base/Patterns/AdditionEndTokenPattern.php
@@ -1,11 +1,12 @@
assertSame($expected, $highlighter->parse($input, 'php'));
}
+ public function test_gutter_injection_one_single_line(): void
+ {
+ $input = <<<'TXT'
+on:
+ pull_request:
+ types: [opened, synchronize, reopened, ready_for_review]
+{+ pull_request_target: +}
+other: foo
+TXT;
+
+ $expected = <<<'TXT'
+ 10 on:
+ 11 pull_request:
+ 12 types: [opened, synchronize, reopened, ready_for_review]
+13 + pull_request_target:
+ 14 other: foo
+TXT;
+
+ $highlighter = (new Highlighter())->withGutter(10);
+
+ $this->assertSame($expected, $highlighter->parse($input, 'php'));
+ }
+
+ public function test_gutter_injection_many_single_lines(): void
+ {
+ $input = <<<'TXT'
+on:
+ pull_request:
+ types: [opened, synchronize, reopened, ready_for_review]
+{+ pull_request_target: +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+other: foo
+TXT;
+
+ $expected = <<<'TXT'
+ 10 on:
+ 11 pull_request:
+ 12 types: [opened, synchronize, reopened, ready_for_review]
+13 + pull_request_target:
+14 + types: [opened, synchronize, reopened, ready_for_review]
+15 + types: [opened, synchronize, reopened, ready_for_review]
+16 + types: [opened, synchronize, reopened, ready_for_review]
+ 17 other: foo
+TXT;
+
+ $highlighter = (new Highlighter())->withGutter(10);
+
+ $this->assertSame($expected, $highlighter->parse($input, 'php'));
+ }
+
public function test_gutter_injection_terminal(): void
{
$input = <<<'TXT'
@@ -76,7 +128,7 @@ public function test_gutter_injection_terminal(): void
TXT;
$expected = <<<'TXT'
-ICAxMCAbWzM0bWZvcmVhY2gbWzBtICgbWzBtJGxpbmVzG1swbSAbWzM0bWFzG1swbSAbWzBtJGkbWzBtID0+IBtbMG0kbGluZRtbMG0pIHsKICAxMSAgICAgG1swbSRndXR0ZXJOdW1iZXIbWzBtID0gG1swbSRndXR0ZXJOdW1iZXJzG1swbVsbWzBtJGkbWzBtXTsKICAxMiAKICAxMyAgICAgG1swbSRndXR0ZXJDbGFzcxtbMG0gPSAnG1szMG1obC1ndXR0ZXIgG1swbScgLiAoG1swbSR0aGlzG1swbS0+G1szMm1jbGFzc2VzG1swbVsbWzBtJGkbWzBtICsgMV0gPz8gJxtbMzBtG1swbScpOwoxNCArIAoxNSArICAgICAbWzBtJGxpbmVzG1swbVsbWzBtJGkbWzBtXSA9IBtbMzJtc3ByaW50ZhtbMG0oCjE2ICsgICAgICAgICAbWzMxbUVzY2FwZRtbMG06OhtbMzJtdG9rZW5zG1swbSgnG1szMG08c3BhbiBjbGFzcz0iJXMiPiVzPC9zcGFuPiVzG1swbScpLAogIDE3ICAgICAgICAgG1swbSRndXR0ZXJDbGFzcxtbMG0sCiAgMTggICAgICAgICAbWzMybXN0cl9wYWQbWzBtKAoxOSAtICAgICAgICAgICAgIBtbMzJtc3RyaW5nG1swbTogG1swbSRndXR0ZXJOdW1iZXIbWzBtLAogIDIwICAgICAgICAgICAgIBtbMzJtbGVuZ3RoG1swbTogG1swbSRndXR0ZXJXaWR0aBtbMG0sCiAgMjEgICAgICAgICAgICAgG1szMm1wYWRfdHlwZRtbMG06IBtbMzJtU1RSX1BBRF9MRUZUG1swbSwKICAyMiAgICAgICAgICksCiAgMjMgICAgICAgICAbWzBtJGxpbmUbWzBtLAogIDI0ICAgICApOwogIDI1IH0=
+ICAxMCAbWzM0bWZvcmVhY2gbWzBtICgbWzBtJGxpbmVzG1swbSAbWzM0bWFzG1swbSAbWzBtJGkbWzBtID0+IBtbMG0kbGluZRtbMG0pIHsKICAxMSAgICAgG1swbSRndXR0ZXJOdW1iZXIbWzBtID0gG1swbSRndXR0ZXJOdW1iZXJzG1swbVsbWzBtJGkbWzBtXTsKICAxMiAKICAxMyAgICAgG1swbSRndXR0ZXJDbGFzcxtbMG0gPSAnG1szMG1obC1ndXR0ZXIgG1swbScgLiAoG1swbSR0aGlzG1swbS0+G1szMm1jbGFzc2VzG1swbVsbWzBtJGkbWzBtICsgMV0gPz8gJxtbMzBtG1swbScpOwoxNCArIBtbMG0bWzBtCjE1ICsgICAgIBtbMG0kbGluZXMbWzBtWxtbMG0kaRtbMG1dID0gG1szMm1zcHJpbnRmG1swbSgKMTYgKyAgICAgICAgIBtbMzFtRXNjYXBlG1swbTo6G1szMm10b2tlbnMbWzBtKCcbWzMwbTxzcGFuIGNsYXNzPSIlcyI+JXM8L3NwYW4+JXMbWzBtJyksG1swbRtbMG0KICAxNyAgICAgICAgIBtbMG0kZ3V0dGVyQ2xhc3MbWzBtLAogIDE4ICAgICAgICAgG1szMm1zdHJfcGFkG1swbSgKMTkgLSAgICAgICAgICAgICAbWzMybXN0cmluZxtbMG06IBtbMG0bWzBtG1swbSRndXR0ZXJOdW1iZXIbWzBtG1swbRtbMG0sCiAgMjAgICAgICAgICAgICAgG1szMm1sZW5ndGgbWzBtOiAbWzBtJGd1dHRlcldpZHRoG1swbSwKICAyMSAgICAgICAgICAgICAbWzMybXBhZF90eXBlG1swbTogG1szMm1TVFJfUEFEX0xFRlQbWzBtLAogIDIyICAgICAgICAgKSwKICAyMyAgICAgICAgIBtbMG0kbGluZRtbMG0sCiAgMjQgICAgICk7CiAgMjUgfQ==
TXT;
$highlighter = (new Highlighter(new LightTerminalTheme()))->withGutter(10);
diff --git a/tests/index.php b/tests/index.php
index 246ecb2..9901430 100644
--- a/tests/index.php
+++ b/tests/index.php
@@ -11,7 +11,6 @@
use Tempest\Highlight\CommonMark\InlineCodeBlockRenderer;
use Tempest\Highlight\Highlighter;
use Tempest\Highlight\Themes\CssTheme;
-use Tempest\Highlight\Themes\InlineTheme;
$environment = new Environment();
diff --git a/tests/targets/test.md b/tests/targets/test.md
index 16d519a..16a567b 100644
--- a/tests/targets/test.md
+++ b/tests/targets/test.md
@@ -2,6 +2,9 @@
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
-{- pull_request_target: -}
-{- types: [opened, synchronize, reopened, ready_for_review] -}
+{+ pull_request_target: +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+{+ types: [opened, synchronize, reopened, ready_for_review] +}
+other: foo
```
\ No newline at end of file