Skip to content

Commit

Permalink
UIMacros: overloaded macro {templatePrint}
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Mar 29, 2020
1 parent e0960a3 commit 9e3637a
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"nette/forms": "^3.0",
"nette/robot-loader": "^3.2",
"nette/security": "^3.0",
"latte/latte": "^2.6.2",
"latte/latte": "^2.7",
"tracy/tracy": "^2.6",
"mockery/mockery": "^1.0",
"phpstan/phpstan-nette": "^0.12"
Expand Down
16 changes: 16 additions & 0 deletions src/Bridges/ApplicationLatte/UIMacros.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ 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
{
Expand All @@ -44,6 +47,7 @@ public static function install(Latte\Compiler $compiler): void
$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);
}


Expand All @@ -62,6 +66,9 @@ public function initialize(): void
*/
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);'];
}

Expand Down Expand Up @@ -147,4 +154,13 @@ public function macroExtends(MacroNode $node, PhpWriter $writer)
}
$this->extends = $writer->write('$this->parentName = $this->global->uiPresenter->findLayoutTemplateFile();');
}


/**
* {templatePrint [parentClass | default]}
*/
public function macroTemplatePrint(MacroNode $node)
{
$this->printTemplate = var_export($node->tokenizer->fetchWord() ?: null, true);
}
}
45 changes: 45 additions & 0 deletions src/Bridges/ApplicationLatte/UIRuntime.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

use Latte;
use Nette;
use Nette\Application\UI\Presenter;
use Nette\PhpGenerator as Php;


/**
Expand All @@ -34,4 +36,47 @@ public static function initialize(Latte\Runtime\Template $template, &$parentName
$parentName = $providers->uiControl->findLayoutTemplateFile();
}
}


public static function printClass(Latte\Runtime\Template $template, string $parent = null): void
{
$name = 'Template';
$parent = $parent === 'default'
? DefaultTemplate::class
: ($parent ?: Template::class);

$params = $template->getParameters();
$control = $params['control'] ?? $params['presenter'] ?? null;
if ($control) {
$name = preg_replace('#(Control|Presenter)$#', '', get_class($control)) . 'Template';
unset($params[$control instanceof Presenter ? 'control' : 'presenter']);
}

if (class_exists($parent)) {
get_class_vars($parent);
$params = array_diff_key($params, get_class_vars($parent));
}

$funcs = (array) $template->global->fn;
unset($funcs['isLinkCurrent'], $funcs['isModuleCurrent']);

$namespace = new Php\PhpNamespace(Php\Helpers::extractNamespace($name));
$class = $namespace->addClass(Php\Helpers::extractShortName($name));
$class->setExtends($parent);
$class->addTrait(Nette\SmartObject::class);

$blueprint = new Latte\Runtime\Blueprint;
$blueprint->addProperties($class, $params, true);
$blueprint->addFunctions($class, $funcs);

$end = $blueprint->printCanvas();
$blueprint->printHeader('Native types');
$blueprint->printCode((string) $namespace);

$blueprint->addProperties($class, $params, false);

$blueprint->printHeader('phpDoc types');
$blueprint->printCode((string) $namespace);
echo $end;
}
}

0 comments on commit 9e3637a

Please sign in to comment.