Changeset 68171 in spip-zone


Ignore:
Timestamp:
Dec 5, 2012, 3:34:35 PM (8 years ago)
Author:
cedric@…
Message:

action fixer_newsletter qui fixe les elements volatiles de la newsletter
par exemple : images de local/ copiee dans IMG/nl/xx/
Lorsque la newsletter est publiee, on appelle cette action fixer_newsletter

+ un filtre newsletter_fixer_image utilisable depuis le squelette de newsletter (filtre unipotent)

Location:
_plugins_/newsletters
Files:
5 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/newsletters/action/fixer_newsletter.php

    r68159 r68171  
    77
    88if (!defined('_ECRIRE_INC_VERSION')) return;
     9include_spip("inc/newsletters");
     10include_spip("newsletters_fonctions");
    911
    10 function action_generer_newsletter_dist($id_newsletter = null, $force = false){
     12/**
     13 * fixer les images dans IMG pour ne pas les perdre meme si on vide les cache des images
     14 * ou si on supprime un doc joint, un logo etc...
     15 *
     16 *
     17 * @param int|null $id_newsletter
     18 * @return mixed
     19 */
     20function action_fixer_newsletter_dist($id_newsletter = null){
    1121        if (is_null($id_newsletter)){
    1222                $securiser_action = charger_fonction('securiser_action', 'inc');
     
    1525
    1626        include_spip('inc/autoriser');
    17         if (autoriser('generer', 'newsletter', $id_newsletter)){
    18                 $row = sql_fetsel('*', 'spip_newsletters', 'id_newsletter=' . intval($id_newsletter));
     27        if (autoriser('modifier', 'newsletter', $id_newsletter)){
     28                $row = sql_fetsel('html_email,html_page,texte_email', 'spip_newsletters', 'id_newsletter=' . intval($id_newsletter));
    1929
    20                 // si cuite on ne genere pas, sauf si force
    21                 if (!$row['baked'] OR $force){
    22                         $patron = $row['patron'];
    23                         $date = intval($row['date_redac'])?$row['date_redac']:$row['date'];
     30                // trouver toutes les images dans les 2 versions html
     31                $images = array();
     32                foreach (array($row['html_email'],$row['html_page']) as $champ){
     33                        preg_match_all('/<img\s[^>]*(src=["\'])([^\'"]*)(["\'])/Uims', $champ, $matches, PREG_SET_ORDER);
     34                        if ($matches AND count($matches)){
     35                                foreach ($matches as $matche){
     36                                        $src = $matche[2];
     37                                        if (!isset($images[$src])){
     38                                                if ($url = newsletter_fixer_image($src,$id_newsletter))
     39                                                        $images[$src] = url_absolue($url);
     40                                        }
     41                                }
     42                        }
     43                }
    2444
    25                         $set = array();
    26                         $set['html_email'] = newsletters_recuperer_fond($id_newsletter, $patron, $date);
    27                         if (trouver_fond("$patron.texte","newsletters"))
    28                                 $set['texte_email'] = newsletters_recuperer_fond($id_newsletter, "$patron.texte", $date);
    29                         else
    30                                 $set['texte_email'] = newsletters_html2text($set['html_email']);
     45                foreach(array_keys($row) as $k){
     46                        // remplacer les urls dans les differentes versions
     47                        $row[$k] = str_replace(array_keys($images),array_values($images),$row[$k]);
     48                }
    3149
    32                         $set['html_page'] = '';
    33                         if (trouver_fond("$patron.page","newsletters"))
    34                                 $set['html_page'] = newsletters_recuperer_fond($id_newsletter, "$patron.page", $date);
    35 
    36                         #header('Content-Type: text/plain; charset=utf-8');
    37                         #echo($set['texte_email']);
    38                         #die();
    39 
    40                         include_spip("action/editer_objet");
    41                         objet_modifier("newsletter",$id_newsletter,$set);
    42 
    43                 }
     50                include_spip("action/editer_objet");
     51                objet_modifier("newsletter",$id_newsletter,$row);
    4452        }
    4553}
    46 
    47 function newsletters_recuperer_fond($id_newsletter, $patron, $date = null){
    48 
    49         if (is_null($date))
    50                 $date = date('Y-m-d 00:00:00');
    51 
    52         // on passe la globale lien_implicite_cible_public en true
    53         // pour avoir les liens internes en public (en non prive d'apres le contexte)
    54         // credit de l'astuce: denisb & rastapopoulos
    55         $GLOBALS['lien_implicite_cible_public'] = true;
    56 
    57         $texte = recuperer_fond(
    58                 "newsletters/$patron",
    59                 array(
    60                         'date' => $date,
    61                         'id_newsletter' => $id_newsletter,
    62                 )
    63         );
    64 
    65         // on revient a la config initiale
    66         unset($GLOBALS['lien_implicite_cible_public']);
    67 
    68         return $texte;
    69 }
    70 
    71 function newsletters_html2text($html){
    72         // nettoyer les balises de mise en page html
    73         $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
    74         $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
    75         $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
    76         $html = preg_replace(",<!--.*-->,Uims","\n",$html);
    77         $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
    78         $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
    79         $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
    80         $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
    81         $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
    82         $html = preg_replace(",(<p>\s*</p>),ims","",$html);
    83         #return $html;
    84 
    85         $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
    86 
    87         // vider le contenu de qqunes :
    88         $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
    89 
    90         // Liens :
    91         // Nettoyage des liens des notes de bas de page
    92         $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);
    93         // Supprimer tous les liens internes
    94         $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
    95         // Remplace tous les liens
    96         preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
    97         $prelinks = $postlinks = array();
    98         foreach ($matches as $k => $match){
    99                 $link = "@@@link$k@@@";
    100                 $prelinks[$match[0]] = $match[2]." ($link)";
    101                 $postlinks[$link] = $match[1];
    102         }
    103         $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
    104 
    105         // les images par leur alt ?
    106         // au moins les puces
    107         $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
    108         // les autres
    109         $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
    110         // on vire celles sans alt
    111         $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
    112 
    113         // espaces
    114         $html = str_replace("&nbsp;"," ",$html);
    115         $html = preg_replace(",<p>\s+,ims","<p>",$html);
    116 
    117         #return $html;
    118         include_spip("lib/markdownify/markdownify");
    119         $parser = new Markdownify(false,false,false);
    120         $texte = $parser->parseString($html);
    121 
    122         $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
    123 
    124 
    125         // trim et sauts de ligne en trop ou pas assez
    126         $texte = trim($texte);
    127         $texte = str_replace("<br />\n","\n",$texte);
    128         $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
    129         $texte = preg_replace(",(@@@hr@@@\s*)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
    130         $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
    131         $texte = preg_replace(",(\n\s*)(\n\s*)(\n\s*)+,ims","\n\n\n",$texte);
    132 
    133         // entites restantes ? (dans du code...)
    134         include_spip('inc/charsets');
    135         $texte = unicode2charset($texte);
    136         $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
    137 
    138 
    139         // Faire des lignes de 75 caracteres maximum
    140         return trim(wordwrap($texte));
    141 
    142 }
    143 
  • _plugins_/newsletters/action/generer_newsletter.php

    r68158 r68171  
    77
    88if (!defined('_ECRIRE_INC_VERSION')) return;
     9include_spip("inc/newsletters");
    910
    1011function action_generer_newsletter_dist($id_newsletter = null, $force = false){
     
    4546}
    4647
     48/**
     49 * Recuperer un fond avec des liens internes public, et la bonne date
     50 *
     51 * @param int $id_newsletter
     52 * @param string $patron
     53 * @param null|string $date
     54 * @return string
     55 */
    4756function newsletters_recuperer_fond($id_newsletter, $patron, $date = null){
    4857
     
    6877        return $texte;
    6978}
    70 
    71 function newsletters_html2text($html){
    72         // nettoyer les balises de mise en page html
    73         $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
    74         $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
    75         $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
    76         $html = preg_replace(",<!--.*-->,Uims","\n",$html);
    77         $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
    78         $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
    79         $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
    80         $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
    81         $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
    82         $html = preg_replace(",(<p>\s*</p>),ims","",$html);
    83         #return $html;
    84 
    85         $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
    86 
    87         // vider le contenu de qqunes :
    88         $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
    89 
    90         // Liens :
    91         // Nettoyage des liens des notes de bas de page
    92         $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);
    93         // Supprimer tous les liens internes
    94         $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
    95         // Remplace tous les liens
    96         preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
    97         $prelinks = $postlinks = array();
    98         foreach ($matches as $k => $match){
    99                 $link = "@@@link$k@@@";
    100                 $prelinks[$match[0]] = $match[2]." ($link)";
    101                 $postlinks[$link] = $match[1];
    102         }
    103         $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
    104 
    105         // les images par leur alt ?
    106         // au moins les puces
    107         $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
    108         // les autres
    109         $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
    110         // on vire celles sans alt
    111         $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
    112 
    113         // espaces
    114         $html = str_replace("&nbsp;"," ",$html);
    115         $html = preg_replace(",<p>\s+,ims","<p>",$html);
    116 
    117         #return $html;
    118         include_spip("lib/markdownify/markdownify");
    119         $parser = new Markdownify(false,false,false);
    120         $texte = $parser->parseString($html);
    121 
    122         $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
    123 
    124 
    125         // trim et sauts de ligne en trop ou pas assez
    126         $texte = trim($texte);
    127         $texte = str_replace("<br />\n","\n",$texte);
    128         $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
    129         $texte = preg_replace(",(@@@hr@@@\s*)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
    130         $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
    131         $texte = preg_replace(",(\n\s*)(\n\s*)(\n\s*)+,ims","\n\n\n",$texte);
    132 
    133         // entites restantes ? (dans du code...)
    134         include_spip('inc/charsets');
    135         $texte = unicode2charset($texte);
    136         $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
    137 
    138 
    139         // Faire des lignes de 75 caracteres maximum
    140         return trim(wordwrap($texte));
    141 
    142 }
    143 
  • _plugins_/newsletters/inc/newsletters.php

    r68158 r68171  
    6363        }
    6464}
     65
     66
     67/**
     68 * generer une version texte a partir d'une version HTML
     69 *
     70 * @param string $html
     71 * @return string
     72 */
     73function newsletters_html2text($html){
     74        // nettoyer les balises de mise en page html
     75        $html = preg_replace(",</(td|th)>,Uims","<br/>",$html);
     76        $html = preg_replace(",</(table)>,Uims","@@@hr@@@",$html);
     77        $html = preg_replace(",</?(html|body|table|td|th|tbody|thead|center|article|section|span)[^>]*>,Uims","\n\n",$html);
     78        $html = preg_replace(",<!--.*-->,Uims","\n",$html);
     79        $html = preg_replace(",<(/?)(div|tr|caption)([^>]*>),Uims","<\\1p>",$html);
     80        $html = preg_replace(",(<p>\s*)+,ims","<p>",$html);
     81        $html = preg_replace(",<br/?>\s*</p>,ims","</p>",$html);
     82        $html = preg_replace(",</p>\s*<br/?>,ims","</p>",$html);
     83        $html = preg_replace(",(</p>\s*(@@@hr@@@)?\s*)+,ims","</p>\\2",$html);
     84        $html = preg_replace(",(<p>\s*</p>),ims","",$html);
     85        #return $html;
     86
     87        $html = preg_replace(",<textarea[^>]*spip_cadre[^>]*>(.*)</textarea>,Uims","<code>\n\\1\n</code>",$html);
     88
     89        // vider le contenu de qqunes :
     90        $html = preg_replace(",<head[^>]*>.*</head>,Uims","\n",$html);
     91
     92        // Liens :
     93        // Nettoyage des liens des notes de bas de page
     94        $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);
     95        // Supprimer tous les liens internes
     96        $html = preg_replace("/\<a href=['\"]#(.*?)['\"][^>]*>(.*?)<\/a>/ims","\\2", $html);
     97        // Remplace tous les liens
     98        preg_match_all("/\<a href=['\"](.*?)['\"][^>]*>(.*?)<\/a>/ims", $html,$matches,PREG_SET_ORDER);
     99        $prelinks = $postlinks = array();
     100        foreach ($matches as $k => $match){
     101                $link = "@@@link$k@@@";
     102                $prelinks[$match[0]] = $match[2]." ($link)";
     103                $postlinks[$link] = $match[1];
     104        }
     105        $html = str_replace(array_keys($prelinks), array_values($prelinks),$html);
     106
     107        // les images par leur alt ?
     108        // au moins les puces
     109        $html = preg_replace(',<img\s[^>]*alt="-"[^>]*>,Uims','-',$html);
     110        // les autres
     111        $html = preg_replace(',<img\s[^>]*alt=[\'"]([^\'"]*)[\'"][^>]*>,Uims',"\\1",$html);
     112        // on vire celles sans alt
     113        $html = preg_replace(",</?(img)[^>]*>,Uims","\n",$html);
     114
     115        // espaces
     116        $html = str_replace("&nbsp;"," ",$html);
     117        $html = preg_replace(",<p>\s+,ims","<p>",$html);
     118
     119        #return $html;
     120        include_spip("lib/markdownify/markdownify");
     121        $parser = new Markdownify(false,false,false);
     122        $texte = $parser->parseString($html);
     123
     124        $texte = str_replace(array_keys($postlinks), array_values($postlinks),$texte);
     125
     126
     127        // trim et sauts de ligne en trop ou pas assez
     128        $texte = trim($texte);
     129        $texte = str_replace("<br />\n","\n",$texte);
     130        $texte = preg_replace(",(@@@hr@@@\s*)+\Z,ims","",$texte);
     131        $texte = preg_replace(",(@@@hr@@@\s*)+,ims","\n\n\n".str_pad("-",75,"-")."\n\n\n",$texte);
     132        $texte = preg_replace(",(\n#+\s),ims","\n\n\\1",$texte);
     133        $texte = preg_replace(",(\n\s*)(\n\s*)(\n\s*)+,ims","\n\n\n",$texte);
     134
     135        // entites restantes ? (dans du code...)
     136        include_spip('inc/charsets');
     137        $texte = unicode2charset($texte);
     138        $texte = str_replace(array('&#039;', '&#034;'),array("'",'"'), $texte);
     139
     140
     141        // Faire des lignes de 75 caracteres maximum
     142        return trim(wordwrap($texte));
     143
     144}
  • _plugins_/newsletters/newsletters_fonctions.php

    r68158 r68171  
    7979        return $page;
    8080}
     81
     82/**
     83 * Un filtre pour fixer une image
     84 * appele par l'action fixer_newsletter, mais peut etre utilise aussi directement dans la newsletter pour fixer les images
     85 * manuellement et forcer une url absolue sur un domaine particulier
     86 *
     87 * Le filtre genere une url finissant par #fixed pour ne pas y retoucher si il est rappelle
     88 * (y compris si c'est un domaine qu'il ne connait pas)
     89 *
     90 * @param $src
     91 * @param $id_newsletter
     92 * @return bool|string
     93 */
     94function newsletter_fixer_image($src,$id_newsletter){
     95        static $dir = array();
     96        if (!isset($dir[$id_newsletter])){
     97                $dir[$id_newsletter] = sous_repertoire(_DIR_IMG,"nl");
     98                $dir[$id_newsletter] = sous_repertoire($dir[$id_newsletter],$id_newsletter);
     99        }
     100
     101        // recuperer l'image par copie directe si possible
     102        if (strncmp($src,$GLOBALS['meta']['adresse_site'].'/',$l=strlen($GLOBALS['meta']['adresse_site'].'/'))==0)
     103                $src = _DIR_RACINE . substr($src,$l);
     104
     105        $url = parse_url($src);
     106        // hack : mettre un #fixed sur une url d'image pour indiquer qu'elle a deja ete fixee
     107        // on ne fait plus rien dans ce cas
     108        if ($url['fragment']=='fixed') return false;
     109
     110        $path_parts = pathinfo($url['path']);
     111        $dest = $dir[$id_newsletter].md5($src).".".$path_parts['extension'];
     112
     113        if (!$url['scheme']
     114                AND !$url['host']
     115          AND file_exists($src)){
     116                deplacer_fichier_upload($src, $dest, false);
     117        }
     118        else {
     119                include_spip("inc/distant");
     120                recuperer_page($src,$dest);
     121        }
     122
     123        if (!file_exists($dest))
     124                return false;
     125
     126        return "$dest#fixed";
     127}
    81128?>
  • _plugins_/newsletters/newsletters_pipelines.php

    r68158 r68171  
    1111
    1212/**
    13  * Quand une newsletter est publiee la generer si necessaire
    14  * et la figer (baked)
    15 
     13 * Quand une newsletter est publiee fixer les images dans un dossier IMG/nl/xx/
     14 * pour ne jamais perdre les images temporaires
     15 *
    1616 * @param $flux
    1717 * @return mixed
     
    3131                $generer_newsletter($id_newsletter);
    3232
     33                // fixer les images et autre
     34                $fixer_newsletter = charger_fonction("fixer_newsletter","action");
     35                $fixer_newsletter($id_newsletter);
    3336
    3437                $flux['data']['baked'] = 1;
  • _plugins_/newsletters/paquet.xml

    r68160 r68171  
    22        prefix="newsletters"
    33        categorie="communication"
    4         version="0.1.1"
     4        version="0.2.0"
    55        etat="dev"
    66        compatibilite="[3.0.5;3.0.*]"
     
    2323        <pipeline nom="pre_edition" inclure="newsletters_pipelines.php" />
    2424
    25         <menu nom="newsletters" titre="newsletter:titre_newsletters" parent="menu_edition" icone="images/newsletter-16.png" action="newsletters" />
     25        <menu nom="newsletters" titre="newsletter:titre_newsletters" parent="menu_edition" icone="images/newsletter-16.png" action="newsletters" />
     26
     27        <necessite nom="mailsubscribers" compatibilite="[0.7.0;]" />
     28        <!--<necessite nom="mailshot" compatibilite="[0.1.0;]" />-->
    2629</paquet>
Note: See TracChangeset for help on using the changeset viewer.