<?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) {
    // Échapper tout le contenu pour éviter les injections XSS
    $markdown = htmlspecialchars($markdown, ENT_QUOTES, 'UTF-8');
    
    // 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
    // 1. URLs avec protocole http/https
    $protocolUrlPattern = '/(https?:\/\/[^\s<]+[^\s<\.)])/i';
    $markdown = preg_replace_callback($protocolUrlPattern, 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);
    
    // 2. Domaines sans protocole (comme "o-k-i.net", "gong.gp", "NUVEL.NU")
    // Détecte les domaines avec TLD communs qui ne font pas partie d'autre chose
    $domainPattern = '/\b([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+([a-zA-Z]{2,63})\b/';
    $markdown = preg_replace_callback($domainPattern, function($matches) use (&$links, &$link_count) {
        $domain = $matches[0];
        
        // Éviter de convertir des éléments qui ressemblent à des versions/numéros ou qui sont déjà dans des liens
        if (preg_match('/^v?\d+\.\d+/', $domain) || strpos($domain, '___LINK_') !== false) {
            return $domain;
        }
        
        $placeholder = "___LINK_{$link_count}___";
        $links[$placeholder] = '<a href="http://' . htmlspecialchars($domain, ENT_QUOTES, 'UTF-8') . '" target="_blank" rel="noopener noreferrer">' . $domain . '</a>';
        $link_count++;
        
        return $placeholder;
    }, $markdown);
    
    // 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);
    
    // Restaurer les liens
    foreach ($links as $placeholder => $link) {
        $markdown = str_replace($placeholder, $link, $markdown);
    }
    
    return $markdown;
} 