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('');
+ $this->assertStringContainsString('