diff --git a/src/Tokens/BoldAndItalicToken.php b/src/Tokens/BoldAndItalicToken.php index fbd47be..271ee18 100644 --- a/src/Tokens/BoldAndItalicToken.php +++ b/src/Tokens/BoldAndItalicToken.php @@ -3,6 +3,8 @@ namespace Tempest\Markdown\Tokens; use Tempest\Markdown\Parser; +use Tempest\Markdown\Rules\CodeRule; +use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; use Tempest\Markdown\Rules\StrikethroughRule; @@ -20,8 +22,10 @@ public function parse(Parser $parser): string $content = $parser ->forToken($this, [ new StrikethroughRule(), + new CodeRule(), new LinkRule(), new SocialHandleRule(), + new ImageRule(), new TextRule(), ]) ->parse($this->content); diff --git a/src/Tokens/BoldToken.php b/src/Tokens/BoldToken.php index bbea35c..cd2a8a0 100644 --- a/src/Tokens/BoldToken.php +++ b/src/Tokens/BoldToken.php @@ -3,6 +3,8 @@ namespace Tempest\Markdown\Tokens; use Tempest\Markdown\Parser; +use Tempest\Markdown\Rules\CodeRule; +use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; @@ -22,8 +24,10 @@ public function parse(Parser $parser): string ->forToken($this, [ new ItalicRule(), new StrikethroughRule(), + new CodeRule(), new LinkRule(), new SocialHandleRule(), + new ImageRule(), new TextRule(), ]) ->parse($this->content); diff --git a/src/Tokens/DivToken.php b/src/Tokens/DivToken.php index 0fd4d92..0ea7470 100644 --- a/src/Tokens/DivToken.php +++ b/src/Tokens/DivToken.php @@ -13,6 +13,7 @@ use Tempest\Markdown\Rules\PreRule; use Tempest\Markdown\Rules\QuoteRule; use Tempest\Markdown\Rules\SocialHandleRule; +use Tempest\Markdown\Rules\StrikethroughRule; use Tempest\Markdown\Rules\TextRule; use Tempest\Markdown\Token; @@ -32,6 +33,7 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new StrikethroughRule(), new LinkRule(), new SocialHandleRule(), new ImageRule(), diff --git a/src/Tokens/HeadingToken.php b/src/Tokens/HeadingToken.php index 419c7dc..385f3b2 100644 --- a/src/Tokens/HeadingToken.php +++ b/src/Tokens/HeadingToken.php @@ -6,6 +6,7 @@ use Tempest\Markdown\Rules\BoldAndItalicRule; use Tempest\Markdown\Rules\BoldRule; use Tempest\Markdown\Rules\CodeRule; +use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; @@ -39,6 +40,7 @@ public function parse(Parser $parser): string new StrikethroughRule(), new LinkRule(), new SocialHandleRule(), + new ImageRule(), new CodeRule(), new TextRule(), ]) diff --git a/src/Tokens/ItalicToken.php b/src/Tokens/ItalicToken.php index 38afe8d..dceeb9e 100644 --- a/src/Tokens/ItalicToken.php +++ b/src/Tokens/ItalicToken.php @@ -4,6 +4,8 @@ use Tempest\Markdown\Parser; use Tempest\Markdown\Rules\BoldRule; +use Tempest\Markdown\Rules\CodeRule; +use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; use Tempest\Markdown\Rules\StrikethroughRule; @@ -22,8 +24,10 @@ public function parse(Parser $parser): string ->forToken($this, [ new BoldRule(), new StrikethroughRule(), + new CodeRule(), new LinkRule(), new SocialHandleRule(), + new ImageRule(), new TextRule(), ]) ->parse($this->content); diff --git a/src/Tokens/ListToken.php b/src/Tokens/ListToken.php index 463c93b..e228ed3 100644 --- a/src/Tokens/ListToken.php +++ b/src/Tokens/ListToken.php @@ -10,6 +10,7 @@ use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; +use Tempest\Markdown\Rules\StrikethroughRule; use Tempest\Markdown\Rules\TextRule; use Tempest\Markdown\Token; @@ -26,6 +27,7 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new StrikethroughRule(), new LinkRule(), new SocialHandleRule(), new ImageRule(), diff --git a/src/Tokens/OrderedListToken.php b/src/Tokens/OrderedListToken.php index d3ddbf0..69576dc 100644 --- a/src/Tokens/OrderedListToken.php +++ b/src/Tokens/OrderedListToken.php @@ -10,6 +10,7 @@ use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; +use Tempest\Markdown\Rules\StrikethroughRule; use Tempest\Markdown\Rules\TextRule; use Tempest\Markdown\Token; @@ -26,6 +27,7 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new StrikethroughRule(), new LinkRule(), new SocialHandleRule(), new ImageRule(), diff --git a/src/Tokens/QuoteToken.php b/src/Tokens/QuoteToken.php index 29b6e46..f6f11d5 100644 --- a/src/Tokens/QuoteToken.php +++ b/src/Tokens/QuoteToken.php @@ -5,11 +5,13 @@ use Tempest\Markdown\Parser; use Tempest\Markdown\Rules\BoldAndItalicRule; use Tempest\Markdown\Rules\BoldRule; +use Tempest\Markdown\Rules\CodeRule; use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\QuoteRule; use Tempest\Markdown\Rules\SocialHandleRule; +use Tempest\Markdown\Rules\StrikethroughRule; use Tempest\Markdown\Rules\TextRule; use Tempest\Markdown\Token; @@ -26,6 +28,8 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new StrikethroughRule(), + new CodeRule(), new QuoteRule(), new LinkRule(), new SocialHandleRule(), diff --git a/src/Tokens/StrikethroughToken.php b/src/Tokens/StrikethroughToken.php index dc4c44b..8b68180 100644 --- a/src/Tokens/StrikethroughToken.php +++ b/src/Tokens/StrikethroughToken.php @@ -5,6 +5,8 @@ use Tempest\Markdown\Parser; use Tempest\Markdown\Rules\BoldAndItalicRule; use Tempest\Markdown\Rules\BoldRule; +use Tempest\Markdown\Rules\CodeRule; +use Tempest\Markdown\Rules\ImageRule; use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; @@ -24,8 +26,10 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new CodeRule(), new LinkRule(), new SocialHandleRule(), + new ImageRule(), new TextRule(), ]) ->parse($this->content); diff --git a/src/Tokens/TableToken.php b/src/Tokens/TableToken.php index a5ea07a..ea69f2d 100644 --- a/src/Tokens/TableToken.php +++ b/src/Tokens/TableToken.php @@ -10,6 +10,7 @@ use Tempest\Markdown\Rules\ItalicRule; use Tempest\Markdown\Rules\LinkRule; use Tempest\Markdown\Rules\SocialHandleRule; +use Tempest\Markdown\Rules\StrikethroughRule; use Tempest\Markdown\Rules\TextRule; use Tempest\Markdown\Token; @@ -26,6 +27,7 @@ public function parse(Parser $parser): string new BoldAndItalicRule(), new BoldRule(), new ItalicRule(), + new StrikethroughRule(), new LinkRule(), new SocialHandleRule(), new CodeRule(), diff --git a/tests/NestedInlineRuleTest.php b/tests/NestedInlineRuleTest.php new file mode 100644 index 0000000..cd8a8e6 --- /dev/null +++ b/tests/NestedInlineRuleTest.php @@ -0,0 +1,150 @@ +assertSame( + $expected, + trim(new Markdown(highlighter: null)->parse($markdown)->html), + ); + } + + public static function provideNestedInline(): iterable + { + yield 'code in a paragraph' => [ + '`code`', + '

code

', + ]; + + yield 'code in a heading' => [ + '# `code`', + '

code

', + ]; + + yield 'code in a blockquote' => [ + '> `code`', + '
code
', + ]; + + yield 'code in bold' => [ + '**`code`**', + '

code

', + ]; + + yield 'code in italic' => [ + '*`code`*', + '

code

', + ]; + + yield 'code in bold italic' => [ + '***`code`***', + '

code

', + ]; + + yield 'code in strikethrough' => [ + '~~`code`~~', + '

code

', + ]; + + yield 'image in a paragraph' => [ + '![alt](img.png)', + '

alt

', + ]; + + yield 'image in a heading' => [ + '# ![alt](img.png)', + '

alt

', + ]; + + yield 'image in bold' => [ + '**![alt](img.png)**', + '

alt

', + ]; + + yield 'image in italic' => [ + '*![alt](img.png)*', + '

alt

', + ]; + + yield 'image in bold italic' => [ + '***![alt](img.png)***', + '

alt

', + ]; + + yield 'image in strikethrough' => [ + '~~![alt](img.png)~~', + '

alt

', + ]; + + yield 'strikethrough in a paragraph' => [ + '~~struck~~', + '

struck

', + ]; + + yield 'strikethrough in a list item' => [ + '- ~~struck~~', + '', + ]; + + yield 'strikethrough in an ordered list item' => [ + '1. ~~struck~~', + '
  1. struck
', + ]; + + yield 'strikethrough in a table cell' => [ + "| h |\n| - |\n| ~~struck~~ |", + '' + . '
h
struck
', + ]; + + yield 'strikethrough in a blockquote' => [ + '> ~~struck~~', + '
struck
', + ]; + + yield 'strikethrough in a div' => [ + ":::\n~~struck~~\n:::\n", + "
struck\n
", + ]; + } + + #[Test] + #[DataProvider('provideSelfNesting')] + public function a_rule_does_not_nest_in_the_token_it_produces( + string $markdown, + string $expected, + ): void { + $this->assertSame( + $expected, + trim(new Markdown(highlighter: null)->parse($markdown)->html), + ); + } + + public static function provideSelfNesting(): iterable + { + yield 'a link does not nest in a link' => [ + '[a [b](https://b.test) c](https://a.test)', + '

a [b](https://b.test) c

', + ]; + + yield 'a social handle does not nest in a link' => [ + '[{x:tempestphp}](https://a.test)', + '

{x:tempestphp}

', + ]; + } +}