You are here

function Smarty_Compiler::_compile_tag in Quiz 6.6

Same name and namespace in other branches
  1. 6.5 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__);
          }
        }
      }
  }
}