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; }
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; }
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; }