johnnyhuy/laravel-useful-commonmark-extension
Installation:
composer require johnnyhuy/laravel-useful-commonmark-extension
Add the service provider to config/app.php:
'providers' => [
// ...
Johnnyhuy\CommonMarkExtension\CommonMarkExtensionServiceProvider::class,
],
Publish Config (optional):
php artisan vendor:publish --provider="Johnnyhuy\CommonMarkExtension\CommonMarkExtensionServiceProvider"
This creates config/commonmark-extensions.php with default settings.
First Use Case: Parse markdown with extensions in a controller:
use League\CommonMark\CommonMarkConverter;
use League\CommonMark\Environment;
$environment = new Environment();
$environment->addExtension(new \Johnnyhuy\CommonMarkExtension\GistExtension());
$converter = new CommonMarkConverter($environment);
$markdown = "# Hello **World**\n\n[]";
echo $converter->convert($markdown);
Dynamic Extension Loading:
Register extensions in config/commonmark-extensions.php:
'extensions' => [
\Johnnyhuy\CommonMarkExtension\GistExtension::class,
\Johnnyhuy\CommonMarkExtension\CodepenExtension::class,
],
Use the helper in your code:
$converter = app(\League\CommonMark\CommonMarkConverter::class);
Blade Integration: Create a Blade directive for reusable markdown parsing:
// In a service provider
Blade::directive('markdown', function ($expression) {
$converter = app(\League\CommonMark\CommonMarkConverter::class);
return "<?php echo {$converter->convert({$expression})}; ?>";
});
Usage in Blade:
@markdown($post->content)
API Responses: Parse markdown in API responses:
return response()->json([
'content' => app(\League\CommonMark\CommonMarkConverter::class)->convert($request->markdown),
]);
Form Handling: Sanitize markdown input before processing:
$cleanMarkdown = app(\League\CommonMark\CommonMarkConverter::class)->convert($request->raw_markdown);
spatie/laravel-markdown or root/str.$cacheKey = 'markdown_'.$post->id;
$html = Cache::remember($cacheKey, now()->addHours(1), function() use ($post) {
return app(\League\CommonMark\CommonMarkConverter::class)->convert($post->content);
});
Extension Conflicts:
config/commonmark-extensions.php to isolate the issue.HTML Sanitization:
HTMLPurifier or spatie/laravel-html to sanitize output:
$purifier = app(\HTMLPurifier::class);
$safeHtml = $purifier->purify($converter->convert($markdown));
Deprecated Laravel Versions:
Missing Assets:
<script src="https://gist.github.com/..."></script>
<script src="https://codepen.io/..."></script>
\Log::debug('Markdown parsed:', [
'input' => $markdown,
'output' => $converter->convert($markdown),
]);
dd($environment->getExtensions()) to list loaded extensions and debug their behavior.| Extension | Tip |
|---|---|
| Gist | Requires valid Gist IDs. Validate with preg_match('/^https:\/\/gist\.github\.com\/[^/]+\/[a-z0-9]+$/', $url). |
| YouTube | Supports short URLs (e.g., youtu.be/...). Test with both formats. |
| Codepen | Needs data-pen-title for embeds. Add a fallback if missing. |
class MarkdownService {
protected $extensions = [];
public function addExtension($extension) {
$this->extensions[] = $extension;
}
public function convert($markdown) {
$environment = new Environment();
foreach ($this->extensions as $extension) {
$environment->addExtension($extension);
}
return (new CommonMarkConverter($environment))->convert($markdown);
}
}
class CustomYouTubeExtension extends \Johnnyhuy\CommonMarkExtension\YouTubeExtension {
protected function getEmbedUrl($url) {
// Custom logic
return parent::getEmbedUrl($url);
}
}
GistExtension) to create your own. Register it in the config.How can I help you explore Laravel packages today?