Haanga_Compiler::generate_op_block PHP Method

generate_op_block() protected method

.. {% endblock %} {{{
protected generate_op_block ( $details, &$body )
    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--;
    }