Ejemplo n.º 1
0
    /**
     * Finishes parsing.
     * @param  string
     * @return void
     */
    public function finalize(&$s)
    {
        // blocks closing check
        if (count($this->blocks) === 1) {
            // auto-close last block
            $s .= $this->parser->macro('/block');
        }
        // extends support
        if ($this->namedBlocks || $this->extends) {
            $s = '<?php
if ($_l->extends) {
	ob_start();
} elseif (isset($presenter, $control) && $presenter->isAjax() && $control->isControlInvalid()) {
	return Nette\\Latte\\DefaultMacros::renderSnippets($control, $_l, get_defined_vars());
}
?>' . $s . '<?php
if ($_l->extends) {
	ob_end_clean();
	Nette\\Latte\\DefaultMacros::includeTemplate($_l->extends, get_defined_vars(), $template)->render();
}
';
        } else {
            $s = '<?php
if (isset($presenter, $control) && $presenter->isAjax() && $control->isControlInvalid()) {
	return Nette\\Latte\\DefaultMacros::renderSnippets($control, $_l, get_defined_vars());
}
?>' . $s;
        }
        // named blocks
        if ($this->namedBlocks) {
            $uniq = $this->uniq;
            foreach (array_reverse($this->namedBlocks, TRUE) as $name => $foo) {
                $code =& $this->namedBlocks[$name];
                $namere = preg_quote($name, '#');
                $s = Strings::replace($s, "#{block {$namere}} \\?>(.*)<\\?php {/block {$namere}}#sU", function ($matches) use($name, &$code, $uniq) {
                    list(, $content) = $matches;
                    $func = '_lb' . substr(md5($uniq . $name), 0, 10) . '_' . preg_replace('#[^a-z0-9_]#i', '_', $name);
                    $code = "//\n// block {$name}\n//\n" . "if (!function_exists(\$_l->blocks[" . var_export($name, TRUE) . "][] = '{$func}')) { " . "function {$func}(\$_l, \$_args) { " . (PHP_VERSION_ID > 50208 ? 'extract($_args)' : 'foreach ($_args as $__k => $__v) $$__k = $__v') . ($name[0] === '_' ? '; $control->validateControl(' . var_export(substr($name, 1), TRUE) . ')' : '') . "\n?>{$content}<?php\n}}";
                    return '';
                });
            }
            $s = "<?php\n\n" . implode("\n\n\n", $this->namedBlocks) . "\n\n//\n// end of blocks\n//\n?>" . $s;
        }
        // internal state holder
        $s = "<?php\n" . '$_l = Nette\\Latte\\DefaultMacros::initRuntime($template, ' . var_export($this->extends, TRUE) . ', ' . var_export($this->uniq, TRUE) . '); unset($_extends);' . "\n?>" . $s;
    }