func_format=$func_format;
$this->var_format=$var_format;
$this->var_return='';
$this->in_relation = $in_relation;
$this->erreur = 0;
}
public function exec_function($function_name, $param_name, $param_number) {
if($this->in_relation == false || ($this->in_relation== true && $function_name != "get_childs_in_tpl" && $function_name != "get_parents_in_tpl")){
if(empty($this->func_format[$function_name])) return " $function_name not found ";
$ret = $this->func_format[$function_name]( $param_name, $this);
return $ret;
}else{
return "";
}
}
public function exec($cmd, & $i) {
$state = 0;
$ret = "";
$function_name='';
$param_uneval='';
$strlen_cmd = strlen($cmd);
for ($i; $i < $strlen_cmd; $i++) {
switch ($state) {
case '0' : //state Normal
switch ($cmd[$i]) {
case '$' :
$state = "get_param_name";
$param_name = '';
break;
case '#' :
$state = "get_token";
break;
default :
break;
}
break;
case 'get_token' : //get param name
if(isset($cmd[$i -2]) && ($cmd[$i -2] == '&') && ($cmd[$i -1] == '#') && preg_match('/[0-9]/',$cmd[$i])){//Il n'y a pas de fonction commençant par un chiffre, il s'agit d'une entité html
return "#".$cmd[$i];
break;
}
switch ($cmd[$i]) {
case ' ' :
case '"' :
case "'" :
case '<' :
case '>' :
case "\r" :
case "\n" :
case "\t" :
return "#".$function_name.$cmd[$i]; //La liste de caractères précédente permet de déterminer qu'on doit sortir de l'interpretation
break;
case '{' :
if ($cmd[$i -1] == '#') { // fin d'un parametre à ne pas évaluer par };
$state='get_sub_param';
}else{
return $function_name.'{';
}
break;
case '(' :
$param_number = 0;
$param_name[$param_number] = '';
$state = "get_function_param";
if(($function_name == "SET") || ($function_name == "set")) $this->var_set=1;
elseif(empty($this->func_format[$function_name])) return "#".$function_name.$cmd[$i]; // ce n'est pas une fonction existante, on retourne la chaine
break;
default :
$function_name .= $cmd[$i];
break;
}
break;
case 'get_sub_param' :
switch ($cmd[$i]) {
case '}' :
if ($cmd[$i +1] == ';') { // fin d'un parametre à ne pas évaluer par };
$i++;
return $param_uneval;
}
//break; -> Il faut garder le } si il n'est pas suivit d'un ; voir expl de {explnum_id} ci-dessous
//Expl: #group(#linked_id(down,a,d);,0,
,#{- #title();};);
default:
$param_uneval.=$cmd[$i];
$state='get_sub_param';
break;
}
break;
case 'get_param_name' : //get param name
switch ($cmd[$i]) {
case ' ' :
case '"' :
case "'" :
case '<' :
case '>' :
case "\r" :
case "\n" :
case "\t" :
return "$".$param_name.$cmd[$i];
break;
case ';' :
if($this->var_set){
$this->var_set_name=$param_name;
$this->var_set=0;
}
return ($this->var_format[$param_name]);
break;
case '=' :
$this->var_return=$param_name;
return ($param_name);
break;
default :
$param_name .= $cmd[$i];
break;
}
break;
case 'get_function_name' : //get param name
switch ($cmd[$i]) {
case ' ' :
case '"' :
case "'" :
case '<' :
case '>' :
case "\r" :
case "\n" :
case "\t" :
case ";" :
return "#".$function_name.$cmd[$i];
break;
case '(' :
$param_number = 0;
$param_name[$param_number] = '';
$state = "get_function_param";
if(($function_name == "SET") || ($function_name == "set")) $this->var_set=1;
break;
default :
$function_name .= $cmd[$i];
break;
}
break;
case 'get_function_param' : //get param name
switch ($cmd[$i]) {
case '$' :
if($param_name[$param_number])$param_name[$param_number] .= $this->exec($cmd, $i);
else $param_name[$param_number]= $this->exec($cmd, $i);
break;
case '#' :
if($param_name[$param_number])$param_name[$param_number] .= $this->exec($cmd, $i);
else $param_name[$param_number]= $this->exec($cmd, $i);
break;
case ')' :
if ($cmd[$i +1] == ';') { // fin d'une fonction par );
$i++;
if(($function_name == "SET") || ($function_name == "set")) {
$this->var_format[$this->var_set_name]=$param_name[1];
eval( "global \$".$param_name[0].";\$".$param_name[0]."=\"".$param_name[1]."\";");
$this->var_set=0;
return '';
}else
return ($this->exec_function($function_name, $param_name, $param_number));
} else {
$param_name[$param_number] .= ')';
}
break;
case ',' :
$param_number++;
$param_name[$param_number] = '';
break;
default :
if( ($cmd[$i]=='\\') && ( ($i+1) < $strlen_cmd) )$i++;
$param_name[$param_number] .= $cmd[$i];
break;
}
break;
default :
break;
}
}
return $ret;
}
public function exec_cmd($no_escape=false) {
$cmd=$this->cmd;
$strlen_cmd = strlen($cmd);
$ret = "";
for ($i = 0; $i < $strlen_cmd; $i++) {
switch ($cmd[$i]) {
case '$' :
if (isset($cmd[$i+1]) && ($cmd[$i+1] == '('|| $cmd[$i+1] == '=' )) {
$ret .= '$'; // cas de jQuery de type : "$(this).hide();" ou d'une règle CSS de type "[id$=_footer]"
break;
}
case '#' :
$return = $this->exec($cmd, $i);
if(!$this->var_return){
//C'est le retour pour afficher
$ret .=$return;
}else{
//C'est une affectation d'une variable
$this->var_format[$this->var_return]=$this->exec($cmd, $i);
$this->var_return='';
}
if ($this->erreur == 1) {
return -1;
}
break;
default :
if (!$no_escape) if( ($cmd[$i]=='\\') && ( ($i+1) < $strlen_cmd) )$i++;
$ret .= $cmd[$i];
break;
}
}
return $ret;
}
public function exec_cmd_conso() {
$ret='';
$cmd=$this->cmd;
$strlen_cmd = strlen($cmd);
//$ret = "";
for ($i = 0; $i < $strlen_cmd; $i++) {
switch ($cmd[$i]) {
case '$' :
case '#' :
$return = $this->exec($cmd, $i);
if(!$this->var_return && !is_array($return) ){
//C'est le retour pour afficher
$ret .=$return;
} elseif(is_array($return)){
$ret = $return;
} else{
//C'est une affectation d'une variable
$this->var_format[$this->var_return]=$this->exec($cmd, $i);
$this->var_return='';
}
if ($this->erreur == 1) {
return -1;
}
break;
default :
if( ($cmd[$i]=='\\') && ( ($i+1) < $strlen_cmd) )$i++;
$ret .= $cmd[$i];
break;
}
}
return $ret;
}
public static function get_instance($filename='interpreter.inc.php',$in_relation=false) {
if(!isset(static::$instances[$filename][$in_relation])) {
static::$instances[$filename][$in_relation] = new parse_format($filename,$in_relation);
}
return static::$instances[$filename][$in_relation];
}
}