1111
1212use Latte ;
1313use 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