[ Table::class => [ 'class' => 'table table-hover', ], Link::class => [ 'class' => 'btn btn-sm btn-secondary', ], ], ]; $converter = new GithubFlavoredMarkdownConverter($config); $converter ->getEnvironment() ->addExtension(new HighlightExtension(new Highlighter()->withGutter())) ->addExtension(new FootnoteExtension()) ->addExtension(new DefaultAttributesExtension()) ->addEventListener(DocumentParsedEvent::class, $this->documentParsed(...)) ; return $converter->convert($content); } private function documentParsed(DocumentParsedEvent $event): void { $document = $event->getDocument(); $linkNodes = new Query() ->where(Query::type(Link::class)) ->findAll($document) ; /** @var Link $linkNode */ foreach ($linkNodes as $linkNode) { $url = $linkNode->getUrl(); if (!is_numeric($url)) { continue; } $snip = $this->snipRepo->find($url); if ($snip === null) { continue; } $linkNode->setUrl($this->router->generate('snip_single', [ 'snip' => $url, ])); $textNode = $linkNode->firstChild(); if (!$textNode) { $linkNode->appendChild(new Text($snip)); } } } }