Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Tempest\Markdown\Rules\ParagraphRule;
use Tempest\Markdown\Rules\PreRule;
use Tempest\Markdown\Rules\QuoteRule;
use Tempest\Markdown\Rules\RawRule;
use Tempest\Markdown\Rules\TableRule;
use Tempest\Markdown\Rules\ThickRulerRule;
use Tempest\Markdown\Rules\ThinRulerRule;
Expand Down Expand Up @@ -45,6 +46,7 @@ public function __construct(
public ?ResponsiveImageFactory $imageFactory = null,
array $rules = [
new NewLineRule(),
new RawRule(),
new FrontMatterRule(),
new HeadingRule(),
new QuoteRule(),
Expand Down
25 changes: 25 additions & 0 deletions src/Rules/RawRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Tempest\Markdown\Rules;

use Tempest\Markdown\Parser;
use Tempest\Markdown\Rule;
use Tempest\Markdown\Token;
use Tempest\Markdown\Tokens\RawToken;

final readonly class RawRule implements Rule
{
public function shouldParse(Parser $parser): bool
{
return $parser->comesNext('@@', length: 2);
}

public function parse(Parser $parser): ?Token
{
$parser->consume(2);
$content = $parser->consumeUntil('@@');
$parser->consume(2);

return new RawToken($content);
}
}
18 changes: 18 additions & 0 deletions src/Tokens/RawToken.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Tempest\Markdown\Tokens;

use Tempest\Markdown\Parser;
use Tempest\Markdown\Token;

final readonly class RawToken implements Token
{
public function __construct(
private string $content,
) {}

public function parse(Parser $parser): string
{
return $this->content;
}
}
25 changes: 25 additions & 0 deletions tests/MarkdownTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -271,4 +271,29 @@ public function test_remove_rules_removes_rule(): void

$this->assertStringNotContainsString('<h1', $parsed->html);
}

#[Test]
public function test_raw(): void
{
$parsed = (string) $this->markdown
->parse(<<<'MD'
## Hello

@@
### World
@@

_hi_
MD);

$this->assertSame(<<<HTML
<h2 id="hello">Hello</h2>


### World


<p><em>hi</em></p>
HTML, $parsed);
}
}
54 changes: 54 additions & 0 deletions tests/Rules/RawRuleTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Tempest\Markdown\Tests\Rules;

use PHPUnit\Framework\Attributes\Test;
use Tempest\Markdown\Parser;
use Tempest\Markdown\Rules\RawRule;
use Tempest\Markdown\Rules\TextRule;
use Tempest\Markdown\Tests\ParserTestCase;

class RawRuleTest extends ParserTestCase
{
#[Test]
public function test_raw_content_is_passed_through(): void
{
$html = (string) new Parser(highlighter: null, rules: [new RawRule()])->parse('@@<b>raw</b>@@');

$this->assertSame('<b>raw</b>', $html);
}

#[Test]
public function test_raw_html_is_not_escaped(): void
{
$html = (string) new Parser(highlighter: null, rules: [new RawRule()])->parse('@@<script>alert("xss")</script>@@');

$this->assertSame('<script>alert("xss")</script>', $html);
}

#[Test]
public function test_raw_inline_with_surrounding_text(): void
{
$html = (string) new Parser(highlighter: null, rules: [new RawRule(), new TextRule()])->parse('Hello @@<em>world</em>@@ end');

$this->assertSame('Hello <em>world</em> end', $html);
}

#[Test]
public function test_multiple_raw_blocks(): void
{
$html = (string) new Parser(highlighter: null, rules: [new RawRule(), new TextRule()])->parse('@@foo@@ and @@bar@@');

$this->assertSame('foo and bar', $html);
}

#[Test]
public function test_raw_multiline_content(): void
{
$input = "@@line1\nline2@@";

$html = (string) new Parser(highlighter: null, rules: [new RawRule()])->parse($input);

$this->assertSame("line1\nline2", $html);
}
}
44 changes: 44 additions & 0 deletions tests/Tokens/RawTokenTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Tempest\Markdown\Tests\Tokens;

use PHPUnit\Framework\Attributes\Test;
use Tempest\Markdown\Parser;
use Tempest\Markdown\Tests\ParserTestCase;
use Tempest\Markdown\Tokens\RawToken;

class RawTokenTest extends ParserTestCase
{
#[Test]
public function test_parse_returns_content_as_is(): void
{
$token = new RawToken('<b>raw</b>');

$this->assertSame('<b>raw</b>', $token->parse(new Parser()));
}

#[Test]
public function test_parse_multiline(): void
{
$content = "line1\nline2";
$token = new RawToken($content);

$this->assertSame($content, $token->parse(new Parser()));
}

#[Test]
public function test_parse_does_not_process_markdown(): void
{
$token = new RawToken('**bold** _italic_');

$this->assertSame('**bold** _italic_', $token->parse(new Parser()));
}

#[Test]
public function test_parse_empty_string(): void
{
$token = new RawToken('');

$this->assertSame('', $token->parse(new Parser()));
}
}
Loading