Location: PHPKode > scripts > TemplateBuilder > templatebuilder/TemplateBuilder.php
<?php

/*
+------------------------------------------------------------+
| Class TemplateBuilder - Version 2.5 - Copyright (C) 2002.  |
+------------------------------------------------------------+
| Authors: 						     |
| - Edson C. Melo <hide@address.com>	             |
| - Frederico R. Galvão <hide@address.com>	     |
+------------------------------------------------------------+
*/

Class TemplateBuilder
{
    var $start_tag = "<%";
    var $end_tag   = "%>";
    var $arquivo;
    var $buffer;
    var $line;
    var $BUGA_EXP;

    function print_error($msg)
    {
        echo("<font face=Verdana size=-2><b><font color=#ff0000>[Template Error]: </font></b>" . $msg . "</font><br><br>");
    }


    function print_file_info()
    {
        $size = filesize($this->arquivo);

	$note = "													 
		\r<!--												 
		\r::[Buga File Info]:::::::::::::::::::::::::::::::::
		\r::Arquivo:: $this->arquivo						 
		\r::Tamanho:: $size bytes							 
		\r:::::::::::::::::::::::::::::::::::::::::::::::::::
		\r!-->												 
	        ";

        print($note);
    }


    function parse_template($arquivo)
    {
        $this->arquivo = $arquivo;

	$fd = $this->open_file();

	$this->line = 0;
		
	while(!feof($fd))
	{
	    $this->line++;

	    $this->buffer = fgets($fd, 8192);
			
            $BUGA_TAG = strstr($this->buffer, $this->start_tag);
			
            if(!$BUGA_TAG)
                print($this->buffer);
	    else
		$this->interpreta_buga_exp();
        }

        fclose($fd);

        $this->print_file_info();
    }


    function open_file()
    {
	if(file_exists($this->arquivo))
	{
            if(is_readable($this->arquivo))
	    {
                $fd = fopen($this->arquivo, "r");

		if($fd)
		{
		    $ret = $fd;
		}
		else
		{
		    $ret = false;
		    $this->print_error($this->arquivo . " - Não foi possível abrir o arquivo!");
		    exit;
		}
            }
	    else
	    {
                $ret = false;
		$this->print_error($this->arquivo . " - Permissão negada para a leitura do arquivo!");
		exit;
            }
        }
	else
	{
	    $ret = false;
	    $this->print_error($this->arquivo . " - O arquivo não existe!");
	    exit;
	}

        return $ret;
    }

    function interpreta_buga_exp()
    {
        $n_char = strlen($this->buffer);

	if($n_char > 0)
	{
            $BUGA_TAG = strstr($this->buffer, $this->start_tag);
			
            if($BUGA_TAG)
	    {
                $start_position = strpos($this->buffer, $this->start_tag);

		if(strstr($this->buffer, $this->end_tag))
		    $end_position = strpos($this->buffer, $this->end_tag);
		else
		{
		    $this->print_error("Erro de sintaxe na linha : " . $this->line);
 		    exit;
		}

		for($i = 0; $i < $start_position; $i++)
		{
    		    print($this->buffer[$i]);
		}
				
		$this->BUGA_EXP = substr($this->buffer, ($start_position + 2), ($end_position - $start_position - 2));

		$check = $this->valida_sintaxe();
				
		if($check)
		{
 		    if($this->BUGA_EXP_TP == "Variável")
		        $parse = $this->parse_var();
		    else // $this->BUGA_EXP_TP == "Função"
		        $parse = $this->parse_func();

		    print($parse);

		    $this->buffer = substr($this->buffer, ($end_position + 2));

		    return $this->interpreta_buga_exp();						
                }
		else
		{
		    $this->print_error($this->BUGA_EXP_TP . " Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
		    exit;
		}
            }
	    else
	    {
	        print($this->buffer);
	    }
        }
    }


    function valida_sintaxe()
    {
        if(($this->BUGA_EXP[0] == "@") && (!strstr($this->BUGA_EXP, "(")) && (!strstr($this->BUGA_EXP, ")")))
	{
	    $this->BUGA_EXP_TP = "Variável";
		
            if((ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("[a-zA-Z_]$", $this->BUGA_EXP)) || (ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("[0-9_]$", $this->BUGA_EXP)) || (ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("]$", $this->BUGA_EXP)))
                $ret = true;
            else
		$ret = false;
        }
	else
	{
	    $this->BUGA_EXP_TP = "Função";
			
  	    if(ereg("^[a-zA-Z].+)$", $this->BUGA_EXP) || ereg("^@.+->[a-zA-Z].+)$", $this->BUGA_EXP))
                $ret = true;
	    else
		$ret = false;
	}

        return $ret;
    }


    function parse_var()
    {
        if((ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("[a-zA-Z_]$", $this->BUGA_EXP)) || (ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("[0-9_]$", $this->BUGA_EXP)) || (ereg("^@[a-zA-Z_]", $this->BUGA_EXP) && ereg("]$", $this->BUGA_EXP)))
        {
	    $this->BUGA_EXP = ereg_replace("@", "", $this->BUGA_EXP);

 	    if(!strstr($this->BUGA_EXP, "->") && !strstr($this->BUGA_EXP, "["))
	        return $this->call_var($this->BUGA_EXP, '', '', "N");
	    elseif(strstr($this->BUGA_EXP, "->"))
	    {
	        if(!strstr($this->BUGA_EXP, "[") && !strstr($this->BUGA_EXP, "]"))
		{
		    if(ereg("^(.+)->(.+)$", $this->BUGA_EXP, $arr))
		        return $this->call_var($arr[1], $arr[2], '', "O");
		    else
		    {
		        $this->print_error("Variável Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
			exit;
		    }
		}
		else
		{
		    if(ereg("^(.+)->(.+)\[(.+)\]$", $this->BUGA_EXP, $arr))
		    {
		        $arr[3] = ereg_replace("\"", "", $arr[3]);
			$arr[3] = ereg_replace("\'", "", $arr[3]);

			return $this->call_var($arr[1], $arr[2], $arr[3], "O");
		    }
		    else
		    {
		        $this->print_error("Variável Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
			exit;
		    }
		}
	    }
	    else // strstr($this->BUGA_EXP, "[")
	    {
	        if(ereg("^(.+)\[(.+)\]$", $this->BUGA_EXP, $arr))
		{
		    $arr[2] = ereg_replace("\"", "", $arr[2]);
		    $arr[2] = ereg_replace("\'", "", $arr[2]);

		    return $this->call_var($arr[1], $arr[2], '', "A");
		}
		else
		{
		    $this->print_error("Variável Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
		    exit;
		}
	    }
	}
	else
	{
	    $this->print_error("Variável Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
	    exit;
	}
    }


    function call_var($part_i, $part_m, $part_f, $tipo)
    {
        global $$part_i;
		
	if($tipo == "N")
	    return $$part_i;
	elseif($tipo == "A")
	{
 	    $var = $$part_i;
	    return $var[$part_m];
	}
	else // $tipo == "O"
	{
	    if($part_f == "")
	        return $$part_i->$part_m;
	    else
  	    {
	        $var = $$part_i->$part_m;
		return $var[$part_f];
	    }
	}
    }


    function parse_func()
    {
        $start_position = strpos($this->BUGA_EXP, "(");
	$end_position   = strpos($this->BUGA_EXP, ")");

	if(ereg("^@(.+)->(.+)\(", $this->BUGA_EXP, $arr))
	{
	    $this->is_class = true;

 	    $class_name = $arr[1];
	    $func_name  = $arr[2];
	}
	else
	{
	    $this->is_class = false;

	    $func_name = substr($this->BUGA_EXP, 0, $start_position);
	}

	if($start_position != ($end_position - 1))
	    $PARAMETER_LIST = substr($this->BUGA_EXP, ($start_position + 1), ($end_position - $start_position - 1));
	else
	    $PARAMETER_LIST = false;
		
	if($PARAMETER_LIST)
	{
	    $this->PARAMETERS = explode(",", $PARAMETER_LIST);
		
	    $N_PARAMETER = count($this->PARAMETERS);

	    $args = "";

	    $this->ARG = $this->interpreta_parameter($N_PARAMETER, $args);
	}
	else
	    $N_PARAMETER = 0;

	if($this->is_class)
	    return $this->call_func($N_PARAMETER, $class_name, $func_name);
	else
	    return $this->call_func($N_PARAMETER, '', $func_name);
    }


    function interpreta_parameter($N_PARAMETER, $argument)
    {
        if($N_PARAMETER == 0)
	{
	    return $argument;
	}
	else
	{
	    $atual_arg = array_shift($this->PARAMETERS);
	    $atual_arg = trim($atual_arg);

	    if($atual_arg[0] == "@")
	    {
	        $this->BUGA_EXP = $atual_arg;
		$parse          = $this->parse_var();
		$argument[]     = $parse;
	    }
	    elseif(($atual_arg[0] == "\"") || ($atual_arg[0] == "'"))
	    {
	        $atual_arg = ereg_replace("\"", "", $atual_arg);
		$atual_arg = ereg_replace("\'", "", $atual_arg);

		$argument[] = $atual_arg;
	    }
	    elseif(ereg("[0-9]", $atual_arg))
	    {
	        $argument[] = $atual_arg;
	    }
	    elseif(strstr($atual_arg, "(") && strstr($atual_arg, ")"))
	    {
		$this->BUGA_EXP = $atual_arg;

		$check = $this->valida_sintaxe();

		if($check)
		{
		    $parse = $this->parse_func();

		    $argument[] = $parse;
		}
		else
		{
		    $this->print_error("Função Inválida! Verifique sua sintaxe. ( <i>" . $this->BUGA_EXP . "</i> ) na linha : " . $this->line);
		    exit;
		}
	    }
	    else
	    {
	        $this->print_error("Argumento Inválido! Verifique sua sintaxe. ( <i>" . $atual_arg . "</i> ) na linha : " . $this->line);
		exit;
	    }

	    $N_PARAMETER--;

	    return $this->interpreta_parameter($N_PARAMETER, $argument);
	}
    }


    function call_func($N_PARAMETER, $class_name, $func_name)
    {
        global $$class_name;
	
	$list = ""; // variável utilizada na recursão da função  build_arg_list();
	
	if(!$class_name)
	{
 	    if(!$N_PARAMETER)
	        return $func_name();
	    else
		return $this->build_parameter_list($N_PARAMETER, '', $func_name, $list);
	}
	else
	{
	    if(!$N_PARAMETER)
	        return $$class_name->$func_name();
	    else
		return $this->build_parameter_list($N_PARAMETER, $class_name, $func_name, $list);
	}
    }


    function build_parameter_list($N_PARAMETER, $class_name, $func_name, $list)
    {
        global $$class_name;

	if($N_PARAMETER == 0)
	{
	    if(!$class_name)
	        return $func_name($list);
	    else
		return $$class_name->$func_name($list);
	}
	else
	{
	    $atual_arg = array_shift($this->ARG);

	    if(($N_PARAMETER - 1) == 0)
	        $list .= $atual_arg;
	    else
		$list .= $atual_arg . ", ";

	    $N_PARAMETER--;

	    return $this->build_parameter_list($N_PARAMETER, $class_name, $func_name, $list);
        }
    }	

}

?>
Return current item: TemplateBuilder