Example #1
0
function applique_filtres($p) {

	// Traitements standards (cf. supra)
	if ($p->etoile == '')
		$code = champs_traitements($p);
	else
		$code = $p->code;

	// Appliquer les filtres perso
	if ($p->param)
		$code = compose_filtres($p, $code);

	// S'il y a un lien avec la session, ajouter un code qui levera
	// un drapeau dans la structure d'invalidation $Cache
	if (isset($p->descr['session']))
		$code = "invalideur_session(\$Cache, $code)";

	// Securite
	if ($p->interdire_scripts
	AND $p->etoile != '**') {
		if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r))
			$code = "interdire_scripts($code)";
		else {
		  $code = interdire_scripts($r[2]);
		  $code = "sinon(interdire_scripts($r[1]),'$code')";
		}
	}
	return $code;
}
Example #2
0
function compile_cas($tableau, $descr, &$boucles, $id_boucle)
{
    $codes = array();
    // cas de la boucle recursive
    if (is_array($id_boucle)) {
        $id_boucle = $id_boucle[0];
    }
    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
    $tab = str_repeat("\t", ++$descr['niv']);
    $mode = _request('var_mode_affiche');
    $err_e_c = '';
    // chaque commentaire introduit dans le code doit commencer
    // par un caractere distinguant le cas, pour exploitation par debug.
    foreach ($tableau as $p) {
        switch ($p->type) {
            // texte seul
            case 'texte':
                $code = sandbox_composer_texte($p->texte, $p);
                $commentaire = strlen($p->texte) . " signes";
                $avant = '';
                $apres = '';
                $altern = "''";
                break;
            case 'polyglotte':
                $code = "";
                foreach ($p->traductions as $k => $v) {
                    $code .= ",'" . str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) . "' => '" . str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) . "'";
                }
                $code = "choisir_traduction(array(" . substr($code, 1) . "))";
                $commentaire = '&';
                $avant = '';
                $apres = '';
                $altern = "''";
                break;
                // inclure
            // inclure
            case 'include':
                $p->descr = $descr;
                $code = calculer_inclure($p, $boucles, $id_boucle);
                if ($code === false) {
                    $err_e_c = true;
                    $code = "''";
                } else {
                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
                    $avant = '';
                    $apres = '';
                    $altern = "''";
                }
                break;
                // boucle
            // boucle
            case TYPE_RECURSIF:
                $nom = $p->id_boucle;
                $newdescr = $descr;
                $newdescr['id_mere'] = $nom;
                $newdescr['niv']++;
                $avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
                $apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
                $newdescr['niv']--;
                $altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
                if ($avant === false or $apres === false or $altern === false) {
                    $err_e_c = true;
                    $code = "''";
                } else {
                    $code = 'BOUCLE' . str_replace("-", "_", $nom) . $descr['nom'] . '($Cache, $Pile, $doublons, $Numrows, $SP)';
                    $commentaire = "?{$nom}";
                    if (!$boucles[$nom]->milieu and $boucles[$nom]->type_requete != TYPE_RECURSIF) {
                        if ($altern != "''") {
                            $code .= "\n. {$altern}";
                        }
                        if ($avant != "''" or $apres != "''") {
                            spip_log("boucle {$nom} toujours vide, code superflu dans {$descr['sourcefile']}");
                        }
                        $avant = $apres = $altern = "''";
                    } else {
                        if ($altern != "''") {
                            $altern = "({$altern})";
                        }
                    }
                }
                break;
            case 'idiome':
                $l = array();
                $code = '';
                foreach ($p->arg as $k => $v) {
                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
                    if ($k) {
                        $l[] = _q($k) . ' => ' . $_v;
                    } else {
                        $code = $_v;
                    }
                }
                // Si le module n'est pas fourni, l'expliciter sauf si calculé
                if ($p->module) {
                    $m = $p->module . ':' . $p->nom_champ;
                } elseif ($p->nom_champ) {
                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
                } else {
                    $m = '';
                }
                $code = (!$code ? "'{$m}'" : ($m ? "'{$m}' . {$code}" : "(strpos(\$x={$code}, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")) . (!$l ? '' : ", array(" . implode(",\n", $l) . ")");
                $code = "_T({$code})";
                if ($p->param) {
                    $p->id_boucle = $id_boucle;
                    $p->boucles =& $boucles;
                    $code = compose_filtres($p, $code);
                }
                $commentaire = ":";
                $avant = '';
                $apres = '';
                $altern = "''";
                break;
            case 'champ':
                // cette structure pourrait etre completee des le phrase' (a faire)
                $p->id_boucle = $id_boucle;
                $p->boucles =& $boucles;
                $p->descr = $descr;
                #$p->interdire_scripts = true;
                $p->type_requete = $type;
                $code = calculer_champ($p);
                $commentaire = '#' . $p->nom_champ . $p->etoile;
                $avant = calculer_liste($p->avant, $descr, $boucles, $id_boucle);
                $apres = calculer_liste($p->apres, $descr, $boucles, $id_boucle);
                $altern = "''";
                // Si la valeur est destinee a une comparaison a ''
                // forcer la conversion en une chaine par strval
                // si ca peut etre autre chose qu'une chaine
                if (($avant != "''" or $apres != "''") and $code[0] != "'" and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code) and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code) and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
                    $code = "strval({$code})";
                }
                break;
            default:
                // Erreur de construction de l'arbre de syntaxe abstraite
                $code = "''";
                $p->descr = $descr;
                $err_e_c = _T('zbug_erreur_compilation');
                erreur_squelette($err_e_c, $p);
        }
        // switch
        if ($code != "''") {
            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
            $codes[] = $mode == 'validation' ? "array({$code}, '{$commentaire}', " . $p->ligne . ")" : ($mode == 'code' ? "\n// {$commentaire}\n{$code}" : $code);
        }
    }
    // foreach
    return $err_e_c ? false : $codes;
}
Example #3
0
function applique_filtres($p)
{
    // Traitements standards (cf. supra)
    if ($p->etoile == '') {
        $code = champs_traitements($p);
    } else {
        $code = $p->code;
    }
    // Appliquer les filtres perso
    if ($p->param) {
        $code = compose_filtres($p, $code);
    }
    // S'il y a un lien avec la session, ajouter un code qui levera
    // un drapeau dans la structure d'invalidation $Cache
    if (isset($p->descr['session'])) {
        $code = "invalideur_session(\$Cache, {$code})";
    }
    $code = sandbox_composer_interdire_scripts($code, $p);
    return $code;
}