%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Bridges/FormsLatte/ |
| Current File : //www/varak.net/losik.varak.net/vendor/nette/forms/src/Bridges/FormsLatte/FormMacros.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\FormsLatte;
use Latte;
use Latte\CompileException;
use Latte\MacroNode;
use Latte\Macros\MacroSet;
use Latte\PhpWriter;
/**
* Latte v2 macros for Nette\Forms.
*
* - {form name} ... {/form}
* - {input name}
* - {label name /} or {label name}... {/label}
* - {inputError name}
* - {formContainer name} ... {/formContainer}
* - {formContext name} ... {/formContext}
*/
final class FormMacros extends MacroSet
{
public static function install(Latte\Compiler $compiler): void
{
$me = new static($compiler);
$me->addMacro('form', [$me, 'macroForm'], 'echo Nette\Bridges\FormsLatte\Runtime::renderFormEnd(array_pop($this->global->formsStack));');
$me->addMacro('formContext', [$me, 'macroFormContext'], 'array_pop($this->global->formsStack);');
$me->addMacro('formContainer', [$me, 'macroFormContainer'], 'array_pop($this->global->formsStack); $formContainer = end($this->global->formsStack)');
$me->addMacro('label', [$me, 'macroLabel'], [$me, 'macroLabelEnd'], null, self::AUTO_EMPTY);
$me->addMacro('input', [$me, 'macroInput']);
$me->addMacro('name', [$me, 'macroName'], [$me, 'macroNameEnd'], [$me, 'macroNameAttr']);
$me->addMacro('inputError', [$me, 'macroInputError']);
$me->addMacro('formPrint', [$me, 'macroFormPrint']);
$me->addMacro('formClassPrint', [$me, 'macroFormPrint']);
}
/********************* macros ****************d*g**/
/**
* {form ...}
*/
public function macroForm(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
if ($node->prefix) {
throw new CompileException('Did you mean <form n:name=...> ?');
}
$name = $node->tokenizer->fetchWord();
if ($name == null) { // null or false
throw new CompileException('Missing form name in ' . $node->getNotation());
}
$node->replaced = true;
$node->tokenizer->reset();
return $writer->write(
'echo Nette\Bridges\FormsLatte\Runtime::renderFormBegin($form = $this->global->formsStack[] = '
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %node.word) ? $ʟ_tmp : $this->global->uiControl[$ʟ_tmp]'
: '$this->global->uiControl[%node.word]')
. ', %node.array)'
. " /* line $node->startLine */;"
);
}
/**
* {formContext ...}
*/
public function macroFormContext(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
if ($node->prefix) {
throw new CompileException('Did you mean <form n:name=...> ?');
}
$name = $node->tokenizer->fetchWord();
if ($name == null) { // null or false
throw new CompileException('Missing form name in ' . $node->getNotation());
}
$node->tokenizer->reset();
return $writer->write(
'$form = $this->global->formsStack[] = '
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %node.word) ? $ʟ_tmp : $this->global->uiControl[$ʟ_tmp]'
: '$this->global->uiControl[%node.word]')
. " /* line $node->startLine */;"
);
}
/**
* {formContainer ...}
*/
public function macroFormContainer(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
$name = $node->tokenizer->fetchWord();
if ($name == null) { // null or false
throw new CompileException('Missing name in ' . $node->getNotation());
}
$node->tokenizer->reset();
return $writer->write(
'$this->global->formsStack[] = $formContainer = '
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %node.word) ? $ʟ_tmp : end($this->global->formsStack)[$ʟ_tmp]'
: 'end($this->global->formsStack)[%node.word]')
. " /* line $node->startLine */;"
);
}
/**
* {label ...}
*/
public function macroLabel(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
$words = $node->tokenizer->fetchWords();
if (!$words) {
throw new CompileException('Missing name in ' . $node->getNotation());
}
$node->replaced = true;
$name = array_shift($words);
return $writer->write(
($name[0] === '$'
? '$ʟ_input = is_object($ʟ_tmp = %0.word) ? $ʟ_tmp : end($this->global->formsStack)[$ʟ_tmp]; if ($ʟ_label = $ʟ_input'
: 'if ($ʟ_label = end($this->global->formsStack)[%0.word]'
)
. '->%1.raw) echo $ʟ_label'
. ($node->tokenizer->isNext() ? '->addAttributes(%node.array)' : ''),
$name,
$words ? ('getLabelPart(' . implode(', ', array_map([$writer, 'formatWord'], $words)) . ')') : 'getLabel()'
);
}
/**
* {/label}
*/
public function macroLabelEnd(MacroNode $node, PhpWriter $writer)
{
if ($node->content != null) {
$node->openingCode = rtrim($node->openingCode, '?> ') . '->startTag() ?>';
return $writer->write('if ($ʟ_label) echo $ʟ_label->endTag()');
}
}
/**
* {input ...}
*/
public function macroInput(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
$words = $node->tokenizer->fetchWords();
if (!$words) {
throw new CompileException('Missing name in ' . $node->getNotation());
}
$node->replaced = true;
$name = array_shift($words);
return $writer->write(
($name[0] === '$'
? '$ʟ_input = $_input = is_object($ʟ_tmp = %word) ? $ʟ_tmp : end($this->global->formsStack)[$ʟ_tmp]; echo $ʟ_input'
: 'echo end($this->global->formsStack)[%word]')
. '->%raw'
. ($node->tokenizer->isNext() ? '->addAttributes(%node.array)' : '')
. " /* line $node->startLine */;",
$name,
$words ? 'getControlPart(' . implode(', ', array_map([$writer, 'formatWord'], $words)) . ')' : 'getControl()'
);
}
/**
* <form n:name>, <input n:name>, <select n:name>, <textarea n:name>, <label n:name> and <button n:name>
*/
public function macroNameAttr(MacroNode $node, PhpWriter $writer)
{
$words = $node->tokenizer->fetchWords();
if (!$words) {
throw new CompileException('Missing name in ' . $node->getNotation());
}
$name = array_shift($words);
$tagName = strtolower($node->htmlNode->name);
$node->empty = $tagName === 'input';
$definedHtmlAttributes = array_keys($node->htmlNode->attrs);
if (isset($node->htmlNode->macroAttrs['class'])) {
$definedHtmlAttributes[] = 'class';
}
if ($tagName === 'form') {
$node->openingCode = $writer->write(
'<?php $form = $this->global->formsStack[] = '
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %0.word) ? $ʟ_tmp : $this->global->uiControl[$ʟ_tmp]'
: '$this->global->uiControl[%0.word]')
. " /* line $node->startLine */; ?>",
$name
);
return $writer->write(
'echo Nette\Bridges\FormsLatte\Runtime::renderFormBegin(end($this->global->formsStack), %0.var, false)',
array_fill_keys($definedHtmlAttributes, null)
);
} else {
$method = $tagName === 'label' ? 'getLabel' : 'getControl';
return $writer->write(
'$ʟ_input = $_input = '
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %0.word) ? $ʟ_tmp : end($this->global->formsStack)[$ʟ_tmp]'
: 'end($this->global->formsStack)[%0.word]')
. '; echo $ʟ_input->%1.raw'
. ($definedHtmlAttributes ? '->addAttributes(%2.var)' : '') . '->attributes()'
. " /* line $node->startLine */;",
$name,
$method . 'Part(' . implode(', ', array_map([$writer, 'formatWord'], $words)) . ')',
array_fill_keys($definedHtmlAttributes, null)
);
}
}
public function macroName(MacroNode $node, PhpWriter $writer)
{
if (!$node->prefix) {
throw new CompileException("Unknown tag {{$node->name}}, use n:{$node->name} attribute.");
} elseif ($node->prefix !== MacroNode::PREFIX_NONE) {
throw new CompileException("Unknown attribute n:{$node->prefix}-{$node->name}, use n:{$node->name} attribute.");
}
}
public function macroNameEnd(MacroNode $node, PhpWriter $writer)
{
$tagName = strtolower($node->htmlNode->name);
if ($tagName === 'form') {
$node->innerContent .= '<?php echo Nette\Bridges\FormsLatte\Runtime::renderFormEnd(array_pop($this->global->formsStack), false)'
. " /* line $node->startLine */; ?>";
} elseif ($tagName === 'label') {
if ($node->htmlNode->empty) {
$node->innerContent = "<?php echo \$ʟ_input->getLabelPart()->getHtml() /* line $node->startLine */; ?>";
}
} elseif ($tagName === 'button') {
if ($node->htmlNode->empty) {
$node->innerContent = $writer->write("<?php echo %escape(\$ʟ_input->getCaption()) /* line $node->startLine */; ?>");
}
} else { // select, textarea
$node->innerContent = "<?php echo \$ʟ_input->getControl()->getHtml() /* line $node->startLine */; ?>";
}
}
/**
* {inputError ...}
*/
public function macroInputError(MacroNode $node, PhpWriter $writer)
{
if ($node->modifiers) {
throw new CompileException('Modifiers are not allowed in ' . $node->getNotation());
}
$name = $node->tokenizer->fetchWord();
$node->replaced = true;
if (!$name) {
return $writer->write("echo %escape(\$ʟ_input->getError()) /* line $node->startLine */;");
} elseif ($name[0] === '$') {
return $writer->write(
'$ʟ_input = is_object($ʟ_tmp = %0.word) ? $ʟ_tmp : end($this->global->formsStack)[$ʟ_tmp];'
. "echo %escape(\$ʟ_input->getError()) /* line $node->startLine */;",
$name
);
} else {
return $writer->write("echo %escape(end(\$this->global->formsStack)[%0.word]->getError()) /* line $node->startLine */;", $name);
}
}
/**
* {formPrint ClassName}
* {formClassPrint ClassName}
*/
public function macroFormPrint(MacroNode $node, PhpWriter $writer)
{
$name = $node->tokenizer->fetchWord();
if ($name == null) { // null or false
throw new CompileException('Missing form name in ' . $node->getNotation());
}
$node->tokenizer->reset();
return $writer->write(
'Nette\Bridges\FormsLatte\Runtime::render' . $node->name . '('
. ($name[0] === '$'
? 'is_object($ʟ_tmp = %node.word) ? $ʟ_tmp : $this->global->uiControl[$ʟ_tmp]'
: '$this->global->uiControl[%node.word]')
. '); exit;'
);
}
}