%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/nette/application/src/Bridges/ApplicationLatte/ |
| Current File : //www/varak.net/losik.varak.net/vendor/nette/application/src/Bridges/ApplicationLatte/UIMacros.php |
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Nette\Bridges\ApplicationLatte;
use Latte;
use Latte\CompileException;
use Latte\MacroNode;
use Latte\PhpWriter;
use Nette\Utils\Strings;
/**
* Latte v2 tags for Nette\Application\UI.
*
* - {link destination ...} control link
* - {plink destination ...} presenter link
* - {snippet ?} ... {/snippet ?} control snippet
* - n:nonce
*/
final class UIMacros extends Latte\Macros\MacroSet
{
/** @var bool|string */
private $extends;
/** @var string|null */
private $printTemplate;
public static function install(Latte\Compiler $compiler): void
{
$me = new static($compiler);
$me->addMacro('control', [$me, 'macroControl']);
$me->addMacro('href', null, null, function (MacroNode $node, PhpWriter $writer) use ($me): string {
return ' ?> href="<?php ' . $me->macroLink($node, $writer) . ' ?>"<?php ';
});
$me->addMacro('plink', [$me, 'macroLink']);
$me->addMacro('link', [$me, 'macroLink']);
$me->addMacro('ifCurrent', [$me, 'macroIfCurrent'], '}'); // deprecated; use n:class="$presenter->linkCurrent ? ..."
$me->addMacro('extends', [$me, 'macroExtends']);
$me->addMacro('layout', [$me, 'macroExtends']);
$me->addMacro('nonce', null, null, 'echo $this->global->uiNonce ? " nonce=\"{$this->global->uiNonce}\"" : "";');
$me->addMacro('templatePrint', [$me, 'macroTemplatePrint'], null, null, self::ALLOWED_IN_HEAD);
}
/**
* Initializes before template parsing.
*/
public function initialize(): void
{
$this->extends = false;
}
/**
* Finishes template parsing.
* @return array(prolog, epilog)
*/
public function finalize()
{
if ($this->printTemplate) {
return ["Nette\\Bridges\\ApplicationLatte\\UIRuntime::printClass(\$this, $this->printTemplate); exit;"];
}
return [$this->extends . 'Nette\Bridges\ApplicationLatte\UIRuntime::initialize($this, $this->parentName, $this->blocks);'];
}
/********************* macros ****************d*g**/
/**
* {control name[:method] [params]}
*/
public function macroControl(MacroNode $node, PhpWriter $writer)
{
if ($node->context !== [Latte\Compiler::CONTENT_HTML, Latte\Compiler::CONTEXT_HTML_TEXT]) {
$escapeMod = Latte\Helpers::removeFilter($node->modifiers, 'noescape') ? '' : '|escape';
}
if ($node->modifiers) {
trigger_error('Modifiers are deprecated in ' . $node->getNotation(), E_USER_DEPRECATED);
}
$node->modifiers .= $escapeMod ?? '';
$words = $node->tokenizer->fetchWords();
if (!$words) {
throw new CompileException('Missing control name in {control}');
}
$name = $writer->formatWord($words[0]);
$method = ucfirst($words[1] ?? '');
$method = Strings::match($method, '#^\w*$#D')
? "render$method"
: "{\"render$method\"}";
$tokens = $node->tokenizer;
$pos = $tokens->position;
$wrap = false;
while ($tokens->nextToken()) {
if ($tokens->isCurrent('=>', '(expand)') && !$tokens->depth) {
$wrap = true;
break;
}
}
$tokens->position = $pos;
$param = $wrap ? $writer->formatArray() : $writer->formatArgs();
return "/* line $node->startLine */ "
. ($name[0] === '$' ? "if (is_object($name)) \$_tmp = $name; else " : '')
. '$_tmp = $this->global->uiControl->getComponent(' . $name . '); '
. 'if ($_tmp instanceof Nette\Application\UI\Renderable) $_tmp->redrawControl(null, false); '
. ($node->modifiers === ''
? "\$_tmp->$method($param);"
: $writer->write(
"ob_start(function () {}); \$_tmp->$method($param); \$ʟ_fi = new LR\\FilterInfo(%var); echo %modifyContent(ob_get_clean());",
Latte\Engine::CONTENT_HTML
)
);
}
/**
* {link destination [,] [params]}
* {plink destination [,] [params]}
* n:href="destination [,] [params]"
*/
public function macroLink(MacroNode $node, PhpWriter $writer)
{
$node->modifiers = preg_replace('#\|safeurl\s*(?=\||$)#Di', '', $node->modifiers);
return $writer->using($node, $this->getCompiler())
->write(
'echo %escape(%modify('
. ($node->name === 'plink' ? '$this->global->uiPresenter' : '$this->global->uiControl')
. '->link(%node.word, %node.array?)))'
. ($node->startLine ? " /* line $node->startLine */;" : ';')
);
}
/**
* {ifCurrent destination [,] [params]}
*/
public function macroIfCurrent(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
return $writer->write(
$node->args
? 'if ($this->global->uiPresenter->isLinkCurrent(%node.word, %node.array?)) {'
: 'if ($this->global->uiPresenter->getLastCreatedRequestFlag("current")) {'
);
}
/**
* {extends auto}
*/
public function macroExtends(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers || $node->parentNode || $node->args !== 'auto') {
return $this->extends = false;
}
$this->extends = $writer->write('$this->parentName = $this->global->uiPresenter->findLayoutTemplateFile();');
}
/**
* {templatePrint [parentClass | default]}
*/
public function macroTemplatePrint(MacroNode $node): void
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
$this->printTemplate = var_export($node->tokenizer->fetchWord() ?: null, true);
}
}