@vituum/vite-plugin-latte 2.0.0-next.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +1 -1
  2. package/index.js +4 -2
  3. package/package.json +11 -9
  4. package/types/index.d.ts +1 -1
  5. package/vendor/autoload.php +1 -4
  6. package/vendor/composer/InstalledVersions.php +36 -2
  7. package/vendor/composer/autoload_classmap.php +14 -15
  8. package/vendor/composer/autoload_psr4.php +2 -0
  9. package/vendor/composer/autoload_static.php +38 -15
  10. package/vendor/composer/installed.json +32 -22
  11. package/vendor/composer/installed.php +12 -12
  12. package/vendor/composer/platform_check.php +4 -5
  13. package/vendor/latte/latte/bin/latte-lint +10 -3
  14. package/vendor/latte/latte/composer.json +16 -6
  15. package/vendor/latte/latte/src/Bridges/Tracy/BlueScreenPanel.php +13 -38
  16. package/vendor/latte/latte/src/Bridges/Tracy/LattePanel.php +9 -7
  17. package/vendor/latte/latte/src/Bridges/Tracy/TracyExtension.php +2 -4
  18. package/vendor/latte/latte/src/Bridges/Tracy/dist/panel.phtml +94 -0
  19. package/vendor/latte/latte/src/Bridges/Tracy/dist/tab.phtml +10 -0
  20. package/vendor/latte/latte/src/Latte/Compiler/Block.php +4 -6
  21. package/vendor/latte/latte/src/Latte/Compiler/Escaper.php +67 -86
  22. package/vendor/latte/latte/src/Latte/Compiler/Node.php +6 -3
  23. package/vendor/latte/latte/src/Latte/Compiler/NodeHelpers.php +16 -6
  24. package/vendor/latte/latte/src/Latte/Compiler/NodeTraverser.php +25 -12
  25. package/vendor/latte/latte/src/Latte/Compiler/Nodes/AreaNode.php +7 -3
  26. package/vendor/latte/latte/src/Latte/Compiler/Nodes/AuxiliaryNode.php +5 -4
  27. package/vendor/latte/latte/src/Latte/Compiler/Nodes/FragmentNode.php +8 -4
  28. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/AttributeNode.php +7 -15
  29. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/BogusTagNode.php +4 -6
  30. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/CommentNode.php +4 -3
  31. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/ElementNode.php +37 -67
  32. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/ExpressionAttributeNode.php +60 -0
  33. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Html/TagNode.php +70 -0
  34. package/vendor/latte/latte/src/Latte/Compiler/Nodes/NopNode.php +4 -3
  35. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ArgumentNode.php +4 -3
  36. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ArrayItemNode.php +4 -15
  37. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ClosureUseNode.php +4 -3
  38. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ComplexTypeNode.php +4 -3
  39. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayAccessNode.php +4 -3
  40. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ArrayNode.php +6 -22
  41. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignNode.php +18 -5
  42. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AssignOpNode.php +18 -7
  43. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/AuxiliaryNode.php +5 -4
  44. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/BinaryOpNode.php +38 -9
  45. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CastNode.php +14 -6
  46. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClassConstantFetchNode.php +4 -3
  47. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/CloneNode.php +12 -4
  48. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ClosureNode.php +10 -6
  49. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ConstantFetchNode.php +7 -6
  50. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/EmptyNode.php +4 -3
  51. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FilterCallNode.php +10 -4
  52. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallNode.php +14 -5
  53. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InNode.php +4 -3
  54. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/InstanceofNode.php +14 -5
  55. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/IssetNode.php +6 -3
  56. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MatchNode.php +6 -3
  57. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallNode.php +18 -5
  58. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/NewNode.php +14 -4
  59. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PostOpNode.php +14 -6
  60. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PreOpNode.php +14 -6
  61. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/PropertyFetchNode.php +4 -3
  62. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticMethodCallNode.php +14 -15
  63. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticPropertyFetchNode.php +4 -3
  64. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/TemporaryNode.php +7 -6
  65. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/TernaryNode.php +16 -11
  66. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/UnaryOpNode.php +19 -9
  67. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/VariableNode.php +4 -3
  68. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ExpressionNode.php +4 -3
  69. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/FilterNode.php +33 -8
  70. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IdentifierNode.php +4 -3
  71. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/InterpolatedStringPartNode.php +4 -3
  72. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/IntersectionTypeNode.php +6 -3
  73. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ListItemNode.php +4 -3
  74. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ListNode.php +4 -3
  75. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/MatchArmNode.php +6 -3
  76. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ModifierNode.php +29 -41
  77. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NameNode.php +9 -4
  78. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/NullableTypeNode.php +4 -3
  79. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/OperatorNode.php +27 -0
  80. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ParameterNode.php +4 -3
  81. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/BooleanNode.php +4 -3
  82. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/FloatNode.php +9 -6
  83. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/IntegerNode.php +8 -6
  84. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/InterpolatedStringNode.php +9 -5
  85. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/NullNode.php +4 -3
  86. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Scalar/StringNode.php +6 -4
  87. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/ScalarNode.php +4 -3
  88. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/SuperiorTypeNode.php +4 -3
  89. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/UnionTypeNode.php +6 -3
  90. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/VarLikeIdentifierNode.php +4 -3
  91. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/{Expression/NotNode.php → VariadicPlaceholderNode.php} +9 -9
  92. package/vendor/latte/latte/src/Latte/{Essential → Compiler}/Nodes/PrintNode.php +9 -15
  93. package/vendor/latte/latte/src/Latte/Compiler/Nodes/StatementNode.php +7 -3
  94. package/vendor/latte/latte/src/Latte/Compiler/Nodes/TemplateNode.php +4 -3
  95. package/vendor/latte/latte/src/Latte/Compiler/Nodes/TextNode.php +6 -4
  96. package/vendor/latte/latte/src/Latte/Compiler/PhpHelpers.php +32 -18
  97. package/vendor/latte/latte/src/Latte/Compiler/Position.php +7 -7
  98. package/vendor/latte/latte/src/Latte/Compiler/PrintContext.php +72 -104
  99. package/vendor/latte/latte/src/Latte/Compiler/Tag.php +17 -16
  100. package/vendor/latte/latte/src/Latte/Compiler/TagLexer.php +11 -8
  101. package/vendor/latte/latte/src/Latte/Compiler/TagParser.php +28 -23
  102. package/vendor/latte/latte/src/Latte/Compiler/TagParserData.php +360 -336
  103. package/vendor/latte/latte/src/Latte/Compiler/TemplateGenerator.php +49 -38
  104. package/vendor/latte/latte/src/Latte/Compiler/TemplateLexer.php +37 -12
  105. package/vendor/latte/latte/src/Latte/Compiler/TemplateParser.php +35 -21
  106. package/vendor/latte/latte/src/Latte/Compiler/TemplateParserHtml.php +121 -71
  107. package/vendor/latte/latte/src/Latte/Compiler/Token.php +79 -70
  108. package/vendor/latte/latte/src/Latte/Compiler/TokenStream.php +21 -14
  109. package/vendor/latte/latte/src/Latte/ContentType.php +4 -3
  110. package/vendor/latte/latte/src/Latte/Engine.php +147 -188
  111. package/vendor/latte/latte/src/Latte/Essential/AuxiliaryIterator.php +5 -7
  112. package/vendor/latte/latte/src/Latte/Essential/Blueprint.php +5 -5
  113. package/vendor/latte/latte/src/Latte/Essential/CachingIterator.php +5 -4
  114. package/vendor/latte/latte/src/Latte/Essential/CoreExtension.php +155 -127
  115. package/vendor/latte/latte/src/Latte/Essential/Filters.php +99 -44
  116. package/vendor/latte/latte/src/Latte/Essential/Nodes/BlockNode.php +14 -13
  117. package/vendor/latte/latte/src/Latte/Essential/Nodes/CaptureNode.php +5 -6
  118. package/vendor/latte/latte/src/Latte/Essential/Nodes/ContentTypeNode.php +3 -4
  119. package/vendor/latte/latte/src/Latte/Essential/Nodes/CustomFunctionCallNode.php +46 -0
  120. package/vendor/latte/latte/src/Latte/Essential/Nodes/DebugbreakNode.php +2 -3
  121. package/vendor/latte/latte/src/Latte/Essential/Nodes/DefineNode.php +10 -7
  122. package/vendor/latte/latte/src/Latte/Essential/Nodes/DoNode.php +3 -4
  123. package/vendor/latte/latte/src/Latte/Essential/Nodes/DumpNode.php +2 -3
  124. package/vendor/latte/latte/src/Latte/Essential/Nodes/EmbedNode.php +8 -9
  125. package/vendor/latte/latte/src/Latte/Essential/Nodes/ExtendsNode.php +3 -5
  126. package/vendor/latte/latte/src/Latte/Essential/Nodes/FirstLastSepNode.php +4 -7
  127. package/vendor/latte/latte/src/Latte/Essential/Nodes/ForNode.php +6 -5
  128. package/vendor/latte/latte/src/Latte/Essential/Nodes/ForeachNode.php +7 -7
  129. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfChangedNode.php +4 -5
  130. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfContentNode.php +7 -6
  131. package/vendor/latte/latte/src/Latte/Essential/Nodes/IfNode.php +11 -11
  132. package/vendor/latte/latte/src/Latte/Essential/Nodes/ImportNode.php +5 -6
  133. package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeBlockNode.php +26 -27
  134. package/vendor/latte/latte/src/Latte/Essential/Nodes/IncludeFileNode.php +7 -10
  135. package/vendor/latte/latte/src/Latte/Essential/Nodes/IterateWhileNode.php +6 -6
  136. package/vendor/latte/latte/src/Latte/Essential/Nodes/JumpNode.php +4 -8
  137. package/vendor/latte/latte/src/Latte/Essential/Nodes/NAttrNode.php +35 -47
  138. package/vendor/latte/latte/src/Latte/Essential/Nodes/NClassNode.php +4 -5
  139. package/vendor/latte/latte/src/Latte/Essential/Nodes/NElseNode.php +69 -34
  140. package/vendor/latte/latte/src/Latte/Essential/Nodes/NTagNode.php +9 -33
  141. package/vendor/latte/latte/src/Latte/Essential/Nodes/ParametersNode.php +7 -4
  142. package/vendor/latte/latte/src/Latte/Essential/Nodes/RawPhpNode.php +3 -4
  143. package/vendor/latte/latte/src/Latte/Essential/Nodes/RollbackNode.php +2 -3
  144. package/vendor/latte/latte/src/Latte/Essential/Nodes/SpacelessNode.php +4 -5
  145. package/vendor/latte/latte/src/Latte/Essential/Nodes/SwitchNode.php +9 -7
  146. package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplatePrintNode.php +4 -4
  147. package/vendor/latte/latte/src/Latte/Essential/Nodes/TemplateTypeNode.php +3 -4
  148. package/vendor/latte/latte/src/Latte/Essential/Nodes/TraceNode.php +2 -3
  149. package/vendor/latte/latte/src/Latte/Essential/Nodes/TranslateNode.php +5 -5
  150. package/vendor/latte/latte/src/Latte/Essential/Nodes/TryNode.php +4 -5
  151. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarNode.php +10 -6
  152. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarPrintNode.php +2 -3
  153. package/vendor/latte/latte/src/Latte/Essential/Nodes/VarTypeNode.php +3 -4
  154. package/vendor/latte/latte/src/Latte/Essential/Nodes/WhileNode.php +5 -5
  155. package/vendor/latte/latte/src/Latte/Essential/Passes.php +82 -21
  156. package/vendor/latte/latte/src/Latte/Essential/RawPhpExtension.php +2 -4
  157. package/vendor/latte/latte/src/Latte/Essential/RollbackException.php +1 -3
  158. package/vendor/latte/latte/src/Latte/Essential/Tracer.php +24 -28
  159. package/vendor/latte/latte/src/Latte/Essential/TranslatorExtension.php +14 -14
  160. package/vendor/latte/latte/src/Latte/Extension.php +12 -6
  161. package/vendor/latte/latte/src/Latte/Feature.php +24 -0
  162. package/vendor/latte/latte/src/Latte/Helpers.php +65 -15
  163. package/vendor/latte/latte/src/Latte/Loader.php +1 -9
  164. package/vendor/latte/latte/src/Latte/Loaders/FileLoader.php +11 -17
  165. package/vendor/latte/latte/src/Latte/Loaders/StringLoader.php +7 -21
  166. package/vendor/latte/latte/src/Latte/Policy.php +4 -3
  167. package/vendor/latte/latte/src/Latte/Runtime/Block.php +2 -4
  168. package/vendor/latte/latte/src/Latte/Runtime/Cache.php +143 -0
  169. package/vendor/latte/latte/src/Latte/Runtime/FilterExecutor.php +5 -6
  170. package/vendor/latte/latte/src/Latte/Runtime/FilterInfo.php +11 -11
  171. package/vendor/latte/latte/src/Latte/Runtime/FunctionExecutor.php +5 -6
  172. package/vendor/latte/latte/src/Latte/Runtime/Helpers.php +91 -0
  173. package/vendor/latte/latte/src/Latte/Runtime/Html.php +3 -5
  174. package/vendor/latte/latte/src/Latte/Runtime/HtmlHelpers.php +374 -0
  175. package/vendor/latte/latte/src/Latte/Runtime/HtmlStringable.php +1 -3
  176. package/vendor/latte/latte/src/Latte/Runtime/Template.php +162 -182
  177. package/vendor/latte/latte/src/Latte/Runtime/XmlHelpers.php +108 -0
  178. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallNode.php +12 -4
  179. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallNode.php +15 -5
  180. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/PropertyFetchNode.php +4 -3
  181. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/SandboxNode.php +5 -6
  182. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticMethodCallNode.php +14 -4
  183. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticPropertyFetchNode.php +4 -3
  184. package/vendor/latte/latte/src/Latte/Sandbox/RuntimeChecker.php +8 -6
  185. package/vendor/latte/latte/src/Latte/Sandbox/SandboxExtension.php +16 -12
  186. package/vendor/latte/latte/src/Latte/Sandbox/SecurityPolicy.php +18 -16
  187. package/vendor/latte/latte/src/Latte/attributes.php +7 -3
  188. package/vendor/latte/latte/src/Latte/exceptions.php +52 -6
  189. package/vendor/latte/latte/src/Tools/Linter.php +74 -28
  190. package/vendor/latte/latte/src/Tools/LinterExtension.php +176 -0
  191. package/vendor/nette/utils/composer.json +15 -5
  192. package/vendor/nette/utils/readme.md +1 -1
  193. package/vendor/nette/utils/src/HtmlStringable.php +4 -1
  194. package/vendor/nette/utils/src/Iterators/CachingIterator.php +10 -25
  195. package/vendor/nette/utils/src/Iterators/Mapper.php +2 -3
  196. package/vendor/nette/utils/src/SmartObject.php +3 -0
  197. package/vendor/nette/utils/src/StaticClass.php +1 -11
  198. package/vendor/nette/utils/src/Translator.php +1 -1
  199. package/vendor/nette/utils/src/Utils/ArrayHash.php +6 -10
  200. package/vendor/nette/utils/src/Utils/ArrayList.php +8 -12
  201. package/vendor/nette/utils/src/Utils/Arrays.php +38 -18
  202. package/vendor/nette/utils/src/Utils/Callback.php +13 -8
  203. package/vendor/nette/utils/src/Utils/DateTime.php +95 -26
  204. package/vendor/nette/utils/src/Utils/FileInfo.php +6 -7
  205. package/vendor/nette/utils/src/Utils/FileSystem.php +10 -5
  206. package/vendor/nette/utils/src/Utils/Finder.php +31 -12
  207. package/vendor/nette/utils/src/Utils/Floats.php +1 -0
  208. package/vendor/nette/utils/src/Utils/Helpers.php +22 -2
  209. package/vendor/nette/utils/src/Utils/Html.php +130 -127
  210. package/vendor/nette/utils/src/Utils/Image.php +80 -60
  211. package/vendor/nette/utils/src/Utils/ImageColor.php +5 -0
  212. package/vendor/nette/utils/src/Utils/ImageType.php +2 -0
  213. package/vendor/nette/utils/src/Utils/Iterables.php +41 -7
  214. package/vendor/nette/utils/src/Utils/Json.php +2 -0
  215. package/vendor/nette/utils/src/Utils/ObjectHelpers.php +2 -0
  216. package/vendor/nette/utils/src/Utils/Paginator.php +10 -43
  217. package/vendor/nette/utils/src/Utils/Random.php +2 -0
  218. package/vendor/nette/utils/src/Utils/Reflection.php +22 -15
  219. package/vendor/nette/utils/src/Utils/ReflectionMethod.php +6 -1
  220. package/vendor/nette/utils/src/Utils/Strings.php +62 -57
  221. package/vendor/nette/utils/src/Utils/Type.php +91 -42
  222. package/vendor/nette/utils/src/Utils/Validators.php +9 -7
  223. package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.panel.phtml +0 -101
  224. package/vendor/latte/latte/src/Bridges/Tracy/templates/LattePanel.tab.phtml +0 -15
  225. package/vendor/latte/latte/src/Latte/Compiler/ExpressionBuilder.php +0 -129
  226. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/ErrorSuppressNode.php +0 -36
  227. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/FunctionCallableNode.php +0 -39
  228. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/MethodCallableNode.php +0 -42
  229. package/vendor/latte/latte/src/Latte/Compiler/Nodes/Php/Expression/StaticMethodCallableNode.php +0 -57
  230. package/vendor/latte/latte/src/Latte/PositionAwareException.php +0 -47
  231. package/vendor/latte/latte/src/Latte/Runtime/Filters.php +0 -283
  232. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/FunctionCallableNode.php +0 -29
  233. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/MethodCallableNode.php +0 -30
  234. package/vendor/latte/latte/src/Latte/Sandbox/Nodes/StaticMethodCallableNode.php +0 -30
@@ -1,19 +1,16 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Html;
11
9
 
12
10
  use Latte\Compiler\Node;
13
11
  use Latte\Compiler\NodeHelpers;
14
12
  use Latte\Compiler\Nodes;
15
13
  use Latte\Compiler\Nodes\AreaNode;
16
- use Latte\Compiler\Nodes\AuxiliaryNode;
17
14
  use Latte\Compiler\Nodes\FragmentNode;
18
15
  use Latte\Compiler\Position;
19
16
  use Latte\Compiler\PrintContext;
@@ -22,45 +19,42 @@ use Latte\ContentType;
22
19
 
23
20
 
24
21
  /**
25
- * HTML element node.
22
+ * HTML/XML element with attributes, content, and n:attribute support.
26
23
  */
27
24
  class ElementNode extends AreaNode
28
25
  {
29
- public ?Nodes\Php\ExpressionNode $variableName = null;
30
- public ?FragmentNode $attributes = null;
26
+ public FragmentNode $attributes;
31
27
  public bool $selfClosing = false;
32
28
  public ?AreaNode $content = null;
33
29
 
34
30
  /** @var Tag[] */
35
31
  public array $nAttributes = [];
36
-
37
- /** n:tag & n:tag- support */
38
- public AreaNode $tagNode;
39
- public bool $captureTagName = false;
32
+ public ?AreaNode $dynamicTag = null;
40
33
  public bool $breakable = false;
41
- private ?string $endTagVar;
42
34
 
43
35
 
44
36
  public function __construct(
45
- public /*readonly*/ string $name,
37
+ public readonly string $name,
46
38
  public ?Position $position = null,
47
- public /*readonly*/ ?self $parent = null,
48
- public ?\stdClass $data = null,
39
+ public readonly ?self $parent = null,
49
40
  public string $contentType = ContentType::Html,
50
41
  ) {
51
- $this->data ??= new \stdClass;
52
- $this->tagNode = new AuxiliaryNode(\Closure::fromCallable([$this, 'printStartTag']));
42
+ $this->attributes = new FragmentNode;
53
43
  }
54
44
 
55
45
 
56
46
  public function getAttribute(string $name): string|Node|bool|null
57
47
  {
58
- foreach ($this->attributes?->children as $child) {
48
+ foreach ($this->attributes->children as $child) {
59
49
  if ($child instanceof AttributeNode
60
50
  && $child->name instanceof Nodes\TextNode
61
- && strcasecmp($name, $child->name->content) === 0
51
+ && $this->matchesIdentifier($name, $child->name->content)
62
52
  ) {
63
53
  return NodeHelpers::toText($child->value) ?? $child->value ?? true;
54
+ } elseif ($child instanceof ExpressionAttributeNode
55
+ && $this->matchesIdentifier($name, $child->name)
56
+ ) {
57
+ return true;
64
58
  }
65
59
  }
66
60
 
@@ -69,10 +63,16 @@ class ElementNode extends AreaNode
69
63
 
70
64
 
71
65
  public function is(string $name): bool
66
+ {
67
+ return $this->matchesIdentifier($this->name, $name);
68
+ }
69
+
70
+
71
+ private function matchesIdentifier(string $a, string $b): bool
72
72
  {
73
73
  return $this->contentType === ContentType::Html
74
- ? strcasecmp($this->name, $name) === 0
75
- : $this->name === $name;
74
+ ? strcasecmp($a, $b) === 0
75
+ : $a === $b;
76
76
  }
77
77
 
78
78
 
@@ -85,66 +85,36 @@ class ElementNode extends AreaNode
85
85
 
86
86
  public function print(PrintContext $context): string
87
87
  {
88
- $res = $this->endTagVar = null;
89
- if ($this->captureTagName || $this->variableName) {
90
- $endTag = $this->endTagVar = '$ʟ_tag[' . $context->generateId() . ']';
91
- $res = "$this->endTagVar = '';";
92
- } else {
93
- $endTag = var_export('</' . $this->name . '>', true);
94
- }
95
-
96
- $res .= $this->tagNode->print($context); // calls $this->printStartTag()
88
+ $res = $this->dynamicTag
89
+ ? $this->dynamicTag->print($context)
90
+ : (new TagNode($this))->print($context, captureEnd: false);
91
+
92
+ if ($innerContent = $this->content) {
93
+ if ($this->dynamicTag) {
94
+ $endTag = '$ʟ_tags[' . ($context->generateId()) . ']';
95
+ $res = "\$ʟ_tag = ''; $res $endTag = \$ʟ_tag;";
96
+ } else {
97
+ $endTag = var_export('</' . $this->name . '>', return: true);
98
+ }
97
99
 
98
- if ($this->content) {
99
100
  $context->beginEscape()->enterHtmlText($this);
100
- $content = $this->content->print($context);
101
+ $content = $innerContent->print($context);
101
102
  $context->restoreEscape();
102
103
  $res .= $this->breakable
103
104
  ? 'try { ' . $content . ' } finally { echo ' . $endTag . '; } '
104
- : $content . 'echo ' . $endTag . ';';
105
+ : $content . ' echo ' . $endTag . ';';
105
106
  }
106
107
 
107
108
  return $res;
108
109
  }
109
110
 
110
111
 
111
- private function printStartTag(PrintContext $context): string
112
- {
113
- $context->beginEscape()->enterHtmlTag($this->name);
114
- $res = "echo '<';";
115
-
116
- if ($this->endTagVar) {
117
- $expr = $this->variableName
118
- ? 'LR\Filters::safeTag('
119
- . $this->variableName->print($context)
120
- . ($this->contentType === ContentType::Xml ? ', true' : '')
121
- . ')'
122
- : var_export($this->name, true);
123
- $res .= "echo \$ʟ_tmp = $expr /* line {$this->position->line} */;"
124
- . "{$this->endTagVar} = '</' . \$ʟ_tmp . '>' . {$this->endTagVar};";
125
- } else {
126
- $res .= 'echo ' . var_export($this->name, true) . ';';
127
- }
128
-
129
- foreach ($this->attributes?->children ?? [] as $attr) {
130
- $res .= $attr->print($context);
131
- }
132
-
133
- $res .= "echo '" . ($this->selfClosing ? '/>' : '>') . "';";
134
- $context->restoreEscape();
135
- return $res;
136
- }
137
-
138
-
139
112
  public function &getIterator(): \Generator
140
113
  {
141
- yield $this->tagNode;
142
- if ($this->variableName) {
143
- yield $this->variableName;
144
- }
145
- if ($this->attributes) {
146
- yield $this->attributes;
114
+ if ($this->dynamicTag) {
115
+ yield $this->dynamicTag;
147
116
  }
117
+ yield $this->attributes;
148
118
  if ($this->content) {
149
119
  yield $this->content;
150
120
  }
@@ -0,0 +1,60 @@
1
+ <?php declare(strict_types=1);
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ namespace Latte\Compiler\Nodes\Html;
9
+
10
+ use Latte\Compiler\Nodes\AreaNode;
11
+ use Latte\Compiler\Nodes\Php\ExpressionNode;
12
+ use Latte\Compiler\Nodes\Php\ModifierNode;
13
+ use Latte\Compiler\Position;
14
+ use Latte\Compiler\PrintContext;
15
+ use Latte\ContentType;
16
+ use Latte\Feature;
17
+ use Latte\Runtime as LR;
18
+
19
+
20
+ /**
21
+ * Dynamic HTML attribute generated from expression.
22
+ */
23
+ class ExpressionAttributeNode extends AreaNode
24
+ {
25
+ public function __construct(
26
+ public string $name,
27
+ public ExpressionNode $value,
28
+ public ModifierNode $modifier,
29
+ public ?string $indentation = null,
30
+ public ?Position $position = null,
31
+ ) {
32
+ }
33
+
34
+
35
+ public function print(PrintContext $context): string
36
+ {
37
+ if ($context->getEscaper()->getContentType() === ContentType::Html) {
38
+ $type = $this->modifier->removeFilter('toggle') ? 'bool' : LR\HtmlHelpers::classifyAttributeType($this->name);
39
+ $method = 'LR\HtmlHelpers::format' . ucfirst($type) . 'Attribute';
40
+ } else {
41
+ $method = 'LR\XmlHelpers::formatAttribute';
42
+ }
43
+ return $context->format(
44
+ 'echo %raw(%dump, %modify(%node), %dump?) %line;',
45
+ $method,
46
+ $this->indentation . $this->name,
47
+ $this->modifier,
48
+ $this->value,
49
+ (!$this->modifier->removeFilter('accept') && $context->hasFeature(Feature::MigrationWarnings)) ?: null,
50
+ $this->value->position,
51
+ );
52
+ }
53
+
54
+
55
+ public function &getIterator(): \Generator
56
+ {
57
+ yield $this->value;
58
+ yield $this->modifier;
59
+ }
60
+ }
@@ -0,0 +1,70 @@
1
+ <?php declare(strict_types=1);
2
+
3
+ /**
4
+ * This file is part of the Latte (https://latte.nette.org)
5
+ * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
+ */
7
+
8
+ namespace Latte\Compiler\Nodes\Html;
9
+
10
+ use Latte\Compiler\Nodes;
11
+ use Latte\Compiler\Nodes\AreaNode;
12
+ use Latte\Compiler\PrintContext;
13
+ use Latte\ContentType;
14
+
15
+
16
+ /**
17
+ * Helper node for rendering HTML tags with n:tag and n:tag* support.
18
+ * Writes end tag to $ʟ_tag.
19
+ */
20
+ class TagNode extends AreaNode
21
+ {
22
+ public function __construct(
23
+ public readonly ElementNode $element,
24
+ public ?Nodes\Php\ExpressionNode $name = null,
25
+ ) {
26
+ }
27
+
28
+
29
+ public function print(PrintContext $context, ?bool $captureEnd = null): string
30
+ {
31
+ $captureEnd ??= (bool) $this->element->content;
32
+ $context->beginEscape()->enterHtmlTag($this->element->name);
33
+
34
+ $res = $this->name
35
+ ? $context->format(
36
+ <<<'XX'
37
+ $ʟ_tmp = LR\%raw::validateTagChange(%node, %dump);
38
+ %raw
39
+ echo '<', $ʟ_tmp %line;
40
+ %node
41
+ echo %dump;
42
+ XX,
43
+ $this->element->contentType === ContentType::Html ? 'HtmlHelpers' : 'XmlHelpers',
44
+ $this->name,
45
+ $this->element->name,
46
+ $captureEnd ? '$ʟ_tag = \'</\' . $ʟ_tmp . \'>\' . $ʟ_tag;' : '',
47
+ $this->element->position,
48
+ $this->element->attributes,
49
+ $this->element->selfClosing ? '/>' : '>',
50
+ )
51
+ : $context->format(
52
+ '%raw echo %dump; %node echo %dump;',
53
+ $captureEnd ? '$ʟ_tag = ' . $context->encodeString("</{$this->element->name}>") . ' . $ʟ_tag;' : '',
54
+ '<' . $this->element->name,
55
+ $this->element->attributes,
56
+ $this->element->selfClosing ? '/>' : '>',
57
+ );
58
+
59
+ $context->restoreEscape();
60
+ return $res;
61
+ }
62
+
63
+
64
+ public function &getIterator(): \Generator
65
+ {
66
+ if ($this->name) {
67
+ yield $this->name;
68
+ }
69
+ }
70
+ }
@@ -1,17 +1,18 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes;
11
9
 
12
10
  use Latte\Compiler\PrintContext;
13
11
 
14
12
 
13
+ /**
14
+ * Placeholder for removed or filtered-out content.
15
+ */
15
16
  class NopNode extends AreaNode
16
17
  {
17
18
  public function print(PrintContext $context): string
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php;
11
9
 
12
10
  use Latte\Compiler\Node;
@@ -14,6 +12,9 @@ use Latte\Compiler\Position;
14
12
  use Latte\Compiler\PrintContext;
15
13
 
16
14
 
15
+ /**
16
+ * Function/method argument with optional name, reference, and unpacking.
17
+ */
17
18
  class ArgumentNode extends Node
18
19
  {
19
20
  public function __construct(
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php;
11
9
 
12
10
  use Latte\Compiler\Node;
@@ -14,6 +12,9 @@ use Latte\Compiler\Position;
14
12
  use Latte\Compiler\PrintContext;
15
13
 
16
14
 
15
+ /**
16
+ * Array item with optional key, reference, and spread operator.
17
+ */
17
18
  class ArrayItemNode extends Node
18
19
  {
19
20
  public function __construct(
@@ -60,15 +61,3 @@ class ArrayItemNode extends Node
60
61
  yield $this->value;
61
62
  }
62
63
  }
63
-
64
-
65
- class_alias(ArrayItemNode::class, Expression\ArrayItemNode::class);
66
-
67
- namespace Latte\Compiler\Nodes\Php\Expression;
68
-
69
- if (false) {
70
- /** @deprecated use Latte\Compiler\Nodes\Php\ArrayItemNode */
71
- class ArrayItemNode
72
- {
73
- }
74
- }
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php;
11
9
 
12
10
  use Latte\Compiler\Node;
@@ -15,6 +13,9 @@ use Latte\Compiler\Position;
15
13
  use Latte\Compiler\PrintContext;
16
14
 
17
15
 
16
+ /**
17
+ * Closure use variable ($var or &$var).
18
+ */
18
19
  class ClosureUseNode extends Node
19
20
  {
20
21
  public function __construct(
@@ -1,17 +1,18 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php;
11
9
 
12
10
  use Latte\Compiler\Node;
13
11
 
14
12
 
13
+ /**
14
+ * Base for complex type declarations (nullable, union, intersection).
15
+ */
15
16
  abstract class ComplexTypeNode extends Node
16
17
  {
17
18
  }
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php\Expression;
11
9
 
12
10
  use Latte\Compiler\Nodes\Php\ExpressionNode;
@@ -14,6 +12,9 @@ use Latte\Compiler\Position;
14
12
  use Latte\Compiler\PrintContext;
15
13
 
16
14
 
15
+ /**
16
+ * Array or string element access ($arr[$key]).
17
+ */
17
18
  class ArrayAccessNode extends ExpressionNode
18
19
  {
19
20
  public function __construct(
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php\Expression;
11
9
 
12
10
  use Latte\Compiler\Nodes\Php\ArgumentNode;
@@ -14,8 +12,12 @@ use Latte\Compiler\Nodes\Php\ArrayItemNode;
14
12
  use Latte\Compiler\Nodes\Php\ExpressionNode;
15
13
  use Latte\Compiler\Position;
16
14
  use Latte\Compiler\PrintContext;
15
+ use Latte\Helpers;
17
16
 
18
17
 
18
+ /**
19
+ * Array literal.
20
+ */
19
21
  class ArrayNode extends ExpressionNode
20
22
  {
21
23
  public function __construct(
@@ -36,25 +38,6 @@ class ArrayNode extends ExpressionNode
36
38
 
37
39
  public function print(PrintContext $context): string
38
40
  {
39
- // Converts [...$var] -> $var, because PHP 8.0 doesn't support unpacking with string keys
40
- if (PHP_VERSION_ID < 80100) {
41
- $res = '[';
42
- $merge = false;
43
- foreach ($this->items as $item) {
44
- if ($item === null) {
45
- $res .= ', ';
46
- } elseif ($item->unpack) {
47
- $res .= '], ' . $item->value->print($context) . ', [';
48
- $merge = true;
49
- } else {
50
- $res .= $item->print($context) . ', ';
51
- }
52
- }
53
-
54
- $res = str_ends_with($res, ', ') ? substr($res, 0, -2) : $res;
55
- return $merge ? "array_merge($res])" : $res . ']';
56
- }
57
-
58
41
  return '[' . $context->implode($this->items) . ']';
59
42
  }
60
43
 
@@ -64,5 +47,6 @@ class ArrayNode extends ExpressionNode
64
47
  foreach ($this->items as &$item) {
65
48
  yield $item;
66
49
  }
50
+ Helpers::removeNulls($this->items);
67
51
  }
68
52
  }
@@ -1,23 +1,28 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php\Expression;
11
9
 
12
10
  use Latte\CompileException;
13
11
  use Latte\Compiler\Nodes\Php\ExpressionNode;
14
12
  use Latte\Compiler\Nodes\Php\ListNode;
13
+ use Latte\Compiler\Nodes\Php\OperatorNode;
15
14
  use Latte\Compiler\Position;
16
15
  use Latte\Compiler\PrintContext;
17
16
 
18
17
 
19
- class AssignNode extends ExpressionNode
18
+ /**
19
+ * Assignment ($var = expr or $var = &$ref).
20
+ */
21
+ class AssignNode extends ExpressionNode implements OperatorNode
20
22
  {
23
+ public const Precedence = [90, self::AssocRight];
24
+
25
+
21
26
  public function __construct(
22
27
  public ExpressionNode|ListNode $var,
23
28
  public ExpressionNode $expr,
@@ -31,7 +36,15 @@ class AssignNode extends ExpressionNode
31
36
  public function print(PrintContext $context): string
32
37
  {
33
38
  $this->validate();
34
- return $context->infixOp($this, $this->var, $this->byRef ? ' = &' : ' = ', $this->expr);
39
+ return $context->parenthesize($this, $this->var, self::AssocLeft)
40
+ . ($this->byRef ? ' = &' : ' = ')
41
+ . $context->parenthesize($this, $this->expr, self::AssocRight);
42
+ }
43
+
44
+
45
+ public function getOperatorPrecedence(): array
46
+ {
47
+ return self::Precedence;
35
48
  }
36
49
 
37
50
 
@@ -1,32 +1,35 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php\Expression;
11
9
 
12
10
  use Latte\CompileException;
13
11
  use Latte\Compiler\Nodes\Php\ExpressionNode;
12
+ use Latte\Compiler\Nodes\Php\OperatorNode;
14
13
  use Latte\Compiler\Position;
15
14
  use Latte\Compiler\PrintContext;
15
+ use function in_array;
16
16
 
17
17
 
18
- class AssignOpNode extends ExpressionNode
18
+ /**
19
+ * Compound assignment ($var += expr, $var .= expr, etc.).
20
+ */
21
+ class AssignOpNode extends ExpressionNode implements OperatorNode
19
22
  {
20
23
  private const Ops = ['+', '-', '*', '/', '.', '%', '&', '|', '^', '<<', '>>', '**', '??'];
21
24
 
22
25
 
23
26
  public function __construct(
24
27
  public ExpressionNode $var,
25
- public /*readonly*/ string $operator,
28
+ public string $operator,
26
29
  public ExpressionNode $expr,
27
30
  public ?Position $position = null,
28
31
  ) {
29
- if (!in_array($this->operator, self::Ops, true)) {
32
+ if (!in_array($this->operator, self::Ops, strict: true)) {
30
33
  throw new \InvalidArgumentException("Unexpected operator '$this->operator'");
31
34
  }
32
35
  $this->validate();
@@ -36,7 +39,15 @@ class AssignOpNode extends ExpressionNode
36
39
  public function print(PrintContext $context): string
37
40
  {
38
41
  $this->validate();
39
- return $context->infixOp($this, $this->var, ' ' . $this->operator . '= ', $this->expr);
42
+ return $context->parenthesize($this, $this->var, self::AssocLeft)
43
+ . ' ' . $this->operator . '= '
44
+ . $context->parenthesize($this, $this->expr, self::AssocRight);
45
+ }
46
+
47
+
48
+ public function getOperatorPrecedence(): array
49
+ {
50
+ return AssignNode::Precedence;
40
51
  }
41
52
 
42
53
 
@@ -1,12 +1,10 @@
1
- <?php
1
+ <?php declare(strict_types=1);
2
2
 
3
3
  /**
4
4
  * This file is part of the Latte (https://latte.nette.org)
5
5
  * Copyright (c) 2008 David Grudl (https://davidgrudl.com)
6
6
  */
7
7
 
8
- declare(strict_types=1);
9
-
10
8
  namespace Latte\Compiler\Nodes\Php\Expression;
11
9
 
12
10
  use Latte\Compiler\Node;
@@ -14,10 +12,13 @@ use Latte\Compiler\Nodes\Php\ExpressionNode;
14
12
  use Latte\Compiler\PrintContext;
15
13
 
16
14
 
15
+ /**
16
+ * Code generator hidden from compiler passes. Pass child nodes for traversal.
17
+ */
17
18
  class AuxiliaryNode extends ExpressionNode
18
19
  {
19
20
  public function __construct(
20
- public /*readonly*/ \Closure $print,
21
+ public readonly \Closure $print,
21
22
  /** @var (?Node)[] */
22
23
  public array $nodes = [],
23
24
  ) {