fluxbb/commonmark
Laravel-friendly CommonMark utilities from FluxBB: parse, render, and work with Markdown/CommonMark content in PHP with sensible defaults and integration patterns suited to Laravel apps. Lightweight package aimed at consistent, safe content rendering.
Installation:
composer require fluxbb/commonmark
Add to composer.json if not auto-loaded:
"autoload": {
"psr-4": {
"App\\": "app/",
"FluxBB\\CommonMark\\": "vendor/fluxbb/commonmark/src/"
}
}
Run composer dump-autoload.
First Use Case: Parse a simple Markdown string:
use FluxBB\CommonMark\CommonMarkConverter;
$converter = new CommonMarkConverter();
$html = $converter->convertToHtml('# Hello, **Markdown**!');
echo $html; // Outputs: <h1>Hello, <strong>Markdown</strong>!</h1>
Where to Look First:
src/CommonMarkConverter.php for core functionality.src/Environment.php for configuration and extensions.Basic Parsing:
$converter = new CommonMarkConverter();
$html = $converter->convertToHtml($markdownString);
convertToCommonMark() for reverse conversion (if needed).Extending with Custom Rules:
FluxBB\CommonMark\Rule\RuleInterface for custom syntax.Environment:
$env = new Environment();
$env->addRule(new MyCustomRule());
$converter = new CommonMarkConverter($env);
Integration with Laravel:
public function register()
{
$this->app->singleton(CommonMarkConverter::class, function ($app) {
$env = new Environment();
// Add extensions here (e.g., tables, footnotes)
return new CommonMarkConverter($env);
});
}
app/Helpers/markdown.php):
if (!function_exists('markdown')) {
function markdown($text) {
return app(CommonMarkConverter::class)->convertToHtml($text);
}
}
Blade::directive('markdown', function ($expression) {
return "<?php echo markdown({$expression}); ?>";
});
Usage in Blade:
@markdown($post->content)
Handling Large Content:
$converter = new CommonMarkConverter();
$stream = fopen('large.md', 'r');
$html = '';
while (!feof($stream)) {
$chunk = fread($stream, 8192);
$html .= $converter->convertToHtml($chunk);
}
fclose($stream);
Safe Mode (XSS Protection):
HTMLPurifier or similar to sanitize output:
$html = $converter->convertToHtml($markdown);
$purifier = new HTMLPurifier();
$safeHtml = $purifier->purify($html);
Performance:
$cacheKey = 'markdown_' . md5($markdown);
$html = cache()->remember($cacheKey, now()->addHours(1), function () use ($markdown) {
return $converter->convertToHtml($markdown);
});
Extension Conflicts:
Environment for available extensions:
$env->addExtension(new TablesExtension());
$env->addExtension(new FootnotesExtension());
Deprecated Features:
HTML Output Quirks:
class="markdown-body"). Override templates if needed:
$env->addRenderer(new MyCustomRenderer());
Namespace Collisions:
fluxbb packages, ensure autoloading is configured correctly to avoid conflicts.Enable Debugging:
CommonMarkConverter to debug mode (if supported) or log input/output:
$markdown = '# Test';
$html = $converter->convertToHtml($markdown);
Log::debug("Markdown: {$markdown}", ['html' => $html]);
Validate Markdown:
Check Extensions:
$env = new Environment();
// Disable all extensions temporarily
$env->removeAllExtensions();
Custom Renderers:
RendererInterface for custom HTML output:
class MyRenderer implements RendererInterface {
public function renderBlock($block) {
// Custom logic
}
}
$env->addRenderer(new MyRenderer());
Inline/Block Rules:
InlineParser or BlockParser interfaces.Post-Processing:
Str or Html helpers to modify output:
$html = str_replace('class="markdown-body"', '', $html);
Event Listeners:
eloquent.saved) to auto-convert Markdown fields:
Post::saved(function ($post) {
if ($post->isDirty('content')) {
$post->content_html = markdown($post->content);
$post->save();
}
});
How can I help you explore Laravel packages today?