Example #1
0
function version_texte($texte){
	$texte = charset2unicode($texte);

	// accentuer le texte avant de suprimer les tags
	$texte = strtr($texte, array('&amp;'=>'&', '&quot;'=>'"', '&lt;'=>'<', '&gt;'=>'>', '&egrave;'=>'&#232;', '&eacute;'=>'&#233;', '&agrave;' => '&#224;')	);
	
	$cherche = array (
/*01*/		'@<script[^>]*?>.*?</script>@si', // Supprime le javascript
/*02*/		'@<style[^>]*?>.*?</style>@si', // Supprime les styles inline
/*03*/		",<link[^>]*>,Uims",			// les css
/*04*/		",<img[^>]*alt=['\"]([^'\"]*)['\"][^>]*>,Uims", // les images
	);
	
	$remplace = array (
/*01*/		'',
/*02*/		'',
/*03*/		'',
/*04*/		'[\1]',
	);

	// voir : TODO.txt
	
	$texte = preg_replace($cherche, $remplace, $texte);
	return $texte;
}
Example #2
0
File: fr.php Project: nursit/SPIP
function typographie_fr_dist($letexte)
{
    static $trans;
    // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ;
    // 147 = ldquo; 148 = rdquo; ' = zouli apostrophe
    if (!$trans) {
        $trans = array("'" => "&#8217;", "&nbsp;" => "~", "&raquo;" => "&#187;", "&laquo;" => "&#171;", "&rdquo;" => "&#8221;", "&ldquo;" => "&#8220;", "&deg;" => "&#176;");
        $chars = array(160 => '~', 187 => '&#187;', 171 => '&#171;', 148 => '&#8221;', 147 => '&#8220;', 176 => '&#176;');
        $chars_trans = array_keys($chars);
        $chars = array_values($chars);
        $chars_trans = implode(' ', array_map('chr', $chars_trans));
        $chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1', 'forcer'));
        $chars_trans = explode(" ", $chars_trans);
        foreach ($chars as $k => $r) {
            $trans[$chars_trans[$k]] = $r;
        }
    }
    $letexte = strtr($letexte, $trans);
    $cherche1 = array('/((?:^|[^\\#0-9a-zA-Z\\&])[\\#0-9a-zA-Z]*)\\;/S', '/&#187;| --?,|(?::| %)(?:\\W|$)/S', '/([^[<(!?.])([!?][!?\\.]*)/iS', '/&#171;|(?:M(?:M?\\.|mes?|r\\.?)|[MnN]&#176;) /S');
    $remplace1 = array('\\1~;', '~\\0', '\\1~\\2', '\\0~');
    $letexte = preg_replace($cherche1, $remplace1, $letexte);
    $letexte = preg_replace("/ *~+ */S", "~", $letexte);
    $cherche2 = array('/([^-\\n]|^)--([^-]|$)/S', ',(http|https|ftp|mailto)~((://[^"\'\\s\\[\\]\\}\\)<>]+)~([?]))?,S', '/~/');
    $remplace2 = array('\\1&mdash;\\2', '\\1\\3\\4', '&nbsp;');
    $letexte = preg_replace($cherche2, $remplace2, $letexte);
    return $letexte;
}
Example #3
0
/**
 * Exporter une ligne complete au format CSV, avec delimiteur fourni
 * @param array $ligne
 * @param string $delim
 * @return string
 */
function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) {
	$output = join($delim, array_map('exporter_csv_champ', $ligne))."\r\n";
	if ($importer_charset){
		$output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset);
	}
	return $output;
}
function pdf_first_clean($texte){
	// Cette focntion est appelé après la fonction propre
	// $texte = ereg_replace("<p class[^>]*>", "<P>", $texte);
	//Translation des codes iso
	// PB avec l'utilisation de <code>
	$trans = get_html_translation_table(HTML_ENTITIES);
	$texte = preg_replace(',<!-- .* -->,msU', '', $texte); // supprimer les remarques HTML (du Couteau Suisse ?)
	$trans = array_flip($trans);
	$trans["<br />\n"] = "<BR>";        // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code)
	$trans['&#176;'] = "°";
	$trans["&#339;"] = "oe";
	$trans["&#8206;"] = "";
	$trans["&#8211;"] = "-";
	$trans["&#8216;"] = "'";
	$trans["&#8217;"] = "'";
	$trans["&#8220;"] = "\"";
	$trans["&#8221;"] = "\"";
	$trans["&#8230;"] = "...";
	$trans["&#8364;"] = "Euros";
	$trans["&ucirc;"] = "û";
	$trans['->'] = '-»';
	$trans['<-'] = '«-';
	$trans['&nbsp;'] = ' ';
	// certains titles font paniquer l'analyse
	$texte = preg_replace(',title=".*",msU', 'title=""', $texte);
	
	$texte = unicode2charset(charset2unicode($texte), 'iso-8859-1'); // repasser tout dans un charset acceptable par export PDF
	$texte = strtr($texte, $trans);

	return $texte;
}
Example #5
0
function cs_test_spam(&$spam, &$texte, &$test) {
	foreach($spam[0] as $m) $test |= strpos($texte, $m)!==false;
	if(!$test && $spam[1]) $test = preg_match($spam[1], $texte);
	if(!$test && $spam[2]) {
		include_spip('inc/charsets');
		$test = preg_match($spam[2], charset2unicode($texte));
	}
	return $test;
}
function crayons_json_encode($v)
{
    if ($GLOBALS['meta']['charset'] == 'utf-8' and function_exists('json_encode')) {
        return json_encode($v);
    }
    $v = crayons_var2js($v);
    if ($GLOBALS['meta']['charset'] != 'utf-8') {
        include_spip('inc/charsets');
        $v = charset2unicode($v);
    }
    return $v;
}
Example #7
0
function type_urls_URL_objet_191_exec() {
	global $type_urls;
	$type = _request('type_objet');
	$table = $type.($type=='syndic'?'':'s');
	$id_objet = intval(_request('id_objet'));
	$r0 = "SELECT url_propre, titre FROM spip_$table WHERE id_$type=$id_objet";
	$r = spip_query($r0);
	if ($r AND $r = spip_fetch_array($r)) { $url_1 = $r['url_propre']; $titre = $r['titre']; }
	if(!function_exists($fct = 'generer_url_'.($type=='syndic'?'site':$type))) {
		if($f = include_spip('urls/'.$type_urls, false))
			include_once($f);
	}
	$url = function_exists($fct)?$fct($id_objet):'??';
	$r = spip_query($r0);
	if ($r AND $r = spip_fetch_array($r)) $url_2 = $r['url_propre'];
	// url propre en base || titre || url complete || type d'URLs || URL recalculee
	include_spip('inc/charsets');
	echo _request('format')=='iframe'
		?"<span style='font-family:Verdana,Arial,Sans,sans-serif; font-size:10px;'>[<a href='../$url' title='$url' target='_blank'>"._T('couteau:urls_propres_lien').'</a>]</span>'

		:$url_1.'||'.charset2unicode($titre).'||'.$url.'||'.$type_urls.'||'.$url_2;
}
Example #8
0
function couper($texte, $taille = 50, $suite = '&nbsp;(...)')
{
    if (!($length = strlen($texte)) or $taille <= 0) {
        return '';
    }
    $offset = 400 + 2 * $taille;
    while ($offset < $length and strlen(preg_replace(",<[^>]+>,Uims", "", substr($texte, 0, $offset))) < $taille) {
        $offset = 2 * $offset;
    }
    if ($offset < $length && ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== NULL) {
        $p_tag_fermant = strpos($texte, '>', $offset);
        if ($p_tag_fermant && $p_tag_fermant < $p_tag_ouvrant) {
            $offset = $p_tag_fermant + 1;
        }
        // prolonger la coupe jusqu'au tag fermant suivant eventuel
    }
    $texte = substr($texte, 0, $offset);
    /* eviter de travailler sur 10ko pour extraire 150 caracteres */
    // on utilise les \r pour passer entre les gouttes
    $texte = str_replace("\r\n", "\n", $texte);
    $texte = str_replace("\r", "\n", $texte);
    // sauts de ligne et paragraphes
    $texte = preg_replace("/\n\n+/", "\r", $texte);
    $texte = preg_replace("/<(p|br)( [^>]*)?" . ">/", "\r", $texte);
    // supprimer les traits, lignes etc
    $texte = preg_replace("/(^|\r|\n)(-[-#\\*]*|_ )/", "\r", $texte);
    // supprimer les tags
    $texte = supprimer_tags($texte);
    $texte = trim(str_replace("\n", " ", $texte));
    $texte .= "\n";
    // marquer la fin
    // travailler en accents charset
    $texte = unicode2charset(html2unicode($texte, true));
    if (!function_exists('nettoyer_raccourcis_typo')) {
        include_spip('inc/lien');
    }
    $texte = nettoyer_raccourcis_typo($texte);
    // corriger la longueur de coupe
    // en fonction de la presence de caracteres utf
    if ($GLOBALS['meta']['charset'] == 'utf-8') {
        $long = charset2unicode($texte);
        $long = spip_substr($long, 0, max($taille, 1));
        $nbcharutf = preg_match_all('/(&#[0-9]{3,5};)/S', $long, $matches);
        $taille += $nbcharutf;
    }
    // couper au mot precedent
    $long = spip_substr($texte, 0, max($taille - 4, 1));
    $u = $GLOBALS['meta']['pcre_u'];
    $court = preg_replace("/([^\\s][\\s]+)[^\\s]*\n?\$/" . $u, "\\1", $long);
    $points = $suite;
    // trop court ? ne pas faire de (...)
    if (spip_strlen($court) < max(0.75 * $taille, 2)) {
        $points = '';
        $long = spip_substr($texte, 0, $taille);
        $texte = preg_replace("/([^\\s][\\s]+)[^\\s]*\n?\$/" . $u, "\\1", $long);
        // encore trop court ? couper au caractere
        if (spip_strlen($texte) < 0.75 * $taille) {
            $texte = $long;
        }
    } else {
        $texte = $court;
    }
    if (strpos($texte, "\n")) {
        // la fin est encore la : c'est qu'on n'a pas de texte de suite
        $points = '';
    }
    // remettre les paragraphes
    $texte = preg_replace("/\r+/", "\n\n", $texte);
    // supprimer l'eventuelle entite finale mal coupee
    $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte);
    return quote_amp(trim($texte)) . $points;
}
Example #9
0
function typo_fr($letexte)
{
    global $flag_strtr2;
    static $trans;
    // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; 147 = ldquo; 148 = rdquo
    if (!$trans) {
        $trans = array("&nbsp;" => "~", "&raquo;" => "&#187;", "&laquo;" => "&#171;", "&rdquo;" => "&#148;", "&ldquo;" => "&#147;", "&deg;" => "&#176;");
        $chars = array(160 => '~', 187 => '&#187;', 171 => '&#171;', 148 => '&#148;', 147 => '&#147;', 176 => '&#176;');
        $charset = read_meta('charset');
        include_lcm('inc_charsets');
        while (list($c, $r) = each($chars)) {
            $c = unicode2charset(charset2unicode(chr($c), 'iso-8859-1', 'forcer'));
            $trans[$c] = $r;
        }
    }
    if ($flag_strtr2) {
        $letexte = strtr($letexte, $trans);
    } else {
        reset($trans);
        while (list($c, $r) = each($trans)) {
            $letexte = str_replace($c, $r, $letexte);
        }
    }
    $cherche1 = array('/((^|[^\\#0-9a-zA-Z\\&])[\\#0-9a-zA-Z]*)\\;/', '/&#187;| --?,|:([^0-9]|$)/', '/([^<!?])([!?])/', '/&#171;|(M(M?\\.|mes?|r\\.?)|[MnN]&#176;) /');
    $remplace1 = array('\\1~;', '~\\0', '\\1~\\2', '\\0~');
    $letexte = ereg_remplace($cherche1, $remplace1, $letexte);
    $letexte = preg_replace("/ *~+ */", "~", $letexte);
    $cherche2 = array('/([^-\\n]|^)--([^-]|$)/', '/(http|https|ftp|mailto)~:/', '/~/');
    $remplace2 = array('\\1&mdash;\\2', '\\1:', '&nbsp;');
    $letexte = ereg_remplace($cherche2, $remplace2, $letexte);
    return $letexte;
}
Example #10
0
/**
 * Traduire une chaine internationalisée
 *
 * Lorsque la langue demandée n'a pas de traduction pour la clé de langue
 * transmise, la fonction cherche alors la traduction dans la langue
 * principale du site (défini par la meta `langue_site`), puis, à défaut
 * dans la langue française.
 *
 * Les traductions sont cherchées dans les modules de langue indiqués.
 * Par exemple le module `mots` dans la clé `mots:titre_mot`, pour une
 * traduction `es` (espagnol) provoquera une recherche dans tous les fichiers
 * `lang\mots_es.php`.
 *
 * Des surcharges locales peuvent être présentes également
 * dans les fichiers `lang/local_es.php` ou `lang/local.php`
 *
 * @note
 *   Les couples clé/traductions déjà connus sont sauvés en interne
 *   dans les globales `i18n_${module}_${lang}` tel que `i18n_mots_es`
 *   et sont également sauvés dans la variable statique `deja_vu`
 *   de cette fonction.
 *
 * @uses charger_langue()
 * @uses chercher_module_lang()
 * @uses surcharger_langue()
 *
 * @param string $ori
 *     Clé de traduction, tel que `bouton_enregistrer` ou `mots:titre_mot`
 * @param string $lang
 *     Code de langue, la traduction doit se faire si possible dans cette langue
 * @return string
 *     Traduction demandée. Chaîne vide si aucune traduction trouvée.
 **/
function inc_traduire_dist($ori, $lang)
{
    static $deja_vu = array();
    static $local = array();
    if (isset($deja_vu[$lang][$ori]) and _request('var_mode') != 'traduction') {
        return $deja_vu[$lang][$ori];
    }
    // modules demandes explicitement <xxx|yyy|zzz:code> cf MODULES_IDIOMES
    if (strpos($ori, ':')) {
        list($modules, $code) = explode(':', $ori, 2);
        $modules = explode('|', $modules);
        $ori_complet = $ori;
    } else {
        $modules = array('spip', 'ecrire');
        $code = $ori;
        $ori_complet = implode('|', $modules) . ':' . $ori;
    }
    $text = '';
    $module_retenu = '';
    // parcourir tous les modules jusqu'a ce qu'on trouve
    foreach ($modules as $module) {
        $var = "i18n_" . $module . "_" . $lang;
        if (empty($GLOBALS[$var])) {
            charger_langue($lang, $module);
            // surcharges persos -- on cherche
            // (lang/)local_xx.php et/ou (lang/)local.php ...
            if (!isset($local['local_' . $lang])) {
                // redéfinir la langue en cours pour les surcharges (chercher_langue a pu le changer)
                $GLOBALS['idx_lang'] = $var;
                // ... (lang/)local_xx.php
                $local['local_' . $lang] = chercher_module_lang('local', $lang);
            }
            if ($local['local_' . $lang]) {
                surcharger_langue($local['local_' . $lang]);
            }
            // ... puis (lang/)local.php
            if (!isset($local['local'])) {
                $local['local'] = chercher_module_lang('local');
            }
            if ($local['local']) {
                surcharger_langue($local['local']);
            }
        }
        if (isset($GLOBALS[$var][$code])) {
            $module_retenu = $module;
            $text = $GLOBALS[$var][$code];
            break;
        }
    }
    // Retour aux sources si la chaine est absente dans la langue cible ;
    // on essaie d'abord la langue du site, puis a defaut la langue fr
    $langue_retenue = $lang;
    if (!strlen($text) and $lang !== _LANGUE_PAR_DEFAUT) {
        if ($lang !== $GLOBALS['meta']['langue_site']) {
            $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']);
            $langue_retenue = !strlen($text) ? $GLOBALS['meta']['langue_site'] : '';
        } else {
            $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT);
            $langue_retenue = !strlen($text) ? _LANGUE_PAR_DEFAUT : '';
        }
    }
    // Supprimer la mention <NEW> ou <MODIF>
    if (substr($text, 0, 1) === '<') {
        $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text);
    }
    // Si on n'est pas en utf-8, la chaine peut l'etre...
    // le cas echeant on la convertit en entites html &#xxx;
    if ((!isset($GLOBALS['meta']['charset']) or $GLOBALS['meta']['charset'] !== 'utf-8') and preg_match(',[\\x7f-\\xff],S', $text)) {
        include_spip('inc/charsets');
        $text = charset2unicode($text, 'utf-8');
    }
    if (_request('var_mode') == 'traduction') {
        if ($text) {
            $classe = 'debug-traduction' . ($module_retenu == 'ecrire' ? '-prive' : '');
            $text = '<span lang=' . $langue_retenue . ' class=' . $classe . ' title=' . $ori_complet . '(' . $langue_retenue . ')>' . $text . '</span>';
            $text = str_replace(array("{$module_retenu}:", "{$module_retenu}|"), array("*{$module_retenu}*:", "*{$module_retenu}*|"), $text);
        }
    } else {
        $deja_vu[$lang][$ori] = $text;
    }
    return $text;
}
Example #11
0
function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS)
{
    include_spip('inc/xml');
    $arbre = spip_xml_parse($desc);
    $verifie_conformite = charger_fonction('verifie_conformite', 'plugins');
    $verifie_conformite($plug, $arbre, $dir_plugins);
    include_spip('inc/charsets');
    // On renvoie la DTD utilisee
    $ret['dtd'] = "plugin";
    if (isset($arbre['categorie'])) {
        $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie']));
    }
    if (isset($arbre['nom'])) {
        $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom']));
    }
    if (isset($arbre['icon'])) {
        $ret['logo'] = trim(spip_xml_aplatit($arbre['icon']));
    }
    if (isset($arbre['auteur'])) {
        $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur']));
    }
    // garder le 1er niveau en tableau mais traiter le multi possible
    if (isset($arbre['licence'])) {
        $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence']));
    }
    if (isset($arbre['version'])) {
        $ret['version'] = trim(spip_xml_aplatit($arbre['version']));
    }
    if (isset($arbre['version_base'])) {
        $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base']));
    }
    if (isset($arbre['etat'])) {
        $ret['etat'] = trim(spip_xml_aplatit($arbre['etat']));
    }
    $ret['description'] = $ret['slogan'] = "";
    if (isset($arbre['slogan'])) {
        $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan']));
    }
    if (isset($arbre['description'])) {
        $ret['description'] = trim(spip_xml_aplatit($arbre['description']));
    }
    if (isset($arbre['lien'])) {
        $ret['documentation'] = trim(join(' ', $arbre['lien']));
        if ($ret['documentation']) {
            // le lien de doc doit etre une url et c'est tout
            if (!preg_match(',^https?://,iS', $ret['documentation'])) {
                $ret['documentation'] = "";
            }
        }
    }
    if (isset($arbre['options'])) {
        $ret['options'] = $arbre['options'];
    }
    if (isset($arbre['fonctions'])) {
        $ret['fonctions'] = $arbre['fonctions'];
    }
    if (isset($arbre['prefix'][0])) {
        $ret['prefix'] = trim(array_pop($arbre['prefix']));
    }
    if (isset($arbre['install'])) {
        $ret['install'] = $arbre['install'];
    }
    if (isset($arbre['meta'])) {
        $ret['meta'] = trim(spip_xml_aplatit($arbre['meta']));
    }
    $necessite = info_plugin_normalise_necessite($arbre['necessite']);
    $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : '';
    $ret['necessite'] = $necessite['necessite'];
    $ret['lib'] = $necessite['lib'];
    $ret['utilise'] = info_plugin_normalise_utilise($arbre['utilise']);
    $ret['procure'] = info_plugin_normalise_procure($arbre['procure']);
    $ret['chemin'] = info_plugin_normalise_chemin($arbre['path']);
    if (isset($arbre['pipeline'])) {
        $ret['pipeline'] = $arbre['pipeline'];
    }
    $extraire_boutons = charger_fonction('extraire_boutons', 'plugins');
    $les_boutons = $extraire_boutons($arbre);
    $ret['menu'] = $les_boutons['bouton'];
    $ret['onglet'] = $les_boutons['onglet'];
    $ret['traduire'] = $arbre['traduire'];
    if (isset($arbre['config'])) {
        $ret['config'] = spip_xml_aplatit($arbre['config']);
    }
    if (isset($arbre['noisette'])) {
        $ret['noisette'] = $arbre['noisette'];
    }
    if (isset($arbre['erreur'])) {
        $ret['erreur'] = $arbre['erreur'];
        if ($plug) {
            spip_log("infos_plugin {$plug} " . @join(' ', $arbre['erreur']));
        }
    }
    return $ret;
}
Example #12
0
function inc_traduire_dist($ori, $lang) {

	static $deja_vu = array();
  
	if (isset($deja_vu[$lang][$ori]))
		return $deja_vu[$lang][$ori];

	// modules demandes explicitement <xxx/yyy/zzz:code>
	if (strpos($ori,':')) {
		list($modules,$code) = explode(':',$ori,2);
		$modules = explode('/', $modules);
	} else {
		$modules = array('spip', 'ecrire');
		$code = $ori;
	}

	$text = '';
	// parcourir tous les modules jusqu'a ce qu'on trouve
	foreach ($modules as $module) {
		$var = "i18n_".$module."_".$lang;
		if (empty($GLOBALS[$var])) {
			charger_langue($lang, $module);

			// surcharge perso -- on cherche (lang/)local_xx.php ...
			if ($f = chercher_module_lang('local', $lang))
				surcharger_langue($f);
			// ... puis (lang/)local.php
			if ($f = chercher_module_lang('local'))
				surcharger_langue($f);
		}
		if (isset($GLOBALS[$var][$code])) {
			$text = $GLOBALS[$var][$code];
			break;
		}
	}

	// Retour aux sources si la chaine est absente dans la langue cible ;
	// on essaie d'abord la langue du site, puis a defaut la langue fr
	if (!strlen($text)
	AND $lang !== 'fr') {
		if ($lang !== $GLOBALS['meta']['langue_site'])
			$text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']);
		else 
			$text = inc_traduire_dist($ori, 'fr');
	}

	// Supprimer la mention <NEW> ou <MODIF>
	if (substr($text,0,1) === '<')
		$text = str_replace(array('<NEW>', '<MODIF>'), array(), $text);

	// Si on n'est pas en utf-8, la chaine peut l'etre...
	// le cas echeant on la convertit en entites html &#xxx;
	if ($GLOBALS['meta']['charset'] !== 'utf-8'
	AND preg_match(',[\x7f-\xff],S', $text)) {
		include_spip('inc/charsets');
		$text = charset2unicode($text,'utf-8');
	}

	$deja_vu[$lang][$ori] = $text;

	return $text;
}
Example #13
0
function translitteration($texte, $charset = 'AUTO', $complexe = '')
{
    static $trans;
    if ($charset == 'AUTO') {
        $charset = read_meta('charset');
    }
    $charset = strtolower($charset);
    $table_translit = 'translit' . $complexe;
    // 1. Passer le charset et les &eacute en utf-8
    $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true)));
    // 2. Translitterer grace a la table predefinie
    if (!$trans[$complexe]) {
        global $CHARSET;
        load_charset($table_translit);
        reset($CHARSET[$table_translit]);
        while (list($key, $val) = each($CHARSET[$table_translit])) {
            $trans[$complexe][caractere_utf_8($key)] = $val;
        }
    }
    if ($GLOBALS['flag_strtr2']) {
        $texte = strtr($texte, $trans[$complexe]);
    } else {
        $tr = $trans[$complexe];
        while (list($from, $to) = each($tr)) {
            $texte = str_replace($from, $to, $texte);
        }
    }
    /*
    	// Le probleme d'iconv c'est qu'il risque de nous renvoyer des ? alors qu'on
    	// prefere garder l'utf-8 pour que la chaine soit indexable.
    	// 3. Translitterer grace a iconv
    	if ($GLOBALS['flag_iconv'] && preg_match('/&#0*([0-9]+);/', $texte)) {
    		$texte = iconv('utf-8', 'ascii//translit', $texte);
    	}
    */
    return $texte;
}
Example #14
0
function filtrer_ical($texte)
{
    #include_spip('inc/charsets');
    $texte = html2unicode($texte);
    $texte = unicode2charset(charset2unicode($texte, $GLOBALS['meta']['charset'], 1), 'utf-8');
    $texte = preg_replace("/\n/", " ", $texte);
    $texte = preg_replace("/,/", "\\,", $texte);
    return $texte;
}
Example #15
0
function afficher_diff($texte)
{
    $charset = $GLOBALS['meta']['charset'];
    if ($charset == 'utf-8') {
        return $texte;
    }
    return charset2unicode($texte, 'utf-8');
}
Example #16
0
function spiplistes_envoyer_mail ($to, $subject, $message, $from = false, $headers = '', $format = 'texte') {
	
	static $opt_simuler_envoi;

	// si desabo, plus de format ! donc forcer a texte
	$format = ($format == 'html') ? $format : 'texte';
	
	$charset = $GLOBALS['meta']['spiplistes_charset_envoi'];
	if(!$opt_simuler_envoi) {
		$opt_simuler_envoi = spiplistes_pref_lire('opt_simuler_envoi');
	}
	if (!$from)
	{
		$from = spiplistes_email_from_default();
	}
	if(strpos($from, '<') === false) {
		$fromname = spiplistes_nom_site_texte();
		
		if ($charset != $GLOBALS['meta']['charset']){
			include_spip('inc/charsets');
			$fromname = unicode2charset(charset2unicode($fromname),$charset);
		}
	}
	// @TODO: voir email_reply_to ?
	$reply_to = 'no-reply'.preg_replace("|.*(@[a-z.]+)|i", "$1", email_valide($from));
	
	if($opt_simuler_envoi == 'oui') {
		spiplistes_log("!!! MAIL SIMULATION MODE !!!");
		$result = true;
	}
	else {
		include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php');
		
		$email_a_envoyer = array();
		
		$return_path = spiplistes_return_path($from);
		
		if(is_array($message))
		{
			if($format=='html' && isset($message[$format])) {
				$email_a_envoyer['html'] = new phpMail($to, $subject, $message['html'], $message['texte'], $charset);
				$email_a_envoyer['html']->From = $from ; 
				if($fromname) $email_a_envoyer['html']->FromName = $fromname ; 
				$email_a_envoyer['html']->AddCustomHeader("Errors-To: ".$return_path); 
				$email_a_envoyer['html']->AddCustomHeader("Reply-To: ".$from); 
				$email_a_envoyer['html']->AddCustomHeader("Return-Path: ".$return_path); 	
				$email_a_envoyer['html']->SMTPKeepAlive = true;
				$email_a_envoyer['html']->Body = $message['html']->Body;
				$email_a_envoyer['html']->AltBody = $message['html']->AltBody;
			}
			$message = $message['texte']->Body;
		}
		//$message = spiplistes_html_entity_decode ($message, $charset);
		$message = spiplistes_translate_2_charset ($message, $charset, true);
		
		//$email_a_envoyer['texte'] = new phpMail($to, $subject, '', html_entity_decode($message), $charset);
		$email_a_envoyer['texte'] = new phpMail($to, $subject, '', $message, $charset);
		$email_a_envoyer['texte']->From = $from ;
		if($fromname) $email_a_envoyer['html']->FromName = $fromname ; 
		$email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); 
		$email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$reply_to); 
		$email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); 
		$email_a_envoyer['texte']->SMTPKeepAlive = true;
		
		$result = $email_a_envoyer[$format]->send();
		
		$msg = "email from $from to $to";
		spiplistes_log(!$result ? "error: $msg not sent" : "$msg sent");
	}
	return($result);
}
Example #17
0
/**
 * Traitement de l'export des donnees auteurs.
 * 
 * @param  string $criteres de selection des auteurs
 * 
 * @return array $retour nbre auteurs exportes et message de confirmation d'action.
 */
function exec_adhauteurs_export()
{
    // Preparation affichage des choix type d'export
    $criteres_tot = _request('criteres');
    $criteres = explode('|', $criteres_tot, 7);
    // Preparation de l'export des criteres (mise en forme dans le fichier out)
    // -- saison --
    if (intval($criteres[2])) {
        $lib_criteres = sql_getfetsel('titre', 'spip_adhsaisons', array('id_saison=' . intval($criteres[2])));
        $export_crit[0] = array('Saison', $lib_criteres);
    } else {
        $export_crit[0] = array('Saison', 'active');
    }
    // -- technique --
    if (intval($criteres[3])) {
        $adhwhere = array("type = 'niveau_Technique'");
        $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[3])));
        $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere);
        $export_crit[1] = array('Techbase', $lib_criteres);
    } else {
        $export_crit[1] = array('Techbase', '<<Tous>>');
    }
    // -- encadrement --
    if (intval($criteres[4])) {
        $adhwhere = array("type='Niveau_Encadrement'");
        $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[4])));
        $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere);
        $export_crit[2] = array('Encadrant', $lib_criteres);
    } else {
        $export_crit[2] = array('Encadrant', '<<Tous>>');
    }
    // -- niveau --
    if (intval($criteres[5])) {
        $lib_criteres = sql_getfetsel('titre', 'spip_adhnivs', array('id_niveau =' . intval($criteres[5])));
        $export_crit[3] = array('Niveau', $criteres[6], $lib_criteres);
    } else {
        $export_crit[3] = array('Niveau', '<<Tous>>');
    }
    $export_crit[4] = array('Champ', $criteres[0], $criteres[1]);
    /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - exec_adhauteurs_export - Pt05 - ";
    	adhclub_log("$debug1.", true);
    	adhclub_log("criteres tot= $criteres_tot.", true);
    	adhclub_log("criteres 0= $criteres[0].", true);
    	adhclub_log("criteres 1= $criteres[1].", true);
    	adhclub_log("criteres 2= $criteres[2].", true);
    	adhclub_log("criteres 3= $criteres[3].", true);
    	adhclub_log("criteres 4= $criteres[4].", true);
    	adhclub_log("criteres 5= $criteres[5].", true);
    	adhclub_log("criteres 6= $criteres[6].", true);
    	adhclub_log("criteres 7= $criteres[7].", true);
    	adhclub_log("FIN $debug1.", true);
    	*/
    $retour = _request('retour');
    $delim = _request('delim');
    if ($delim == 'TAB') {
        $delim = "\t";
    }
    if (!$retour) {
        $retour = generer_url_ecrire('adh_adherents');
    }
    $titre = _T("adhclub:exporter_user_nb", array('nb_auteurs' => $nb_auteurs));
    if (!$delim) {
        $icone = _DIR_PLUGIN_ADHCLUB . "img_pack/adh_export-24.png";
        //
        // Affichage de la page
        //
        $commencer_page = charger_fonction('commencer_page', 'inc');
        pipeline('exec_init', array('args' => $_GET, 'data' => ''));
        echo $commencer_page($titre, "adhclub");
        echo debut_gauche('', true);
        $raccourcis = recuperer_fond("prive/inclure/adh_menu_tous", $contexte);
        echo bloc_des_raccourcis($raccourcis);
        echo pipeline('affiche_gauche', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => ''));
        echo creer_colonne_droite("", true);
        echo pipeline('affiche_droite', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => ''));
        echo debut_droite("", true);
        $milieu = '';
        $milieu .= "<div class='entete-formulaire'>";
        // Icones retour
        if ($retour) {
            $milieu .= icone_verticale(_T('icone_retour'), $retour, $icone, "rien.gif", $GLOBALS['spip_lang_left']);
        }
        $milieu .= gros_titre($titre, '', false);
        $milieu .= "</div>";
        $milieu .= "<div class='formulaire_spip'>";
        $action = generer_url_ecrire("adhauteurs_export", "criteres={$criteres_tot}&retour={$retour}");
        $milieu .= "\n<form action='{$action}' method='post' class='formulaire_editer'><div>" . form_hidden($action);
        $milieu .= "<ul><li><label for='delim'>" . _T("adhclub:export_format") . "</label>";
        $milieu .= "<select name='delim' id='delim'>\n";
        $milieu .= "<option value=','>" . _T("adhclub:export_classique") . "</option>\n";
        $milieu .= "<option value=';'>" . _T("adhclub:export_excel") . "</option>\n";
        $milieu .= "<option value='TAB'>" . _T("adhclub:export_tabulation") . "</option>\n";
        $milieu .= "</select></li></ul>";
        $milieu .= "<p class='boutons'><input type='submit' class='submit' name='ok' value='" . _T('bouton_download') . "' /></p>\n";
        $milieu .= "</div></form>";
        $milieu .= "</div>";
        echo pipeline('affiche_milieu', array('args' => array('exec' => 'adhauteurs_export', 'criteres' => $criteres_tot, 'retour' => $retour), 'data' => $milieu));
        echo fin_gauche(), fin_page();
        exit;
    }
    // Debut de l'export des donnees
    // Recuperation de la requete des adherents suivant filtrage (array de la forme SELECT..)
    $sql_adh_auteurs = adh_recherche($criteres[0], $criteres[1], 'spip_auteurs', $criteres[2], $criteres[3], $criteres[4], $criteres[5], $criteres[6], true);
    if ($sql_adh_auteurs) {
        // JR 20/03/2013 - Definir les colonnes a extraire pour $adh_select
        $adhselect_l = array("au.id_auteur", "au.nom_famille", "au.prenom", "au.sexe", "au.naissance", "au.fonction as licence", "au.mobile", "au.telephone", "au.email", "au.certiflimite as date_certif", "au.certifaspirine as allergie_aspirine", "au.certifqualif as certif_restreint");
        $adhfrom_l = array("spip_auteurs au");
        $adhwhere_l = array("au.id_auteur IN(" . $sql_adh_auteurs . ")");
        // -- Si la saison est explicite,
        //    on recherche les données Cotisations et Assurances associees a chaque auteur
        if (intval($criteres[2])) {
            $adhselect_l = array_merge($adhselect_l, array("co_l.id_coti", "co_l.titre as cotisation", "co_l.mnt_cotis", "as_l.id_assur", "as_l.titre as assurance", "as_l.mnt_assur"));
            $adhfrom_l = array_merge($adhfrom_l, array("spip_adhcotis co_l", "spip_adhcotis_liens ca_l", "spip_adhassurs as_l", "spip_adhassurs_liens aa_l"));
            $adhwhere_l = array_merge($adhwhere_l, array("au.id_auteur=ca_l.id_objet", "ca_l.objet='auteur'", "ca_l.id_coti=co_l.id_coti", "co_l.id_saison=" . intval($criteres[2]), "co_l.complement='non'", "au.id_auteur=aa_l.id_objet", "aa_l.objet='auteur'", "aa_l.id_assur=as_l.id_assur", "as_l.id_saison=" . intval($criteres[2])));
        }
        /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt25 - ";
        		adhclub_log("$debug1.", true);
        		$debug2 = sql_get_select($adhselect_l, $adhfrom_l, sql_in('au.id_auteur', $sql_adh_auteurs));
        		adhclub_log("debug2=$debug2.", true);
        		adhclub_log("adhwhere_l=$adhwhere_l.", true);
        		$debug3 = sql_get_select($adhselect_l, $adhfrom_l, $adhwhere_l);
        		adhclub_log("debug3=$debug3.", true);
        		adhclub_log("FIN $debug1.", true);
        		*/
        if ($export_auteurs = sql_allfetsel($adhselect_l, $adhfrom_l, $adhwhere_l)) {
            foreach ($export_auteurs as $ligne) {
                $list_entete = array();
                $list_valeur = array();
                foreach ($ligne as $k => $v) {
                    /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt35 - ";
                    		adhclub_log("$debug1.", true);
                    		adhclub_log("k= $k , v= $v.", true);
                    		adhclub_log("FIN $debug1.", true);*/
                    $list_entete = array_merge($list_entete, array($k));
                    $list_valeur = array_merge($list_valeur, array($v));
                }
                // Ecriture de l'entete des colonnes.
                if ($nb_auteurs == 0) {
                    // JR-2013/08/01-Mise en forme des criteres en tete du fichier exporte.
                    // JR-25/03/2015-Utilisation des F(spip_bonux) existantes.
                    $output = exporter_csv_ligne(array('CRITERES'), $delim);
                    $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim);
                    $output .= exporter_csv_ligne($export_crit[0], $delim);
                    $output .= exporter_csv_ligne($export_crit[1], $delim);
                    $output .= exporter_csv_ligne($export_crit[2], $delim);
                    $output .= exporter_csv_ligne($export_crit[3], $delim);
                    $output .= exporter_csv_ligne($export_crit[4], $delim);
                    $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim);
                    // JR-20130801-Entetes de colonnes.
                    $output .= exporter_csv_ligne($list_entete, $delim);
                }
                // Ecriture des lignes de donnees.
                $output .= exporter_csv_ligne($list_valeur, $delim);
                ++$nb_auteurs;
            }
            $charset = $GLOBALS['meta']['charset'];
            $file_csv = "export_auteurs_" . date('Ymd_His');
            // @todo-JR-25/03/2015-Utilisation des F(spip_bonux) existantes. Attention remplissage criteres.
            //$filename = inc_exporter_csv($file_csv, ' ', $delim);
            $filename = preg_replace(',[^-_\\w]+,', '_', translitteration(textebrut(typo($file_csv))));
            // Excel ?
            if ($delim == ',') {
                $extension = 'csv';
            } else {
                // Extension 'csv' si delim = ';' (et pas forcément 'xls' !)
                if ($delim == ';') {
                    $extension = 'csv';
                } else {
                    $extension = 'xls';
                }
            }
            # Excel n'accepte pas l'utf-8 ni les entites html... on fait quoi?
            include_spip('inc/charsets');
            $output = unicode2charset(charset2unicode($output), 'iso-8859-1');
            $charset = 'iso-8859-1';
        }
        Header("Content-Type: text/comma-separated-values; charset={$charset}");
        Header("Content-Disposition: attachment; filename={$filename}.{$extension}");
        //Header("Content-Type: text/plain; charset=$charset");
        Header("Content-Length: " . strlen($output));
        echo $output;
        exit;
        //*/
    } else {
        include_spip('inc/minipres');
        echo minipres();
    }
}
Example #18
0
/**
 * complete caracteres manquants dans HTML -> ISO
 * @return la chaine transcrite
 * @param $texte le texte a transcrire
 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
 * @param $is_html flag. Pour ne pas transcrire completement la version html
 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
 * @see http://www.w3.org/TR/html401/sgml/entities.html
 */
function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false)
{
	$texte = charset2unicode($texte);
	
	$texte = unicode2charset($texte, $charset);
	
	if ($is_html) {
		$texte = spiplistes_html_entity_decode ($texte, $charset);
	}
	if($charset != 'utf-8') {
		$texte = spiplistes_iso2ascii ($texte, $is_html);		
	}
	return($texte);
}
Example #19
0
function spipdf_first_clean($texte){

	// supprimer les remarques HTML (du Couteau Suisse ?)
	$texte = preg_replace(',<!-- .* -->,msU', '', $texte);

	$trans = array();
	$trans["<br />\n"] = '<BR>'; // Pour éviter que le \n ne se tranforme en espace dans les <DIV class=spip_code> (TT, tag SPIP : code)

	// gestion d'un encodage latin1
	if (SPIPDF_CHARSET=='ISO-8859-15' || SPIPDF_CHARSET=='iso-8859-15'){
		$trans['&#176;'] = '°';
		$trans['&#339;'] = 'oe';
		$trans['&#8211;'] = '-';
		$trans['&#8216;'] = '\'';
		$trans['&#8217;'] = '\'';
		$trans['&#8220;'] = '"';
		$trans['&#8221;'] = '"';
		$trans['&#8230;'] = '...';
		$trans['&#8364;'] = 'Euros';
		$trans['&ucirc;'] = 'û';
		$trans['->'] = '-»';
		$trans['<-'] = '«-';
		$trans['&mdash;'] = '-';
		$trans['&deg;'] = '°';
		$trans['œ'] = 'oe';
		$trans['Œ'] = 'OE';
		$trans['…'] = '...';
		$trans['&euro;'] = 'Euros';
		$trans['€'] = 'Euros';
		$trans['&copy;'] = '©';
	}
	// pas d'insécable
	$trans['&nbsp;'] = ' ';

	// certains titles font paniquer l'analyse
	// TODO : a peaufiner car ils sont necessaires pour les signets
	// <bookmark title="Compatibilité" level="0" ></bookmark>
	// http://wiki.spipu.net/doku.php?id=html2pdf:fr:v4:bookmark
	//$texte = preg_replace(',title=".*",msU', 'title=""', $texte);

	$texte = strtr($texte, $trans);
	if (SPIPDF_CHARSET=='UTF-8'){
		$texte = charset2unicode($texte);
	} else {
		$texte = unicode2charset(charset2unicode($texte), SPIPDF_CHARSET); // Repasser tout dans le charset demandé
	}

	// Décoder les codes HTML dans le charset final
	$texte = html_entity_decode($texte, ENT_NOQUOTES, SPIPDF_CHARSET);

	return $texte;
}
Example #20
0
/**
 * Envoie le courrier pret au depart
 *
 * Prend dans le panier des courriers a envoyer (spip_courriers) les encours
 * - formate le titre, texte pour l'envoi
 *
 * 
 * les etiquettes sont dans la queue d'envois (spip_auteurs_courriers)
 * - id_auteur (pour reprendre l'adresse mail de id_auteur)
 * - id_courrier (le courrier a dupliquer/envoyer)
 * 
 * la queue (spip_auteurs_courriers) a ete remplie par cron_spiplistes_cron()
 * se sert de la queue pour ventiler les envois par lots

 * le courrier (spip_courriers) doit avoir date <= time() et statut 'encour'
 * si email_test, la meleuse envoie le courrier a email_test, 
 *  supprime email_test du courrier 
 *  et repositionne le statut du courrier en 'redac'
 * si pas email_test mais id_liste, 
 *  regarde la queue d'envois (spip_auteurs_courriers) 
 *  et passe le statut du courrier (spip_courriers) a :
 *		'publie' si type == 'nl' (newsletter)
 *		'auto' si type == 'auto' (liste programmee)
 * 	et envoie les courriers precises aux abonnes de cette liste
 * 	et supprime l'identifiant du courrier dans la queue d'envois (spip_auteurs_courriers)

 * renvoie:
 * - nul, si la tache n'a pas a etre effectuee
 * - positif, si la tache a ete effectuee
 * - negatif, si la tache doit etre poursuivie ou recommencee
 *
 * @package spiplistes
 * @param int $last_time
 * @return int
 */
function spiplistes_meleuse ($last_time) {

	//spiplistes_debug_log('spiplistes_meleuse()');
	
	include_spip('inc/meta');
	include_spip('inc/texte');
	include_spip('inc/filtres');
	include_spip('inc/acces');
	include_spip('inc/spiplistes_api');
	include_spip('inc/spiplistes_api_courrier');
	
	include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php');

	// initialise les options (preferences)
	foreach(array(
		'opt_simuler_envoi'
		, 'opt_suspendre_meleuse'
		, 'opt_lien_en_tete_courrier', 'lien_patron'
		, 'opt_ajout_pied_courrier', 'pied_patron'
		, 'opt_ajout_tampon_editeur'
		, 'opt_personnaliser_courrier'
		, 'opt_log_voir_destinataire'
		, 'opt_ajout_lien_desabo'
		) as $key) {
		$$key = spiplistes_pref_lire($key);
	}
	
	$sql_vide = sql_quote('');
	$nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide);
	
	
	$prefix_log = _SPIPLISTES_PREFIX_LOG;
	
	// si meleuse suspendue, signale en log 
	if($opt_suspendre_meleuse == 'oui') {
		spiplistes_log($prefix_log.'SUSPEND MODE !!!');
		return(0 - $last_time);
	}

	if($nb_etiquettes) {
		
		$eol = "\n";
		$eol2 =$eol.$eol;
		$body_html_debut = '<html>'.$eol2.'<body style="margin:0;padding:0;">'.$eol2;
		$body_html_fin = $eol2.'</body></html>';
		$charset_spip = $GLOBALS['meta']['charset'];
		$charset_dest = $GLOBALS['meta']['spiplistes_charset_envoi'];

		spiplistes_log($prefix_log.$nb_etiquettes.' job(s), distribution...');
		
		$log_voir_destinataire = ($opt_log_voir_destinataire == 'oui');
		$simuler_envoi = ($opt_simuler_envoi == 'oui');
		
		// signale en log si mode simulation
		if($simuler_envoi) {
			spiplistes_log($prefix_log.'SIMULATION MODE !!!');
		}

		// prepare le tampon editeur
		if($opt_ajout_tampon_editeur == 'oui')
		{
			list($tampon_html, $tampon_texte) = spiplistes_tampon_assembler_patron();
		}
		else {
			$tampon_html = $tampon_texte = '';
		}
		
		// prendre la premiere etiquette sur le tas et traiter son courrier
		$sql_courrier_select = array(
			'titre', 'texte', 'message_texte', 'type'
			, 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi'
			);
		if($id_courrier = 
			intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide))
		) {
			$sql_courrier_a_traiter = spiplistes_courriers_casier_premier(
				  $sql_courrier_select
				, 'id_courrier='.sql_quote($id_courrier)
			);
			spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier);
		} else {
			// un vieux bug dans une ancienne version, eradique depuis (j'espere ;-)
			//spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !");
			spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier'
							  , array('s' => $prefix_log))
						   );
		}
		
		// boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur
		while($row = sql_fetch($sql_courrier_a_traiter)) {
		
			foreach($sql_courrier_select as $key) {
				$$key = $row[$key];
			}
			foreach(array('id_courrier','id_liste','total_abonnes') as $key) {
				$$key = intval($$key);
			}
			// objet (subject) ne peut pas être en html ?!
			// sauf pour le webmail (et encore)
			$objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre))));
			$page_html = stripslashes($texte);
			$message_texte = stripslashes($message_texte);
			
			$nb_emails = array();
			
			// compteur pour la session uniquement
			// le total de chaque sera ajoute en fin de session
			$nb_emails_envoyes =
				$nb_emails_echec = 
				$nb_emails_non_envoyes = 
				$nb_emails['texte'] = 
				$nb_emails['html'] = 0
				;
			
			$str_log = 'id_courrier #'.$id_courrier;
			
			//////////////////////////
			// Determiner email de l emetteur
			if($is_a_test = email_valide($email_test)) {
				// courrier a destination adresse email de test
				$str_log .= ' TO: '.$email_test.' (TEST)';
			} 
			else if($id_liste > 0) {
				// courrier a destination des abonnes d'une liste
				$total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);
				$str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)';
	
				$lang = spiplistes_listes_langue($id_liste);

				if($lang != '') {
					$GLOBALS['spip_lang'] = $lang;
				}
				
				$contexte = array('lang' => $lang);
				
				list($pied_html, $pied_texte) = spiplistes_pied_page_assembler_patron($id_liste, $lang);
			}
			else {
				// erreur dans un script d'appel ? Ou url ? Ou base erreur ?
				$str_log .= ' [ERROR] MISSING PARAMS (id_liste AND email_test)';
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR);
				// quitte while() principal
				break;
			}
			
			//////////////////////////////
			// email emetteur
			$email_envoi = spiplistes_listes_email_emetteur($id_liste);
			if(!$is_a_test && !($email_envoi)) { 
				$str_log .= ' [ERROR] ID_LISTE #'.$id_liste.' or from email MISSING'; 
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR);
				// quitte while() principal
				break;
			}
			$from = $email_envoi;
			if($from_valide = email_valide($from)) {
				if(strpos($from, '<') === false) {
					$fromname = spiplistes_nom_site_texte ($lang);
					$fromname = extraire_multi($GLOBALS['meta']['nom_site']);
					if ($charset_dest!=$charset_spip)
					{
						include_spip('inc/charsets');
						$fromname = unicode2charset(charset2unicode($fromname),$charset_dest);
					}
				}
			}
			else {
				spiplistes_log('[ERROR] from address incorrect: '.$from);
				if($is_a_test) {
					spiplistes_courriers_statut_redac ($id_courrier);
				}
				// break; // garder pour incrementer les erreurs des listes
			}
			
			$email_reply_to = spiplistes_pref_lire_defaut('email_reply_to', $from);
			
			$return_path = spiplistes_pref_lire_defaut('email_return_path_defaut', $from);
			
			////////////////////////////////////
			// Prepare la version texte
			$objet_texte = $titre;
			$page_texte = ($message_texte !='')
				? $message_texte
				: spiplistes_courrier_version_texte($page_html)
				;
			
			////////////////////////////////////
			// Ajoute lien tete de courrier
			if(
				($opt_lien_en_tete_courrier == 'oui') 
				&& !empty($lien_patron)
			) {
				list($lien_html, $lien_texte) = spiplistes_courriers_assembler_patron (
					_SPIPLISTES_PATRONS_TETE_DIR . $lien_patron
					, array('id_courrier' => $id_courrier
							, 'lang' => $lang)
					);
				$page_html = $lien_html . $page_html;
				$page_texte = $lien_texte . $page_texte;
			}

			////////////////////////////////////
			// La petite ligne du renvoi du cookie pour modifier son abonnement
			//$pied_rappel_html = _T('spiplistes:modif_abonnement_html');
			//$pied_rappel_texte = _T('spiplistes:modif_abonnement_text');
			
			// transcrire le contenu
			if($charset_dest != $charset_spip){
				include_spip('inc/charsets');
				foreach(array(
					  'objet_html', 'objet_texte'
					, 'page_html', 'page_texte'
					, 'pied_html', 'pied_texte'
					//, 'pied_rappel_html', 'pied_rappel_texte'
					, 'tampon_html', 'tampon_texte') as $key) 
				{
					if(!empty($$key)) {
						$$key = spiplistes_translate_2_charset(
							$$key
							, $charset_dest
							, (strpos($key, 'texte') === false)
							);
					}
				}
			}
			
			// corrige les liens relatifs (celui de texte a deja ete corrige par la trieuse (cron)
			foreach(array('pied_html', 'pied_texte'
				//, 'pied_rappel_html', 'pied_rappel_texte'
				, 'tampon_html', 'tampon_texte') as $key) {
				if(!empty($$key)) {
					$$key = spiplistes_liens_absolus ($$key);
				}
			}
			
			$email_a_envoyer = array();
			$email_a_envoyer['texte'] = new phpMail('', $objet_texte, ''
													, $page_texte, $charset_dest);
			$email_a_envoyer['texte']->From = $from ; 
			if($fromname) $email_a_envoyer['texte']->FromName = $fromname ;
			// Errors-To:,    Non-standard @see: http://www.ietf.org/rfc/rfc2076.txt
			//$email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); 
			$email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$email_reply_to); 
			$email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); 
			$email_a_envoyer['texte']->SMTPKeepAlive = true;

			//$email_a_envoyer['html'] = new phpMail('', $objet_html, $page_html, $page_texte, $charset_dest);
			$email_a_envoyer['html'] = new phpMail(''
												   , $objet_html
												   , $page_html
												   , $page_texte
												   , $charset_dest
												   );
			$email_a_envoyer['html']->From = $from ; 
			if($fromname) {
				$email_a_envoyer['html']->FromName = $fromname ;
			}
			//$email_a_envoyer['html']->AddCustomHeader('Errors-To: '.$return_path); 
			$email_a_envoyer['html']->AddCustomHeader('Reply-To: '.$email_reply_to); 
			$email_a_envoyer['html']->AddCustomHeader('Return-Path: '.$return_path); 	
			$email_a_envoyer['html']->SMTPKeepAlive = true;
		
			$str_log .= ' REPLY-TO: '.$email_reply_to.' RETURN-PATH: '.$return_path;
			
			if($total_abonnes) {
		
				$limit = intval($GLOBALS['meta']['spiplistes_lots']); // nombre de messages envoyes par boucles.	
				
				if($is_a_test) {
					$sql_adresses_dest = sql_select('id_auteur,nom,email', 'spip_auteurs'
						, 'email='.sql_quote($email_test).' LIMIT 1');
				}
				else {
					// Pour memo: les etiquettes sont creees par la trieuse
					// ou directement en backoffice 
					// - pour les envois de test
					// - pour les envoyer maintenant des courriers
					
					// Traitement d'une liasse d'etiquettes
					// un id pour ce processus (le tampon est unique par liasse)
					$id_process = intval(substr(creer_uniqid(),0,5));
					$prefix_log .= '['.$id_process.'] ';
			
					// un coup de tampon sur les etiquettes 
					// des courriers qui vont partir
					spiplistes_courriers_en_queue_modifier(
						array(
							  'etat' => sql_quote($id_process))
							, 'etat='.$sql_vide.' AND id_courrier='.sql_quote($id_courrier).' LIMIT '.$limit
					);
					
					// prendre la liasse des etiquettes tamponnees
					$sql_adresses_dest = sql_select(
						  array('a.nom', 'a.id_auteur', 'a.email')
						, array('spip_auteurs AS a', 'spip_auteurs_courriers AS b')
						, array(
							'etat='.sql_quote($id_process)
							, 'a.id_auteur=b.id_auteur'
							, 'b.id_courrier='.sql_quote($id_courrier)
							)
						, 'a.email'
					);
				}
					
				$nb_destinataires = sql_count($sql_adresses_dest);
				spiplistes_log($prefix_log.'nb etiquettes a traiter: '.$nb_destinataires);
				if($nb_destinataires > 0) {

					spiplistes_debug_log($prefix_log.'total_abos: '.$total_abonnes.', en cours: '.$nb_destinataires.', limit: '.$limit);

/*
// CP:20100215: inutile de compter AVANT
// si process en //, le chiffre est faux
					// replacer les compteurs
					if($row = sql_fetch(sql_select(
						"nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html"
						, 'spip_courriers'
						, 'id_courrier='.sql_quote($id_courrier)
						, '', '', 1
						))
					) {
						$nb_emails_envoyes = intval($row['nb_emails_envoyes']);
						$nb_emails_echec = intval($row['nb_emails_echec']);
						$nb_emails_non_envoyes = intval($row['nb_emails_non_envoyes']);
						$nb_emails['texte'] = intval($row['nb_emails_texte']);
						$nb_emails['html'] = intval($row['nb_emails_html']);
					}
*/

					//envoyer le lot d'emails selectionne' (la liasse)
					while($adresse = sql_fetch($sql_adresses_dest)) {

						if($log_voir_destinataire) {
							$str_temp = '';
						}

						$id_auteur = intval($adresse['id_auteur']);
						$nom_auteur = $adresse['nom'];
						$email = $adresse['email'];

						// Marquer le debut de l'envoi
						if(!intval($date_debut_envoi)) {
							spiplistes_courrier_modifier ($id_courrier, array('date_debut_envoi' => 'NOW()'), false);
						}
				
						$format_abo = spiplistes_format_abo_demande($id_auteur);

						$total++;
						if($log_voir_destinataire) {
							$str_temp .= $nom_auteur.'('.$format_abo.') - '.$email;
						}
						unset ($cookie);
		
						if(($format_abo=='html') || ($format_abo=='texte')) {
							$cookie = creer_uniqid();
							spiplistes_auteurs_cookie_oubli_updateq($cookie, $email);
		
							if($from_valide) {
								//$_url = generer_url_public('abonnement','d='.$cookie);
								
								if($opt_personnaliser_courrier == 'oui') {
									list($ventre_html, $ventre_texte) = spiplistes_personnaliser_courrier(
																			$page_html
																			, $page_texte
																			, $id_auteur
																			, $format_abo
																		);
								}
								else {
									$ventre_html = $page_html;
									$ventre_texte = $page_texte;
								}
								// le &amp; semble poser probleme sur certains MUA. A suivre...
								//$_url = preg_replace(',(&amp;),','&', $_url);
								
								// Pour le moment (27/03/2011), un seul patron connu
								$lien_rappel = 'lien_standard';
								
								list($pied_rappel_html, $pied_rappel_texte) = spiplistes_courriers_assembler_patron (
									_SPIPLISTES_PATRONS_LIEN_DIR . $lien_rappel
									, array('id_courrier' => $id_courrier
											, 'id_liste' => $id_liste
											, '_url' => generer_url_public()
											, 'lang' => $lang
											, 'd' => $cookie
											, 'lien_desabo' => ($opt_ajout_lien_desabo == 'oui')
											)
								);
								$pied_rappel_texte = spiplistes_translate_2_charset ($pied_rappel_texte
																					 , $charset_dest
																					 , true);
								
								switch($format_abo) {
									case 'html':
										// Si on ne trouve pas les tags HTML alors on les ajoutes
										if (FALSE === strpos($ventre_html, '</html>')) {
											$email_a_envoyer[$format_abo]->Body =
												  $body_html_debut . $eol
												. $ventre_html . $eol
												. $pied_html . $eol
												. $pied_rappel_html . $eol
												. $tampon_html . $eol
												. $body_html_fin
												;										
										} else {
											// Si on trouve les tags HTML cela veut dire que l'auteur
											// veut pouvoir gerer lui meme la partie <head> ainsi que le lien de desabonnement
											// donc on ne prend en compte que la partie ventre_html.
											$tags_perso = array('http://%URL_ABONNEMENT%' => generer_url_public('abonnement','d='.$cookie),);
											$email_a_envoyer[$format_abo]->Body = str_replace(array_keys($tags_perso), array_values($tags_perso), $ventre_html);
										}
										// la version alternative texte 
										$email_a_envoyer[$format_abo]->AltBody = 
											$ventre_texte .$eol2
											. $pied_texte . $eol2
											. $pied_rappel_texte . $eol2
											. $tampon_texte
											;
										break;
									case 'texte':
										$email_a_envoyer[$format_abo]->Body =
											$ventre_texte .$eol2
											. $pied_texte . $eol2
											. $pied_rappel_texte . $eol2
											. $tampon_texte
											;
										break;
								}

								$email_a_envoyer[$format_abo]->SetAddress($email, $nom_auteur);
								// envoie le mail																
								if($simuler_envoi || $email_a_envoyer[$format_abo]->send()) {
									$nb_emails_envoyes++;
									$nb_emails[$format_abo]++;
									if($log_voir_destinataire) {
										$str_temp .= '  [OK]';
									}
								}
								else {
									$nb_emails_echec++;
									if($log_voir_destinataire) {
										$str_temp .= _T('spiplistes:erreur_mail');
									}
								}
							}
							else {
								$nb_emails_echec++;
								if($log_voir_destinataire) {
									$str_temp .= _T('spiplistes:sans_adresse');
								}
							} 
							
						} // end if(($format_abo=='html') || ($format_abo=='texte'))
						else {  
							$nb_emails_non_envoyes++; 
							if($log_voir_destinataire) {
								$str_temp .= ' '._T('spiplistes:msg_abonne_sans_format');
							}
							// prevenir qu'il manque le format
							spiplistes_log($prefix_log.' destination format MISSING FOR ID_AUTEUR #'.$id_auteur);
						} /* fin abo*/
						
						if($log_voir_destinataire) {
							spiplistes_log($prefix_log.$str_temp);
						}
						
					} // fin while
					
					// supprime la liasse de la queue d'envois
					spiplistes_debug_log($prefix_log."envoi OK. Supprimer queue $id_process");
					spiplistes_courriers_en_queue_supprimer('etat='.sql_quote($id_process));
					
					// si c'est un test on repasse le courrier en redac
					if($is_a_test) {
						spiplistes_courriers_statut_redac ($id_courrier);
					}
					$email_a_envoyer['texte']->SmtpClose();
					$email_a_envoyer['html']->SmtpClose();
				} // end if 
			}
			else {
				//aucun destinataire connu pour ce message
				spiplistes_debug_log($prefix_log._T('spiplistes:erreur_sans_destinataire')
									 . '---' . _T('spiplistes:envoi_annule')
									 );
				spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_IGNORE);
				spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier);
				$str_log .= ' END #'.$id_courrier;
				// 
				break;
			}

			if(!$is_a_test) {
				// faire le bilan apres l'envoi d'un lot
				$sql_set_array = array(
					  'nb_emails_envoyes' => sql_quote('nb_emails_envoyes').'+'.$nb_emails_envoyes
					, 'nb_emails_texte' => sql_quote('nb_emails_texte').'+'.$nb_emails['texte']
					, 'nb_emails_html' => sql_quote('nb_emails_html').'+'.$nb_emails['html']
				);
				if($nb_emails_echec) {
					$sql_set_array['nb_emails_echec'] = sql_quote('nb_emails_echec').'+'.$nb_emails_echec;
				}
				if($nb_emails_non_envoyes) {
					$sql_set_array['nb_emails_non_envoyes'] = sql_quote('nb_emails_non_envoyes').'+'.$nb_emails_non_envoyes;
				}

				spiplistes_log($prefix_log.$str_log);
				
				$str_log = spiplistes_trace_compteur ($id_courrier
												   , $nb_emails_envoyes
												   , $nb_emails['html']
												   , $nb_emails['texte']
												   , $nb_emails_non_envoyes
												   , $nb_emails_echec
												   , 'SESSION');

				// si courrier pas termine, redemande la main au CRON, sinon nettoyage.
				if($t = spiplistes_courriers_en_queue_compter('id_courrier='.sql_quote($id_courrier))) {
					$str_log .= ' LEFT '.$t.' jobs'; 
				}
				else {
					$statut = ($type == _SPIPLISTES_COURRIER_TYPE_NEWSLETTER) ? _SPIPLISTES_COURRIER_STATUT_PUBLIE : _SPIPLISTES_COURRIER_STATUT_AUTO;
					spiplistes_debug_log($prefix_log."nouveau statut $statut");
					$sql_set_array['statut'] = sql_quote($statut);
					$sql_set_array['date_fin_envoi'] = 'NOW()';
					$str_log .= ' END #'.$id_courrier;
				}
				spiplistes_courrier_modifier($id_courrier, $sql_set_array, false);
				
				// placer en log le suivi des compteurs si mode debug
				if (spiplistes_debug_log())
				{					
					if ($row = sql_fetch(sql_select(
						'nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html'
						, 'spip_courriers'
						, 'id_courrier='.sql_quote($id_courrier)
						, '', '', 1
						))
					) {
						spiplistes_log($prefix_log.$str_log);
						
						$str_log = spiplistes_trace_compteur ($id_courrier
												   , $row['nb_emails_envoyes']
												   , $row['nb_emails_html']
												   , $row['nb_emails_texte']
												   , $row['nb_emails_non_envoyes']
												   , $row['nb_emails_echec']
												   , 'FROM_DB')
												. ' END #'.$id_courrier;
												;
					}
				}
				
			}
		} // end while()
	} // end if($nb_etiquettes)
	else {
		$str_log = 'no job'; 
	}

	spiplistes_log($prefix_log.$str_log);

	if(($ii = spiplistes_courriers_total_abonnes()) > 0) {
		// il en reste apres la meleuse ? Signale au CRON tache non terminee
		$nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide);
		spiplistes_log($prefix_log.'courriers prets au depart ('.$nb_etiquettes.'/'.$ii.')');
		$last_time = -$last_time;
	}
	
	return($last_time);
} // end spiplistes_meleuse()
Example #21
0
function convert_extra($v, $charset_source) {
	if ($extra = @unserialize($v)) {
		foreach ($extra as $key=>$val)
			$extra[$key] = unicode_to_utf_8(
			charset2unicode($val, $charset_source));
		return ", extra=".sql_quote(serialize($extra));
	}
}
Example #22
0
function glossaire_gogogo($texte, $mots, $limit, &$unicode) {
	// prudence 2 : on protege TOUTES les balises HTML comprenant le mot
	if (strpos($texte, '<')!==false)
		$texte = preg_replace_callback(",<[^>]*(?:$mots)[^>]*>,Ui", 'glossaire_echappe_balises_callback', $texte);
	// prudence 3 : en iso-8859-1, (\W) comprend les accents, mais pas en utf-8... Donc on passe en unicode
	if(($GLOBALS['meta']['charset'] != 'iso-8859-1') && !$unicode) 
		{ $texte = charset2unicode($texte); $unicode = true; }
	// prudence 4 : on neutralise le mot si on trouve un accent (HTML ou unicode) juste avant ou apres
	if (strpos($texte, '&')!==false) {
		$texte = preg_replace_callback(',&(?:'._GLOSSAIRE_ACCENTS.");(?:$mots),i", 'glossaire_echappe_balises_callback', $texte);
		$texte = preg_replace_callback(",(?:$mots)&(?:"._GLOSSAIRE_ACCENTS.');,i', 'glossaire_echappe_balises_callback', $texte);
	}
	// a chaque mot reconnu, on pose une balise temporaire cryptee
	return trim(preg_replace_callback(",(?<=\W)(?:$mots)(?=\W),i", "glossaire_echappe_mot_callback", " $texte ", $limit));
}
Example #23
0
function traiter_raccourci_glossaire($texte)
{
	if (!preg_match_all(_RACCOURCI_GLOSSAIRE,
	$texte, $matches, PREG_SET_ORDER))
		return $texte;

	include_spip('inc/charsets');
	$lien = charger_fonction('lien', 'inc');

	foreach ($matches as $regs) {
	// Eviter les cas particulier genre "[?!?]"
	// et isoler le lexeme a gloser de ses accessoires
	// (#:url du glossaire, | bulle d'aide, {} hreflang)
	// Transformation en pseudo-raccourci pour passer dans inc_lien
		if (preg_match(_RACCOURCI_GLOSES, $regs[1], $r)) {
			preg_match('/^(.*?)(\d*)$/', $r[4], $m);
			$_n = intval($m[2]);
			$gloss = $m[1] ? ('#' . $m[1]) : '';
			$t = $r[1] . $r[2] . $r[5];
			list($t, $bulle, $hlang) = traiter_raccourci_lien_atts($t);
			if ($bulle===false) $bulle = $m[1];
			$t = unicode2charset(charset2unicode($t), 'utf-8');
			$ref = $lien("glose$_n$gloss", $t, 'spip_glossaire', $bulle, $hlang);
			$texte = str_replace($regs[0], $ref, $texte);
		}
	}
	return $texte;
}
Example #24
0
function translitteration($texte, $charset='AUTO', $complexe='') {
	// 0. Supprimer les caracteres illegaux
	include_spip('inc/filtres');
	$texte = corriger_caracteres($texte);

	// 1. Passer le charset et les &eacute en utf-8
	$texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true)));

	return translitteration_rapide($texte,$charset,$complexe);
}
Example #25
0
/**
 * Afficher de facon textuelle les dates de debut et fin en fonction des cas
 * - Le lundi 20 fevrier a 18h
 * - Le 20 fevrier de 18h a 20h
 * - Du 20 au 23 fevrier
 * - du 20 fevrier au 30 mars
 * - du 20 fevrier 2007 au 30 mars 2008
 * $horaire='oui' permet d'afficher l'horaire, toute autre valeur n'indique que le jour
 * $forme peut contenir abbr (afficher le nom des jours en abbrege) et ou hcal (generer une date au format hcal)
 * 
 * @param string $date_debut
 * @param string $date_fin
 * @param string $horaire
 * @param string $forme
 * @return string
 */
function agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = '')
{
    $abbr = '';
    if (strpos($forme, 'abbr') !== false) {
        $abbr = 'abbr';
    }
    $affdate = "affdate_jourcourt";
    if (strpos($forme, 'annee') !== false) {
        $affdate = 'affdate';
    }
    $dtstart = $dtend = $dtabbr = "";
    if (strpos($forme, 'hcal') !== false) {
        $dtstart = "<abbr class='dtstart' title='" . date_iso($date_debut) . "'>";
        $dtend = "<abbr class='dtend' title='" . date_iso($date_fin) . "'>";
        $dtabbr = "</abbr>";
    }
    $date_debut = strtotime($date_debut);
    $date_fin = strtotime($date_fin);
    $d = date("Y-m-d", $date_debut);
    $f = date("Y-m-d", $date_fin);
    $h = $horaire == 'oui';
    $hd = date("H:i", $date_debut);
    $hf = date("H:i", $date_fin);
    $au = " " . strtolower(_T('agenda:evenement_date_au'));
    $du = _T('agenda:evenement_date_du') . " ";
    $s = "";
    if ($d == $f) {
        // meme jour
        $s = ucfirst(nom_jour($d, $abbr)) . " " . $affdate($d);
        if ($h) {
            $s .= " {$hd}";
        }
        $s = "{$dtstart}{$s}{$dtabbr}";
        if ($h and $hd != $hf) {
            $s .= "-{$dtend}{$hf}{$dtabbr}";
        }
    } else {
        if (date("Y-m", $date_debut) == date("Y-m", $date_fin)) {
            // meme annee et mois, jours differents
            if ($h) {
                $s = $du . $dtstart . affdate_jourcourt($d) . " {$hd}" . $dtabbr;
                $s .= $au . $dtend . $affdate($f);
                if ($hd != $hf) {
                    $s .= " {$hf}";
                }
                $s .= $dtabbr;
            } else {
                $s = $du . $dtstart . jour($d) . $dtabbr;
                $s .= $au . $dtend . $affdate($f) . $dtabbr;
            }
        } else {
            if (date("Y", $date_debut) == date("Y", $date_fin)) {
                // meme annee, mois et jours differents
                $s = $du . $dtstart . affdate_jourcourt($d);
                if ($h) {
                    $s .= " {$hd}";
                }
                $s .= $dtabbr . $au . $dtend . $affdate($f);
                if ($h) {
                    $s .= " {$hf}";
                }
                $s .= $dtabbr;
            } else {
                // tout different
                $s = $du . $dtstart . affdate($d);
                if ($h) {
                    $s .= " " . date("(H:i)", $date_debut);
                }
                $s .= $dtabbr . $au . $dtend . affdate($f);
                if ($h) {
                    $s .= " " . date("(H:i)", $date_fin);
                }
                $s .= $dtabbr;
            }
        }
    }
    return unicode2charset(charset2unicode($s, 'AUTO'));
}
Example #26
0
function spiplistes_preparer_message ($objet, $patron, $contexte) {
	
	// si pas encore abonne' ou desabonne', pas de format ! donc forcer a texte
	$format = ($contexte['format'] == 'html') ? $contexte['format'] : ($contexte['format'] = 'texte');

	$contexte['patron'] = $patron;
	$path_patron = _SPIPLISTES_PATRONS_MESSAGES_DIR . $patron;
	
	list($message_html, $message_texte) = spiplistes_assembler_patron($path_patron, $contexte);

	$charset = $GLOBALS['meta']['spiplistes_charset_envoi'];
	
	if($charset != $GLOBALS['meta']['charset'])
	{
		include_spip('inc/charsets');
		if($format == 'html') {
			$message_html = unicode2charset(charset2unicode($message_html), $charset);
		}
		//$message_texte = unicode2charset(charset2unicode($message_texte), $charset);
		$message_texte = spiplistes_translate_2_charset ($message_texte, $charset);
	}
	$email_a_envoyer = array();
	$email_a_envoyer['texte'] = new phpMail('', $objet, '', $message_texte, $charset);
	if($format == 'html') {
		$email_a_envoyer['html'] = new phpMail('', $objet, $message_html, $message_texte, $charset);
		$email_a_envoyer['html']->Body = "<html>\n\n<body>\n\n" . $message_html	. "\n\n</body></html>";
		$email_a_envoyer['html']->AltBody = $message_texte;
	}
	$email_a_envoyer['texte']->Body = $message_texte ."\n\n";
	$email_a_envoyer[$format]->SetAddress($contexte['email'], $contexte['nom']);
	
	return($email_a_envoyer);
}
Example #27
0
function filtrer_ical($texte)
{
    include_lcm('inc_charsets');
    $texte = html2unicode($texte);
    $texte = unicode2charset(charset2unicode($texte, read_meta('charset'), 1), 'utf-8');
    $texte = preg_replace("/\n/", " ", $texte);
    $texte = preg_replace("/,/", "\\,", $texte);
    return $texte;
}
Example #28
0
	/**
	 * @param $email
	 * @param $objet
	 * @param $message_html
	 * @param $message_texte
	 * @param array $options
	 *
	 */
	public function __construct($email, $objet, $message_html, $message_texte, $options = array()) {
		// On récupère toutes les options par défaut depuis le formulaire de config
		$defaut = array();
		foreach (array(
			'adresse_envoi', 'adresse_envoi_email', 'adresse_envoi_nom', 'forcer_from',
			'cc', 'bcc',
			'smtp', 'smtp_host', 'smtp_port', 'smtp_auth',
			'smtp_username', 'smtp_password', 'smtp_secure', 'smtp_sender',
			'filtre_images', 'filtre_iso_8859',
		) as $config) {
			$defaut[$config] = isset($GLOBALS['meta']["facteur_$config"]) ? $GLOBALS['meta']["facteur_$config"] : '';
		}
		// On fusionne les options avec d'éventuelles surcharges lors de l'appel
		$options = array_merge($defaut, $options);

		// par defaut on log rien car tres verbeux
		// on utilise facteur_log_debug qui filtre log SPIP en _LOG_DEBUG
		$this->SMTPDebug = 0;
		$this->Debugoutput = "facteur_log_debug";
		// Il est possible d'avoir beaucoup plus de logs avec 2, 3 ou 4, ce qui logs les échanges complets avec le serveur
		// utiliser avec un define('_MAX_LOG',1000); car sinon on est limite a 100 lignes par hit et phpMailer est tres verbeux
		if (defined('_FACTEUR_DEBUG_SMTP')) {
			$this->SMTPDebug = _FACTEUR_DEBUG_SMTP ;
		}
		$this->exceptions = false;


		if (
			$options['adresse_envoi'] == 'oui'
			and $options['adresse_envoi_email']
		) {
			$this->From = $options['adresse_envoi_email'];
		}
		else {
			$this->From = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"]) ?
				$GLOBALS['meta']["email_envoi"]
				: $GLOBALS['meta']['email_webmaster'];
		}

		// Si plusieurs emails dans le from, pas de Name !
		if (strpos($this->From,",") === false) {
			if (
				$options['adresse_envoi'] == 'oui'
				and $options['adresse_envoi_nom']
			) {
				$this->FromName = $options['adresse_envoi_nom'];
			}
			// Par défaut, l'envoyeur est le nom du site
			else {
				$this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site']));
			}
		}

		// si forcer_from, on sauvegarde le From et FromName par defaut, qui seront utilises
		// si From n'est pas dans le meme domaine
		// (utiliser le facteur avec un service externe qui necessite la validation des domaines d'envoi)
		if ($options['forcer_from']=='oui'){
			$this->ForceFrom = $this->From;
			$this->ForceFromName = $this->FromName;
		}

		$this->CharSet = "utf-8";
		$this->Mailer = 'mail';
		$this->Subject = unicode_to_utf_8(charset2unicode($objet,$GLOBALS['meta']['charset']));

		//Pour un envoi multiple de mail, $email doit être un tableau avec les adresses.
		if (is_array($email)) {
			foreach ($email as $cle => $adresseMail) {
				if (!$this->AddAddress($adresseMail)) {
					spip_log("Erreur AddAddress $adresseMail : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR);
				}
			}
		}
		elseif (!$this->AddAddress($email)) {
			spip_log("Erreur AddAddress $email : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR);
		}

		// Retour des erreurs
		if (!empty($options['smtp_sender'])) {
			$this->Sender = $options['smtp_sender'];
			$this->AddCustomHeader("Errors-To: ".$this->Sender);
		}

		// Destinataires en copie, seulement s'il n'y a pas de destinataire de test
		if (!defined('_TEST_EMAIL_DEST')){
			if (!empty($options['cc'])) {
				$this->AddCC($options['cc']);
			}
			if (!empty($options['bcc'])) {
				$this->AddBCC($options['bcc']);
			}
		}

		// Si on envoie avec un SMTP explicite
		if (isset($options['smtp']) AND $options['smtp'] == 'oui') {
			$this->Mailer	= 'smtp';
			$this->Host 	= $options['smtp_host'];
			$this->Port 	= $options['smtp_port'];

			// SMTP authentifié
			if ($options['smtp_auth'] == 'oui') {
				$this->SMTPAuth = true;
				$this->Username = $options['smtp_username'];
				$this->Password = $options['smtp_password'];
			}
			else {
				$this->SMTPAuth = false;
			}

			if ($options['smtp_secure'] == 'ssl') {
				$this->SMTPSecure = 'ssl';
			}
			if ($options['smtp_secure'] == 'tls') {
				$this->SMTPSecure = 'tls';
			}

			// Pour le moment on remet l'ancien fonctionnement :
			// on ne doit pas tester les certificats si pas demandé explicitement avec l'option TLS !
			$this->SMTPAutoTLS = false;
		}

		// S'il y a un contenu HTML
		if (!empty($message_html)) {
			$message_html = unicode_to_utf_8(charset2unicode($message_html, $GLOBALS['meta']['charset']));

			$this->Body = $message_html;
			$this->IsHTML(true);
			if ($options['filtre_images']) {
				$this->JoindreImagesHTML();
			}

			$this->UrlsAbsolues();
		}

		// S'il y a un contenu texte brut
		if (!empty($message_texte)) {
			$message_texte = unicode_to_utf_8(charset2unicode($message_texte, $GLOBALS['meta']['charset']));

			// Si pas de HTML on le remplace en tant que contenu principal
			if (!$this->Body) {
				$this->IsHTML(false);
				$this->Body = $message_texte;
			}
			// Sinon on met le texte brut en contenu alternatif
			else {
				$this->AltBody = $message_texte;
			}
		}

		if ($options['filtre_iso_8859']) {
			$this->ConvertirUtf8VersIso8859();
		}
	}
Example #29
0
/**
 * Afficher de facon textuelle les dates de debut et fin en fonction des cas
 * - Le lundi 20 fevrier a 18h
 * - Le 20 fevrier de 18h a 20h
 * - Du 20 au 23 fevrier
 * - du 20 fevrier au 30 mars
 * - du 20 fevrier 2007 au 30 mars 2008
 * $horaire='oui' permet d'afficher l'horaire, toute autre valeur n'indique que le jour
 * $forme peut contenir abbr (afficher le nom des jours en abbrege) et ou hcal (generer une date au format hcal)
 * 
 * @param string $date_debut
 * @param string $date_fin
 * @param string $horaire
 * @param string $forme
 * @return string
 */
function agenda_affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
	static $trans_tbl=NULL;
	if ($trans_tbl==NULL){
		$trans_tbl = get_html_translation_table (HTML_ENTITIES);
		$trans_tbl = array_flip ($trans_tbl);
	}
	
	$abbr = '';
	if (strpos($forme,'abbr')!==false) $abbr = 'abbr';
	$affdate = "affdate_jourcourt";
	if (strpos($forme,'annee')!==false) $affdate = 'affdate';
	
	$dtstart = $dtend = $dtabbr = "";
	if (strpos($forme,'hcal')!==false) {
		$dtstart = "<abbr class='dtstart' title='".date_iso($date_debut)."'>";
		$dtend = "<abbr class='dtend' title='".date_iso($date_fin)."'>";
		$dtabbr = "</abbr>";
	}
	
	$date_debut = strtotime($date_debut);
	$date_fin = strtotime($date_fin);
	$d = date("Y-m-d", $date_debut);
	$f = date("Y-m-d", $date_fin);
	$h = $horaire=='oui';
	$hd = date("H:i",$date_debut);
	$hf = date("H:i",$date_fin);
	$au = " " . strtolower(_T('agenda:evenement_date_au'));
	$du = _T('agenda:evenement_date_du') . " ";
	$s = "";
	if ($d==$f)
	{ // meme jour
		$s = ucfirst(nom_jour($d,$abbr))." ".$affdate($d);
		if ($h)
			$s .= " $hd";
		$s = "$dtstart$s$dtabbr";
		if ($h AND $hd!=$hf) $s .= "-$dtend$hf$dtabbr";
	}
	else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin))
	{ // meme annee et mois, jours differents
		if ($h){
			$s = $du . $dtstart . affdate_jourcourt($d) . " $hd" . $dtabbr;
			$s .= $au . $dtend . $affdate($f);
			if ($hd!=$hf) $s .= " $hf";
			$s .= $dtabbr;
		}
		else {
			$s = $du . $dtstart . jour($d) . $dtabbr;
			$s .= $au . $dtend . $affdate($f) . $dtabbr;
		}
	}
	else if ((date("Y",$date_debut))==date("Y",$date_fin))
	{ // meme annee, mois et jours differents
		$s = $du . $dtstart . affdate_jourcourt($d);
		if ($h) $s .= " $hd";
		$s .= $dtabbr . $au . $dtend . $affdate($f);
		if ($h) $s .= " $hf";
		$s .= $dtabbr;
	}
	else
	{ // tout different
		$s = $du . $dtstart . affdate($d);
		if ($h)
			$s .= " ".date("(H:i)",$date_debut);
		$s .= $dtabbr . $au . $dtend. affdate($f);
		if ($h)
			$s .= " ".date("(H:i)",$date_fin);
		$s .= $dtabbr;
	}
	return unicode2charset(charset2unicode(strtr($s,$trans_tbl),''));	
}
/**
 * Synchroniser les utilisateurs Galette vers Spip.
 * 
 * @param  boolean $forcer Forcer la synchronisation.
 * @return int     Retourne en cas de réussite le nombre de fiches mis à jour ;
 *  _ 0 lorsqu'une erreur inconnue est survenue ;
 *  _ -1 si la synchronisation a échouée ;
 *  _ -2 lorsque des erreurs sont survenues lors de la connexion à la BDD ;
 *  _ -10 si la synchronisation est inutile.
 **/
function galettonuts_synchroniser($forcer = false)
{
    // Lecture de la configuration
    if (!class_exists('L2_Spip_Plugin_Metas')) {
        include_spip('lib/L2/Spip/Plugin/Metas.class');
    }
    $config = new L2_Spip_Plugin_Metas('galettonuts_config');
    // Connexion à la base Galette
    $link = galettonuts_galette_db($config->lire('adresse_db'), $config->lire('login_db'), $config->lire('pass_db'), $config->lire('choix_db'));
    if (!$link) {
        spip_log('cron: Galettonuts, echec de connexion a la bdd de galette');
        return -2;
    }
    $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro');
    // La synchronisation est inutile.
    if (!$forcer && !is_null($synchro->lire('maj')) && galettonuts_a_jour($synchro->lire('maj'), $config->lire('prefix_db'), $link)) {
        return -10;
    } else {
        // Compteur d'utilisateurs traités
        $compteur = 0;
        // Tableau associatif zones/auteurs
        $ids = array();
        $maintenant = time();
        // Récupération des adhérents Galette
        $req = "SELECT `id_adh` AS `id`, `nom_adh` AS `nom`, `prenom_adh` AS `prenom`, `activite_adh` AS `actif`, " . "`login_adh` AS `login`, `mdp_adh` AS `pass`, `email_adh` AS `email` " . "FROM `" . $config->lire('prefix_db') . "adherents` WHERE 1;";
        $res = @mysql_query($req, $link);
        // Pour chaque adhérent de galette
        while ($adh = @mysql_fetch_assoc($res)) {
            include_spip('inc/acces');
            include_spip('inc/charsets');
            // Formatage des informations de l'auteur à destination de Spip
            $login = unicode2charset(charset2unicode($adh['login'], 'iso-8859-15', 'forcer'));
            $email = unicode2charset(charset2unicode($adh['email'], 'iso-8859-15', 'forcer'));
            $nom = unicode2charset(charset2unicode(ucfirst($adh['prenom']) . ' ' . ucfirst($adh['nom']), 'iso-8859-15', 'forcer'));
            $alea_actuel = creer_uniqid();
            $alea_futur = creer_uniqid();
            $pass = $adh['pass'];
            $htpass = generer_htpass($pass);
            $mdpass = md5($alea_actuel . $pass);
            // Récupération de l'identifiant de l'auteur Spip, s'il existe
            $res2 = spip_query("SELECT `id_auteur` FROM `spip_galettonuts` WHERE `id_adh` = '{$adh['id']}';");
            if (spip_mysql_count($res2)) {
                $id_auteur = (int) @mysql_result($res2, 0);
            } else {
                $id_auteur = null;
            }
            // Mise à jour de l'auteur Spip
            if ($id_auteur) {
                $req = "UPDATE `spip_auteurs` SET " . "`nom` = " . _q($nom) . ", `email` = " . _q($email) . ", `login` = " . _q($login) . ", `pass` = " . _q($mdpass) . ", `htpass` = " . _q($htpass) . ", `alea_actuel` = " . _q($alea_actuel) . ", `alea_futur` = " . _q($alea_futur);
                if (1 != $adh['actif']) {
                    $req .= ", `statut` = " . _q('5poubelle');
                }
                $req .= ", `maj` = NOW()" . " WHERE `id_auteur` = " . _q($id_auteur);
                spip_query($req);
            } else {
                $statut = 1 == $adh['actif'] ? '6forum' : '5poubelle';
                $req = "INSERT INTO `spip_auteurs` (`nom`, `email`, `login`, `pass`, `htpass`, `alea_actuel`, `alea_futur`, `statut`) " . "VALUES (" . _q($nom) . ', ' . _q($email) . ', ' . _q($login) . ', ' . _q($mdpass) . ', ' . _q($htpass) . ', ' . _q($alea_actuel) . ', ' . _q($alea_futur) . ', ' . _q($statut) . ");";
                spip_query($req);
                unset($req);
                // Puisque la colonne id_auteur de la table spip_auteurs est
                // de type BIGINT, on ne peut utiliser mysql_insert_id() de PHP.
                $id_auteur = @mysql_result(spip_query("SELECT LAST_INSERT_ID();"), 0);
                $req = "INSERT INTO `spip_galettonuts` (`id_auteur`, `id_adh`) VALUES (" . _q($id_auteur) . ', ' . _q($adh['id']) . ');';
                spip_query($req);
            }
            spip_free_result($res2);
            // Hop, un utilisateur de synchronisé en plus
            ++$compteur;
            // Dans le cas où le plugin Accès Restreint est présent, on stocke
            // les identifiants des auteurs fraichement synchronisés associés
            // à une/des zone(s) définie lors de la configuration de Galettonuts
            if ($zones = $config->lire('zones')) {
                $ids[$id_auteur] = $zones;
                unset($zones);
            }
        }
        // while
        // La synchronisation est complète, on le sauvegarde
        $synchro->ajouter(array('maj' => $maintenant), true);
        // Association de zones aux auteurs synchronisés
        if (0 < count($ids)) {
            galettonuts_associer_zones($ids);
        }
        return $compteur;
    }
}