Skip to content

Commit a51e69d

Browse files
committed
feat: add custom markdown renderers
1 parent 8edcaf1 commit a51e69d

2 files changed

Lines changed: 70 additions & 2 deletions

File tree

src/Blocks/Renderer/MarkdownRenderer.php

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,51 @@ public static function render(BlockInterface ...$blocks): string
1212
{
1313
$markdown = "";
1414
foreach ($blocks as $block) {
15-
$markdown = $markdown . self::renderBlock($block) . "\n";
15+
$markdown = $markdown . self::renderBlock($block, 0) . "\n";
1616
}
1717

1818
return $markdown;
1919
}
2020

21-
public static function renderBlock(BlockInterface $block, int $depth = 0): string
21+
/**
22+
* Render blocks with custom renderers.
23+
*
24+
* @param array<value-of<BlockType>, BlockRendererInterface> $overrides
25+
* @param BlockInterface ...$blocks
26+
*
27+
* @return string
28+
*/
29+
public static function renderWithOverrides(
30+
array $overrides,
31+
BlockInterface ...$blocks,
32+
): string {
33+
$markdown = "";
34+
foreach ($blocks as $block) {
35+
$markdown = $markdown . self::renderBlock($block, 0, $overrides) . "\n";
36+
}
37+
38+
return $markdown;
39+
}
40+
41+
/**
42+
* Undocumented function
43+
*
44+
* @param BlockInterface $block
45+
* @param int $depth
46+
* @param array<value-of<BlockType>, BlockRendererInterface> $overrides
47+
*
48+
* @return string
49+
*/
50+
public static function renderBlock(
51+
BlockInterface $block,
52+
int $depth = 0,
53+
array $overrides = []): string
2254
{
55+
if (array_key_exists($block->metadata()->type->value, $overrides)) {
56+
$renderer = $overrides[$block->metadata()->type->value];
57+
return $renderer::render($block, $depth);
58+
}
59+
2360
return match ($block->metadata()->type) {
2461
BlockType::Bookmark => Markdown\BookmarkRenderer::render($block, $depth),
2562
BlockType::Breadcrumb => Markdown\BreadcrumbRenderer::render($block, $depth),

tests/Unit/Blocks/Renderer/MarkdownRendererTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
namespace Notion\Test\Unit\Blocks\Renderer;
44

5+
use Notion\Blocks\BlockType;
56
use Notion\Blocks\BulletedListItem;
67
use Notion\Blocks\Heading1;
78
use Notion\Blocks\Heading2;
89
use Notion\Blocks\Paragraph;
10+
use Notion\Blocks\Renderer\Markdown\Heading1Renderer;
911
use Notion\Blocks\Renderer\MarkdownRenderer;
1012
use PHPUnit\Framework\TestCase;
1113

@@ -37,6 +39,35 @@ public function test_render(): void
3739
## Mall
3840
- Black T-Shirt
3941
42+
MARKDOWN;
43+
44+
$this->assertSame($expected, $markdown);
45+
}
46+
47+
public function test_render_with_overrides(): void
48+
{
49+
$blocks = [
50+
Heading1::fromString("Post title"),
51+
Paragraph::fromString("My dummy post content."),
52+
];
53+
54+
$overrides = [
55+
BlockType::Heading1->value => new class implements \Notion\Blocks\Renderer\BlockRendererInterface {
56+
public static function render(\Notion\Blocks\BlockInterface $block, int $depth = 0): string
57+
{
58+
$original = Heading1Renderer::render($block, $depth);
59+
return "{$original} (OVERRIDE)";
60+
}
61+
},
62+
];
63+
64+
$markdown = MarkdownRenderer::renderWithOverrides($overrides, ...$blocks);
65+
66+
$expected = <<<MARKDOWN
67+
# Post title (OVERRIDE)
68+
My dummy post content.
69+
70+
4071
MARKDOWN;
4172

4273
$this->assertSame($expected, $markdown);

0 commit comments

Comments
 (0)