/** * Process Mustache section style * * @param Context $context current context * @param array $current section node data * * @throws \RuntimeException * @return mixed|string */ private function _mustacheStyleSection(Context $context, $current) { $sectionName = $current[Tokenizer::NAME]; // fallback to mustache style each/with/for just if there is // no argument at all. try { $sectionVar = $context->get($sectionName, false); } catch (\InvalidArgumentException $e) { throw new \RuntimeException(sprintf('"%s" is not registered as a helper', $sectionName)); } $buffer = ''; if (is_array($sectionVar) || $sectionVar instanceof \Traversable) { $isList = is_array($sectionVar) && array_keys($sectionVar) === range(0, count($sectionVar) - 1); $index = 0; $lastIndex = $isList ? count($sectionVar) - 1 : false; foreach ($sectionVar as $key => $d) { $specialVariables = array('@index' => $index, '@first' => $index === 0, '@last' => $index === $lastIndex); if (!$isList) { $specialVariables['@key'] = $key; } $context->pushSpecialVariables($specialVariables); $context->push($d); $buffer .= $this->render($context); $context->pop(); $context->popSpecialVariables(); $index++; } } elseif (is_object($sectionVar)) { //Act like with $context->push($sectionVar); $buffer = $this->render($context); $context->pop(); } elseif ($sectionVar) { $buffer = $this->render($context); } return $buffer; }