/** * 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; } }