Skip to content

Commit 820b921

Browse files
committed
UIMacros: overloaded macro {templatePrint}
1 parent 2061c40 commit 820b921

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"nette/forms": "^3.0",
3232
"nette/robot-loader": "^3.2",
3333
"nette/security": "^3.0",
34-
"latte/latte": "^2.6.2",
34+
"latte/latte": "^2.7",
3535
"tracy/tracy": "^2.6",
3636
"mockery/mockery": "^1.0",
3737
"phpstan/phpstan-nette": "^0.12"

src/Bridges/ApplicationLatte/UIMacros.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ final class UIMacros extends Latte\Macros\MacroSet
2929
/** @var bool|string */
3030
private $extends;
3131

32+
/** @var string|null */
33+
private $printTemplate;
34+
3235

3336
public static function install(Latte\Compiler $compiler): void
3437
{
@@ -44,6 +47,7 @@ public static function install(Latte\Compiler $compiler): void
4447
$me->addMacro('extends', [$me, 'macroExtends']);
4548
$me->addMacro('layout', [$me, 'macroExtends']);
4649
$me->addMacro('nonce', null, null, 'echo $this->global->uiNonce ? " nonce=\"{$this->global->uiNonce}\"" : "";');
50+
$me->addMacro('templatePrint', [$me, 'macroTemplatePrint'], null, null, self::ALLOWED_IN_HEAD);
4751
}
4852

4953

@@ -62,6 +66,9 @@ public function initialize(): void
6266
*/
6367
public function finalize()
6468
{
69+
if ($this->printTemplate) {
70+
return ["Nette\\Bridges\\ApplicationLatte\\UIRuntime::printClass(\$this, $this->printTemplate); exit;"];
71+
}
6572
return [$this->extends . 'Nette\Bridges\ApplicationLatte\UIRuntime::initialize($this, $this->parentName, $this->blocks);'];
6673
}
6774

@@ -147,4 +154,13 @@ public function macroExtends(MacroNode $node, PhpWriter $writer)
147154
}
148155
$this->extends = $writer->write('$this->parentName = $this->global->uiPresenter->findLayoutTemplateFile();');
149156
}
157+
158+
159+
/**
160+
* {templatePrint [parentClass | default]}
161+
*/
162+
public function macroTemplatePrint(MacroNode $node)
163+
{
164+
$this->printTemplate = var_export($node->tokenizer->fetchWord() ?: null, true);
165+
}
150166
}

src/Bridges/ApplicationLatte/UIRuntime.php

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

1212
use Latte;
1313
use Nette;
14+
use Nette\Application\UI\Presenter;
15+
use Nette\PhpGenerator as Php;
1416

1517

1618
/**
@@ -34,4 +36,47 @@ public static function initialize(Latte\Runtime\Template $template, &$parentName
3436
$parentName = $providers->uiControl->findLayoutTemplateFile();
3537
}
3638
}
39+
40+
41+
public static function printClass(Latte\Runtime\Template $template, string $parent = null): void
42+
{
43+
$name = 'Template';
44+
$parent = $parent === 'default'
45+
? DefaultTemplate::class
46+
: ($parent ?: Template::class);
47+
48+
$params = $template->getParameters();
49+
$control = $params['control'] ?? $params['presenter'] ?? null;
50+
if ($control) {
51+
$name = preg_replace('#(Control|Presenter)$#', '', get_class($control)) . 'Template';
52+
unset($params[$control instanceof Presenter ? 'control' : 'presenter']);
53+
}
54+
55+
if (class_exists($parent)) {
56+
get_class_vars($parent);
57+
$params = array_diff_key($params, get_class_vars($parent));
58+
}
59+
60+
$funcs = (array) $template->global->fn;
61+
unset($funcs['isLinkCurrent'], $funcs['isModuleCurrent']);
62+
63+
$namespace = new Php\PhpNamespace(Php\Helpers::extractNamespace($name));
64+
$class = $namespace->addClass(Php\Helpers::extractShortName($name));
65+
$class->setExtends($parent);
66+
$class->addTrait(Nette\SmartObject::class);
67+
68+
$blueprint = new Latte\Runtime\Blueprint;
69+
$blueprint->addProperties($class, $params, true);
70+
$blueprint->addFunctions($class, $funcs);
71+
72+
$end = $blueprint->printCanvas();
73+
$blueprint->printHeader('Native types');
74+
$blueprint->printCode((string) $namespace);
75+
76+
$blueprint->addProperties($class, $params, false);
77+
78+
$blueprint->printHeader('phpDoc types');
79+
$blueprint->printCode((string) $namespace);
80+
echo $end;
81+
}
3782
}

0 commit comments

Comments
 (0)