function Smarty_Compiler::_compile_tag in Quiz 6.5
Same name and namespace in other branches
- 6.6 includes/moodle/lib/smarty/Smarty_Compiler.class.php \Smarty_Compiler::_compile_tag()
Compile a template tag
Parameters
string $template_tag:
Return value
string
1 call to Smarty_Compiler::_compile_tag()
- Smarty_Compiler::_compile_file in includes/
moodle/ lib/ smarty/ Smarty_Compiler.class.php - compile a resource
File
- includes/
moodle/ lib/ smarty/ Smarty_Compiler.class.php, line 424
Class
- Smarty_Compiler
- Template compiling class @package Smarty
Code
function _compile_tag($template_tag) {
/* Matched comment. */
if ($template_tag[0] == '*' && $template_tag[strlen($template_tag) - 1] == '*') {
return '';
}
/* Split tag into two three parts: command, command modifiers and the arguments. */
if (!preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '|\\/?' . $this->_reg_obj_regexp . '|\\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
(?:\\s+(.*))?$
~xs', $template_tag, $match)) {
$this
->_syntax_error("unrecognized tag: {$template_tag}", E_USER_ERROR, __FILE__, __LINE__);
}
$tag_command = $match[1];
$tag_modifier = isset($match[2]) ? $match[2] : null;
$tag_args = isset($match[3]) ? $match[3] : null;
if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
/* tag name is a variable or object */
$_return = $this
->_parse_var_props($tag_command . $tag_modifier);
return "<?php echo {$_return}; ?>" . $this->_additional_newline;
}
/* If the tag name is a registered object, we process it. */
if (preg_match('~^\\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
return $this
->_compile_registered_object_tag($tag_command, $this
->_parse_attrs($tag_args), $tag_modifier);
}
switch ($tag_command) {
case 'include':
return $this
->_compile_include_tag($tag_args);
case 'include_php':
return $this
->_compile_include_php_tag($tag_args);
case 'if':
$this
->_push_tag('if');
return $this
->_compile_if_tag($tag_args);
case 'else':
list($_open_tag) = end($this->_tag_stack);
if ($_open_tag != 'if' && $_open_tag != 'elseif') {
$this
->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
}
else {
$this
->_push_tag('else');
}
return '<?php else: ?>';
case 'elseif':
list($_open_tag) = end($this->_tag_stack);
if ($_open_tag != 'if' && $_open_tag != 'elseif') {
$this
->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
}
if ($_open_tag == 'if') {
$this
->_push_tag('elseif');
}
return $this
->_compile_if_tag($tag_args, true);
case '/if':
$this
->_pop_tag('if');
return '<?php endif; ?>';
case 'capture':
return $this
->_compile_capture_tag(true, $tag_args);
case '/capture':
return $this
->_compile_capture_tag(false);
case 'ldelim':
return $this->left_delimiter;
case 'rdelim':
return $this->right_delimiter;
case 'section':
$this
->_push_tag('section');
return $this
->_compile_section_start($tag_args);
case 'sectionelse':
$this
->_push_tag('sectionelse');
return "<?php endfor; else: ?>";
break;
case '/section':
$_open_tag = $this
->_pop_tag('section');
if ($_open_tag == 'sectionelse') {
return "<?php endif; ?>";
}
else {
return "<?php endfor; endif; ?>";
}
case 'foreach':
$this
->_push_tag('foreach');
return $this
->_compile_foreach_start($tag_args);
break;
case 'foreachelse':
$this
->_push_tag('foreachelse');
return "<?php endforeach; else: ?>";
case '/foreach':
$_open_tag = $this
->_pop_tag('foreach');
if ($_open_tag == 'foreachelse') {
return "<?php endif; unset(\$_from); ?>";
}
else {
return "<?php endforeach; endif; unset(\$_from); ?>";
}
break;
case 'strip':
case '/strip':
if ($tag_command[0] == '/') {
$this
->_pop_tag('strip');
if (--$this->_strip_depth == 0) {
/* outermost closing {/strip} */
$this->_additional_newline = "\n";
return '{' . $tag_command . '}';
}
}
else {
$this
->_push_tag('strip');
if ($this->_strip_depth++ == 0) {
/* outermost opening {strip} */
$this->_additional_newline = "";
return '{' . $tag_command . '}';
}
}
return '';
case 'php':
/* handle folded tags replaced by {php} */
list(, $block) = each($this->_folded_blocks);
$this->_current_line_no += substr_count($block[0], "\n");
/* the number of matched elements in the regexp in _compile_file()
determins the type of folded tag that was found */
switch (count($block)) {
case 2:
/* comment */
return '';
case 3:
/* literal */
return "<?php echo '" . strtr($block[2], array(
"'" => "\\'",
"\\" => "\\\\",
)) . "'; ?>" . $this->_additional_newline;
case 4:
/* php */
if ($this->security && !$this->security_settings['PHP_TAGS']) {
$this
->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
return;
}
return '<?php ' . $block[3] . ' ?>';
}
break;
case 'insert':
return $this
->_compile_insert_tag($tag_args);
default:
if ($this
->_compile_compiler_tag($tag_command, $tag_args, $output)) {
return $output;
}
else {
if ($this
->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
}
else {
if ($this
->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
}
else {
$this
->_syntax_error("unrecognized tag '{$tag_command}'", E_USER_ERROR, __FILE__, __LINE__);
}
}
}
}
}