Skip to content
tpl.inc.php 53.3 KiB
Newer Older
tbrehm's avatar
tbrehm committed
            }

            if (count($this->_namespace) == 0 || $namespace == 'global') return '$this->_vars[\''.$varname.'\']'.$comp_str;
            $retstr = '$this->_arrvars';
            $numnamespaces = count($this->_namespace);
            for ($i=0; $i < $numnamespaces; $i++) {
                if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) {
                    $retstr .= "['".$namespace."'][\$_".$i."]";
                    break 1;
pedro_morgan's avatar
pedro_morgan committed
                } else {
tbrehm's avatar
tbrehm committed
                    $retstr .= "['".$this->_namespace[$i]."'][\$_".$i."]";
                }
            }
            if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) {
                return '(('.$retstr.'[\''.$varname.'\'] !== null) ? '.$retstr.'[\''.$varname.'\'] : $this->_vars[\''.$varname.'\'])'.$comp_str;
pedro_morgan's avatar
pedro_morgan committed
            } else {
tbrehm's avatar
tbrehm committed
                return $retstr."['".$varname."']".$comp_str;
            }
        }


        /**
         * returns a string used for parsing in tmpl_loop statements.
         * @param string $varname
         * @access private
         * @return string used for eval'ing
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _parseLoop ($varname)
        {
tbrehm's avatar
tbrehm committed
            array_push($this->_namespace, $varname);
            $tempvar = count($this->_namespace) - 1;
            $retstr = "for (\$_".$tempvar."=0 ; \$_".$tempvar." < count(\$this->_arrvars";
            for ($i=0; $i < count($this->_namespace); $i++) {
                $retstr .= "['".$this->_namespace[$i]."']";
                if ($this->_namespace[$i] != $varname) $retstr .= "[\$_".$i."]";
            }
            return $retstr."); \$_".$tempvar."++) {";
        }

        /**
         * returns a string used for parsing in tmpl_var statements.
         * @param string $wholetag
         * @param string $tag
         * @param string $varname
         * @param string $escape
         * @param string $format
         * @param string $namespace
         * @access private
         * @return string used for eval'ing
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _parseVar ($wholetag, $tag, $varname, $escape, $format, $namespace)
        {
tbrehm's avatar
tbrehm committed
            if (!empty($namespace)) $namespace = substr($namespace, 0, -1);
            $wholetag = stripslashes($wholetag);

            if (count($this->_namespace) == 0 || $namespace == 'global') {
                $var1 = '$this->_vars[\''.$varname.'\']';
pedro_morgan's avatar
pedro_morgan committed
            } else {
tbrehm's avatar
tbrehm committed
                $var1build = "\$this->_arrvars";
                $numnamespaces = count($this->_namespace);
                for ($i=0; $i < $numnamespaces; $i++) {
                    if ($this->_namespace[$i] == $namespace || (($i + 1) == $numnamespaces && !empty($namespace))) {
                        $var1build .= "['".$namespace."'][\$_".$i."]";
                        break 1;
pedro_morgan's avatar
pedro_morgan committed
                    } else {
tbrehm's avatar
tbrehm committed
                        $var1build .= "['".$this->_namespace[$i]."'][\$_".$i."]";
                    }
                }
                $var1 = $var1build . "['$varname']";
                if ($this->OPTIONS['GLOBAL_VARS'] && empty($namespace)) {
                    $var2 = '$this->_vars[\''.$varname.'\']';
                }
            }

            $beforevar = '';
            $aftervar  = '';
            if (!empty($escape)&& isset($this->ESCAPE_TAGS[$escape])) {
                $beforevar .= $this->ESCAPE_TAGS[$escape]['open'];
                $aftervar   = $this->ESCAPE_TAGS[$escape]['close'] . $aftervar;
            }

            if (!empty($format)&& isset($this->FORMAT_TAGS[$format])) {
                $beforevar .= $this->FORMAT_TAGS[$format]['open'];
                $aftervar   = $this->FORMAT_TAGS[$format]['close'] . $aftervar;
            }

pedro_morgan's avatar
pedro_morgan committed
            //* build return values
tbrehm's avatar
tbrehm committed
            $retstr  = 'if ('.$var1.' !== null) { ';
            $retstr .= 'print('.$beforevar.$var1.$aftervar.'); ';
            $retstr .= '}';

            if (@$var2) {
                $retstr .= ' elseif ('.$var2.' !== null) { ';
                $retstr .= 'print('.$beforevar.$var2.$aftervar.'); ';
                $retstr .= '}';
            }

            switch (strtolower($this->OPTIONS['UNKNOWNS'])) {
                case 'comment':
                    $comment = addcslashes('<!-- unknown variable '.preg_replace('/<!--|-->/', '', $wholetag).'//-->', '"');
tbrehm's avatar
tbrehm committed
                    $retstr .= ' else { print("'.$comment.'"); $this->_setUnknown("'.$varname.'"); }';
                    return $retstr;
tbrehm's avatar
tbrehm committed
                case 'leave':
                    $retstr .= ' else { print("'.addcslashes($wholetag, '"').'"); $this->_setUnknown("'.$varname.'"); }';
                    return $retstr;
tbrehm's avatar
tbrehm committed
                case 'print':
                    $retstr .= ' else { print("'.htmlspecialchars($wholetag, ENT_QUOTES).'"); $this->_setUnknown("'.$varname.'"); }';
                    return $retstr;

                case 'ignore':
                    return $retstr;
tbrehm's avatar
tbrehm committed
                case 'remove':
                default:
                    $retstr .= ' else { $this->_setUnknown("'.$varname.'"); }';
                    return $retstr;
tbrehm's avatar
tbrehm committed
            }
        }

        /**
         * takes values from preg_replace in $this->_intparse() and determines
         * the replace string.
         *
         * @param array $args array of all matches found by preg_replace
         * @access private
         * @return string replace values
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _parseTag ($args)
        {
tbrehm's avatar
tbrehm committed
            $wholetag = $args[0];
            $openclose = $args[1];
            $tag = strtolower($args[2]);
            $newline = $args[9];

            if ($tag == 'else') return '<?php } else { ?>'.$newline;
            if ($tag == 'tmpl_include') return $wholetag; // ignore tmpl_include tags

            if (preg_match("/^<\/|{\/|<!--\/$/s", $openclose) || preg_match("/^end[if|loop|unless|comment]$/", $tag)) {
                if ($tag == 'loop' || $tag == 'endloop') array_pop($this->_namespace);
                if ($tag == 'comment' || $tag == 'endcomment') {
                    return '<?php */ ?>'.$newline;
pedro_morgan's avatar
pedro_morgan committed
                } else {
tbrehm's avatar
tbrehm committed
                    return '<?php } ?>'.$newline;
                }
            }

pedro_morgan's avatar
pedro_morgan committed
            //* arrange attributes
tbrehm's avatar
tbrehm committed
            for ($i=3; $i < 8; $i=($i+2)) {
                if (empty($args[$i]) && empty($args[($i+1)])) break;
                $key = (empty($args[$i])) ? 'name' : strtolower($args[$i]);
                if ($key == 'name' && preg_match('/^(php)?include$/', $tag)) $key = 'file';
                $$key = $args[($i+1)];
            }

            $var = ($this->OPTIONS['CASELESS']) ? strtolower($name) : $name;

            if ($this->_debug && !empty($var)) {
                if (preg_match("/^global\.([A-Za-z_]+[_A-Za-z0-9]*)$/", $var, $matches)) $var2 = $matches[1];
                if (empty($this->_debugTemplatevars[$tag])) $this->_debugTemplatevars[$tag] = array();
                if (!isset($var2)) $var2 = $var;
                if (!in_array($var2, $this->_debugTemplatevars[$tag])) array_push($this->_debugTemplatevars[$tag], $var2);
            }

            if (preg_match("/^([A-Za-z_]+[_A-Za-z0-9]*(\.)+)?([A-Za-z_]+[_A-Za-z0-9]*)$/", $var, $matches)) {
                $var = $matches[3];
                $namespace = $matches[1];
            }


pedro_morgan's avatar
pedro_morgan committed
            //* return correct string (tag dependent)
tbrehm's avatar
tbrehm committed
            switch ($tag) {
                case 'var':
                    if (empty($escape) && (!empty($this->OPTIONS['DEFAULT_ESCAPE']) && strtolower($this->OPTIONS['DEFAULT_ESCAPE']) != 'none')) {
                        $escape = strtolower($this->OPTIONS['DEFAULT_ESCAPE']);
                    }
                    return '<?php '.$this->_parseVar ($wholetag, $tag, $var, @$escape, @$format, @$namespace)." ?>$newline";

                case 'if':
                    return '<?php if ('. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;

                case 'unless':
                      return '<?php if (!'. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;

                case 'elseif':
                      return '<?php } elseif ('. $this->_parseIf($var, @$value, @$op, @$namespace) .') { ?>'.$newline;

                case 'loop':
                      return '<?php '. $this->_parseLoop($var) .'?>'.$newline;

                case 'comment':
                    if (empty($var)) { // full open/close style comment
                        return '<?php /* ?>'.$newline;
pedro_morgan's avatar
pedro_morgan committed
                    } else { // just ignore tag if it was a one line comment
tbrehm's avatar
tbrehm committed
                        return;
                    }

                case 'phpinclude':
                	if ($this->OPTIONS['ENABLE_PHPINCLUDE']) {
                    	return '<?php include(\''.$file.'\'); ?>'.$newline;
                    }

                case 'include':
                    return '<?php $this->_getData($this->_fileSearch(\''.$file.'\'), 1); ?>';
                
                case 'dyninclude':
                    return '<?php $this->_getData($this->_fileSearch($this->_dyninclude[\''.$name.'\']), 1); ?>';

                default:
                    if ($this->OPTIONS['STRICT']) vlibTemplateError::raiseError('VT_ERROR_INVALID_TAG', KILL, htmlspecialchars($wholetag, ENT_QUOTES));
                break;
            }

        }

        /**
         * Parses $this->_tmplfile into correct format for eval() to work
         * Called by $this->_parse(), or $this->fastPrint, this replaces all <tmpl_*> references
         * with their correct php representation, i.e. <tmpl_var title> becomes $this->vars['title']
         * Sets final parsed file to $this->_tmplfilep.
         *
         * @access private
         * @return boolean true/false
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _intParse ()
        {
tbrehm's avatar
tbrehm committed
            $mqrt = get_magic_quotes_runtime();
            set_magic_quotes_runtime(0);
            $this->_tmplfilep = '?>'.$this->_getData($this->_tmplfilename).'<?php return true;';
            set_magic_quotes_runtime($mqrt);
            return true;
        }

        /**
         * Calls _intParse, and eval()s $this->tmplfilep
         * and outputs the results to $this->tmploutput
         *
         * @param bool compress whether to compress contents
         * @access private
         * @return boolean true/false
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _parse ($compress = '')
        {
tbrehm's avatar
tbrehm committed
            if (!$this->_parsed) {
                if ($this->OPTIONS['TIME_PARSE']) $this->_firstparsetime = $this->_getMicroTime();

                $this->_intParse();
                $this->_parsed = true;

                if ($this->OPTIONS['TIME_PARSE']) $this->_totalparsetime = ($this->_getMicroTime() - $this->_firstparsetime);
                if ($this->OPTIONS['TIME_PARSE'] && $this->OPTIONS['GLOBAL_CONTEXT_VARS']) $this->setVar('__PARSE_TIME__', $this->getParseTime());
            }
			
			// ob_start($compress);
            ob_start();

                array_push($this->_currentincludedir, dirname($this->_tmplfilename));
                $this->_includedepth++;
                $success = @eval($this->_tmplfilep);
                $this->_includedepth--;
                array_pop($this->_currentincludedir);

                if ($this->_debug) $this->doDebug();
                if (!$success) vlibTemplateError::raiseError('VT_ERROR_PARSE', FATAL);
                $this->_tmploutput .= ob_get_contents();
            ob_end_clean();
            return true;
        }

        /**
         * Sets one or more of the boolean options 1/0, that control certain actions in the template.
         * Use of this function:
         * either: vlibTemplate::_setOptions(string option_name, bool option_val [, string option_name, bool option_val ..]);
         * or      vlibTemplate::_setOptions(array);
         *          with an associative array where the key is the option_name
         *          and the value is the option_value.
         *
         * @param mixed (mulitple)
         * @return bool true/false
         * @access private
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _setOption() 
        {
tbrehm's avatar
tbrehm committed
            $numargs = func_num_args();
            if ($numargs < 1) {
                vlibTemplateError::raiseError('VT_ERROR_WRONG_NO_PARAMS', null, '_setOption()');
                return false;
            }

            if ($numargs == 1) {
                $options = func_get_arg(1);
                if (is_array($options)) {
                    foreach ($options as $k => $v) {
                        if ($v != null) {
                            if(in_array($k, array_keys($this->OPTIONS))) $this->OPTIONS[$k] = $v;
pedro_morgan's avatar
pedro_morgan committed
                        } else {
tbrehm's avatar
tbrehm committed
                            continue;
                        }
                    }
pedro_morgan's avatar
pedro_morgan committed
                } else {
tbrehm's avatar
tbrehm committed
                    vlibTemplateError::raiseError('VT_ERROR_WRONG_NO_PARAMS', null, '_setOption()');
                    return false;
                }
pedro_morgan's avatar
pedro_morgan committed
            }elseif (is_int($numargs / 2)) {
tbrehm's avatar
tbrehm committed
                for ($i = 0; $i < $numargs; $i=($i+2)) {
                    $k  = func_get_arg($i);
                    $v = func_get_arg(($i+1));
                    if ($v != null) {
                        if(in_array($k, array_keys($this->OPTIONS))) $this->OPTIONS[$k] = $v;
                    }
                }
pedro_morgan's avatar
pedro_morgan committed
            } else {
tbrehm's avatar
tbrehm committed
                vlibTemplateError::raiseError('VT_ERROR_WRONG_NO_PARAMS', null, '_setOption()');
                return false;
            }
            return true;
        }

        /**
         * Used during parsing, this function sets an unknown var checking to see if it
         * has been previously set.
         * @param string var
         * @access private
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _setUnknown($var) 
        {
tbrehm's avatar
tbrehm committed
            if (!in_array($var, $this->_unknowns)) array_push($this->_unknowns, $var);
        }

        /**
         * Returns microtime as a float number
         * @return float microtime
         * @access private
         */
pedro_morgan's avatar
pedro_morgan committed
        private function _getMicrotime() 
        {
            list($msec, $sec) = explode(' ',microtime());
tbrehm's avatar
tbrehm committed
            return ((float)$msec + (float)$sec);
        }

        /**
         * Returns str encoded to hex code.
         * @param string str to be encoded
         * @param bool true/false specify whether to use hex_entity
         * @return string encoded in hex
         * @access private
         */
pedro_morgan's avatar
pedro_morgan committed
        private  function _escape_hex($str = '', $entity = false) {
tbrehm's avatar
tbrehm committed
            $prestr = $entity ? '&#x' : '%';
            $poststr= $entity ? ';' : '';
            for ($i=0; $i < strlen($str); $i++) {
                $return .= $prestr.bin2hex($str[$i]).$poststr;
            }
            return $return;
        }

    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The following functions have no use and are included just so that if the user
    is making use of vlibTemplateCache functions, this doesn't crash when changed to
    vlibTemplate if the user is quickly bypassing the vlibTemplateCache class.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
        function clearCache()        {vlibTemplateError::raiseError('VT_WARNING_NOT_CACHE_OBJ', WARNING, 'clearCache()');}
        function recache()           {vlibTemplateError::raiseError('VT_WARNING_NOT_CACHE_OBJ', WARNING, 'recache()');}
        function setCacheLifeTime()  {vlibTemplateError::raiseError('VT_WARNING_NOT_CACHE_OBJ', WARNING, 'setCacheLifeTime()');}
        function setCacheExtension() {vlibTemplateError::raiseError('VT_WARNING_NOT_CACHE_OBJ', WARNING, 'setCacheExtension()');}
pedro_morgan's avatar
pedro_morgan committed
    } // << end class Def
tbrehm's avatar
tbrehm committed

    //include_once (ISPC_CLASS_PATH.'/vlibTemplate/debug.php');
    include_once (ISPC_CLASS_PATH.'/tpl_cache.inc.php');
tbrehm's avatar
tbrehm committed

} // << end if(!defined())..
?>