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