source: spip-zone/_plugins_/facteur/trunk/inc/facteur_mail_html2text.php @ 118855

Last change on this file since 118855 was 118855, checked in by Cerdic, 8 months ago

on deporte tous les gros filtres dans des fonctions surchargeables sur le meme modele, c'est plus simple a maintenir, lire, surcharger

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1<?php
2/**
3 * Plugin Facteur 4
4 * (c) 2009-2019 Collectif SPIP
5 * Distribue sous licence GPL
6 *
7 * @package SPIP\Facteur\Inc\Facteur_mail_html2text
8 */
9
10
11/**
12 * Transformer un mail HTML en mail Texte proprement :
13 * - les tableaux de mise en page sont utilisés pour structurer le mail texte
14 * - le reste du HTML est markdownifie car c'est un format texte lisible et conventionnel
15 *
16 * @param string $html
17 * @return string
18 */
19function facteur_mail_html2text($html){
20        // nettoyer les balises de mise en page html
21        $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
22        $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
23        $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
24
25        // commentaires html et conditionnels
26        $html = preg_replace(",<!--.*-->,Uims","\n",$html);
27        $html = preg_replace(",<!\[.*\]>,Uims","\n",$html);
28
29        $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
30        $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
31        $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
32        $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
33        $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
34        $html = preg_replace(",(<p>\s*</p>),ims","",$html);
35
36        // succession @@@hr@@@<hr> et <hr>@@@hr@@@
37        $html = preg_replace(",@@@hr@@@\s*(<[^>]*>\s*)?<hr[^>]*>,ims","@@@hr@@@\n",$html);
38        $html = preg_replace(",<hr[^>]*>\s*(<[^>]*>\s*)?@@@hr@@@,ims","\n@@@hr@@@",$html);
39
40        $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
41
42        // vider le contenu de qqunes :
43        $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
44
45        // Liens :
46        // Nettoyage des liens des notes de bas de page
47        $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);
48        // Supprimer tous les liens internes
49        $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
50        // Remplace tous les liens
51        preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
52        $prelinks = $postlinks = array();
53        if (!function_exists('url_absolue'))
54                include_spip('inc/filtres');
55        foreach ($matches as $k => $match){
56                $link = "@@@link$k@@@";
57                $url = str_replace("&amp;","&",$match[1]);
58                if ($match[2]==$match[1] OR $match[2]==$url){
59                        // si le texte est l'url :
60                        $prelinks[$match[0]] = "$link";
61                }
62                else {
63                        // texte + url
64                        $prelinks[$match[0]] = $match[2] . " ($link)";
65                }
66                // passer l'url en absolu dans le texte sinon elle n'est pas clicable ni utilisable
67                $postlinks[$link] = url_absolue($url);
68        }
69        $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
70
71        // les images par leur alt ?
72        // au moins les puces
73        $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
74        // les autres
75        $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
76        // on vire celles sans alt
77        $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
78
79        // espaces
80        $html = str_replace("&nbsp;"," ",$html);
81        $html = preg_replace(",<p>\s+,ims","<p>",$html);
82
83        #return $html;
84        include_spip("lib/markdownify/markdownify");
85        $parser = new Markdownify('inline',false,false);
86        $texte = $parser->parseString($html);
87
88        $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
89
90
91        // trim et sauts de ligne en trop ou pas assez
92        $texte = trim($texte);
93        $texte = str_replace("<br />\n","\n",$texte);
94        $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
95        $texte = preg_replace(",(@@@hr@@@\s*\n)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
96        $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
97        $texte = preg_replace(",(\n\s*)(\n\s*)+(\n)+,ims","\n\n\n",$texte);
98
99
100        // <p> et </p> restants
101        $texte = str_replace(array("<p>","</p>"),array("",""),$texte);
102
103        // entites restantes ? (dans du code...)
104        include_spip('inc/charsets');
105        $texte = unicode2charset($texte);
106        $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
107
108
109        // Faire des lignes de 75 caracteres maximum
110        return trim(wordwrap($texte));
111}
Note: See TracBrowser for help on using the repository browser.