X-Git-Url: http://git.cyclocoop.org/?p=ptitvelo%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Ffacteur%2Ffacteur_fonctions.php;fp=www%2Fplugins%2Ffacteur%2Ffacteur_fonctions.php;h=9c09ca43ecd27bb1da6a0ec532dc0e6d4b05c987;hp=0000000000000000000000000000000000000000;hb=a463177039939e8c9294e065d7505f8de95d48c2;hpb=5be150361b3c836d9206941ba43f862df11466db diff --git a/www/plugins/facteur/facteur_fonctions.php b/www/plugins/facteur/facteur_fonctions.php new file mode 100755 index 0000000..9c09ca4 --- /dev/null +++ b/www/plugins/facteur/facteur_fonctions.php @@ -0,0 +1,387 @@ + + * le corps est entre + * une eventuelle intro peut etre fournie entre + * + * @param string $texte_ou_html + * @return string + */ +function facteur_email_wrap_to_html($texte_ou_html){ + $texte_ou_html = trim($texte_ou_html); + // attention : si pas de contenu on renvoi du vide aussi (mail vide = mail vide) + if (!strlen(trim($texte_ou_html))) + return $texte_ou_html; + + $contexte = array("sujet"=>"","texte"=>"","intro"=>""); + + // tester si le mail est en html (simplifie) + if (substr($texte_ou_html,0,1)=="<" + AND substr($texte_ou_html,-1,1)==">" + AND stripos($texte_ou_html,"")!==false){ + + // dans ce cas on ruse un peu : extraire le sujet du title + $sujet = ""; + if (preg_match(",(.*),Uims",$texte_ou_html,$m)){ + $contexte['sujet'] = $m[1]; + $texte_ou_html = preg_replace(",(.*),Uims","",$texte_ou_html,1); + $texte_ou_html = trim($texte_ou_html); + } + if (preg_match(",(.*),Uims",$texte_ou_html,$m)){ + $contexte['intro'] = $m[1]; + $texte_ou_html = preg_replace(",(.*),Uims","",$texte_ou_html,1); + $texte_ou_html = trim($texte_ou_html); + } + $contexte['html'] = preg_replace(",,ims","",$texte_ou_html); + } + else { + // la premiere ligne est toujours le sujet + $texte_ou_html = explode("\n",$texte_ou_html); + $contexte['sujet'] = trim(array_shift($texte_ou_html)); + $contexte['texte'] = trim(implode("\n",$texte_ou_html)); + } + + // attention : si pas de contenu on renvoi du vide aussi (mail vide = mail vide) + if (!strlen(trim(implode("",$contexte)))) + return ""; + + return recuperer_fond("emails/texte",$contexte); +} + + /* + + Written by Eric Dols - edols@auditavenue.com + + You may freely use or modify this, provided + you leave credits to the original coder. + Feedback about (un)successfull uses, bugs and improvements done + are much appreciated, but don't expect actual support. + + PURPOSE OF THIS FUNCTION + It is designed to process html emails relying + on a css stylesheet placed in the for layout in + order to enhance compatibility with email clients, + including webmail services. + Provided you use minimal css, you can keep styling separate + from the content in your email template, and let this function + "inject" those styles inline in your email html tags on-the-fly, + just before sending. + Technically, it grabs the style declarations found in the + section and inserts each declaration inline, + inside the corresponding html tags in the email message. + + Supports both HTML and XHTML markup seamlessly. Thus + tolerant to email message writers using non-xhtml tag, + even when template is xhtml compliant (e.g. they would + add instead of a xhtml compliant ). + + NEW 10 dec. 2003: + - code revised, including a few regexp bugs fixed. + - multiple class for a tag are now allowed

+ - all unsupported css styles are now moved to the body section (not just a:hover etc...) + + USE + Add this function to a function library include, like "inline.inc" + and include it near the beginning of your php page: + require ("inline.inc"); + + load the html source of message into a variable + like $html_source and process it using: + $html_source = sheet2inline($html_source) + + + STYLE DEFINITIONS SUPPORTED + TAG { ... } + TAG1, TAG2, ... { ... } + TAG.class { ... } + .class { ...) + TAG:pseudo { ... } + + + CSS definitions may be freely formatted (spaces, tabs, linefeeds...), + they are converted to oneliners before inserting them inline in the html tags. + + .class definitions are processed AFTER tag definitions, + thus appended inline after any existing tag styling to + preserve the normal css priority behavior. + + Existing style="..." attributes in tags are NOT stripped. However they MUST + be with double quotes. If not, an addtional style="..." attribute will be added + + + KNOWN LIMITATIONS + - style info should be placed in section. I believe + it shouldnt be too hard to modify to point to an external + stylesheet instead. + - no support (yet?): + * chains like P UL LI { .... } or P UL LI.class { .... } + * #divname p { ... } and + * a:hover, a:visited {...} multiple class:pseudo + They require a significantly more complicated processing likely + based on stylesheet and document trees parsing. + Many email clients don't handle more than what is supported + by this script anyway. + - pseudo-classes like a:hover {...} can't be inserted inline + in the html tags: they are moved to a \n", $body); + } + // append a copy of the pseudo-element declaration to that body style section + $styledefinition = trim($styles[5][$i]); + $styledefinition = preg_replace ("!\s+!mi", " ", $styledefinition ); // convert style definition to a one-liner (optional) + $declaration = $styles[1][$i].trim($styles[2][$i]).$styles[3][$i].trim($styles[4][$i])." { ".$styledefinition." }"; + $body = preg_replace ("!(]*>\s*]*>\s*<\!\-\-[^>]*)"."(\s*\-\->\s*)!si", "\$1".$declaration."\n\$2", $body); + $styles[6][$i]= 2; // mark as moved to (.*)!si", "\$1\$2" , $body); + + // check what styles have been injected +# print_r($styles); + + return $body; +} + +/** + * facteur_addstyle + * @author Eric Dols + * + * @param $matches + * @return string + */ +function facteur_addstyle($matches) { + + // $matches[1]=tag, $matches[2]=tag attributes (if any), $matches[3]=xhtml closing (if any) + + // variables values set in calling function + global $styledefinition, $styletag, $styleclass; + + // convert the style definition to a one-liner + $styledefinition = preg_replace ("!\s+!mi", " ", $styledefinition ); + // convert all double-quotes to single-quotes + $styledefinition = preg_replace ('/"/','\'', $styledefinition ); + + if (preg_match ("/style\=/i", $matches[2])) { + // add styles to existing style attribute if any already in the tag + $pattern = "!(.* style\=)[\"]([^\"]*)[\"](.*)!mi"; + $replacement = "\$1".'"'."\$2 ".$styledefinition.'"'."\$3"; + $attributes = preg_replace ($pattern, $replacement , $matches[2]); + } else { + // otherwise add new style attribute to tag (none was present) + $attributes = $matches[2].' style="'.$styledefinition.'"'; + } + + if ($styleclass!="") { + // if we were injecting a class style, remove the now useless class attribute from the html tag + + // Single class in tag case (class="classname"): remove class attribute altogether + $pattern = "!(.*) class\=['\"]".$styleclass."['\"](.*)!mi"; + $replacement = "\$1\$2"; + $attributes = preg_replace ( $pattern, $replacement, $attributes); + + // Multiple classes in tag case (class="classname anotherclass..."): remove class name from class attribute. + // classes are injected inline and removed by order of appearance in stylesheet + // exact same behavior as where last declared class attributes in