Example #1
0
 /**
  * Process handlebars section style
  *
  * @param Context $context current context
  * @param array   $current section node data
  *
  * @return mixed|string
  */
 private function _handlebarsStyleSection(Context $context, $current)
 {
     $helpers = $this->handlebars->getHelpers();
     $sectionName = $current[Tokenizer::NAME];
     if (isset($current[Tokenizer::END])) {
         $source = substr($this->getSource(), $current[Tokenizer::INDEX], $current[Tokenizer::END] - $current[Tokenizer::INDEX]);
     } else {
         $source = '';
     }
     // subexpression parsing loop
     // will contain all subexpressions
     // inside outermost brackets
     $subexprs = array();
     $insideOf = array('single' => false, 'double' => false);
     $lvl = 0;
     $cur_start = 0;
     for ($i = 0; $i < strlen($current[Tokenizer::ARGS]); $i++) {
         $cur = substr($current[Tokenizer::ARGS], $i, 1);
         if ($cur == "'") {
             $insideOf['single'] = !$insideOf['single'];
         }
         if ($cur == '"') {
             $insideOf['double'] = !$insideOf['double'];
         }
         if ($cur == '(' && !$insideOf['single'] && !$insideOf['double']) {
             if ($lvl == 0) {
                 $cur_start = $i + 1;
             }
             $lvl++;
             continue;
         }
         if ($cur == ')' && !$insideOf['single'] && !$insideOf['double']) {
             $lvl--;
             if ($lvl == 0) {
                 $subexprs[] = substr($current[Tokenizer::ARGS], $cur_start, $i - $cur_start);
             }
         }
     }
     if (!empty($subexprs)) {
         foreach ($subexprs as $expr) {
             $cmd = explode(" ", $expr);
             $name = trim($cmd[0]);
             // construct artificial section node
             $section_node = array(Tokenizer::TYPE => Tokenizer::T_ESCAPED, Tokenizer::NAME => $name, Tokenizer::OTAG => $current[Tokenizer::OTAG], Tokenizer::CTAG => $current[Tokenizer::CTAG], Tokenizer::INDEX => $current[Tokenizer::INDEX], Tokenizer::ARGS => implode(" ", array_slice($cmd, 1)));
             // resolve the node recursively
             $resolved = $this->_handlebarsStyleSection($context, $section_node);
             $resolved = addcslashes($resolved, '"');
             // replace original subexpression with result
             $current[Tokenizer::ARGS] = str_replace('(' . $expr . ')', '"' . $resolved . '"', $current[Tokenizer::ARGS]);
         }
     }
     $return = $helpers->call($sectionName, $this, $context, $current[Tokenizer::ARGS], $source);
     if ($return instanceof StringWrapper) {
         return $this->handlebars->loadString($return)->render($context);
     } else {
         return $return;
     }
 }