Étape 2 : Le Moteur de Rendu et la Classe de Base
Pour avoir un contrôle total sur le rendu, nous utilisons un composant Blade dédié et une architecture extensible pour nos blocs de code.
1. Création du Composant Blade
Créez le composant MarkdownRenderer qui enveloppera la logique de Spatie.
php artisan make:component MarkdownRenderer
Modifiez le fichier app/View/Components/MarkdownRenderer.php :
namespace App\View\Components;
use App\Markdown\MarkdownHelper;
use Illuminate\View\Component;
use Spatie\LaravelMarkdown\MarkdownRenderer as SpatieRenderer;
class MarkdownRenderer extends Component
{
public function __construct(public ?string $content = null) {}
public function render()
{
return function (array $data) {
$markdown = $this->content ?? $data['slot'];
// On utilise l'instance de Spatie avec nos extensions
return app(SpatieRenderer::class)
->addExtensions([
new \App\Markdown\Extensions\TorchlightExtension(),
])
->toHtml((string) $markdown);
};
}
}
2. La Classe de Base des Extensions
Pour ne pas dupliquer le code de rendu HTML des blocs de code, nous créons une classe abstraite BaseExtension dans app/Markdown/BaseExtension.php.
Cette classe intercepte les blocs de code (FencedCode, IndentedCode), les envoie à l’API Torchlight, et génère le HTML final.
Points clés de la logique :
- Capture : Elle récupère tous les blocs de code du document Markdown.
- Requête : Elle fait une seule requête groupée à Torchlight pour optimiser les performances.
- Remplacement : Elle remplace les blocs par le HTML stylisé.
Note : La logique complète de BaseExtension est fournie dans le dépôt pour gérer les numéros de ligne et les diffs.
Prochaine Étape
Dans l’étape suivante, nous allons implémenter TorchlightExtension pour ajouter les labels de langue et le bouton de copie.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Étape 2 : Le Moteur de Rendu et la Classe de Base. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.