⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smarty_compiler.class.php

📁 通达OA官方提供的30源代码,感觉很实在
💻 PHP
📖 第 1 页 / 共 4 页
字号:
                        $this->_syntax_error("invalid attribute name - '$token'");                    break;                case 1:                    /* If the token is '=', then we go to state 2. */                    if ($token == '=') {                        $state = 2;                    } else                        $this->_syntax_error("expecting '=' after attribute name");                    break;                case 2:                    /* If token is not '=', we set the attribute value and go to                       state 0. */                    if ($token != '=') {                        /* We booleanize the token if it's a non-quoted possible                           boolean value. */                        if (preg_match('!^(on|yes|true)$!', $token))                            $token = true;                        else if (preg_match('!^(off|no|false)$!', $token))                            $token = false;                        /* If the token is not variable (doesn't start with                           '$', '#', or '%') and not enclosed in single or                           double quotes we single-quote it. */                        else if ($quote && !in_array($token{0}, $var_delims) &&                                 !(($token{0} == '"' || $token[0] == "'") &&                                 $token{strlen($token)-1} == $token{0}))                            $token = '"'.$token.'"';                        $attrs[$attr_name] = $token;                        $state = 0;                    } else                        $this->_syntax_error("'=' cannot be an attribute value");                    break;            }        }        $this->_parse_vars_props($attrs);        return $attrs;    }/*======================================================================*\    Function: _parse_vars_props    Purpose:  compile variables and section properties tokens into              PHP code\*======================================================================*/    function _parse_vars_props(&$tokens)    {        $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';        $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' .  $qstr_regexp . '|[^|]+))*)*$!', $tokens);        $conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);        $sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' .  $qstr_regexp .  '|[^|]+))*)*$!', $tokens);        if (count($var_exprs)) {            foreach ($var_exprs as $expr_index => $var_expr) {                $tokens[$expr_index] = $this->_parse_var($var_expr);            }        }        if (count($conf_var_exprs)) {            foreach ($conf_var_exprs as $expr_index => $var_expr) {                $tokens[$expr_index] = $this->_parse_conf_var($var_expr);            }        }        if (count($sect_prop_exprs)) {            foreach ($sect_prop_exprs as $expr_index => $section_prop_expr) {                $tokens[$expr_index] = $this->_parse_section_prop($section_prop_expr);            }        }    }/*======================================================================*\    Function: _parse_var    Purpose:  parse variable expression into PHP code\*======================================================================*/    function _parse_var($var_expr)    {        $parts = explode('|', substr($var_expr, 1), 2);        $var_ref = $parts[0];        $modifiers = isset($parts[1]) ? $parts[1] : '';        preg_match_all('!\[\w+(\.\w+)?\]|(->|\.)\w+|^\w+!', $var_ref, $match);        $indexes = $match[0];        $var_name = array_shift($indexes);        /* Handle $smarty.* variable references as a special case. */        if ($var_name == 'smarty') {            /*             * If the reference could be compiled, use the compiled output;             * otherwise, fall back on the $smarty variable generated at             * run-time.             */            if (($smarty_ref = $this->_compile_smarty_ref($indexes)) !== null) {                $output = $smarty_ref;            } else {                $var_name = substr(array_shift($indexes), 1);                $output = "\$this->_smarty_vars['$var_name']";            }        } else {            $output = "\$this->_tpl_vars['$var_name']";        }        foreach ($indexes as $index) {            if ($index{0} == '[') {                $index = substr($index, 1, -1);                if (is_numeric($index)) {                    $output .= "[$index]";                } else {                    $parts = explode('.', $index);                    $section = $parts[0];                    $section_prop = isset($parts[1]) ? $parts[1] : 'index';                    $output .= "[\$this->_sections['$section']['$section_prop']]";                }            } else if ($index{0} == '.') {                $output .= "['" . substr($index, 1) . "']";            } else {                $output .= $index;            }        }        $this->_parse_modifiers($output, $modifiers);        return $output;    }/*======================================================================*\    Function: _parse_conf_var    Purpose:  parse configuration variable expression into PHP code\*======================================================================*/    function _parse_conf_var($conf_var_expr)    {        $parts = explode('|', $conf_var_expr, 2);        $var_ref = $parts[0];        $modifiers = isset($parts[1]) ? $parts[1] : '';        $var_name = substr($var_ref, 1, -1);        $output = "\$this->_config[0]['vars']['$var_name']";        $this->_parse_modifiers($output, $modifiers);        return $output;    }/*======================================================================*\    Function: _parse_section_prop    Purpose:  parse section property expression into PHP code\*======================================================================*/    function _parse_section_prop($section_prop_expr)    {        $parts = explode('|', $section_prop_expr, 2);        $var_ref = $parts[0];        $modifiers = isset($parts[1]) ? $parts[1] : '';        preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);        $section_name = $match[1];        $prop_name = $match[2];        $output = "\$this->_sections['$section_name']['$prop_name']";        $this->_parse_modifiers($output, $modifiers);        return $output;    }/*======================================================================*\    Function: _parse_modifiers    Purpose:  parse modifier chain into PHP code\*======================================================================*/    function _parse_modifiers(&$output, $modifier_string)    {        $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';        preg_match_all('!\|(@?\w+)((?>:(?:'. $qstr_regexp . '|[^|]+))*)!', '|' . $modifier_string, $match);        list(, $modifiers, $modifier_arg_strings) = $match;        for ($i = 0; $i < count($modifiers); $i++) {            $modifier_name = $modifiers[$i];            preg_match_all('!:(' . $qstr_regexp . '|[^:]+)!', $modifier_arg_strings[$i], $match);            $modifier_args = $match[1];            if ($modifier_name{0} == '@') {                $map_array = 'false';                $modifier_name = substr($modifier_name, 1);            } else                $map_array = 'true';            /*             * First we lookup the modifier function name in the registered             * modifiers table.             */            @$mod_func_name = $this->custom_mods[$modifier_name];            /*             * If we don't find that modifier there, we assume it's just a PHP             * function name.             */            if (!isset($mod_func_name)) {                if ($this->security && !in_array($modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {                    $this->_syntax_error("(secure mode) modifier '$modifier_name' is not allowed", E_USER_WARNING);                    continue;                } else {                    $mod_func_name = $modifier_name;                }            }            if (!function_exists($mod_func_name)) {                $this->_syntax_error("modifier '$modifier_name' is not implemented", E_USER_WARNING);                continue;            }            $this->_parse_vars_props($modifier_args);            if (count($modifier_args) > 0)                $modifier_args = ', '.implode(', ', $modifier_args);            else                $modifier_args = '';            $output = "\$this->_run_mod_handler('$mod_func_name', $map_array, $output$modifier_args)";        }    }/*======================================================================*\    Function: _compile_smarty_ref    Purpose:  Compiles references of type $smarty.foo\*======================================================================*/    function _compile_smarty_ref(&$indexes)    {        /* Extract the reference name. */        $ref = substr($indexes[0], 1);        switch ($ref) {            case 'now':                $compiled_ref = 'time()';                if (count($indexes) > 1) {                    $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference');                }                break;            case 'foreach':            case 'section':                if ($indexes[1]{0} != '.') {                    $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference');                }                $name = substr($indexes[1], 1);                array_shift($indexes);                if ($ref == 'foreach')                    $compiled_ref = "\$this->_foreach['$name']";                else                    $compiled_ref = "\$this->_sections['$name']";                break;            /* These cases have to be handled at run-time. */            case 'env':            case 'get':            case 'post':            case 'cookies':            case 'server':            case 'session':            case 'request':            case 'capture':                return null;            default:                $this->_syntax_error('$smarty.' . $ref . ' is an unknown reference');                break;        }        array_shift($indexes);        return $compiled_ref;    }/*======================================================================*\    Function: _syntax_error    Purpose:  display Smarty syntax error\*======================================================================*/    function _syntax_error($error_msg, $error_type = E_USER_ERROR)    {        trigger_error("Smarty: [in " . $this->_current_file . " line " .                      $this->_current_line_no . "]: syntax error: $error_msg", $error_type);    }}/* vim: set et: */?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -