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