Installation:
composer require graham-campbell/markdown
Publish the config (optional):
php artisan vendor:publish --provider="GrahamCampbell\Markdown\MarkdownServiceProvider" --tag="config"
First Use Case: Convert Markdown to HTML in a Blade view:
{!! Markdown::parse('# Hello World') !!}
Or in a controller:
use GrahamCampbell\Markdown\Facades\Markdown;
$html = Markdown::parse('**Bold text**');
Where to Look First:
config/markdown.php for configuration options (e.g., extensions, caching).Blade Integration:
Use Markdown::parse() in Blade templates for dynamic content:
<div class="content">
{!! Markdown::parse($post->body) !!}
</div>
API Responses: Return parsed Markdown in API responses:
return response()->json([
'content' => Markdown::parse($request->markdown_content)
]);
Caching Parsed Output (via config):
// config/markdown.php
'cache' => true,
Cache key is auto-generated from input.
Extensions: Enable/disable CommonMark extensions (e.g., tables, footnotes):
Markdown::enableExtensions(['tables']);
Custom Parsing Logic: Chain methods for pre/post-processing:
$html = Markdown::parse($text)
->replace('<h1>', '<h1 class="custom">')
->stripTags('<script>');
document.getElementById('preview').innerHTML = await fetch('/parse', {
method: 'POST',
body: JSON.stringify({ markdown: input.value })
}).then(r => r.text());
$this->app->instance(\GrahamCampbell\Markdown\Facades\Markdown::class, $mock);
XSS Risks:
Markdown::parse()->toHtml() with strip_tags() or a whitelist:
$safeHtml = strip_tags(Markdown::parse($input), '<p><a><strong><em>');
Caching Quirks:
Markdown::parse($text, null, 'custom_key_' . md5($text));
Extension Conflicts:
autolink + strikethrough) may break rendering.Performance:
$parsed = Markdown::parse($text);
dd($parsed->toHtml()); // Debug HTML output
dd(Markdown::getExtensions()); // List enabled extensions
Undefined extension: Ensure the extension name matches CommonMark’s (e.g., tables, not table).Cache not working: Verify file or array cache driver is configured in config/cache.php.Custom Extensions: Register a League CommonMark extension via the config:
// config/markdown.php
'extensions' => [
\League\CommonMark\Extension\MyCustomExtension::class,
],
Pre/Post Processing:
Override the Markdown facade to add logic:
// app/Providers/AppServiceProvider.php
public function boot()
{
$this->app->resolving(\GrahamCampbell\Markdown\Facades\Markdown::class, function ($markdown) {
$markdown->afterParse(function ($html) {
return str_replace('<h1>', '<h1 data-tracked>', $html);
});
});
}
Environment-Specific Config: Use Laravel’s config caching to switch settings per environment:
// config/markdown.php
'cache' => env('MARKDOWN_CACHE', false),
How can I help you explore Laravel packages today?