Files
kaubuntu.re/includes/lib/markdown.php
T

75 lines
2.9 KiB
PHP
Raw Normal View History

2025-04-10 08:49:24 +04:00
<?php
/**
* Fonction simple pour convertir du texte Markdown en HTML
* Adaptée pour PeerTube qui ne prend en charge qu'un sous-ensemble limité d'éléments:
* - Emphase (italique/gras)
* - Liens
* - Retours à la ligne
* - Listes
*
* @param string $markdown Le texte au format Markdown à convertir
* @return string Le texte converti en HTML
*/
function markdown_to_html($markdown) {
2025-04-10 09:08:34 +04:00
// Échapper tout le contenu pour éviter les injections XSS
2025-04-10 08:49:24 +04:00
$markdown = htmlspecialchars($markdown, ENT_QUOTES, 'UTF-8');
2025-04-10 09:08:34 +04:00
// Tableau pour stocker les liens convertis
$links = [];
$link_count = 0;
// Conversion des liens Markdown [texte](url)
$markdown = preg_replace_callback('/\[([^\]]+)\]\(([^)]+)\)/s', function($matches) use (&$links, &$link_count) {
$text = $matches[1];
$url = $matches[2];
// Assurer que l'URL est correctement formée
if (!preg_match('/^https?:\/\//i', $url)) {
// Ajouter http:// si l'URL ne commence pas par http:// ou https://
$url = 'http://' . $url;
}
$placeholder = "___LINK_{$link_count}___";
$links[$placeholder] = '<a href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" target="_blank" rel="noopener noreferrer">' . $text . '</a>';
$link_count++;
return $placeholder;
}, $markdown);
// Détection et conversion des URLs brutes en liens cliquables
$urlPattern = '/(https?:\/\/[^\s<]+[^\s<\.)])/i';
$markdown = preg_replace_callback($urlPattern, function($matches) use (&$links, &$link_count) {
$url = $matches[1];
$placeholder = "___LINK_{$link_count}___";
$links[$placeholder] = '<a href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" target="_blank" rel="noopener noreferrer">' . $url . '</a>';
$link_count++;
return $placeholder;
}, $markdown);
2025-04-10 08:49:24 +04:00
// Conversion du texte en gras et italique (**texte** et *texte*)
$markdown = preg_replace('/\*\*(.*?)\*\*/s', '<strong>$1</strong>', $markdown);
$markdown = preg_replace('/\*(.*?)\*/s', '<em>$1</em>', $markdown);
// Conversion des listes à puces
$markdown = preg_replace('/^- (.*?)$/m', '<li>$1</li>', $markdown);
$markdown = preg_replace('/(<li>.*?<\/li>\n?)+/s', '<ul>$0</ul>', $markdown);
// Conversion des listes numérotées
$markdown = preg_replace('/^\d+\. (.*?)$/m', '<li>$1</li>', $markdown);
$markdown = preg_replace('/(<li>.*?<\/li>\n?)+/s', '<ol>$0</ol>', $markdown);
// Gestion des retours à la ligne
$markdown = nl2br($markdown);
// Nettoyage des balises br dans les listes
$markdown = preg_replace('/<\/li><br \/>/', '</li>', $markdown);
2025-04-10 09:08:34 +04:00
// Restaurer les liens
foreach ($links as $placeholder => $link) {
$markdown = str_replace($placeholder, $link, $markdown);
}
2025-04-10 08:49:24 +04:00
return $markdown;
}