Changeset 70528 in spip-zone for _plugins_/facteur


Ignore:
Timestamp:
Mar 8, 2013, 4:53:28 PM (6 years ago)
Author:
cedric@…
Message:

Branche 3 de facteur, en dev :

  • on ajoute l'auto-detection des mails HTML dans envoyer_mail : si aucun Content-Type n'est fourni, et que le mail commence par un < finit par un > et contient bien un </html> on considère que c'est un mail HTML. Cette feature etait fournie pour les notifications uniquement (par inc/notifications) jusqu'ici
  • on recupere la fonction de conversion HTML->Texte du plugin Newsletter, qui s'appuie sur MarkDownify?
  • si aucune alternative texte n'est fournie à un mail HTML, on génère automatiquement une alternative texte dans envoyer_mail()

A tester et stabiliser.

Location:
_plugins_/facteur/trunk
Files:
7 added
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/facteur/trunk/classes/facteur.php

    r68228 r70528  
    142142       
    143143        /*
    144          * Transforme du HTML en texte brut, mais proprement, c'est-à-dire en essayant
    145          * de garder les titrages, les listes, etc
     144         * Transforme du HTML en texte brut, mais proprement
     145         * utilise le filtre facteur_mail_html2text
     146         * @uses facteur_mail_html2text()
    146147         *
    147148         * @param string $html Le HTML à transformer
     
    149150         */
    150151        function html2text($html){
    151                 // On remplace tous les sauts de lignes par un espace
    152                 $html = str_replace("\n", ' ', $html);
    153                
    154                 // Supprimer tous les liens internes
    155                 $texte = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2", $html);
    156        
    157                 // Supprime feuille style
    158                 $texte = preg_replace(";<style[^>]*>[^<]*</style>;i", "", $texte);
    159        
    160                 // Remplace tous les liens     
    161                 $texte = preg_replace("/\<a[^>]*href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", "\\2 (\\1)", $texte);
    162        
    163                 // Les titres
    164                 $texte = preg_replace(";<h1[^>]*>;i", "\n= ", $texte);
    165                 $texte = str_replace("</h1>", " =\n\n", $texte);
    166                 $texte = preg_replace(";<h2[^>]*>;i", "\n== ", $texte);
    167                 $texte = str_replace("</h2>", " ==\n\n", $texte);
    168                 $texte = preg_replace(";<h3[^>]*>;i", "\n=== ", $texte);
    169                 $texte = str_replace("</h3>", " ===\n\n", $texte);
    170                
    171                 // Une fin de liste
    172                 $texte = preg_replace(";</(u|o)l>;i", "\n\n", $texte);
    173                
    174                 // Une saut de ligne *après* le paragraphe
    175                 $texte = preg_replace(";<p[^>]*>;i", "\n", $texte);
    176                 $texte = preg_replace(";</p>;i", "\n\n", $texte);
    177                 // Les sauts de ligne interne
    178                 $texte = preg_replace(";<br[^>]*>;i", "\n", $texte);
    179        
    180                 //$texte = str_replace('<br /><img class=\'spip_puce\' src=\'puce.gif\' alt=\'-\' border=\'0\'>', "\n".'-', $texte);
    181                 $texte = preg_replace (';<li[^>]*>;i', "\n".'- ', $texte);
    182        
    183        
    184                 // accentuation du gras
    185                 // <b>texte</b> -> **texte**
    186                 $texte = preg_replace (';<b[^>]*>;i','**' ,$texte);
    187                 $texte = str_replace ('</b>','**' ,$texte);
    188        
    189                 // accentuation du gras
    190                 // <strong>texte</strong> -> **texte**
    191                 $texte = preg_replace (';<strong[^>]*>;i','**' ,$texte);
    192                 $texte = str_replace ('</strong>','**' ,$texte);
    193        
    194        
    195                 // accentuation de l'italique
    196                 // <em>texte</em> -> *texte*
    197                 $texte = preg_replace (';<em[^>]*>;i','/' ,$texte);
    198                 $texte = str_replace ('</em>','*' ,$texte);
    199                
    200                 // accentuation de l'italique
    201                 // <i>texte</i> -> *texte*
    202                 $texte = preg_replace (';<i[^>]*>;i','/' ,$texte);
    203                 $texte = str_replace ('</i>','*' ,$texte);
    204        
    205                 $texte = str_replace('&oelig;', 'oe', $texte);
    206                 $texte = str_replace("&nbsp;", " ", $texte);
    207                 $texte = filtrer_entites($texte);
    208        
    209                 // On supprime toutes les balises restantes
    210                 $texte = supprimer_tags($texte);
    211        
    212                 $texte = str_replace("\x0B", "", $texte);
    213                 $texte = str_replace("\t", "", $texte) ;
    214                 $texte = preg_replace(";[ ]{3,};", "", $texte);
    215        
    216                 // espace en debut de ligne
    217                 $texte = preg_replace("/(\r\n|\n|\r)[ ]+/", "\n", $texte);
    218        
    219                 //marche po
    220                 // Bring down number of empty lines to 4 max
    221                 $texte = preg_replace("/(\r\n|\n|\r){3,}/m", "\n\n", $texte);
    222        
    223                 //saut de lignes en debut de texte
    224                 $texte = preg_replace("/^(\r\n|\n|\r)*/", "\n\n", $texte);
    225                 //saut de lignes en debut ou fin de texte
    226                 $texte = preg_replace("/(\r\n|\n|\r)*$/", "\n\n", $texte);
    227        
    228                 // Faire des lignes de 75 caracteres maximum
    229                 //$texte = wordwrap($texte);
    230        
    231                 return $texte;
     152                return facteur_mail_html2text($html);
    232153        }
    233154       
  • _plugins_/facteur/trunk/facteur_fonctions.php

    r70384 r70528  
    287287}
    288288
     289/**
     290 * Transformer un mail HTML en mail Texte proprement :
     291 * - les tableaux de mise en page sont utilisés pour structurer le mail texte
     292 * - le reste du HTML est markdownifie car c'est un format texte lisible et conventionnel
     293 *
     294 * @param string $html
     295 * @return string
     296 */
     297function facteur_mail_html2text($html){
     298        // nettoyer les balises de mise en page html
     299        $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
     300        $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
     301        $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
     302        $html = preg_replace(",<!--.*-->,Uims","\n",$html);
     303        $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
     304        $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
     305        $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
     306        $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
     307        $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
     308        $html = preg_replace(",(<p>\s*</p>),ims","",$html);
     309
     310        // succession @@@hr@@@<hr> et <hr>@@@hr@@@
     311        $html = preg_replace(",@@@hr@@@\s*(<[^>]*>\s*)?<hr[^>]*>,ims","@@@hr@@@\n",$html);
     312        $html = preg_replace(",<hr[^>]*>\s*(<[^>]*>\s*)?@@@hr@@@,ims","\n@@@hr@@@",$html);
     313
     314        $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
     315
     316        // vider le contenu de qqunes :
     317        $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
     318
     319        // Liens :
     320        // Nettoyage des liens des notes de bas de page
     321        $html = preg_replace("@<a href=\"#n(b|h)[0-9]+-[0-9]+\" name=\"n(b|h)[0-9]+-[0-9]+\" class=\"spip_note\">([0-9]+)</a>@", "\\3", $html);
     322        // Supprimer tous les liens internes
     323        $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
     324        // Remplace tous les liens
     325        preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
     326        $prelinks = $postlinks = array();
     327        foreach ($matches as $k => $match){
     328                $link = "@@@link$k@@@";
     329                $url = str_replace("&amp;","&",$matches[1]);
     330                if ($match[2]==$matches[1] OR $match[2]==$url){
     331                        // si le texte est l'url :
     332                        $prelinks[$match[0]] = "$link";
     333                }
     334                else {
     335                        // texte + url
     336                        $prelinks[$match[0]] = $match[2] . " ($link)";
     337                }
     338                $postlinks[$link] = $url;
     339        }
     340        $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
     341
     342        // les images par leur alt ?
     343        // au moins les puces
     344        $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
     345        // les autres
     346        $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
     347        // on vire celles sans alt
     348        $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
     349
     350        // espaces
     351        $html = str_replace("&nbsp;"," ",$html);
     352        $html = preg_replace(",<p>\s+,ims","<p>",$html);
     353
     354        #return $html;
     355        include_spip("lib/markdownify/markdownify");
     356        $parser = new Markdownify('inline',false,false);
     357        $texte = $parser->parseString($html);
     358
     359        $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
     360
     361
     362        // trim et sauts de ligne en trop ou pas assez
     363        $texte = trim($texte);
     364        $texte = str_replace("<br />\n","\n",$texte);
     365        $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
     366        $texte = preg_replace(",(@@@hr@@@\s*\n)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
     367        $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
     368        $texte = preg_replace(",(\n\s*)(\n\s*)+(\n)+,ims","\n\n\n",$texte);
     369
     370        // entites restantes ? (dans du code...)
     371        include_spip('inc/charsets');
     372        $texte = unicode2charset($texte);
     373        $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
     374
     375
     376        // Faire des lignes de 75 caracteres maximum
     377        return trim(wordwrap($texte));
     378}
    289379?>
  • _plugins_/facteur/trunk/inc/envoyer_mail.php

    r65612 r70528  
    6464                }
    6565                else {
    66                         $message_texte  = nettoyer_caracteres_mail($corps);
     66                        // Autodetection : tester si le mail est en HTML
     67                        if (strpos($headers,"Content-Type:")===false
     68                                AND strpos($corps,"<")!==false // eviter les tests suivants si possible
     69                                AND $ttrim = trim($corps)
     70                                AND substr($ttrim,0,1)=="<"
     71                          AND substr($ttrim,-1,1)==">"
     72                          AND stripos($ttrim,"</html>")!==false){
     73
     74                                if(!strlen($sujet)){
     75                                        // dans ce cas on ruse un peu : extraire le sujet du title
     76                                        if (preg_match(",<title>(.*)</title>,Uims",$corps,$m))
     77                                                $sujet = $m[1];
     78                                        else {
     79                                                // fallback, on prend le body si on le trouve
     80                                                if (preg_match(",<body[^>]*>(.*)</body>,Uims",$corps,$m))
     81                                                        $ttrim = $m[1];
     82
     83                                                // et on extrait la premiere ligne de vrai texte...
     84                                                // nettoyer le html et les retours chariots
     85                                                $ttrim = textebrut($ttrim);
     86                                                $ttrim = str_replace("\r\n", "\r", $ttrim);
     87                                                $ttrim = str_replace("\r", "\n", $ttrim);
     88                                                // decouper
     89                                                $ttrim = explode("\n",trim($ttrim));
     90                                                // extraire la premiere ligne de texte brut
     91                                                $sujet = array_shift($ttrim);
     92                                        }
     93                                }
     94                                $message_html   = $corps;
     95                        }
     96                        // c'est vraiment un message texte
     97                        else
     98                                $message_texte  = nettoyer_caracteres_mail($corps);
    6799                }
    68100                $headers = array_map('trim',explode("\n",$headers));
     
    74106        if ($message_texte AND ! $message_html){
    75107                $message_html = recuperer_fond("emails/texte",array('texte'=>$message_texte,'sujet'=>$sujet));
     108        }
     109        // si le mail est en HTML sans alternative, la generer
     110        if ($message_html AND !$message_texte){
     111                $message_texte = facteur_mail_html2text($message_html);
    76112        }
    77113
  • _plugins_/facteur/trunk/paquet.xml

    r70426 r70528  
    22        prefix="facteur"
    33        categorie="communication"
    4         version="2.4.5"
    5         etat="stable"
     4        version="3.0.0"
     5        etat="dev"
    66        compatibilite="[3.0.0;3.0.*]"
    77        logo="prive/themes/spip/images/facteur-32.png"
Note: See TracChangeset for help on using the changeset viewer.