kzykhys/ciconia
Ciconia is a flexible CommonMark/Markdown parser for PHP, converting Markdown to HTML with support for GitHub-flavored syntax and extensions. Designed to be customizable, it fits well in apps needing reliable Markdown rendering and control over output.
Installation
composer require kzykhys/ciconia
Add to composer.json if not using autoloading:
"autoload": {
"psr-4": {
"App\\": "app/",
"Ciconia\\": "vendor/kzykhys/ciconia/src/"
}
}
Run composer dump-autoload.
First Use Case Parse a simple Markdown string:
use Ciconia\Parser;
$parser = new Parser();
$html = $parser->parse('# Hello World!');
echo $html; // Outputs: <h1>Hello World!</h1>
Where to Look First
README.md (basic syntax support).Parsing Markdown
$parser = new Parser();
$html = $parser->parse($markdownString);
Ciconia\Parser\Extension.Integration with Laravel
$this->app->singleton('ciconia.parser', function () {
return new Parser();
});
app/Helpers/markdown.php:
if (!function_exists('markdown')) {
function markdown($text) {
return app('ciconia.parser')->parse($text);
}
}
Use in Blade:
{!! markdown($post->content) !!}
Batch Processing
storage/markdown/):
$files = Storage::files('markdown');
foreach ($files as $file) {
$markdown = Storage::get($file);
$html = $parser->parse($markdown);
Storage::put('public/html/' . basename($file, '.md') . '.html', $html);
}
Custom Extensions
@user mentions):
$parser->addExtension(new class extends Extension {
public function parse($text) {
return preg_replace('/@(\w+)/', '<a href="/users/$1">@$1</a>', $text);
}
});
Deprecated Package
Limited Syntax
erusev/parsedown).Performance
$cacheKey = 'markdown_' . md5($markdown);
$html = Cache::remember($cacheKey, 3600, function () use ($parser, $markdown) {
return $parser->parse($markdown);
});
XSS Risks
{!! htmlspecialchars(markdown($input), ENT_QUOTES, 'UTF-8') !!}
|e filter:
{!! markdown($input) | e !!}
Enable Verbose Output
Parser to log parsing steps:
$parser = new Parser();
$parser->setDebug(true); // Hypothetical; check source for actual method.
Test Edge Cases
$parser->parse('*Unfinished* list'); // May not render as expected.
Fallback Parser
parsedown for unsupported syntax:
use Parsedown;
$parsedown = new Parsedown();
$html = $parser->parse($markdown);
$html = $parsedown->text($html); // Fallback for missing features.
No Built-in Config
Parser class or extend it for settings (e.g., hardcoded line breaks).Extension Order
Custom Block Parsers
Ciconia\Parser\Block\AbstractBlock for new block types (e.g., admonitions):
class AdmonitionBlock extends AbstractBlock {
public function parse($text) {
return '<div class="admonition">' . $text . '</div>';
}
}
Inline Parsers
Ciconia\Parser\Inline\AbstractInline for custom inline syntax (e.g., @highlight):
$parser->addInlineExtension(new class extends AbstractInline {
public function parse($text) {
return preg_replace('/@highlight(.*)@highlight/', '<mark>$1</mark>', $text);
}
});
Pre/Post-Processing
$parser = new Parser();
$wrapper = new class($parser) {
private $parser;
public function __construct(Parser $parser) {
$this->parser = $parser;
}
public function parse($text) {
$text = $this->preProcess($text);
$html = $this->parser->parse($text);
return $this->postProcess($html);
}
};
How can I help you explore Laravel packages today?