protected function generate_op_block($details, &$body)
{
if (is_array($details['name'])) {
$name = "";
foreach ($details['name'] as $part) {
if (is_string($part)) {
$name .= "{$part}";
} else {
if (is_array($part)) {
if (Haanga_AST::is_str($part)) {
$name .= "{$part['string']}";
} elseif (isset($part['object'])) {
$name .= "{$part['object']}";
} else {
throw new Exception("Invalid blockname");
}
}
}
$name .= ".";
}
$details['name'] = substr($name, 0, -1);
}
$this->in_block++;
$this->blocks[] = $details['name'];
$block_name = hvar('blocks', $details['name']);
$this->ob_start($body);
$buffer_var = 'buffer' . $this->ob_start;
$content = hcode();
$this->generate_op_code($details['body'], $content);
$body->append_ast($content);
$this->ob_start--;
$buffer = hvar($buffer_var);
/* {{{ */
/**
* isset previous block (parent block)?
* TRUE
* has reference to self::$block_var ?
* TRUE
* replace self::$block_var for current block value (buffer)
* FALSE
* print parent block
* FALSE
* print current block
*
*/
$declare = hexpr_cond(hexec('isset', $block_name), hexpr_cond(hexpr(hexec('strpos', $block_name, self::$block_var), '===', FALSE), $block_name, hexec('str_replace', self::$block_var, $buffer, $block_name)), $buffer);
/* }}} */
if (!$this->subtemplate) {
$this->do_print($body, $declare);
} else {
$body->decl($block_name, $declare);
if ($this->in_block > 1) {
$this->do_print($body, $block_name);
}
}
array_pop($this->blocks);
$this->in_block--;
}