erusev/parsedown-extra
Parsedown Extra is a fast PHP Markdown parser with support for Markdown Extra features like tables, footnotes, definition lists, abbreviations, and more. Ideal for turning user-written Markdown into HTML in apps, docs, and CMS workflows.
Installation
composer require erusev/parsedown-extra
Register the service provider in config/app.php:
'providers' => [
// ...
Erusev\ParsedownExtra\ParsedownExtraServiceProvider::class,
],
Publish the config (optional):
php artisan vendor:publish --provider="Erusev\ParsedownExtra\ParsedownExtraServiceProvider"
Basic Usage
Inject the ParsedownExtra class into a controller or service:
use Erusev\ParsedownExtra\ParsedownExtra;
public function convertMarkdown(ParsedownExtra $parsedown)
{
$markdown = "# Hello, **World!**\n\n- List item";
$html = $parsedown->text($markdown);
return response()->html($html);
}
First Use Case Convert markdown in a blog post or comment system:
$parsedown = app(ParsedownExtra::class);
$content = $parsedown->text($userInputMarkdown);
Dynamic Markdown Processing Use dependency injection to process markdown in controllers, middleware, or services:
public function __construct(ParsedownExtra $parsedown) {
$this->parsedown = $parsedown;
}
Reusable Parsing Logic Create a helper trait or service:
trait MarkdownConverter {
public function parse(string $markdown): string {
return app(ParsedownExtra::class)->text($markdown);
}
}
Integration with Blade Extend Blade directives for markdown support:
Blade::directive('markdown', function ($expression) {
return "<?php echo app(\\Erusev\\ParsedownExtra\\ParsedownExtra::class)->text({$expression}); ?>";
});
Usage:
@markdown($post->content)
API Responses Return parsed markdown as HTML in API responses:
return response()->json([
'content' => $parsedown->text($request->markdown),
]);
Form Request Validation
Use ParsedownExtra in form requests to sanitize markdown before processing:
public function passes($attribute, $value) {
$this->parsedown = app(ParsedownExtra::class);
$this->sanitized = $this->parsedown->text($value);
return true;
}
XSS Vulnerabilities
htmlspecialchars() or a package like htmlpurifier if user input is untrusted:
$safeHtml = htmlspecialchars($parsedown->text($userInput), ENT_QUOTES, 'UTF-8');
Performance with Large Text
$cacheKey = 'markdown_'.$post->id;
$html = Cache::remember($cacheKey, now()->addHours(1), function() use ($parsedown, $post) {
return $parsedown->text($post->content);
});
Config Overrides
config/parsedown-extra.php:
'extensions' => [
'hardBreak', // Enable hard line breaks
],
Nested Markdown in HTML
<div>{{ markdown }}</div>), ensure the parser doesn’t reprocess it:
$parsedown->setSafeMode(true); // Disable markdown parsing in HTML blocks
Inspect Extensions Check enabled extensions via:
$extensions = $parsedown->getExtensions();
dd($extensions);
Log Parsed Output Debug unexpected HTML by logging the parsed result:
\Log::debug('Parsed Markdown:', ['html' => $parsedown->text($markdown)]);
Test Edge Cases Validate with:
| Syntax |)term)[^note])*[HTML]: HyperText Markup Language)Custom Extensions Register additional extensions:
$parsedown->registerExtension(new \Erusev\ParsedownExtra\Extension\MyCustomExtension());
Override Defaults
Extend the base ParsedownExtra class:
class CustomParsedownExtra extends ParsedownExtra {
public function __construct() {
parent::__construct();
$this->setBreaksEnabled(true);
}
}
Bind it in AppServiceProvider:
$this->app->bind(ParsedownExtra::class, function ($app) {
return new CustomParsedownExtra();
});
Laravel Events Trigger events before/after parsing (e.g., for analytics or logging):
event(new MarkdownParsed($markdown, $html));
How can I help you explore Laravel packages today?