diff --git a/src/app/Markdown/MediaEmbedExtension.php b/src/app/Markdown/MediaEmbedExtension.php new file mode 100644 index 0000000..194be6a --- /dev/null +++ b/src/app/Markdown/MediaEmbedExtension.php @@ -0,0 +1,17 @@ +addEventListener(DocumentParsedEvent::class, [$listener, 'handle']); + $environment->addRenderer(MediaEmbedNode::class, new MediaEmbedNodeRenderer()); + } +} diff --git a/src/app/Markdown/MediaEmbedListener.php b/src/app/Markdown/MediaEmbedListener.php new file mode 100644 index 0000000..f251964 --- /dev/null +++ b/src/app/Markdown/MediaEmbedListener.php @@ -0,0 +1,30 @@ +getDocument()->iterator() as $node) { + if ($node instanceof Image) { + $imagesToReplace[] = $node; + } + } + + foreach ($imagesToReplace as $image) { + $html = $this->resolver->resolve($image->getUrl()); + if ($html !== null) { + $image->replaceWith(new MediaEmbedNode($html)); + } + } + } +} diff --git a/src/app/Markdown/MediaEmbedNode.php b/src/app/Markdown/MediaEmbedNode.php new file mode 100644 index 0000000..5222895 --- /dev/null +++ b/src/app/Markdown/MediaEmbedNode.php @@ -0,0 +1,16 @@ +getLiteral(); + } +} diff --git a/src/app/Models/Document.php b/src/app/Models/Document.php index bdfb981..e7d6eb8 100644 --- a/src/app/Models/Document.php +++ b/src/app/Models/Document.php @@ -127,6 +127,7 @@ public static function renderMarkdown(string $markdown): string ]); $converter->getEnvironment()->addExtension(new GithubFlavoredMarkdownExtension()); + $converter->getEnvironment()->addExtension(new \App\Markdown\MediaEmbedExtension()); return $converter->convert($markdown)->getContent(); } diff --git a/src/tests/Unit/Markdown/MediaEmbedExtensionTest.php b/src/tests/Unit/Markdown/MediaEmbedExtensionTest.php new file mode 100644 index 0000000..51b2c03 --- /dev/null +++ b/src/tests/Unit/Markdown/MediaEmbedExtensionTest.php @@ -0,0 +1,38 @@ +assertStringContainsString('assertStringContainsString('src="/photo.png"', $html); + } + + public function test_video_url_renders_as_video_tag(): void + { + $html = Document::renderMarkdown('![](/demo.mp4)'); + $this->assertStringContainsString('assertStringContainsString('src="/demo.mp4"', $html); + $this->assertStringNotContainsString('assertStringContainsString('assertStringContainsString('youtube-nocookie.com', $html); + } + + public function test_vimeo_url_renders_as_iframe(): void + { + $html = Document::renderMarkdown('![](https://vimeo.com/123456789)'); + $this->assertStringContainsString('assertStringContainsString('player.vimeo.com', $html); + } +}