示例#1
0
function initiale($nom)
{
    return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1);
}
function printWordWrapped($image, $top, $left, $maxWidth, $font, $couleur, $text, $textSize, $align = "left", $hauteur_ligne = 0)
{
    static $memps = array();
    $fontps = false;
    // imageftbbox exige un float, et settype aime le double pour php < 4.2.0
    settype($textSize, 'double');
    // calculer les couleurs ici, car fonctionnement different selon TTF ou PS
    $black = imagecolorallocatealpha($image, hexdec("0x{" . substr($couleur, 0, 2) . "}"), hexdec("0x{" . substr($couleur, 2, 2) . "}"), hexdec("0x{" . substr($couleur, 4, 2) . "}"), 0);
    $grey2 = imagecolorallocatealpha($image, hexdec("0x{" . substr($couleur, 0, 2) . "}"), hexdec("0x{" . substr($couleur, 2, 2) . "}"), hexdec("0x{" . substr($couleur, 4, 2) . "}"), 127);
    // Gaffe, T1Lib ne fonctionne carrement pas bien des qu'on sort de ASCII
    // C'est dommage, parce que la rasterisation des caracteres est autrement plus jolie qu'avec TTF.
    // A garder sous le coude en attendant que ca ne soit plus une grosse bouse.
    // Si police Postscript et que fonction existe...
    if (false and strtolower(substr($font, -4)) == ".pfb" and function_exists("imagepstext")) {
        // Traitement specifique pour polices PostScript (experimental)
        $textSizePs = round(1.32 * $textSize);
        if (!($fontps = $memps["{$font}"])) {
            $fontps = imagepsloadfont($font);
            // Est-ce qu'il faut reencoder? Pas testable proprement, alors...
            // imagepsencodefont($fontps,find_in_path('polices/standard.enc'));
            $memps["{$font}"] = $fontps;
        }
    }
    $rtl_global = false;
    for ($i = 0; $i < spip_strlen($text); $i++) {
        $lettre = spip_substr($text, $i, 1);
        $code = rtl_mb_ord($lettre);
        if ($code >= 54928 && $code <= 56767 || $code >= 15707294 && $code <= 15711164) {
            $rtl_global = true;
        }
    }
    // split the text into an array of single words
    $words = explode(' ', $text);
    // les espaces
    foreach ($words as $k => $v) {
        $words[$k] = str_replace(array('~'), array(' '), $v);
    }
    if ($hauteur_ligne == 0) {
        $lineHeight = floor($textSize * 1.3);
    } else {
        $lineHeight = $hauteur_ligne;
    }
    $dimensions_espace = imageftbbox($textSize, 0, $font, ' ', array());
    if ($dimensions_espace[2] < 0) {
        $dimensions_espace = imageftbbox($textSize, 0, $font, $line, array());
    }
    $largeur_espace = $dimensions_espace[2] - $dimensions_espace[0];
    $retour["espace"] = $largeur_espace;
    $line = '';
    $lines = array();
    while (count($words) > 0) {
        $mot = $words[0];
        if ($rtl_global) {
            $mot = rtl_visuel($mot, $rtl_global);
        }
        $dimensions = imageftbbox($textSize, 0, $font, $line . ' ' . $mot, array());
        $lineWidth = $dimensions[2] - $dimensions[0];
        // get the length of this line, if the word is to be included
        if ($lineWidth > $maxWidth) {
            // if this makes the text wider that anticipated
            $lines[] = $line;
            // add the line to the others
            $line = '';
            // empty it (the word will be added outside the loop)
        }
        $line .= ' ' . $words[0];
        // add the word to the current sentence
        $words = array_slice($words, 1);
        // remove the word from the array
    }
    if ($line != '') {
        $lines[] = $line;
    }
    // add the last line to the others, if it isn't empty
    $height = count($lines) * $lineHeight;
    // the height of all the lines total
    // do the actual printing
    $i = 0;
    // Deux passes pour recuperer, d'abord, largeur_ligne
    // necessaire pour alignement right et center
    $largeur_max = 0;
    foreach ($lines as $line) {
        if ($rtl_global) {
            $line = rtl_visuel($line, $rtl_global);
        }
        $dimensions = imageftbbox($textSize, 0, $font, $line, array());
        $largeur_ligne = $dimensions[2] - $dimensions[0];
        if ($largeur_ligne > $largeur_max) {
            $largeur_max = $largeur_ligne;
        }
    }
    foreach ($lines as $i => $line) {
        if ($rtl_global) {
            $line = rtl_visuel($line, $rtl_global);
        }
        $dimensions = imageftbbox($textSize, 0, $font, $line, array());
        $largeur_ligne = $dimensions[2] - $dimensions[0];
        if ($align == "right") {
            $left_pos = $largeur_max - $largeur_ligne;
        } else {
            if ($align == "center") {
                $left_pos = floor(($largeur_max - $largeur_ligne) / 2);
            } else {
                $left_pos = 0;
            }
        }
        if ($fontps) {
            $line = trim($line);
            imagepstext($image, "{$line}", $fontps, $textSizePs, $black, $grey2, $left + $left_pos, $top + $lineHeight * $i, 0, 0, 0, 16);
        } else {
            imagefttext($image, $textSize, 0, $left + $left_pos, $top + $lineHeight * $i, $black, $font, trim($line), array());
        }
    }
    $retour["height"] = $height;
    # + round(0.3 * $hauteur_ligne);
    $retour["width"] = $largeur_max;
    return $retour;
}
示例#3
0
文件: rechercher.php 项目: JLuc/SPIP
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);
}
示例#4
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;
}
/**
 * Retrouver les mots cles de recherche dans une url de referer
 *
 * Adaptees du code des "Visiteurs",
 * par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/)
 *
 * http://code.spip.net/@stats_show_keywords
 *
 * @param string $kw_referer
 * @return array
 */
function stats_show_keywords($kw_referer)
{
    static $arr_engines = '';
    static $url_site;
    if (!is_array($arr_engines)) {
        // Charger les moteurs de recherche
        $arr_engines = stats_load_engines();
        // initialiser la recherche interne
        $url_site = $GLOBALS['meta']['adresse_site'];
        $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\\.)?,", "", strtolower($url_site));
    }
    if ($url = @parse_url($kw_referer)) {
        $query = isset($url['query']) ? $url['query'] : "";
        $host = strtolower($url['host']);
        $path = $url['path'];
        $scheme = $url['scheme'];
    } else {
        $scheme = $query = $host = $path = '';
    }
    // construire un array des variables directement depuis la query-string
    parse_str($query, $Tquery);
    $keywords = '';
    $found = false;
    if (!empty($url_site)) {
        if (strpos('-' . $kw_referer, $url_site) !== false) {
            if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) {
                $keywords = urldecode($regs[2]);
            } else {
                return array('host' => '');
            }
        } else {
            for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++) {
                if ($found = preg_match(',' . $arr_engines[$cnt][2] . ',', $host) or $found = preg_match(',' . $arr_engines[$cnt][2] . ',', $path)) {
                    $kw_referer_host = $arr_engines[$cnt][0];
                    if (strpos($arr_engines[$cnt][1], '=') !== false) {
                        // Fonctionnement simple: la variable existe dans l'array
                        $v = str_replace('=', '', $arr_engines[$cnt][1]);
                        $keywords = isset($Tquery[$v]) ? $Tquery[$v] : "";
                        // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable
                        if (!strlen($keywords) > 0) {
                            if (preg_match("," . $arr_engines[$cnt][1] . "([^\\&]*),", $query, $vals)) {
                                $keywords = urldecode($vals[2]);
                            }
                        }
                    } else {
                        $keywords = "";
                    }
                    if ($kw_referer_host == "Google" || $kw_referer_host == "AOL" && strpos($query, 'enc=iso') === false || $kw_referer_host == "MSN") {
                        include_spip('inc/charsets');
                        if (!isset($ie) or !($cset = $ie)) {
                            $cset = 'utf-8';
                        }
                        $keywords = importer_charset($keywords, $cset);
                    }
                    $buffer["hostname"] = $kw_referer_host;
                }
            }
        }
    }
    $buffer["host"] = $host;
    $buffer["scheme"] = $scheme;
    if (!isset($buffer["hostname"]) or !$buffer["hostname"]) {
        $buffer["hostname"] = $host;
    }
    $buffer["path"] = substr($path, 1, strlen($path));
    $buffer["query"] = $query;
    if ($keywords != '') {
        if (strlen($keywords) > 150) {
            $keywords = spip_substr($keywords, 0, 148);
            // supprimer l'eventuelle entite finale mal coupee
            $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords);
        }
        $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords))));
    }
    return $buffer;
}
示例#6
0
文件: auteurs.php 项目: rhertzog/lcs
function lettres_d_auteurs($query, $debut, $max_par_page, $tri)
{
	$auteurs = $lettre = array();
	$lettres_nombre_auteurs = 0;
	$lettre_prec ="";
	$nombre_auteurs = 0;
	$query = sql_select($query['SELECT'], $query['FROM'], $query['WHERE'], $query['GROUP BY'], $query['ORDER BY']);

	while ($auteur = sql_fetch($query)) {
		if ($nombre_auteurs>=$debut AND $nombre_auteurs<$debut+$max_par_page) {
			$auteur['restreint'] = sql_countsel("spip_auteurs_rubriques", "id_auteur=".$auteur['id_auteur']);
			
			$auteurs[] = $auteur;
		}

		if ($tri == 'nom') {
			$premiere_lettre = strtoupper(spip_substr(corriger_typo($auteur['nom']),0,1));
			if ($premiere_lettre != $lettre_prec) { 
				$lettre[$premiere_lettre] = $nombre_auteurs;
			}
			$lettre_prec = $premiere_lettre;
		}
		$nombre_auteurs++;
	}
	return array($auteurs, $lettre, $nombre_auteurs, $debut);
}
示例#7
0
/**
 * Rend majuscule le premier caractère d'une chaîne utf-8
 *
 * Version utf-8 d'ucfirst
 *
 * @param string $c
 *     La chaîne à transformer
 * @return string
 *     La chaîne avec une majuscule sur le premier mot
 */
function spip_ucfirst($c)
{
    // Si on n'a pas mb_* ou si ce n'est pas utf-8, utiliser ucfirst
    if (!init_mb_string() or $GLOBALS['meta']['charset'] != 'utf-8') {
        return ucfirst($c);
    }
    $lettre1 = mb_strtoupper(spip_substr($c, 0, 1));
    return $lettre1 . spip_substr($c, 1);
}
示例#8
0
/**
 * Calculer l'initiale d'un nom
 *
 * @param <type> $nom
 * @return <type>
 */
function initiale($nom)
{
    return spip_substr(trim(strtoupper($nom)), 0, 1);
}