Skip to content

Commit cd01bb0

Browse files
committed
UIMacros: added macro {templatePrint}
1 parent 7058edf commit cd01bb0

1 file changed

Lines changed: 54 additions & 0 deletions

File tree

src/Bridges/ApplicationLatte/UIMacros.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111

1212
use Latte;
1313
use Latte\CompileException;
14+
use Latte\Helpers;
1415
use Latte\MacroNode;
1516
use Latte\PhpWriter;
17+
use Nette\Application\UI\Presenter;
1618
use Nette\Utils\Strings;
1719

1820

@@ -44,6 +46,7 @@ public static function install(Latte\Compiler $compiler): void
4446
$me->addMacro('extends', [$me, 'macroExtends']);
4547
$me->addMacro('layout', [$me, 'macroExtends']);
4648
$me->addMacro('nonce', null, null, 'echo $this->global->uiNonce ? " nonce=\"{$this->global->uiNonce}\"" : "";');
49+
$me->addMacro('templatePrint', [$me, 'macroTemplatePrint'], null, null, self::ALLOWED_IN_HEAD);
4750
}
4851

4952

@@ -147,4 +150,55 @@ public function macroExtends(MacroNode $node, PhpWriter $writer)
147150
}
148151
$this->extends = $writer->write('$this->parentName = $this->global->uiPresenter->findLayoutTemplateFile();');
149152
}
153+
154+
155+
/**
156+
* {templatePrint [ClassName]}
157+
*/
158+
public function macroTemplatePrint(MacroNode $node, PhpWriter $writer)
159+
{
160+
$class = $node->tokenizer->fetchWord() ?: null;
161+
return $writer->write(__CLASS__ . '::macroTemplatePrintRuntime($this, %var)', $class);
162+
}
163+
164+
165+
/**
166+
* Generates blueprint of template class.
167+
*/
168+
public static function macroTemplatePrintRuntime(Latte\Runtime\Template $template, ?string $class): void
169+
{
170+
$types = array_map([Helpers::class, 'getType'], $template->getParameters());
171+
if ($template->getParameter('control') instanceof Presenter) {
172+
unset($types['control']);
173+
$subject = $template->getParameter('presenter');
174+
$class = $class ?: preg_replace('#Presenter$#', '', get_class($subject)) . ucfirst($subject->getView()) . 'Template';
175+
} else {
176+
unset($types['presenter']);
177+
$subject = $template->getParameter('control');
178+
$class = $class ?: preg_replace('#Control$#', '', get_class($subject)) . 'Template';
179+
}
180+
unset($types['user'], $types['baseUrl'], $types['basePath'], $types['flashes']);
181+
182+
ob_end_clean();
183+
header('Content-Type: text/plain');
184+
$parts = explode('\\', $class);
185+
$name = array_pop($parts);
186+
$namespace = implode('\\', $parts);
187+
$parent = Template::class;
188+
$subject = explode('\\', get_class($subject));
189+
$subject = end($subject);
190+
echo
191+
($namespace ? "namespace $namespace;\n\n" : '')
192+
. "class $name extends $parent\n"
193+
. "{\n" . Helpers::printProperties($types, true) . "\n}\n"
194+
. "\n\n"
195+
. "/**\n" . Helpers::printProperties($types, false) . "\n */\n"
196+
. "class $name extends $parent\n"
197+
. "{\n}\n"
198+
. "\n\n"
199+
. "/**\n * @property $name \$template\n */\n"
200+
. "class $subject\n"
201+
. "{\n}\n";
202+
exit;
203+
}
150204
}

0 commit comments

Comments
 (0)