Skip to content

Commit

Permalink
Fix for gutter counting being wrong
Browse files Browse the repository at this point in the history
  • Loading branch information
brendt committed Apr 15, 2024
1 parent d3810e4 commit b6a2a5f
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 14 deletions.
10 changes: 7 additions & 3 deletions src/Languages/Base/Injections/AdditionInjection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);
Expand Down
6 changes: 5 additions & 1 deletion src/Languages/Base/Injections/DeletionInjection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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(
Expand All @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions src/Languages/Base/Patterns/AdditionEndTokenPattern.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Base\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\DynamicTokenType;
use Tempest\Highlight\Tokens\IgnoreTokenType;
use Tempest\Highlight\Tokens\TokenType;

Expand All @@ -23,4 +24,4 @@ public function getTokenType(): TokenType
{
return new IgnoreTokenType();
}
}
}
5 changes: 3 additions & 2 deletions src/Languages/Base/Patterns/AdditionStartTokenPattern.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Base\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\PatternTest;
use Tempest\Highlight\Tokens\DynamicTokenType;
use Tempest\Highlight\Tokens\IgnoreTokenType;
use Tempest\Highlight\Tokens\TokenType;

Expand All @@ -23,4 +24,4 @@ public function getTokenType(): TokenType
{
return new IgnoreTokenType();
}
}
}
4 changes: 3 additions & 1 deletion src/Languages/Base/Patterns/DeletionEndTokenPattern.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Base\Patterns;

use Tempest\Highlight\IsPattern;
Expand All @@ -22,4 +24,4 @@ public function getTokenType(): TokenType
{
return new IgnoreTokenType();
}
}
}
4 changes: 3 additions & 1 deletion src/Languages/Base/Patterns/DeletionStartTokenPattern.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Base\Patterns;

use Tempest\Highlight\IsPattern;
Expand All @@ -22,4 +24,4 @@ public function getTokenType(): TokenType
{
return new IgnoreTokenType();
}
}
}
54 changes: 53 additions & 1 deletion tests/Languages/Base/Injections/GutterInjectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,58 @@ public function test_gutter_injection(): void
$this->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'
<span class="hl-gutter "> 10</span> <span class="hl-property">on</span>:
<span class="hl-gutter "> 11</span> <span class="hl-property">pull_request</span>:
<span class="hl-gutter "> 12</span> <span class="hl-property">types</span>: [opened, synchronize, reopened, ready_for_review]
<span class="hl-gutter hl-gutter-addition">13 +</span> <span class="hl-addition"> <span class="hl-property">pull_request_target</span>: </span>
<span class="hl-gutter "> 14</span> <span class="hl-property">other</span>: 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'
<span class="hl-gutter "> 10</span> <span class="hl-property">on</span>:
<span class="hl-gutter "> 11</span> <span class="hl-property">pull_request</span>:
<span class="hl-gutter "> 12</span> <span class="hl-property">types</span>: [opened, synchronize, reopened, ready_for_review]
<span class="hl-gutter hl-gutter-addition">13 +</span> <span class="hl-addition"> <span class="hl-property">pull_request_target</span>: </span>
<span class="hl-gutter hl-gutter-addition">14 +</span> <span class="hl-addition"> <span class="hl-property">types</span>: [opened, synchronize, reopened, ready_for_review] </span>
<span class="hl-gutter hl-gutter-addition">15 +</span> <span class="hl-addition"> <span class="hl-property">types</span>: [opened, synchronize, reopened, ready_for_review] </span>
<span class="hl-gutter hl-gutter-addition">16 +</span> <span class="hl-addition"> <span class="hl-property">types</span>: [opened, synchronize, reopened, ready_for_review] </span>
<span class="hl-gutter "> 17</span> <span class="hl-property">other</span>: foo
TXT;

$highlighter = (new Highlighter())->withGutter(10);

$this->assertSame($expected, $highlighter->parse($input, 'php'));
}

public function test_gutter_injection_terminal(): void
{
$input = <<<'TXT'
Expand All @@ -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);
Expand Down
1 change: 0 additions & 1 deletion tests/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
7 changes: 5 additions & 2 deletions tests/targets/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

0 comments on commit b6a2a5f

Please sign in to comment.