function recherche_avancee_google_like($string, $options = array())
{
    $resume = isset($options['resume']) ? $options['resume'] : ($options['resume'] != 'non' ? $string : '');
    $wrapper = isset($options['wrapper']) ? '<i class="rsusp">[...]</i>' : '';
    $taille = isset($options['taille']) ? $options['taille'] : 55;
    // Convertir en texte brut sans accent
    $string = textebrut($string);
    $string = translitteration($string);
    $rech = translitteration(_request('recherche'));
    // Supprimer les caracteres qui m...
    $badguy = array("^", "/", "\\", "\$", "@", "*");
    $rech = str_replace($badguy, "", $rech);
    // en avant
    $query = rtrim(str_replace("+", " ", $rech));
    $qt = explode(" ", $query);
    if ($wrapper) {
        $num = count($qt);
        // $cc = ceil(55 / $num);
        $cc = $taille;
        for ($i = 0; $i < $num; $i++) {
            $tab[$i] = preg_split("/\\b({$qt[$i]})/i", $string, 2, PREG_SPLIT_DELIM_CAPTURE);
            if (count($tab[$i]) > 1) {
                // Chaine avant
                $avant = substr($tab[$i][0], -$cc, $cc);
                $mots = split(" ", $avant, 2);
                if (count($mots) > 1) {
                    $avant = $mots[1];
                }
                // Chaine apres
                $apres = substr($tab[$i][2], 0, $cc);
                $apres = preg_replace('@(.+)\\s\\S+@s', '\\1', $apres);
                // Concatener
                if ($string_re == '') {
                    $string_re = $wrapper;
                }
                $string_re .= " {$avant}<span class='spip_surligne'>" . $tab[$i][1] . "</span>{$apres} {$wrapper}";
            }
        }
    } else {
        $pattern = array();
        $replace = array();
        foreach ($qt as $t) {
            $pattern[] = "/{$t}/";
            $replace[] = "<span class='spip_surligne'>" . $t . "</span>";
        }
        $string_re = preg_replace($pattern, $replace, $string);
    }
    // Si rien trouve : renvoyer les premiers mots en resume
    if ($resume != '' and $string_re == '') {
        $mots = split(" ", $string, 40);
        for ($i = 0; $i < count($mots) - 1; $i++) {
            $string_re .= $mots[$i] . " ";
            if (strlen($string_re) > 2 * $cc) {
                break;
            }
        }
        $string_re = $resume;
    }
    return $string_re;
}
Esempio n. 2
0
/**
 * enlever les accents des cles presentes dans le head,
 * sinon ca pose des problemes ...
 *
 * @param string $key
 * @return string
 */
function importer_csv_nettoie_key($key)
{
    return translitteration($key);
    /*$accents=array('�','�','�','�','�',"�","�","'");
    	$accents_rep=array('e','e','e','a','u',"o","c","_");
    	return str_replace($accents,$accents_rep,$key);*/
}
Esempio n. 3
0
function reduire_mot($mot) {
	return strtr(
		translitteration(trim($mot)),
		'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
		'abcdefghijklmnopqrstuvwxyz'
		);
}
Esempio n. 4
0
function action_snippet_exporte(){
	global $auteur_session;
	$arg = _request('arg');
	$args = explode(":",$arg);
	$hash = _request('hash');
	$id_auteur = $auteur_session['id_auteur'];
	$redirect = _request('redirect');
	if ($redirect==NULL) $redirect="";
	include_spip("inc/securiser_action");
	if (verifier_action_auteur("snippet_exporte-$arg",$hash,$id_auteur)==TRUE) {
		$table = $args[0];
		$id = $args[1];
		
		$f = snippets_fond_exporter($table, false);
			
		if ($f) {
			include_spip('public/assembler');
			$out = recuperer_fond($f,array('id'=>intval($id)));
			//$out = preg_replace(",\n\n[\s]*(?=\n),","",$out);
			
			$filename=str_replace(":","_",$arg);
			if (preg_match(",<titre>(.*)</titre>,Uims",$out,$regs))
				$filename = preg_replace(',[^-_\w]+,', '_', trim(translitteration(textebrut(typo($regs[1])))));
			$extension = "xml";
			
			Header("Content-Type: text/xml; charset=".$GLOBALS['meta']['charset']);
			Header("Content-Disposition: attachment; filename=$filename.$extension");
			Header("Content-Length: ".strlen($out));
			echo $out;
			exit();
		}
	}	
	redirige_par_entete(str_replace("&amp;","&",urldecode($redirect)));
}
Esempio n. 5
0
function plugins_afficher_liste_dist($url_page,$liste_plugins, $liste_plugins_actifs, $dir_plugins=_DIR_PLUGINS,$afficher_un = 'afficher_plugin'){
	$get_infos = charger_fonction('get_infos','plugins');
	$ligne_plug = charger_fonction($afficher_un,'plugins');
	$liste_plugins = array_flip($liste_plugins);
	foreach(array_keys($liste_plugins) as $chemin) {
		if ($info = $get_infos($chemin, false, $dir_plugins))
			$liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($info['nom']))))));
	}
	asort($liste_plugins);
	$exposed = urldecode(_request('plugin'));

	$block_par_lettre = false;//count($liste_plugins)>10;
	$fast_liste_plugins_actifs = array_flip($liste_plugins_actifs);
	$res = '';
	$block = '';
	$initiale = '';
	$block_actif = false;
	foreach($liste_plugins as $plug => $nom){
		if (($i=substr($nom,0,1))!==$initiale){
			$res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block;
			$initiale = $i;
			$block = '';
			$block_actif = false;
		}
		// le rep suivant
		$actif = @isset($fast_liste_plugins_actifs[$plug]);
		$block_actif = $block_actif | $actif;
		$expose = ($exposed AND ($exposed==$plug OR $exposed==$dir_plugins . $plug OR $exposed==substr($dir_plugins,strlen(_DIR_RACINE)) . $plug));
		$block .= $ligne_plug($url_page, $plug, $actif, $expose, "item", $dir_plugins)."\n";
	}
	$res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block;
	$class = basename($dir_plugins);
	return $res ? "<ul class='liste-items plugins $class'>$res</ul>" : "";
}
Esempio n. 6
0
function url_nettoyer($titre,$longueur_maxi,$longueur_min=0,$separateur='-',$filtre=''){
	if (!defined('_TRANSLITTERER_URL')) define('_TRANSLITTERER_URL', true);
	
	$titre = supprimer_tags(supprimer_numero(extraire_multi($titre)));
	$url = corriger_caracteres($titre);
	
	
	if (_TRANSLITTERER_URL) $url = translitteration($url);

	if ($filtre)
		$url = $filtre($url);

	// on va convertir tous les caracteres de ponctuation et espaces
	// a l'exception de l'underscore (_), car on veut le conserver dans l'url
	$url = str_replace('_', chr(7), $url);
	$url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
	$url = str_replace(chr(7), '_', $url);

	// S'il reste trop de caracteres non latins, les gerer comme wikipedia
	// avec rawurlencode :
	if (_TRANSLITTERER_URL && preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) {
		foreach ($r as $regs) {
			$url = substr_replace($url, rawurlencode($regs[0]),
				strpos($url, $regs[0]), strlen($regs[0]));
		}
	}

	// S'il reste trop peu, renvoyer vide
	if (strlen($url) < $longueur_min)
		return '';

	// Sinon couper les mots et les relier par des $separateur
	if (_TRANSLITTERER_URL) $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url); 
	else $mots = preg_split(",[\s]+,", $url);
	$url = '';
	foreach ($mots as $mot) {
		if (!strlen($mot)) continue;
		$url2 = $url.$separateur.$mot;

		// Si on depasse $longueur_maxi caracteres, s'arreter
		// ne pas compter 3 caracteres pour %E9 mais un seul
		$long = preg_replace(',%.,', '', $url2);
		if (strlen($long) > $longueur_maxi) {
			break;
		}

		$url = $url2;
	}
	$url = substr($url, 1);

	// On enregistre en utf-8 dans la base
	$url = rawurldecode($url);

	if (strlen($url) < $longueur_min)
		return '';
	return $url;
}
Esempio n. 7
0
/**
 * Nom du fichier de sauvegarde
 * la fourniture de l'extension permet de verifier que le nom n'existe pas deja
 *
 * @param string $dir
 * @param string $extension
 * @return string
 */
function dump_nom_fichier($dir, $extension = 'sqlite')
{
    include_spip('inc/texte');
    $site = isset($GLOBALS['meta']['nom_site']) ? preg_replace(array(",\\W,is", ",_(?=_),", ",_\$,"), array("_", "", ""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])), 30, "")) : 'spip';
    $site .= '_' . date('Ymd');
    $nom = $site;
    $cpt = 0;
    while (file_exists($dir . $nom . ".{$extension}")) {
        $nom = $site . sprintf('_%03d', ++$cpt);
    }
    return $nom . ".{$extension}";
}
Esempio n. 8
0
function expression_recherche($recherche, $options)
{
    $u = $GLOBALS['meta']['pcre_u'];
    include_spip('inc/charsets');
    $recherche = trim(translitteration($recherche));
    $is_preg = false;
    if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/') {
        // c'est une preg
        $preg = $recherche . $options['preg_flags'];
        $is_preg = true;
    } else {
        // s'il y a plusieurs mots il faut les chercher tous : oblige REGEXP
        if (preg_match(",\\s+," . $u, $recherche)) {
            $is_preg = true;
            $recherche = preg_replace(',\\s+,' . $u, '|', $recherche);
        }
        $preg = '/' . str_replace('/', '\\/', $recherche) . '/' . $options['preg_flags'];
    }
    // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite
    // ou si l'expression reguliere est invalide
    if (!$is_preg or @preg_match($preg, '') === FALSE) {
        $methode = 'LIKE';
        $u = $GLOBALS['meta']['pcre_u'];
        // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses
        $recherche = str_replace(array('(', ')', '?', '[', ']', '+', '*', '/'), array('\\(', '\\)', '[?]', '\\[', '\\]', '\\+', '\\*', '\\/'), $recherche);
        $recherche_mod = $recherche;
        // echapper les % et _
        $q = str_replace(array('%', '_'), array('\\%', '\\_'), trim($recherche));
        // les expressions entre " " sont un mot a chercher tel quel
        // -> on remplace les espaces par un _ et on enleve les guillemets
        if (preg_match(',["][^"]+["],Uims', $q, $matches)) {
            foreach ($matches as $match) {
                // corriger le like dans le $q
                $word = preg_replace(",\\s+,Uims", "_", $match);
                $word = trim($word, '"');
                $q = str_replace($match, $word, $q);
                // corriger la regexp
                $word = preg_replace(",\\s+,Uims", "[\\s]", $match);
                $word = trim($word, '"');
                $recherche_mod = str_replace($match, $word, $recherche_mod);
            }
        }
        $q = sql_quote("%" . preg_replace(",\\s+," . $u, "%", $q) . "%");
        $preg = '/' . preg_replace(",\\s+," . $u, ".+", trim($recherche_mod)) . '/' . $options['preg_flags'];
    } else {
        $methode = 'REGEXP';
        $q = sql_quote(trim($recherche, '/'));
    }
    return array($methode, $q, $preg);
}
Esempio n. 9
0
/**
 * Afficher une liste de plugins dans l'interface
 * http://doc.spip.org/@affiche_liste_plugins
 *
 * @param string $url_page
 * @param array $liste_plugins
 * @param array $liste_plugins_checked
 * @param array $liste_plugins_actifs
 * @param string $dir_plugins
 * @param string $afficher_un
 * @return string
 */
function plugins_afficher_liste_dist($url_page, $liste_plugins, $liste_plugins_checked, $liste_plugins_actifs, $dir_plugins = _DIR_PLUGINS, $afficher_un = 'afficher_plugin')
{
    $get_infos = charger_fonction('get_infos', 'plugins');
    $ligne_plug = charger_fonction($afficher_un, 'plugins');
    $all_infos = $get_infos($liste_plugins, false, $dir_plugins);
    $all_infos = pipeline('filtrer_liste_plugins', array('args' => array('liste_plugins' => $liste_plugins, 'liste_plugins_checked' => $liste_plugins_checked, 'liste_plugins_actifs' => $liste_plugins_actifs, 'dir_plugins' => $dir_plugins), 'data' => $all_infos));
    $liste_plugins = array_flip($liste_plugins);
    foreach ($liste_plugins as $chemin => $v) {
        // des plugins ont pu etre enleves de la liste par le pipeline. On en tient compte.
        if (isset($all_infos[$chemin])) {
            $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($all_infos[$chemin]['nom']))))));
        } else {
            unset($liste_plugins[$chemin]);
        }
    }
    asort($liste_plugins);
    $exposed = urldecode(_request('plugin'));
    $block_par_lettre = false;
    //count($liste_plugins)>10;
    $fast_liste_plugins_actifs = array();
    $fast_liste_plugins_checked = array();
    if (is_array($liste_plugins_actifs)) {
        $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs);
    }
    if (is_array($liste_plugins_checked)) {
        $fast_liste_plugins_checked = array_flip($liste_plugins_checked);
    }
    $res = '';
    $block = '';
    $initiale = '';
    $block_actif = false;
    foreach ($liste_plugins as $plug => $nom) {
        if (($i = substr($nom, 0, 1)) !== $initiale) {
            $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block;
            $initiale = $i;
            $block = '';
            $block_actif = false;
        }
        // le rep suivant
        $actif = isset($fast_liste_plugins_actifs[$plug]);
        $checked = isset($fast_liste_plugins_checked[$plug]);
        $block_actif = $block_actif | $actif;
        $expose = ($exposed and ($exposed == $plug or $exposed == $dir_plugins . $plug or $exposed == substr($dir_plugins, strlen(_DIR_RACINE)) . $plug));
        $block .= $ligne_plug($url_page, $plug, $checked, $actif, $expose, "item", $dir_plugins) . "\n";
    }
    $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block;
    $class = basename($dir_plugins);
    return $res ? "<ul class='liste-items plugins {$class}'>{$res}</ul>" : "";
}
Esempio n. 10
0
function inc_exporter_csv_dist($titre, $resource, $delim=',', $entetes = null,$envoyer = true){

	$filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre))));
	
	if ($delim == 'TAB') $delim = "\t";
	if (!in_array($delim,array(',',';',"\t")))
		$delim = ",";

	$charset = $GLOBALS['meta']['charset'];
	$importer_charset = null;
	if ($delim == ',')
		$extension = 'csv';
	else {
		$extension = 'xls';
		# Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut
		$importer_charset = $charset = 'iso-8859-1';
	}
	$filename = "$filename.$extension";

	if ($entetes AND is_array($entetes) AND count($entetes))
		$output = exporter_csv_ligne($entetes,$delim,$importer_charset);

	// on passe par un fichier temporaire qui permet de ne pas saturer la memoire
	// avec les gros exports
	$fichier = sous_repertoire(_DIR_CACHE,"export") . $filename;
	$fp = fopen($fichier, 'w');
	$length = fwrite($fp, $output);

	while ($row=is_array($resource)?array_shift($resource):sql_fetch($resource)){
		$output = exporter_csv_ligne($row,$delim,$importer_charset);
		$length += fwrite($fp, $output);
	}
	fclose($fp);

	if ($envoyer) {
		Header("Content-Type: text/comma-separated-values; charset=$charset");
		Header("Content-Disposition: attachment; filename=$filename");
		//non supporte
		//Header("Content-Type: text/plain; charset=$charset");
		Header("Content-Length: $length");
		ob_clean();
    flush();
    readfile($fichier);
	}

	return $fichier;
}
Esempio n. 11
0
function copier_document($ext, $orig, $source) {

	$orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
	$dir = creer_repertoire_documents($ext);
	$dest = preg_replace("/[^.=\w-]+/", "_",
			translitteration(preg_replace("/\.([^.]+)$/", "", 
						      preg_replace("/<[^>]*>/", '', basename($orig)))));

	// ne pas accepter de noms de la forme -r90.jpg qui sont reserves
	// pour les images transformees par rotation (action/documenter)
	$dest = preg_replace(',-r(90|180|270)$,', '', $dest);

	// Si le document "source" est deja au bon endroit, ne rien faire
	if ($source == ($dir . $dest . '.' . $ext))
		return $source;

	// sinon tourner jusqu'a trouver un numero correct
	$n = 0;
	while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext));

	return deplacer_fichier_upload($source, $newFile);
}
Esempio n. 12
0
function action_exporter()
{
    //global $auteur_session;
    $arg = _request('arg');
    $args = explode(":", $arg);
    $hash = _request('hash');
    //$id_auteur = $auteur_session['id_auteur'];
    $redirect = _request('redirect');
    if ($redirect == NULL) {
        $redirect = "";
    }
    //include_spip("inc/securiser_action");
    //if (verifier_action_auteur("snippet_exporte-$arg",$hash,$id_auteur)==TRUE) {
    $table = array_shift($args);
    $id = $args;
    $f = snippets_fond_exporter($table, false);
    spip_log('f ' . $f, 'export');
    if ($f) {
        include_spip('public/assembler');
        $out = recuperer_fond($f, array('id' => $id));
        //$out = preg_replace(",\n\n[\s]*(?=\n),","",$out);
        // $filename=str_replace(":","_",$arg);
        $today = date(Ymd);
        $filename = $table . '_export_' . $today;
        if (preg_match(",<titre>(.*)</titre>,Uims", $out, $regs)) {
            $filename = preg_replace(',[^-_\\w]+,', '_', trim(translitteration(textebrut(typo($regs[1])))));
        }
        $extension = "csv";
        Header("Content-Type: text/csv; charset=" . $GLOBALS['meta']['charset']);
        Header("Content-Disposition: attachment; filename={$filename}.{$extension}");
        Header("Content-Length: " . strlen($out));
        echo $out;
        exit;
        //	}
    }
    redirige_par_entete(str_replace("&amp;", "&", urldecode($redirect)));
}
Esempio n. 13
0
/**
 * enlever les accents des cles presentes dans le head,
 * sinon ca pose des problemes ...
 *
 * @param string $key
 * @return string
 */
function importer_csv_nettoie_key($key)
{
    return translitteration($key);
}
/**
 * Lister les fichiers contenus dans un zip
 *
 * @param array $files
 *    La liste des fichiers
 * @return string $res
 *    La liste HTML des fichiers <li>...</li>
 */
function joindre_liste_contenu_tailles_archive($files)
{
    include_spip('inc/charsets');
    # pour le nom de fichier
    $res = '';
    if (is_array($files)) {
        foreach ($files as $nom => $file) {
            $nom = translitteration($nom);
            $date = date_interface(date("Y-m-d H:i:s", $file['mtime']));
            $taille = taille_en_octets($file['size']);
            $res .= "<li title=\"" . attribut_html($title) . "\"><b>{$nom}</b> &ndash; {$taille}<br />&nbsp; {$date}</li>\n";
        }
    }
    return $res;
}
/**
 * Tester le type de document
 *
 * - le document existe et n'est pas de taille 0 ?
 * - interdit a l'upload ?
 * - quelle extension dans spip_types_documents ?
 * - est-ce "inclus" comme une image ?
 *
 * Le zipper si necessaire
 *
 * @param array $file
 *     Au format $_FILES
 * @param string $mode
 *     Mode d'inclusion du fichier, si connu
 * @return array
 */
function fixer_fichier_upload($file, $mode = '')
{
    /**
     * On vérifie que le fichier existe et qu'il contient quelque chose
     */
    if (is_array($row = verifier_upload_autorise($file['name'], $mode))) {
        if (!isset($row['autozip'])) {
            $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        } else {
            unset($row['autozip']);
            $ext = 'zip';
            if (!($tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))) {
                return false;
            }
            spip_unlink($tmp_dir);
            @mkdir($tmp_dir);
            include_spip('inc/charsets');
            $tmp = $tmp_dir . '/' . translitteration($file['name']);
            $file['name'] .= '.' . $ext;
            # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
            // deplacer le fichier tmp_name dans le dossier tmp
            deplacer_fichier_upload($file['tmp_name'], $tmp, true);
            include_spip('inc/pclzip');
            $source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
            $archive = new PclZip($source);
            $v_list = $archive->create($tmp, PCLZIP_OPT_REMOVE_PATH, $tmp_dir, PCLZIP_OPT_ADD_PATH, '');
            effacer_repertoire_temporaire($tmp_dir);
            if (!$v_list) {
                spip_log("Echec creation du zip ");
                return false;
            }
            $row['fichier'] = copier_document($row['extension'], $file['name'], $source);
            spip_unlink($source);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        }
    } else {
        return $row;
    }
    // retourner le message d'erreur
}
Esempio n. 16
0
function ancre_url($url, $ancre)
{
    // lever l'#ancre
    if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) {
        $url = $r[1];
    }
    if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) {
        if (!function_exists('translitteration')) {
            include_spip('inc/charsets');
        }
        $ancre = preg_replace(array('/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'), array('', '-'), translitteration($ancre));
    }
    return $url . (strlen($ancre) ? '#' . $ancre : '');
}
Esempio n. 17
0
function expression_recherche($recherche, $options)
{
    // ne calculer qu'une seule fois l'expression par hit
    // (meme si utilisee dans plusieurs boucles)
    static $expression = array();
    $key = serialize(array($recherche, $options['preg_flags']));
    if (isset($expression[$key])) {
        return $expression[$key];
    }
    $u = $GLOBALS['meta']['pcre_u'];
    if ($u and strpos($options['preg_flags'], $u) === false) {
        $options['preg_flags'] .= $u;
    }
    include_spip('inc/charsets');
    $recherche = trim($recherche);
    $is_preg = false;
    if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/') {
        // c'est une preg
        $recherche_trans = translitteration($recherche);
        $preg = $recherche_trans . $options['preg_flags'];
        $is_preg = true;
    } else {
        // s'il y a plusieurs mots il faut les chercher tous : oblige REGEXP,
        // sauf ceux de moins de 4 lettres (on supprime ainsi 'le', 'les', 'un',
        // 'une', 'des' ...)
        // attention : plusieurs mots entre guillemets sont a rechercher tels quels
        $recherche_trans = $recherche_mod = $recherche;
        // les expressions entre " " sont un mot a chercher tel quel
        // -> on remplace les espaces par un \x1 et on enleve les guillemets
        if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) {
            foreach ($matches as $match) {
                $word = preg_replace(",\\s+,Uims", "", $match);
                $word = trim($word, '"');
                $recherche_mod = str_replace($match, $word, $recherche_mod);
            }
        }
        if (preg_match(",\\s+," . $u, $recherche_mod)) {
            $is_preg = true;
            $recherche_inter = '|';
            $recherche_mots = explode(' ', $recherche_mod);
            $min_long = defined('_RECHERCHE_MIN_CAR') ? _RECHERCHE_MIN_CAR : 4;
            foreach ($recherche_mots as $mot) {
                if (strlen($mot) >= $min_long) {
                    // echapper les caracteres de regexp qui sont eventuellement dans la recherche
                    $recherche_inter .= preg_quote($mot) . ' ';
                }
            }
            $recherche_inter = str_replace("", '\\s', $recherche_inter);
            // mais on cherche quand même l'expression complète, même si elle
            // comporte des mots de moins de quatre lettres
            $recherche = rtrim(preg_quote($recherche) . preg_replace(',\\s+,' . $u, '|', $recherche_inter), '|');
            $recherche_trans = translitteration($recherche);
        }
        $preg = '/' . str_replace('/', '\\/', $recherche_trans) . '/' . $options['preg_flags'];
    }
    // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite
    // ou si l'expression reguliere est invalide
    if (!$is_preg or @preg_match($preg, '') === FALSE) {
        $methode = 'LIKE';
        $u = $GLOBALS['meta']['pcre_u'];
        // echapper les % et _
        $q = str_replace(array('%', '_'), array('\\%', '\\_'), trim($recherche));
        // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses
        $recherche = preg_quote($recherche);
        $recherche_trans = translitteration($recherche);
        $recherche_mod = $recherche_trans;
        // les expressions entre " " sont un mot a chercher tel quel
        // -> on remplace les espaces par un _ et on enleve les guillemets
        // corriger le like dans le $q
        if (preg_match(',["][^"]+["],Uims', $q, $matches)) {
            foreach ($matches as $match) {
                $word = preg_replace(",\\s+,Uims", "_", $match);
                $word = trim($word, '"');
                $q = str_replace($match, $word, $q);
            }
        }
        // corriger la regexp
        if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) {
            foreach ($matches as $match) {
                $word = preg_replace(",\\s+,Uims", "[\\s]", $match);
                $word = trim($word, '"');
                $recherche_mod = str_replace($match, $word, $recherche_mod);
            }
        }
        $q = sql_quote("%" . preg_replace(",\\s+," . $u, "%", $q) . "%");
        $preg = '/' . preg_replace(",\\s+," . $u, ".+", trim($recherche_mod)) . '/' . $options['preg_flags'];
    } else {
        $methode = 'REGEXP';
        $q = sql_quote(trim($recherche, '/'));
    }
    // tous les caracteres transliterables de $q sont remplaces par un joker
    // permet de matcher en SQL meme si on est sensible aux accents (SQLite)
    $q_t = $q;
    for ($i = 0; $i < spip_strlen($q); $i++) {
        $char = spip_substr($q, $i, 1);
        if (!is_ascii($char) and $char_t = translitteration($char) and $char_t !== $char) {
            $q_t = str_replace($char, $is_preg ? "." : "_", $q_t);
        }
    }
    $q = $q_t;
    // fix : SQLite 3 est sensible aux accents, on jokerise les caracteres
    // les plus frequents qui peuvent etre accentues
    // (oui c'est tres dicustable...)
    if (isset($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type']) and strncmp($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type'], 'sqlite', 6) == 0) {
        $q_t = strtr($q, "aeuioc", $is_preg ? "......" : "______");
        // si il reste au moins un char significatif...
        if (preg_match(",[^'%_.],", $q_t)) {
            $q = $q_t;
        }
    }
    return $expression[$key] = array($methode, $q, $preg);
}
Esempio n. 18
0
/**
 * Copier un document
 * 
 * @param string $ext    L'extension du fichier
 * @param string $dest   le nom sous lequel le sauvegarder
 * @param string $source le fichier sur le serveur (/var/tmp/xyz34)
 * @param string $dans   Où le copier
 * @return string
 */
function cfg_copier_document($ext, $dest, $source, $dans='_cfg') {

	$dest = preg_replace(',\.\.+,', '.', $dest); // pas de .. dans le nom du doc
	$dir = cfg_creer_repertoire_cfg($dans);
	$dest = preg_replace("/[^._=-\w\d]+/", "_", 
			translitteration(preg_replace("/\.([^.]+)$/", "", 
						      preg_replace("/<[^>]*>/", '', basename($dest)))));

	// ne pas accepter de noms de la forme -r90.jpg qui sont reserves
	// pour les images transformees par rotation (action/documenter)
	$dest = preg_replace(',-r(90|180|270)$,', '', $dest);
	
	$newFile = $dir . $dest .'.'.$ext;

	return _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $newFile) : deplacer_fichier_upload($source, $newFile);
}
Esempio n. 19
0
function translitteration_complexe($texte)
{
    return translitteration($texte, 'AUTO', 'complexe');
}
Esempio n. 20
0
function afficher_liste_plugins_distants($liste){
	$res = "";
	if (!$liste) return "";
	
	$menu = array();
	$compte = 0;

	$afficher_plugin_distant = charger_fonction('afficher_plugin_distant','plugins');
	$url_page = self();
	foreach ($liste as $url => $info) {
		$titre = $info[0];
		$titre = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($titre))))));
		$menu[$titre] = $afficher_plugin_distant($url_page, $url, $info, _request('plugin')==$url);
	}
	ksort($menu);

	$res .=
		"<h3>"._T('plugins_compte',array('count' => count($menu)))."</h3>"
	  . '<p>'._T('plugin_info_automatique_select',array('rep'=>joli_repertoire(_DIR_PLUGINS_AUTO))).'</p>'
		. "<ul class='liste-items plugins distants'>".join("\n",$menu)."</ul>";

	return $res;
}
Esempio n. 21
0
function recherche_en_base($recherche='', $tables=NULL, $options=array(), $serveur='') {
	include_spip('base/abstract_sql');

	if (!is_array($tables)) {
		$liste = liste_des_champs();

		if (is_string($tables)
		AND $tables != '') {
			$toutes = array();
			foreach(explode(',', $tables) as $t)
				if (isset($liste[$t]))
					$toutes[$t] = $liste[$t];
			$tables = $toutes;
			unset($toutes);
		} else
			$tables = $liste;
	}

	include_spip('inc/autoriser');

	// options par defaut
	$options = array_merge(array(
		'preg_flags' => 'UimsS',
		'toutvoir' => false,
		'champs' => false,
		'score' => false,
		'matches' => false,
		'jointures' => false
		),
		$options
	);

	$results = array();

	if (!strlen($recherche) OR !count($tables))
		return array();
	include_spip('inc/charsets');
	$recherche = translitteration($recherche);

	$is_preg = false;
	if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){
		// c'est une preg
		$preg = $recherche.$options['preg_flags'];
		$is_preg = true;
	}
	else
		$preg = '/'.str_replace('/', '\\/', $recherche).'/' . $options['preg_flags'];
	// Si la chaine est inactive, on va utiliser LIKE pour aller plus vite
	// ou si l'expression reguliere est invalide
	if (!$is_preg
	OR (@preg_match($preg,'')===FALSE) ) {
		$methode = 'LIKE';
		$u = $GLOBALS['meta']['pcre_u'];
		// eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses
		$recherche = str_replace(
			array('(',')','?','[', ']', '+', '*', '/'),
			array('\(','\)','[?]', '\[', '\]', '\+', '\*', '\/'),
			$recherche);
		$recherche_mod = $recherche;
		
		// echapper les % et _
		$q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche));
		// les expressions entre " " sont un mot a chercher tel quel
		// -> on remplace les espaces par un _ et on enleve les guillemets
		if (preg_match(',["][^"]+["],Uims',$q,$matches)){
			foreach($matches as $match){
				// corriger le like dans le $q
				$word = preg_replace(",\s+,Uims","_",$match);
				$word = trim($word,'"');
				$q = str_replace($match,$word,$q);
				// corriger la regexp
				$word = preg_replace(",\s+,Uims","[\s]",$match);
				$word = trim($word,'"');
				$recherche_mod = str_replace($match,$word,$recherche_mod);		
			}
		}
		$q = sql_quote(
			"%"
			. preg_replace(",\s+,".$u, "%", $q)
			. "%"
		);
		
		$preg = '/'.preg_replace(",\s+,".$u, ".+", trim($recherche_mod)).'/' . $options['preg_flags'];
		
	} else {
		$methode = 'REGEXP';
		$q = sql_quote(substr($recherche,1,-1));
	}

	$jointures = $options['jointures']
		? liste_des_jointures()
		: array();

	foreach ($tables as $table => $champs) {
		$requete = array(
		"SELECT"=>array(),
		"FROM"=>array(),
		"WHERE"=>array(),
		"GROUPBY"=>array(),
		"ORDERBY"=>array(),
		"LIMIT"=>"",
		"HAVING"=>array()
		);

		$_id_table = id_table_objet($table);
		$requete['SELECT'][] = "t.".$_id_table;
		$a = array();
		// Recherche fulltext
		foreach ($champs as $champ => $poids) {
			if (is_array($champ)){
			  spip_log("requetes imbriquees interdites");
			} else {
				if (strpos($champ,".")===FALSE)
					$champ = "t.$champ";
				$requete['SELECT'][] = $champ;
				$a[] = $champ.' '.$methode.' '.$q;
			}
		}
		if ($a) $requete['WHERE'][] = join(" OR ", $a);
		$requete['FROM'][] = table_objet_sql($table).' AS t';

		$s = sql_select(
			$requete['SELECT'], $requete['FROM'], $requete['WHERE'],
			implode(" ",$requete['GROUPBY']),
			$requete['ORDERBY'], $requete['LIMIT'],
			$requete['HAVING'], $serveur
		);

		while ($t = sql_fetch($s,$serveur)) {
			$id = intval($t[$_id_table]);
			if ($options['toutvoir']
			OR autoriser('voir', $table, $id)) {
				// indiquer les champs concernes
				$champs_vus = array();
				$score = 0;
				$matches = array();

				$vu = false;
				foreach ($champs as $champ => $poids) {
					$champ = explode('.',$champ);
					$champ = end($champ);
					if ($n = 
						($options['score'] || $options['matches'])
						? preg_match_all($preg, translitteration_rapide($t[$champ]), $regs, PREG_SET_ORDER)
						: preg_match($preg, translitteration_rapide($t[$champ]))
					) {
						$vu = true;

						if ($options['champs'])
							$champs_vus[$champ] = $t[$champ];
						if ($options['score'])
							$score += $n * $poids;
						if ($options['matches'])
							$matches[$champ] = $regs;

						if (!$options['champs']
						AND !$options['score']
						AND !$options['matches'])
							break;
					}
				}

				if ($vu) {
					if (!isset($results[$table]))
						$results[$table] = array();
					$results[$table][$id] = array();
					if ($champs_vus)
						$results[$table][$id]['champs'] = $champs_vus;
					if ($score)
						$results[$table][$id]['score'] = $score;
					if ($matches)
						$results[$table][$id]['matches'] = $matches;
				}
			}
		}


		// Gerer les donnees associees
		if (isset($jointures[$table])
		AND $joints = recherche_en_base(
				$recherche,
				$jointures[$table],
				array_merge($options, array('jointures' => false))
			)
		) {
			foreach ($joints as $table_liee => $ids_trouves) {
				if (!$rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}","inc",true)){
					$cle_depart = id_table_objet($table);
					$cle_arrivee =  id_table_objet($table_liee);
					$table_sql = preg_replace('/^spip_/', '', table_objet_sql($table));
					$table_liee_sql = preg_replace('/^spip_/', '', table_objet_sql($table_liee));
					if ($table_liee == 'document')
						$s = sql_select("id_objet as $cle_depart, $cle_arrivee", "spip_documents_liens", array("objet='$table'",sql_in('id_'.${table_liee}, array_keys($ids_trouves))), '','','','',$serveur);
					else
						$s = sql_select("$cle_depart,$cle_arrivee", "spip_${table_liee_sql}_${table_sql}", sql_in('id_'.${table_liee}, array_keys($ids_trouves)), '','','','',$serveur);
				}
				else
					list($cle_depart,$cle_arrivee,$s) = $rechercher_joints($table,$table_liee,array_keys($ids_trouves), $serveur);

				while ($t = is_array($s)?array_shift($s):sql_fetch($s)) {
					$id = $t[$cle_depart];
					$joint = $ids_trouves[$t[$cle_arrivee]];
					if (!isset($results[$table]))
						$results[$table] = array();
					if (!isset($results[$table][$id]))
						$results[$table][$id] = array();
					if ($joint['score'])
						$results[$table][$id]['score'] += $joint['score'];
					if ($joint['champs'])
					foreach($joint['champs'] as $c => $val)
						$results[$table][$id]['champs'][$table_liee.'.'.$c] = $val;
					if ($joint['matches'])
					foreach($joint['matches'] as $c => $val)
						$results[$table][$id]['matches'][$table_liee.'.'.$c] = $val;
				}
			}
		}
	}

	return $results;
}
Esempio n. 22
0
/**
 * http://code.spip.net/@test_login
 *
 * @param string $nom
 * @param string $mail
 * @return string
 */
function test_login($nom, $mail)
{
    include_spip('inc/charsets');
    $nom = strtolower(translitteration($nom));
    $login_base = preg_replace("/[^\\w\\d_]/", "_", $nom);
    // il faut eviter que le login soit vraiment trop court
    if (strlen($login_base) < 3) {
        $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
        $login_base = preg_replace("/[^\\w\\d]/", "_", $mail);
    }
    if (strlen($login_base) < 3) {
        $login_base = 'user';
    }
    $login = $login_base;
    for ($i = 1;; $i++) {
        if (!sql_countsel('spip_auteurs', "login='******'")) {
            return $login;
        }
        $login = $login_base . $i;
    }
    return $login;
}
Esempio n. 23
0
function sommaire_id_ancre_ex($index, &$titre, $hn) {
	// traiter le format {{{Mon titre<mon_ancre>}}} (ou alt='Mon titre&lt;mon_ancre&gt;')
	if(preg_match(',<(\w+)>$,', $titre, $r) || preg_match(',&lt;(\w+)&gt;(?=\'),', $titre, $r)) {
		$titre = str_replace($r[0], '', $titre);
		return $r[1];
	}
	// calculer les ancres d'apres le titre
	$a = strtolower(translitteration(sommaire_nettoyer_titre($titre)));
	$a = trim(preg_replace(',[^a-z0-9_]+,', '_', $a), '_');
	return strlen($a)>2?$a:"sommaire_$index";
}
Esempio n. 24
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();
    }
}
Esempio n. 25
0
/**
 * http://doc.spip.org/@test_login
 *
 * @param string $nom
 * @param string $mail
 * @return string
 */
function test_login($nom, $mail)
{
    include_spip('inc/charsets');
    $nom = strtolower(translitteration($nom));
    $login_base = preg_replace("/[^\\w\\d_]/", "_", $nom);
    // il faut eviter que le login soit vraiment trop court
    if (strlen($login_base) < 3) {
        $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
        $login_base = preg_replace("/[^\\w\\d]/", "_", $mail);
    }
    if (strlen($login_base) < 3) {
        $login_base = 'user';
    }
    // eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
    if (strlen($login_base) > 10) {
        $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/", '\\1', $login_base);
        $login_base = substr($login_base, 0, 13);
    }
    $login = $login_base;
    for ($i = 1;; $i++) {
        if (!sql_countsel('spip_auteurs', "login='******'")) {
            return $login;
        }
        $login = $login_base . $i;
    }
    return $login;
}
Esempio n. 26
0
function adhclub_imp_nettoie_key($key)
{
    return translitteration($key);
}
Esempio n. 27
0
/**
 * csv -> tableau
 * @param string $u
 * @return array|bool
 */
function inc_csv_to_array_dist($u)
{
    include_spip('inc/csv');
    list($entete, $csv) = analyse_csv($u);
    array_unshift($csv, $entete);
    include_spip('inc/charsets');
    foreach ($entete as $k => $v) {
        $v = strtolower(preg_replace(',\\W+,', '_', translitteration($v)));
        foreach ($csv as &$item) {
            $item[$v] =& $item[$k];
        }
    }
    return $csv;
}
Esempio n. 28
0
function translitteration_complexe($texte, $chiffres=false) {
	$texte = translitteration($texte,'AUTO','complexe');

	if ($chiffres) {
		$texte = preg_replace("/[aeiuoyd]['`?~.^+(-]{1,2}/eS",
			"translitteration_chiffree('\\0')", $texte);
	}
	
	return $texte;
}
Esempio n. 29
0
function inc_recherche_to_array_dist($recherche, $options = array())
{
    // options par defaut
    $options = array_merge(array('score' => true, 'champs' => false, 'toutvoir' => false, 'matches' => false, 'jointures' => false), $options);
    include_spip('inc/rechercher');
    include_spip('inc/autoriser');
    $requete = array("SELECT" => array(), "FROM" => array(), "WHERE" => array(), "GROUPBY" => array(), "ORDERBY" => array(), "LIMIT" => "", "HAVING" => array());
    $table = sinon($options['table'], 'article');
    if ($options['champs']) {
        $champs = $options['champs'];
    } else {
        $l = liste_des_champs();
        $champs = $l['article'];
    }
    $serveur = $options['serveur'];
    list($methode, $q, $preg) = expression_recherche($recherche, $options);
    $jointures = $options['jointures'] ? liste_des_jointures() : array();
    $_id_table = id_table_objet($table);
    // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ','
    // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs)
    if (strpos($_id_table, ",") !== false) {
        $_id_table = explode(',', $_id_table);
        $_id_table = reset($_id_table);
    }
    $requete['SELECT'][] = "t." . $_id_table;
    $a = array();
    // Recherche fulltext
    foreach ($champs as $champ => $poids) {
        if (is_array($champ)) {
            spip_log("requetes imbriquees interdites");
        } else {
            if (strpos($champ, ".") === FALSE) {
                $champ = "t.{$champ}";
            }
            $requete['SELECT'][] = $champ;
            $a[] = $champ . ' ' . $methode . ' ' . $q;
        }
    }
    if ($a) {
        $requete['WHERE'][] = join(" OR ", $a);
    }
    $requete['FROM'][] = table_objet_sql($table) . ' AS t';
    $results = array();
    $s = sql_select($requete['SELECT'], $requete['FROM'], $requete['WHERE'], implode(" ", $requete['GROUPBY']), $requete['ORDERBY'], $requete['LIMIT'], $requete['HAVING'], $serveur);
    while ($t = sql_fetch($s, $serveur) and (!isset($t['score']) or $t['score'] > 0)) {
        $id = intval($t[$_id_table]);
        if ($options['toutvoir'] or autoriser('voir', $table, $id)) {
            // indiquer les champs concernes
            $champs_vus = array();
            $score = 0;
            $matches = array();
            $vu = false;
            foreach ($champs as $champ => $poids) {
                $champ = explode('.', $champ);
                $champ = end($champ);
                // translitteration_rapide uniquement si on est deja en utf-8
                $value = $GLOBALS['meta']['charset'] == 'utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ]);
                if ($n = $options['score'] || $options['matches'] ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) : preg_match($preg, $value)) {
                    $vu = true;
                    if ($options['champs']) {
                        $champs_vus[$champ] = $t[$champ];
                    }
                    if ($options['score']) {
                        $score += $n * $poids;
                    }
                    if ($options['matches']) {
                        $matches[$champ] = $regs;
                    }
                    if (!$options['champs'] and !$options['score'] and !$options['matches']) {
                        break;
                    }
                }
            }
            if ($vu) {
                if (!isset($results)) {
                    $results = array();
                }
                $results[$id] = array();
                if ($champs_vus) {
                    $results[$id]['champs'] = $champs_vus;
                }
                if ($score) {
                    $results[$id]['score'] = $score;
                }
                if ($matches) {
                    $results[$id]['matches'] = $matches;
                }
            }
        }
    }
    // Gerer les donnees associees
    // ici on est un peu naze : pas capables de reconstruire une jointure complexe
    // on ne sait passer que par table de laison en 1 coup
    if (isset($jointures[$table]) and $joints = recherche_en_base($recherche, $jointures[$table], array_merge($options, array('jointures' => false)))) {
        include_spip('action/editer_liens');
        $trouver_table = charger_fonction('trouver_table', 'base');
        $cle_depart = id_table_objet($table);
        $table_depart = table_objet($table, $serveur);
        $desc_depart = $trouver_table($table_depart, $serveur);
        $depart_associable = objet_associable($table);
        foreach ($joints as $table_liee => $ids_trouves) {
            // on peut definir une fonction de recherche jointe pour regler les cas particuliers
            if (!($rechercher_joints = charger_fonction("rechercher_joints_{$table}_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_objet_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_{$table}_objet_lie", "inc", true))) {
                $cle_arrivee = id_table_objet($table_liee);
                $table_arrivee = table_objet($table_liee, $serveur);
                $desc_arrivee = $trouver_table($table_arrivee, $serveur);
                // cas simple : $cle_depart dans la table_liee
                if (isset($desc_arrivee['field'][$cle_depart])) {
                    $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
                } elseif (isset($desc_depart['field'][$cle_arrivee])) {
                    $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
                } elseif ($l = objet_associable($table_liee)) {
                    list($primary, $table_liens) = $l;
                    $s = sql_select("id_objet as {$cle_depart}, {$primary} as {$cle_arrivee}", $table_liens, array("objet='{$table}'", sql_in($primary, array_keys($ids_trouves))), '', '', '', '', $serveur);
                } elseif ($l = $depart_associable) {
                    list($primary, $table_liens) = $l;
                    $s = sql_select("{$primary} as {$cle_depart}, id_objet as {$cle_arrivee}", $table_liens, array("objet='{$table_liee}'", sql_in('id_objet', array_keys($ids_trouves))), '', '', '', '', $serveur);
                } elseif ($t = $trouver_table($table_arrivee . "_" . $table_depart, $serveur) or $t = $trouver_table($table_depart . "_" . $table_arrivee, $serveur)) {
                    $s = sql_select("{$cle_depart},{$cle_arrivee}", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur);
                }
            } else {
                list($cle_depart, $cle_arrivee, $s) = $rechercher_joints($table, $table_liee, array_keys($ids_trouves), $serveur);
            }
            while ($t = is_array($s) ? array_shift($s) : sql_fetch($s)) {
                $id = $t[$cle_depart];
                $joint = $ids_trouves[$t[$cle_arrivee]];
                if (!isset($results)) {
                    $results = array();
                }
                if (!isset($results[$id])) {
                    $results[$id] = array();
                }
                if (isset($joint['score']) and $joint['score']) {
                    if (!isset($results[$id]['score'])) {
                        $results[$id]['score'] = 0;
                    }
                    $results[$id]['score'] += $joint['score'];
                }
                if (isset($joint['champs']) and $joint['champs']) {
                    foreach ($joint['champs'] as $c => $val) {
                        $results[$id]['champs'][$table_liee . '.' . $c] = $val;
                    }
                }
                if (isset($joint['matches']) and $joint['matches']) {
                    foreach ($joint['matches'] as $c => $val) {
                        $results[$id]['matches'][$table_liee . '.' . $c] = $val;
                    }
                }
            }
        }
    }
    return $results;
}
Esempio n. 30
0
/**
 * Envoi d'un mail
 *
 * @param string $destinataire
 * @param string $sujet
 * @param string|array $corps
 *   - au format string, c'est un corps d'email au format texte, comme supporte nativement par le core
 *   - au format array, c'est un corps etendu qui peut contenir
 *     - string texte : le corps d'email au format texte
 *     - string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie)
 *     - array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete
 *         --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, ---
 *         --- chargee de convertir en texte encodee les pieces jointes ---
 *     - array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array :
 *       - string chemin : chemin file system pour trouver le fichier a embarquer
 *       - string nom : nom du document tel qu'apparaissant dans l'email
 *       - string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
 *       - string mime : mime type du document
 *             --- Non implemente ici ---
 *     - string html : le corps d'email au format html
 *     - string nom_envoyeur : un nom d'envoyeur pour completer l'email from
 *     - string cc : destinataires en copie conforme
 *     - string bcc : destinataires en copie conforme cachee
 *     - string adresse_erreur : addresse de retour en cas d'erreur d'envoi
 * @param string $from (deprecie, utiliser l'entree from de $corps)
 * @param string $headers (deprecie, utiliser l'entree headers de $corps)
 * @return bool
 */
function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = '', $headers = '')
{
    if (!email_valide($destinataire)) {
        return false;
    }
    if ($destinataire == _T('info_mail_fournisseur')) {
        return false;
    }
    // tres fort
    // Fournir si possible un Message-Id: conforme au RFC1036,
    // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER
    $email_envoi = $GLOBALS['meta']['email_envoi'];
    if (!email_valide($email_envoi)) {
        spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.');
        $email_envoi = $destinataire;
    }
    $parts = '';
    if (is_array($corps)) {
        $texte = $corps['texte'];
        $from = isset($corps['from']) ? $corps['from'] : $from;
        $headers = isset($corps['headers']) ? $corps['headers'] : $headers;
        if (is_array($headers)) {
            $headers = implode("\n", $headers);
        }
        if ($corps['pieces_jointes'] and function_exists('mail_embarquer_pieces_jointes')) {
            $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']);
        }
    } else {
        $texte = $corps;
    }
    if (!$from) {
        $from = $email_envoi;
    }
    // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin
    if (preg_match('/^["\\s]*\\<?\\S+\\@\\S+\\>?\\s*$/', $from)) {
        $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')';
    }
    // nettoyer les &eacute; &#8217, &emdash; etc...
    // les 'cliquer ici' etc sont a eviter;  voir:
    // http://mta.org.ua/spamassassin-2.55/stuff/wiki.CustomRulesets/20050914/rules/french_rules.cf
    $texte = nettoyer_caracteres_mail($texte);
    $sujet = nettoyer_caracteres_mail($sujet);
    // encoder le sujet si possible selon la RFC
    if (init_mb_string()) {
        # un bug de mb_string casse mb_encode_mimeheader si l'encoding interne
        # est UTF-8 et le charset iso-8859-1 (constate php5-mac ; php4.3-debian)
        $charset = $GLOBALS['meta']['charset'];
        mb_internal_encoding($charset);
        $sujet = mb_encode_mimeheader($sujet, $charset, 'Q', "\n");
        mb_internal_encoding('utf-8');
    }
    if (function_exists('wordwrap') && preg_match(',multipart/mixed,', $headers) == 0) {
        $texte = wordwrap($texte);
    }
    list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts);
    if (_OS_SERVEUR == 'windows') {
        $texte = preg_replace("@\r*\n@", "\r\n", $texte);
        $headers = preg_replace("@\r*\n@", "\r\n", $headers);
        $sujet = preg_replace("@\r*\n@", "\r\n", $sujet);
    }
    spip_log("mail {$destinataire}\n{$sujet}\n{$headers}", 'mails');
    // mode TEST : forcer l'email
    if (defined('_TEST_EMAIL_DEST')) {
        if (!_TEST_EMAIL_DEST) {
            return false;
        } else {
            $texte = "Dest : {$destinataire}\r\n" . $texte;
            $destinataire = _TEST_EMAIL_DEST;
        }
    }
    return @mail($destinataire, $sujet, $texte, $headers);
}