Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Commonmark Bundle Laravel Package

aymdev/commonmark-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the package:

    composer require aymdev/commonmark-bundle
    

    This auto-registers the bundle for Symfony 4.4+.

  2. Configure a converter in config/packages/aymdev_commonmark.yaml:

    aymdev_commonmark:
        converters:
            default:
                type: 'github'  # or 'commonmark' for standard Markdown
    
  3. First use case:

    • In Twig templates:
      {{ markdown_content|commonmark('default') }}
      
    • In a controller:
      use League\CommonMark\MarkdownConverter;
      
      public function renderMarkdown(MarkdownConverter $converter) {
          $html = $converter->convert('# Hello, World!');
          return new Response($html);
      }
      

Implementation Patterns

Common Workflows

  1. Multi-Converter Setup: Define distinct converters for different use cases (e.g., blog_post vs. comment):

    aymdev_commonmark:
        converters:
            blog_post:
                type: 'commonmark'
                extensions:
                    - League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkExtension
            comment:
                type: 'github'
                options:
                    enable_emphasis: true
    

    Use them in Twig:

    {{ blog_content|commonmark('blog_post') }}
    {{ user_comment|commonmark('comment') }}
    
  2. Dynamic Converter Selection: Inject the ConverterLocator service to resolve converters dynamically:

    use AymDev\CommonMarkBundle\ConverterLocator;
    
    public function __construct(private ConverterLocator $locator) {}
    
    public function convert(string $content, string $converterName): string {
        return $this->locator->get($converterName)->convert($content);
    }
    
  3. Custom Extensions: Register League CommonMark extensions (e.g., tables, footnotes) in config:

    aymdev_commonmark:
        converters:
            advanced:
                type: 'commonmark'
                extensions:
                    - League\CommonMark\Extension\Table\TableExtension
                    - League\CommonMark\Extension\Footnotes\FootnotesExtension
    
  4. API Responses: Convert Markdown in API controllers:

    public function getPostContent(MarkdownConverter $converter): JsonResponse {
        $markdown = $this->fetchMarkdownFromDB();
        return new JsonResponse(['content' => $converter->convert($markdown)]);
    }
    
  5. Form Handling: Use the empty converter type for inline parsing (e.g., previewing Markdown in forms):

    aymdev_commonmark:
        converters:
            preview:
                type: 'empty'
                extensions:
                    - League\CommonMark\Extension\InlineParser\InlineParserExtension
    

Gotchas and Tips

Pitfalls

  1. Converter Not Found:

    • Error: No converter named "X" found.
    • Fix: Ensure the converter is defined in aymdev_commonmark.yaml and the name matches exactly (case-sensitive).
  2. Extension Loading Issues:

    • Error: Class "League\CommonMark\Extension\..." not found.
    • Fix: Verify the extension class exists in league/commonmark (v2.x) and is spelled correctly. Example:
      extensions:
          - League\CommonMark\Extension\SmartPunct\SmartPunctExtension  # Correct
          - League\CommonMark\Extension\SmartPunct  # Incorrect (missing class name)
      
  3. Deprecated Service IDs:

    • Error: Service "aymdev_commonmark.converter.X" not found (Symfony <5.1).
    • Fix: Use the converter name directly (e.g., MarkdownConverter $myConverter in autowiring). See changelog 1.3.0.
  4. Twig Filter Caching:

    • Issue: Twig filter (commonmark) may not reflect config changes immediately.
    • Fix: Clear the Twig cache:
      php bin/console cache:clear
      
  5. Empty Converter Misuse:

    • Gotcha: The empty converter type does not parse blocks (e.g., paragraphs, headings). Use for inline content only (e.g., **bold**<strong>bold</strong>).

Debugging Tips

  1. Log Converter Config: Dump the resolved converter to debug:

    use League\CommonMark\MarkdownConverter;
    
    public function debugConverter(MarkdownConverter $converter) {
        \Symfony\Component\Debug\Debug::dump($converter->getEnvironment());
    }
    
  2. Validate Markdown: Use the empty converter to test raw Markdown syntax:

    aymdev_commonmark:
        converters:
            debug:
                type: 'empty'
    
    {{ markdown|commonmark('debug') }}  {# Renders raw HTML entities #}
    
  3. Extension Conflicts: Disable extensions one-by-one to isolate issues:

    extensions:
        - League\CommonMark\Extension\Table\TableExtension  # Comment out to test
    

Performance Tips

  1. Reuse Converters: The bundle registers converters as singletons. Avoid recreating them manually.

  2. Lazy-Load Extensions: For heavy extensions (e.g., tables), consider lazy-loading:

    extensions:
        - League\CommonMark\Extension\Table\TableExtension:
            enabled: false  # Disable by default
    

    Enable dynamically in code:

    $converter->getEnvironment()->addExtension(new TableExtension());
    
  3. Cache HTML Output: Cache converted Markdown in a service or database to avoid reprocessing:

    $cacheKey = 'markdown_' . md5($content);
    if (!$html = $cache->get($cacheKey)) {
        $html = $converter->convert($content);
        $cache->set($cacheKey, $html, 3600);
    }
    

Extension Points

  1. Custom Converter Types: Extend the bundle to support custom converter types. Override the ConverterFactory service:

    services:
        AymDev\CommonMarkBundle\ConverterFactory:
            arguments:
                $customTypes:
                    my_custom:
                        class: App\Custom\MarkdownConverter
    
  2. Twig Filter Overrides: Replace the default Twig filter by binding a custom extension:

    services:
        app.commonmark.twig_extension:
            class: App\Twig\CustomCommonMarkExtension
            tags: ['twig.extension']
    
  3. Environment Hooks: Modify the converter environment post-creation via an event subscriber:

    use League\CommonMark\Environment;
    
    public function onKernelRequest(GetResponseEvent $event) {
        $converter = $this->locator->get('default');
        $converter->getEnvironment()->addExtension(new MyExtension());
    }
    

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
besmartand-pro/php-quality-config
sentix/ai-chatbot
codifyo/ts-generator-bundle
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor