Example #1
0
/**
 * Appliquer des filtres sur un squelette complet
 *
 * La fonction accèpte plusieurs tableaux de filtres à partir du 3ème argument
 * qui seront appliqués dans l'ordre
 *
 * @uses echapper_php_callback()
 *
 * @param array $skel
 * @param string $corps
 * @param array $filtres
 *     Tableau de filtres à appliquer.
 * @return mixed|string
 */
function sandbox_filtrer_squelette($skel, $corps, $filtres)
{
    $series_filtres = func_get_args();
    array_shift($series_filtres);
    // skel
    array_shift($series_filtres);
    // corps
    // proteger les <INCLUDE> et tous les morceaux de php licites
    if ($skel['process_ins'] == 'php') {
        $corps = preg_replace_callback(',<[?](\\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps);
    }
    // recuperer les couples de remplacement
    $replace = echapper_php_callback();
    foreach ($series_filtres as $filtres) {
        if (count($filtres)) {
            foreach ($filtres as $filtre) {
                if ($filtre and $f = chercher_filtre($filtre)) {
                    $corps = $f($corps);
                }
            }
        }
    }
    // restaurer les echappements
    return str_replace($replace[0], $replace[1], $corps);
}
Example #2
0
function analyse_resultat_skel($nom, $cache, $corps, $source='') {
	$headers = array();

	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
	// note: on essaie d'attrapper aussi certains de ces entetes codes
	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
	if (preg_match_all(
	'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
	$corps, $regs, PREG_SET_ORDER)){
		foreach ($regs as $r) {
			$corps = str_replace($r[0], '', $corps);
			# $j = Content-Type, et pas content-TYPE.
			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));

			if ($j=='X-Spip-Filtre' AND isset($headers[$j]))
				$headers[$j].="|".$r[3];
			else
				$headers[$j] = $r[3];
		}
	}
	// S'agit-il d'un resultat constant ou contenant du code php
	$process_ins = (
		strpos($corps,'<'.'?') === false
		OR strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false
	)
		? 'html'
		: 'php';

	// traiter #FILTRE{} ?
	if (isset($headers['X-Spip-Filtre'])
	AND strlen($headers['X-Spip-Filtre'])) {
		// proteger les <INCLUDE> et tous les morceaux de php
		if ($process_ins == 'php')
			$corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS',
				'echapper_php_callback', $corps);
		foreach (explode('|', $headers['X-Spip-Filtre']) as $filtre) {
			if ($f = chercher_filtre($filtre))
				$corps = $f($corps);
		}
		// restaurer les echappements
		$corps = echapper_php_callback($corps);
		unset($headers['X-Spip-Filtre']);
	}

	return array('texte' => $corps,
		'squelette' => $nom,
		'source' => $source,
		'process_ins' => $process_ins,
		'invalideurs' => $cache,
		'entetes' => $headers,
		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 
	);
}